mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-13 18:51:29 +00:00
Merge of a monster
This commit is contained in:
commit
281483efc1
@ -1,13 +1,59 @@
|
|||||||
EQEMu Changelog (Started on Sept 24, 2003 15:50)
|
EQEMu Changelog (Started on Sept 24, 2003 15:50)
|
||||||
-------------------------------------------------------
|
-------------------------------------------------------
|
||||||
|
== 4/1/2017 ==
|
||||||
|
Akkadius: [Performance] Reworked how all log calls are made in the source
|
||||||
|
- Before we used Log.Out, we will now use a macro Log(
|
||||||
|
- Before: Log.Out(Logs::General, Logs::Status, "Importing Spells...");
|
||||||
|
- After: Log(Logs::General, Logs::Status, "Importing Spells...");
|
||||||
|
- The difference is
|
||||||
|
1) It's 200-300x faster especially when log statements are inside very hot code paths. We already
|
||||||
|
had most hot paths checked before we logged them, but this blankets all existing logging calls now and not just the
|
||||||
|
select few we had picked out in the source.
|
||||||
|
2) Strings don't get copied to the stack, popped and pushed constantly even when we hit a log statement that
|
||||||
|
actually isn't going to log anything.
|
||||||
|
- We do an 'if (LogSys.log_settings[log_category].is_category_enabled == 1)' before we call a log function
|
||||||
|
in the log macro so the log function doesn't get called at all if we're not logging the category
|
||||||
|
- This has increased binary executables roughly 15KB
|
||||||
|
- The old extern for EQEmuLogSys is now named LogSys appropriately instead of Log (Ex: LogSys.StartFileLogs())
|
||||||
|
- The result keeps logging footprint non-existent for when we're not logging that category
|
||||||
|
|
||||||
|
== 03/30/2017 ==
|
||||||
|
Akkadius: [Performance] Fixed an overhead issue where many hot paths would trigger quest subroutines and beneath that the code would
|
||||||
|
try to see if a quest existed perpetually (checking if file exists) even though it should have determined the quest
|
||||||
|
didn't exist the first time.
|
||||||
|
- This caused a lot of overhead in an instance where an entire zone of NPC's is pathing, triggering EVENT_WAYPOINT_ARRIVE
|
||||||
|
and EVENT_WAYPOINT_DEPART when there is no global_npc.pl/lua, or all NPC's pathing don't have a quest assigned, similar
|
||||||
|
behavior would occur. This goes for any other type of quests: spells, items, encounters etc.
|
||||||
|
|
||||||
|
== 03/28/2017 ==
|
||||||
|
Akkadius: [Performance] Fixed a large overhead issue where every single NPC in a zone was checking to depop themselves
|
||||||
|
as a swarm pet every 3ms regardless of being a swarm pet or not. Swarm pets now check to depop only when their timer is up
|
||||||
|
Akkadius: [Performance] Removed a timer where clients would constantly calculate light amount on equipment every 600ms, instead
|
||||||
|
clients will update light when changing equipment or entering a zone
|
||||||
|
Akkadius: [Performance] Disabled enraged timer checks for NPC's that do not actually have enrage as a special attack
|
||||||
|
Akkadius: [Performance] Don't process ProjectileAttack checks for NPC's that are not engaged in any combat
|
||||||
|
|
||||||
|
== 03/27/2017 ==
|
||||||
|
Akkadius: [Performance] Reworked how client to NPC aggro checks are made
|
||||||
|
- Before when reverse aggro checks were done (client to NPC), checks would happen every 750 millseconds where a client would
|
||||||
|
check an entire entity list with distance calcs and other checks for aggro, with many clients in a zone and many NPC's this would
|
||||||
|
add a lot of unecessary overhead. A temporary adjustment on 3/25 was made and upped the check to 6 seconds.
|
||||||
|
- Now, there is a new methodology to scanning. The client will build a cache list of NPC's within close range as defined in new rule:
|
||||||
|
RULE_INT(Range, ClientNPCScan, 300) and will also get any NPC that has an aggro range beyond that defined range to use in
|
||||||
|
the frequent checks for aggro, the result is far less overhead
|
||||||
|
- Client scanning changes when moving versus not moving, the client will scan aggro every 500 milliseconds while moving, and
|
||||||
|
3000 millseconds aggro check when not moving, with a 6000ms re-fetch for close NPC's
|
||||||
|
- A demo of these changes can be found here:
|
||||||
|
https://youtu.be/aGroiwLSTVU
|
||||||
|
|
||||||
== 03/25/2017 ==
|
== 03/25/2017 ==
|
||||||
Akkadius: Reduced CPU footprint in non-combat zones doing constant checks for combat related activities
|
Akkadius: [Performance] Reduced CPU footprint in non-combat zones doing constant checks for combat related activities
|
||||||
Akkadius: Reduced CPU footprint in cases where a client is checking for aggro excessively every 750 millseconds. This has
|
Akkadius: [Performance] Reduced CPU footprint in cases where a client is checking for aggro excessively every 750 millseconds. This has
|
||||||
been adjusted to 6 seconds per new rule RULE_INT(Aggro, ClientAggroCheckInterval)
|
been adjusted to 6 seconds per new rule RULE_INT(Aggro, ClientAggroCheckInterval)
|
||||||
- When zones have many players, with many NPC's, this adds up quickly
|
- When zones have many players, with many NPC's, this adds up quickly
|
||||||
|
|
||||||
== 03/12/2017 ==
|
== 03/12/2017 ==
|
||||||
Akkadius:
|
Akkadius: [Performance]
|
||||||
- Implemented range rules for packets and other functions
|
- Implemented range rules for packets and other functions
|
||||||
RULE_INT ( Range, Say, 135 )
|
RULE_INT ( Range, Say, 135 )
|
||||||
RULE_INT ( Range, Emote, 135 )
|
RULE_INT ( Range, Emote, 135 )
|
||||||
|
|||||||
@ -27,7 +27,7 @@
|
|||||||
#include "../../common/rulesys.h"
|
#include "../../common/rulesys.h"
|
||||||
#include "../../common/string_util.h"
|
#include "../../common/string_util.h"
|
||||||
|
|
||||||
EQEmuLogSys Log;
|
EQEmuLogSys LogSys;
|
||||||
|
|
||||||
void ExportSpells(SharedDatabase *db);
|
void ExportSpells(SharedDatabase *db);
|
||||||
void ExportSkillCaps(SharedDatabase *db);
|
void ExportSkillCaps(SharedDatabase *db);
|
||||||
@ -36,46 +36,46 @@ void ExportDBStrings(SharedDatabase *db);
|
|||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
RegisterExecutablePlatform(ExePlatformClientExport);
|
RegisterExecutablePlatform(ExePlatformClientExport);
|
||||||
Log.LoadLogSettingsDefaults();
|
LogSys.LoadLogSettingsDefaults();
|
||||||
set_exception_handler();
|
set_exception_handler();
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Status, "Client Files Export Utility");
|
Log(Logs::General, Logs::Status, "Client Files Export Utility");
|
||||||
if(!EQEmuConfig::LoadConfig()) {
|
if(!EQEmuConfig::LoadConfig()) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Unable to load configuration file.");
|
Log(Logs::General, Logs::Error, "Unable to load configuration file.");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Config = EQEmuConfig::get();
|
auto Config = EQEmuConfig::get();
|
||||||
|
|
||||||
SharedDatabase database;
|
SharedDatabase database;
|
||||||
Log.Out(Logs::General, Logs::Status, "Connecting to database...");
|
Log(Logs::General, Logs::Status, "Connecting to database...");
|
||||||
if(!database.Connect(Config->DatabaseHost.c_str(), Config->DatabaseUsername.c_str(),
|
if(!database.Connect(Config->DatabaseHost.c_str(), Config->DatabaseUsername.c_str(),
|
||||||
Config->DatabasePassword.c_str(), Config->DatabaseDB.c_str(), Config->DatabasePort)) {
|
Config->DatabasePassword.c_str(), Config->DatabaseDB.c_str(), Config->DatabasePort)) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Unable to connect to the database, cannot continue without a "
|
Log(Logs::General, Logs::Error, "Unable to connect to the database, cannot continue without a "
|
||||||
"database connection");
|
"database connection");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Register Log System and Settings */
|
/* Register Log System and Settings */
|
||||||
database.LoadLogSettings(Log.log_settings);
|
database.LoadLogSettings(LogSys.log_settings);
|
||||||
Log.StartFileLogs();
|
LogSys.StartFileLogs();
|
||||||
|
|
||||||
ExportSpells(&database);
|
ExportSpells(&database);
|
||||||
ExportSkillCaps(&database);
|
ExportSkillCaps(&database);
|
||||||
ExportBaseData(&database);
|
ExportBaseData(&database);
|
||||||
ExportDBStrings(&database);
|
ExportDBStrings(&database);
|
||||||
|
|
||||||
Log.CloseFileLogs();
|
LogSys.CloseFileLogs();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExportSpells(SharedDatabase *db) {
|
void ExportSpells(SharedDatabase *db) {
|
||||||
Log.Out(Logs::General, Logs::Status, "Exporting Spells...");
|
Log(Logs::General, Logs::Status, "Exporting Spells...");
|
||||||
|
|
||||||
FILE *f = fopen("export/spells_us.txt", "w");
|
FILE *f = fopen("export/spells_us.txt", "w");
|
||||||
if(!f) {
|
if(!f) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Unable to open export/spells_us.txt to write, skipping.");
|
Log(Logs::General, Logs::Error, "Unable to open export/spells_us.txt to write, skipping.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,11 +142,11 @@ int GetSkill(SharedDatabase *db, int skill_id, int class_id, int level) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ExportSkillCaps(SharedDatabase *db) {
|
void ExportSkillCaps(SharedDatabase *db) {
|
||||||
Log.Out(Logs::General, Logs::Status, "Exporting Skill Caps...");
|
Log(Logs::General, Logs::Status, "Exporting Skill Caps...");
|
||||||
|
|
||||||
FILE *f = fopen("export/SkillCaps.txt", "w");
|
FILE *f = fopen("export/SkillCaps.txt", "w");
|
||||||
if(!f) {
|
if(!f) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Unable to open export/SkillCaps.txt to write, skipping.");
|
Log(Logs::General, Logs::Error, "Unable to open export/SkillCaps.txt to write, skipping.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -171,11 +171,11 @@ void ExportSkillCaps(SharedDatabase *db) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ExportBaseData(SharedDatabase *db) {
|
void ExportBaseData(SharedDatabase *db) {
|
||||||
Log.Out(Logs::General, Logs::Status, "Exporting Base Data...");
|
Log(Logs::General, Logs::Status, "Exporting Base Data...");
|
||||||
|
|
||||||
FILE *f = fopen("export/BaseData.txt", "w");
|
FILE *f = fopen("export/BaseData.txt", "w");
|
||||||
if(!f) {
|
if(!f) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Unable to open export/BaseData.txt to write, skipping.");
|
Log(Logs::General, Logs::Error, "Unable to open export/BaseData.txt to write, skipping.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,11 +202,11 @@ void ExportBaseData(SharedDatabase *db) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ExportDBStrings(SharedDatabase *db) {
|
void ExportDBStrings(SharedDatabase *db) {
|
||||||
Log.Out(Logs::General, Logs::Status, "Exporting DB Strings...");
|
Log(Logs::General, Logs::Status, "Exporting DB Strings...");
|
||||||
|
|
||||||
FILE *f = fopen("export/dbstr_us.txt", "w");
|
FILE *f = fopen("export/dbstr_us.txt", "w");
|
||||||
if(!f) {
|
if(!f) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Unable to open export/dbstr_us.txt to write, skipping.");
|
Log(Logs::General, Logs::Error, "Unable to open export/dbstr_us.txt to write, skipping.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -25,7 +25,7 @@
|
|||||||
#include "../../common/rulesys.h"
|
#include "../../common/rulesys.h"
|
||||||
#include "../../common/string_util.h"
|
#include "../../common/string_util.h"
|
||||||
|
|
||||||
EQEmuLogSys Log;
|
EQEmuLogSys LogSys;
|
||||||
|
|
||||||
void ImportSpells(SharedDatabase *db);
|
void ImportSpells(SharedDatabase *db);
|
||||||
void ImportSkillCaps(SharedDatabase *db);
|
void ImportSkillCaps(SharedDatabase *db);
|
||||||
@ -34,35 +34,35 @@ void ImportDBStrings(SharedDatabase *db);
|
|||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
RegisterExecutablePlatform(ExePlatformClientImport);
|
RegisterExecutablePlatform(ExePlatformClientImport);
|
||||||
Log.LoadLogSettingsDefaults();
|
LogSys.LoadLogSettingsDefaults();
|
||||||
set_exception_handler();
|
set_exception_handler();
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Status, "Client Files Import Utility");
|
Log(Logs::General, Logs::Status, "Client Files Import Utility");
|
||||||
if(!EQEmuConfig::LoadConfig()) {
|
if(!EQEmuConfig::LoadConfig()) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Unable to load configuration file.");
|
Log(Logs::General, Logs::Error, "Unable to load configuration file.");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Config = EQEmuConfig::get();
|
auto Config = EQEmuConfig::get();
|
||||||
|
|
||||||
SharedDatabase database;
|
SharedDatabase database;
|
||||||
Log.Out(Logs::General, Logs::Status, "Connecting to database...");
|
Log(Logs::General, Logs::Status, "Connecting to database...");
|
||||||
if(!database.Connect(Config->DatabaseHost.c_str(), Config->DatabaseUsername.c_str(),
|
if(!database.Connect(Config->DatabaseHost.c_str(), Config->DatabaseUsername.c_str(),
|
||||||
Config->DatabasePassword.c_str(), Config->DatabaseDB.c_str(), Config->DatabasePort)) {
|
Config->DatabasePassword.c_str(), Config->DatabaseDB.c_str(), Config->DatabasePort)) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Unable to connect to the database, cannot continue without a "
|
Log(Logs::General, Logs::Error, "Unable to connect to the database, cannot continue without a "
|
||||||
"database connection");
|
"database connection");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
database.LoadLogSettings(Log.log_settings);
|
database.LoadLogSettings(LogSys.log_settings);
|
||||||
Log.StartFileLogs();
|
LogSys.StartFileLogs();
|
||||||
|
|
||||||
ImportSpells(&database);
|
ImportSpells(&database);
|
||||||
ImportSkillCaps(&database);
|
ImportSkillCaps(&database);
|
||||||
ImportBaseData(&database);
|
ImportBaseData(&database);
|
||||||
ImportDBStrings(&database);
|
ImportDBStrings(&database);
|
||||||
|
|
||||||
Log.CloseFileLogs();
|
LogSys.CloseFileLogs();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -97,10 +97,10 @@ bool IsStringField(int i) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ImportSpells(SharedDatabase *db) {
|
void ImportSpells(SharedDatabase *db) {
|
||||||
Log.Out(Logs::General, Logs::Status, "Importing Spells...");
|
Log(Logs::General, Logs::Status, "Importing Spells...");
|
||||||
FILE *f = fopen("import/spells_us.txt", "r");
|
FILE *f = fopen("import/spells_us.txt", "r");
|
||||||
if(!f) {
|
if(!f) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Unable to open import/spells_us.txt to read, skipping.");
|
Log(Logs::General, Logs::Error, "Unable to open import/spells_us.txt to read, skipping.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -173,23 +173,23 @@ void ImportSpells(SharedDatabase *db) {
|
|||||||
|
|
||||||
spells_imported++;
|
spells_imported++;
|
||||||
if(spells_imported % 1000 == 0) {
|
if(spells_imported % 1000 == 0) {
|
||||||
Log.Out(Logs::General, Logs::Status, "%d spells imported.", spells_imported);
|
Log(Logs::General, Logs::Status, "%d spells imported.", spells_imported);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(spells_imported % 1000 != 0) {
|
if(spells_imported % 1000 != 0) {
|
||||||
Log.Out(Logs::General, Logs::Status, "%d spells imported.", spells_imported);
|
Log(Logs::General, Logs::Status, "%d spells imported.", spells_imported);
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(f);
|
fclose(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImportSkillCaps(SharedDatabase *db) {
|
void ImportSkillCaps(SharedDatabase *db) {
|
||||||
Log.Out(Logs::General, Logs::Status, "Importing Skill Caps...");
|
Log(Logs::General, Logs::Status, "Importing Skill Caps...");
|
||||||
|
|
||||||
FILE *f = fopen("import/SkillCaps.txt", "r");
|
FILE *f = fopen("import/SkillCaps.txt", "r");
|
||||||
if(!f) {
|
if(!f) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Unable to open import/SkillCaps.txt to read, skipping.");
|
Log(Logs::General, Logs::Error, "Unable to open import/SkillCaps.txt to read, skipping.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -220,11 +220,11 @@ void ImportSkillCaps(SharedDatabase *db) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ImportBaseData(SharedDatabase *db) {
|
void ImportBaseData(SharedDatabase *db) {
|
||||||
Log.Out(Logs::General, Logs::Status, "Importing Base Data...");
|
Log(Logs::General, Logs::Status, "Importing Base Data...");
|
||||||
|
|
||||||
FILE *f = fopen("import/BaseData.txt", "r");
|
FILE *f = fopen("import/BaseData.txt", "r");
|
||||||
if(!f) {
|
if(!f) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Unable to open import/BaseData.txt to read, skipping.");
|
Log(Logs::General, Logs::Error, "Unable to open import/BaseData.txt to read, skipping.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -265,11 +265,11 @@ void ImportBaseData(SharedDatabase *db) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ImportDBStrings(SharedDatabase *db) {
|
void ImportDBStrings(SharedDatabase *db) {
|
||||||
Log.Out(Logs::General, Logs::Status, "Importing DB Strings...");
|
Log(Logs::General, Logs::Status, "Importing DB Strings...");
|
||||||
|
|
||||||
FILE *f = fopen("import/dbstr_us.txt", "r");
|
FILE *f = fopen("import/dbstr_us.txt", "r");
|
||||||
if(!f) {
|
if(!f) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Unable to open import/dbstr_us.txt to read, skipping.");
|
Log(Logs::General, Logs::Error, "Unable to open import/dbstr_us.txt to read, skipping.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -25,7 +25,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Crash, buffer);
|
Log(Logs::General, Logs::Crash, buffer);
|
||||||
StackWalker::OnOutput(szText);
|
StackWalker::OnOutput(szText);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -35,67 +35,67 @@ LONG WINAPI windows_exception_handler(EXCEPTION_POINTERS *ExceptionInfo)
|
|||||||
switch(ExceptionInfo->ExceptionRecord->ExceptionCode)
|
switch(ExceptionInfo->ExceptionRecord->ExceptionCode)
|
||||||
{
|
{
|
||||||
case EXCEPTION_ACCESS_VIOLATION:
|
case EXCEPTION_ACCESS_VIOLATION:
|
||||||
Log.Out(Logs::General, Logs::Crash, "EXCEPTION_ACCESS_VIOLATION");
|
Log(Logs::General, Logs::Crash, "EXCEPTION_ACCESS_VIOLATION");
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
|
case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
|
||||||
Log.Out(Logs::General, Logs::Crash, "EXCEPTION_ARRAY_BOUNDS_EXCEEDED");
|
Log(Logs::General, Logs::Crash, "EXCEPTION_ARRAY_BOUNDS_EXCEEDED");
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_BREAKPOINT:
|
case EXCEPTION_BREAKPOINT:
|
||||||
Log.Out(Logs::General, Logs::Crash, "EXCEPTION_BREAKPOINT");
|
Log(Logs::General, Logs::Crash, "EXCEPTION_BREAKPOINT");
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_DATATYPE_MISALIGNMENT:
|
case EXCEPTION_DATATYPE_MISALIGNMENT:
|
||||||
Log.Out(Logs::General, Logs::Crash, "EXCEPTION_DATATYPE_MISALIGNMENT");
|
Log(Logs::General, Logs::Crash, "EXCEPTION_DATATYPE_MISALIGNMENT");
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_FLT_DENORMAL_OPERAND:
|
case EXCEPTION_FLT_DENORMAL_OPERAND:
|
||||||
Log.Out(Logs::General, Logs::Crash, "EXCEPTION_FLT_DENORMAL_OPERAND");
|
Log(Logs::General, Logs::Crash, "EXCEPTION_FLT_DENORMAL_OPERAND");
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_FLT_DIVIDE_BY_ZERO:
|
case EXCEPTION_FLT_DIVIDE_BY_ZERO:
|
||||||
Log.Out(Logs::General, Logs::Crash, "EXCEPTION_FLT_DIVIDE_BY_ZERO");
|
Log(Logs::General, Logs::Crash, "EXCEPTION_FLT_DIVIDE_BY_ZERO");
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_FLT_INEXACT_RESULT:
|
case EXCEPTION_FLT_INEXACT_RESULT:
|
||||||
Log.Out(Logs::General, Logs::Crash, "EXCEPTION_FLT_INEXACT_RESULT");
|
Log(Logs::General, Logs::Crash, "EXCEPTION_FLT_INEXACT_RESULT");
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_FLT_INVALID_OPERATION:
|
case EXCEPTION_FLT_INVALID_OPERATION:
|
||||||
Log.Out(Logs::General, Logs::Crash, "EXCEPTION_FLT_INVALID_OPERATION");
|
Log(Logs::General, Logs::Crash, "EXCEPTION_FLT_INVALID_OPERATION");
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_FLT_OVERFLOW:
|
case EXCEPTION_FLT_OVERFLOW:
|
||||||
Log.Out(Logs::General, Logs::Crash, "EXCEPTION_FLT_OVERFLOW");
|
Log(Logs::General, Logs::Crash, "EXCEPTION_FLT_OVERFLOW");
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_FLT_STACK_CHECK:
|
case EXCEPTION_FLT_STACK_CHECK:
|
||||||
Log.Out(Logs::General, Logs::Crash, "EXCEPTION_FLT_STACK_CHECK");
|
Log(Logs::General, Logs::Crash, "EXCEPTION_FLT_STACK_CHECK");
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_FLT_UNDERFLOW:
|
case EXCEPTION_FLT_UNDERFLOW:
|
||||||
Log.Out(Logs::General, Logs::Crash, "EXCEPTION_FLT_UNDERFLOW");
|
Log(Logs::General, Logs::Crash, "EXCEPTION_FLT_UNDERFLOW");
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_ILLEGAL_INSTRUCTION:
|
case EXCEPTION_ILLEGAL_INSTRUCTION:
|
||||||
Log.Out(Logs::General, Logs::Crash, "EXCEPTION_ILLEGAL_INSTRUCTION");
|
Log(Logs::General, Logs::Crash, "EXCEPTION_ILLEGAL_INSTRUCTION");
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_IN_PAGE_ERROR:
|
case EXCEPTION_IN_PAGE_ERROR:
|
||||||
Log.Out(Logs::General, Logs::Crash, "EXCEPTION_IN_PAGE_ERROR");
|
Log(Logs::General, Logs::Crash, "EXCEPTION_IN_PAGE_ERROR");
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_INT_DIVIDE_BY_ZERO:
|
case EXCEPTION_INT_DIVIDE_BY_ZERO:
|
||||||
Log.Out(Logs::General, Logs::Crash, "EXCEPTION_INT_DIVIDE_BY_ZERO");
|
Log(Logs::General, Logs::Crash, "EXCEPTION_INT_DIVIDE_BY_ZERO");
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_INT_OVERFLOW:
|
case EXCEPTION_INT_OVERFLOW:
|
||||||
Log.Out(Logs::General, Logs::Crash, "EXCEPTION_INT_OVERFLOW");
|
Log(Logs::General, Logs::Crash, "EXCEPTION_INT_OVERFLOW");
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_INVALID_DISPOSITION:
|
case EXCEPTION_INVALID_DISPOSITION:
|
||||||
Log.Out(Logs::General, Logs::Crash, "EXCEPTION_INVALID_DISPOSITION");
|
Log(Logs::General, Logs::Crash, "EXCEPTION_INVALID_DISPOSITION");
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_NONCONTINUABLE_EXCEPTION:
|
case EXCEPTION_NONCONTINUABLE_EXCEPTION:
|
||||||
Log.Out(Logs::General, Logs::Crash, "EXCEPTION_NONCONTINUABLE_EXCEPTION");
|
Log(Logs::General, Logs::Crash, "EXCEPTION_NONCONTINUABLE_EXCEPTION");
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_PRIV_INSTRUCTION:
|
case EXCEPTION_PRIV_INSTRUCTION:
|
||||||
Log.Out(Logs::General, Logs::Crash, "EXCEPTION_PRIV_INSTRUCTION");
|
Log(Logs::General, Logs::Crash, "EXCEPTION_PRIV_INSTRUCTION");
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_SINGLE_STEP:
|
case EXCEPTION_SINGLE_STEP:
|
||||||
Log.Out(Logs::General, Logs::Crash, "EXCEPTION_SINGLE_STEP");
|
Log(Logs::General, Logs::Crash, "EXCEPTION_SINGLE_STEP");
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_STACK_OVERFLOW:
|
case EXCEPTION_STACK_OVERFLOW:
|
||||||
Log.Out(Logs::General, Logs::Crash, "EXCEPTION_STACK_OVERFLOW");
|
Log(Logs::General, Logs::Crash, "EXCEPTION_STACK_OVERFLOW");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Log.Out(Logs::General, Logs::Crash, "Unknown Exception");
|
Log(Logs::General, Logs::Crash, "Unknown Exception");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -64,11 +64,11 @@ bool Database::Connect(const char* host, const char* user, const char* passwd, c
|
|||||||
uint32 errnum= 0;
|
uint32 errnum= 0;
|
||||||
char errbuf[MYSQL_ERRMSG_SIZE];
|
char errbuf[MYSQL_ERRMSG_SIZE];
|
||||||
if (!Open(host, user, passwd, database, port, &errnum, errbuf)) {
|
if (!Open(host, user, passwd, database, port, &errnum, errbuf)) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Failed to connect to database: Error: %s", errbuf);
|
Log(Logs::General, Logs::Error, "Failed to connect to database: Error: %s", errbuf);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Log.Out(Logs::General, Logs::Status, "Using database '%s' at %s:%d", database, host,port);
|
Log(Logs::General, Logs::Status, "Using database '%s' at %s:%d", database, host,port);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -208,7 +208,7 @@ uint32 Database::CreateAccount(const char* name, const char* password, int16 sta
|
|||||||
else
|
else
|
||||||
query = StringFormat("INSERT INTO account SET name='%s', status=%i, lsaccount_id=%i, time_creation=UNIX_TIMESTAMP();",name, status, lsaccount_id);
|
query = StringFormat("INSERT INTO account SET name='%s', status=%i, lsaccount_id=%i, time_creation=UNIX_TIMESTAMP();",name, status, lsaccount_id);
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Account Attempting to be created: '%s' status: %i", name, status);
|
Log(Logs::General, Logs::World_Server, "Account Attempting to be created: '%s' status: %i", name, status);
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
|
|
||||||
if (!results.Success()) {
|
if (!results.Success()) {
|
||||||
@ -225,7 +225,7 @@ uint32 Database::CreateAccount(const char* name, const char* password, int16 sta
|
|||||||
|
|
||||||
bool Database::DeleteAccount(const char* name) {
|
bool Database::DeleteAccount(const char* name) {
|
||||||
std::string query = StringFormat("DELETE FROM account WHERE name='%s';",name);
|
std::string query = StringFormat("DELETE FROM account WHERE name='%s';",name);
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Account Attempting to be deleted:'%s'", name);
|
Log(Logs::General, Logs::World_Server, "Account Attempting to be deleted:'%s'", name);
|
||||||
|
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
if (!results.Success()) {
|
if (!results.Success()) {
|
||||||
@ -272,7 +272,7 @@ bool Database::ReserveName(uint32 account_id, char* name) {
|
|||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
if (row[0] && atoi(row[0]) > 0){
|
if (row[0] && atoi(row[0]) > 0){
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Account: %i tried to request name: %s, but it is already taken...", account_id, name);
|
Log(Logs::General, Logs::World_Server, "Account: %i tried to request name: %s, but it is already taken...", account_id, name);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -290,17 +290,17 @@ bool Database::ReserveName(uint32 account_id, char* name) {
|
|||||||
bool Database::DeleteCharacter(char *name) {
|
bool Database::DeleteCharacter(char *name) {
|
||||||
uint32 charid = 0;
|
uint32 charid = 0;
|
||||||
if(!name || !strlen(name)) {
|
if(!name || !strlen(name)) {
|
||||||
Log.Out(Logs::General, Logs::World_Server, "DeleteCharacter: request to delete without a name (empty char slot)");
|
Log(Logs::General, Logs::World_Server, "DeleteCharacter: request to delete without a name (empty char slot)");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Database::DeleteCharacter name : '%s'", name);
|
Log(Logs::General, Logs::World_Server, "Database::DeleteCharacter name : '%s'", name);
|
||||||
|
|
||||||
/* Get id from character_data before deleting record so we can clean up the rest of the tables */
|
/* Get id from character_data before deleting record so we can clean up the rest of the tables */
|
||||||
std::string query = StringFormat("SELECT `id` from `character_data` WHERE `name` = '%s'", name);
|
std::string query = StringFormat("SELECT `id` from `character_data` WHERE `name` = '%s'", name);
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
for (auto row = results.begin(); row != results.end(); ++row) { charid = atoi(row[0]); }
|
for (auto row = results.begin(); row != results.end(); ++row) { charid = atoi(row[0]); }
|
||||||
if (charid <= 0){
|
if (charid <= 0){
|
||||||
Log.Out(Logs::General, Logs::Error, "Database::DeleteCharacter :: Character (%s) not found, stopping delete...", name);
|
Log(Logs::General, Logs::Error, "Database::DeleteCharacter :: Character (%s) not found, stopping delete...", name);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -687,7 +687,7 @@ bool Database::StoreCharacter(uint32 account_id, PlayerProfile_Struct* pp, EQEmu
|
|||||||
charid = GetCharacterID(pp->name);
|
charid = GetCharacterID(pp->name);
|
||||||
|
|
||||||
if(!charid) {
|
if(!charid) {
|
||||||
Log.Out(Logs::General, Logs::Error, "StoreCharacter: no character id");
|
Log(Logs::General, Logs::Error, "StoreCharacter: no character id");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1500,7 +1500,7 @@ void Database::SetGroupID(const char* name, uint32 id, uint32 charid, uint32 ism
|
|||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
|
|
||||||
if (!results.Success())
|
if (!results.Success())
|
||||||
Log.Out(Logs::General, Logs::Error, "Error deleting character from group id: %s", results.ErrorMessage().c_str());
|
Log(Logs::General, Logs::Error, "Error deleting character from group id: %s", results.ErrorMessage().c_str());
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1542,6 +1542,8 @@ uint32 Database::GetGroupID(const char* name){
|
|||||||
|
|
||||||
if (results.RowCount() == 0)
|
if (results.RowCount() == 0)
|
||||||
{
|
{
|
||||||
|
// Commenting this out until logging levels can prevent this from going to console
|
||||||
|
//Log(Logs::General, Logs::None,, "Character not in a group: %s", name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1588,7 +1590,7 @@ void Database::SetGroupLeaderName(uint32 gid, const char* name) {
|
|||||||
result = QueryDatabase(query);
|
result = QueryDatabase(query);
|
||||||
|
|
||||||
if(!result.Success()) {
|
if(!result.Success()) {
|
||||||
Log.Out(Logs::General, Logs::None, "Error in Database::SetGroupLeaderName: %s", result.ErrorMessage().c_str());
|
Log(Logs::General, Logs::None, "Error in Database::SetGroupLeaderName: %s", result.ErrorMessage().c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1785,7 +1787,7 @@ const char* Database::GetRaidLeaderName(uint32 raid_id)
|
|||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
|
|
||||||
if (!results.Success()) {
|
if (!results.Success()) {
|
||||||
Log.Out(Logs::General, Logs::Debug, "Unable to get Raid Leader Name for Raid ID: %u", raid_id);
|
Log(Logs::General, Logs::Debug, "Unable to get Raid Leader Name for Raid ID: %u", raid_id);
|
||||||
return "UNKNOWN";
|
return "UNKNOWN";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2069,7 +2071,7 @@ void Database::LoadLogSettings(EQEmuLogSys::LogSettings* log_settings)
|
|||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
|
|
||||||
int log_category = 0;
|
int log_category = 0;
|
||||||
Log.file_logs_enabled = false;
|
LogSys.file_logs_enabled = false;
|
||||||
|
|
||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
log_category = atoi(row[0]);
|
log_category = atoi(row[0]);
|
||||||
@ -2095,7 +2097,7 @@ void Database::LoadLogSettings(EQEmuLogSys::LogSettings* log_settings)
|
|||||||
If we go through this whole loop and nothing is set to any debug level, there is no point to create a file or keep anything open
|
If we go through this whole loop and nothing is set to any debug level, there is no point to create a file or keep anything open
|
||||||
*/
|
*/
|
||||||
if (log_settings[log_category].log_to_file > 0){
|
if (log_settings[log_category].log_to_file > 0){
|
||||||
Log.file_logs_enabled = true;
|
LogSys.file_logs_enabled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2117,7 +2119,7 @@ struct TimeOfDay_Struct Database::LoadTime(time_t &realtime)
|
|||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
|
|
||||||
if (!results.Success() || results.RowCount() == 0){
|
if (!results.Success() || results.RowCount() == 0){
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Loading EQ time of day failed. Using defaults.");
|
Log(Logs::Detail, Logs::World_Server, "Loading EQ time of day failed. Using defaults.");
|
||||||
eqTime.minute = 0;
|
eqTime.minute = 0;
|
||||||
eqTime.hour = 9;
|
eqTime.hour = 9;
|
||||||
eqTime.day = 1;
|
eqTime.day = 1;
|
||||||
|
|||||||
@ -110,8 +110,8 @@ MySQLRequestResult DBcore::QueryDatabase(const char* query, uint32 querylen, boo
|
|||||||
|
|
||||||
/* Implement Logging at the Root */
|
/* Implement Logging at the Root */
|
||||||
if (mysql_errno(&mysql) > 0 && strlen(query) > 0){
|
if (mysql_errno(&mysql) > 0 && strlen(query) > 0){
|
||||||
if (Log.log_settings[Logs::MySQLError].is_category_enabled == 1)
|
if (LogSys.log_settings[Logs::MySQLError].is_category_enabled == 1)
|
||||||
Log.Out(Logs::General, Logs::MySQLError, "%i: %s \n %s", mysql_errno(&mysql), mysql_error(&mysql), query);
|
Log(Logs::General, Logs::MySQLError, "%i: %s \n %s", mysql_errno(&mysql), mysql_error(&mysql), query);
|
||||||
}
|
}
|
||||||
|
|
||||||
return MySQLRequestResult(nullptr, 0, 0, 0, 0, mysql_errno(&mysql),errorBuffer);
|
return MySQLRequestResult(nullptr, 0, 0, 0, 0, mysql_errno(&mysql),errorBuffer);
|
||||||
@ -127,12 +127,14 @@ MySQLRequestResult DBcore::QueryDatabase(const char* query, uint32 querylen, boo
|
|||||||
|
|
||||||
MySQLRequestResult requestResult(res, (uint32)mysql_affected_rows(&mysql), rowCount, (uint32)mysql_field_count(&mysql), (uint32)mysql_insert_id(&mysql));
|
MySQLRequestResult requestResult(res, (uint32)mysql_affected_rows(&mysql), rowCount, (uint32)mysql_field_count(&mysql), (uint32)mysql_insert_id(&mysql));
|
||||||
|
|
||||||
if (Log.log_settings[Logs::MySQLQuery].is_category_enabled == 1)
|
if (LogSys.log_settings[Logs::MySQLQuery].is_category_enabled == 1)
|
||||||
{
|
{
|
||||||
if ((strncasecmp(query, "select", 6) == 0))
|
if ((strncasecmp(query, "select", 6) == 0)) {
|
||||||
Log.Out(Logs::General, Logs::MySQLQuery, "%s (%u row%s returned)", query, requestResult.RowCount(), requestResult.RowCount() == 1 ? "" : "s");
|
Log(Logs::General, Logs::MySQLQuery, "%s (%u row%s returned)", query, requestResult.RowCount(), requestResult.RowCount() == 1 ? "" : "s");
|
||||||
else
|
}
|
||||||
Log.Out(Logs::General, Logs::MySQLQuery, "%s (%u row%s affected)", query, requestResult.RowsAffected(), requestResult.RowsAffected() == 1 ? "" : "s");
|
else {
|
||||||
|
Log(Logs::General, Logs::MySQLQuery, "%s (%u row%s affected)", query, requestResult.RowsAffected(), requestResult.RowsAffected() == 1 ? "" : "s");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return requestResult;
|
return requestResult;
|
||||||
|
|||||||
@ -84,14 +84,14 @@ void EQStream::init(bool resetSession) {
|
|||||||
|
|
||||||
OpMgr = nullptr;
|
OpMgr = nullptr;
|
||||||
if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
|
if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "init Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, SequencedBase, SequencedQueue.size(), NextOutSeq);
|
Log(Logs::Detail, Logs::Netcode, _L "init Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, SequencedBase, SequencedQueue.size(), NextOutSeq);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EQRawApplicationPacket *EQStream::MakeApplicationPacket(EQProtocolPacket *p)
|
EQRawApplicationPacket *EQStream::MakeApplicationPacket(EQProtocolPacket *p)
|
||||||
{
|
{
|
||||||
EQRawApplicationPacket *ap=nullptr;
|
EQRawApplicationPacket *ap=nullptr;
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Creating new application packet, length %d" __L, p->size);
|
Log(Logs::Detail, Logs::Netcode, _L "Creating new application packet, length %d" __L, p->size);
|
||||||
// _raw(NET__APP_CREATE_HEX, 0xFFFF, p);
|
// _raw(NET__APP_CREATE_HEX, 0xFFFF, p);
|
||||||
ap = p->MakeAppPacket();
|
ap = p->MakeAppPacket();
|
||||||
return ap;
|
return ap;
|
||||||
@ -100,7 +100,7 @@ EQRawApplicationPacket *EQStream::MakeApplicationPacket(EQProtocolPacket *p)
|
|||||||
EQRawApplicationPacket *EQStream::MakeApplicationPacket(const unsigned char *buf, uint32 len)
|
EQRawApplicationPacket *EQStream::MakeApplicationPacket(const unsigned char *buf, uint32 len)
|
||||||
{
|
{
|
||||||
EQRawApplicationPacket *ap=nullptr;
|
EQRawApplicationPacket *ap=nullptr;
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Creating new application packet, length %d" __L, len);
|
Log(Logs::Detail, Logs::Netcode, _L "Creating new application packet, length %d" __L, len);
|
||||||
ap = new EQRawApplicationPacket(buf, len);
|
ap = new EQRawApplicationPacket(buf, len);
|
||||||
return ap;
|
return ap;
|
||||||
}
|
}
|
||||||
@ -130,7 +130,7 @@ void EQStream::ProcessPacket(EQProtocolPacket *p)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!Session && p->opcode!=OP_SessionRequest && p->opcode!=OP_SessionResponse) {
|
if (!Session && p->opcode!=OP_SessionRequest && p->opcode!=OP_SessionResponse) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Session not initialized, packet ignored" __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Session not initialized, packet ignored" __L);
|
||||||
// _raw(NET__DEBUG, 0xFFFF, p);
|
// _raw(NET__DEBUG, 0xFFFF, p);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -141,7 +141,7 @@ void EQStream::ProcessPacket(EQProtocolPacket *p)
|
|||||||
while(processed < p->size) {
|
while(processed < p->size) {
|
||||||
subpacket_length=*(p->pBuffer+processed);
|
subpacket_length=*(p->pBuffer+processed);
|
||||||
EQProtocolPacket *subp=MakeProtocolPacket(p->pBuffer+processed+1,subpacket_length);
|
EQProtocolPacket *subp=MakeProtocolPacket(p->pBuffer+processed+1,subpacket_length);
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Extracting combined packet of length %d" __L, subpacket_length);
|
Log(Logs::Detail, Logs::Netcode, _L "Extracting combined packet of length %d" __L, subpacket_length);
|
||||||
// _raw(NET__NET_CREATE_HEX, 0xFFFF, subp);
|
// _raw(NET__NET_CREATE_HEX, 0xFFFF, subp);
|
||||||
subp->copyInfo(p);
|
subp->copyInfo(p);
|
||||||
ProcessPacket(subp);
|
ProcessPacket(subp);
|
||||||
@ -156,12 +156,12 @@ void EQStream::ProcessPacket(EQProtocolPacket *p)
|
|||||||
while(processed<p->size) {
|
while(processed<p->size) {
|
||||||
EQRawApplicationPacket *ap=nullptr;
|
EQRawApplicationPacket *ap=nullptr;
|
||||||
if ((subpacket_length=(unsigned char)*(p->pBuffer+processed))!=0xff) {
|
if ((subpacket_length=(unsigned char)*(p->pBuffer+processed))!=0xff) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Extracting combined app packet of length %d, short len" __L, subpacket_length);
|
Log(Logs::Detail, Logs::Netcode, _L "Extracting combined app packet of length %d, short len" __L, subpacket_length);
|
||||||
ap=MakeApplicationPacket(p->pBuffer+processed+1,subpacket_length);
|
ap=MakeApplicationPacket(p->pBuffer+processed+1,subpacket_length);
|
||||||
processed+=subpacket_length+1;
|
processed+=subpacket_length+1;
|
||||||
} else {
|
} else {
|
||||||
subpacket_length=ntohs(*(uint16 *)(p->pBuffer+processed+1));
|
subpacket_length=ntohs(*(uint16 *)(p->pBuffer+processed+1));
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Extracting combined app packet of length %d, short len" __L, subpacket_length);
|
Log(Logs::Detail, Logs::Netcode, _L "Extracting combined app packet of length %d, short len" __L, subpacket_length);
|
||||||
ap=MakeApplicationPacket(p->pBuffer+processed+3,subpacket_length);
|
ap=MakeApplicationPacket(p->pBuffer+processed+3,subpacket_length);
|
||||||
processed+=subpacket_length+3;
|
processed+=subpacket_length+3;
|
||||||
}
|
}
|
||||||
@ -176,29 +176,29 @@ void EQStream::ProcessPacket(EQProtocolPacket *p)
|
|||||||
case OP_Packet: {
|
case OP_Packet: {
|
||||||
if(!p->pBuffer || (p->Size() < 4))
|
if(!p->pBuffer || (p->Size() < 4))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Received OP_Packet that was of malformed size" __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Received OP_Packet that was of malformed size" __L);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
uint16 seq=ntohs(*(uint16 *)(p->pBuffer));
|
uint16 seq=ntohs(*(uint16 *)(p->pBuffer));
|
||||||
SeqOrder check=CompareSequence(NextInSeq,seq);
|
SeqOrder check=CompareSequence(NextInSeq,seq);
|
||||||
if (check == SeqFuture) {
|
if (check == SeqFuture) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Future OP_Packet: Expecting Seq=%d, but got Seq=%d" __L, NextInSeq, seq);
|
Log(Logs::Detail, Logs::Netcode, _L "Future OP_Packet: Expecting Seq=%d, but got Seq=%d" __L, NextInSeq, seq);
|
||||||
// _raw(NET__DEBUG, seq, p);
|
// _raw(NET__DEBUG, seq, p);
|
||||||
|
|
||||||
PacketQueue[seq]=p->Copy();
|
PacketQueue[seq]=p->Copy();
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "OP_Packet Queue size=%d" __L, PacketQueue.size());
|
Log(Logs::Detail, Logs::Netcode, _L "OP_Packet Queue size=%d" __L, PacketQueue.size());
|
||||||
|
|
||||||
//SendOutOfOrderAck(seq);
|
//SendOutOfOrderAck(seq);
|
||||||
|
|
||||||
} else if (check == SeqPast) {
|
} else if (check == SeqPast) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Duplicate OP_Packet: Expecting Seq=%d, but got Seq=%d" __L, NextInSeq, seq);
|
Log(Logs::Detail, Logs::Netcode, _L "Duplicate OP_Packet: Expecting Seq=%d, but got Seq=%d" __L, NextInSeq, seq);
|
||||||
// _raw(NET__DEBUG, seq, p);
|
// _raw(NET__DEBUG, seq, p);
|
||||||
SendOutOfOrderAck(seq); //we already got this packet but it was out of order
|
SendOutOfOrderAck(seq); //we already got this packet but it was out of order
|
||||||
} else {
|
} else {
|
||||||
// In case we did queue one before as well.
|
// In case we did queue one before as well.
|
||||||
EQProtocolPacket *qp=RemoveQueue(seq);
|
EQProtocolPacket *qp=RemoveQueue(seq);
|
||||||
if (qp) {
|
if (qp) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[NET_TRACE] OP_Packet: Removing older queued packet with sequence %d", seq);
|
Log(Logs::General, Logs::Netcode, "[NET_TRACE] OP_Packet: Removing older queued packet with sequence %d", seq);
|
||||||
delete qp;
|
delete qp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -207,7 +207,7 @@ void EQStream::ProcessPacket(EQProtocolPacket *p)
|
|||||||
// Check for an embedded OP_AppCombinded (protocol level 0x19)
|
// Check for an embedded OP_AppCombinded (protocol level 0x19)
|
||||||
if (*(p->pBuffer+2)==0x00 && *(p->pBuffer+3)==0x19) {
|
if (*(p->pBuffer+2)==0x00 && *(p->pBuffer+3)==0x19) {
|
||||||
EQProtocolPacket *subp=MakeProtocolPacket(p->pBuffer+2,p->size-2);
|
EQProtocolPacket *subp=MakeProtocolPacket(p->pBuffer+2,p->size-2);
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "seq %d, Extracting combined packet of length %d" __L, seq, subp->size);
|
Log(Logs::Detail, Logs::Netcode, _L "seq %d, Extracting combined packet of length %d" __L, seq, subp->size);
|
||||||
// _raw(NET__NET_CREATE_HEX, seq, subp);
|
// _raw(NET__NET_CREATE_HEX, seq, subp);
|
||||||
subp->copyInfo(p);
|
subp->copyInfo(p);
|
||||||
ProcessPacket(subp);
|
ProcessPacket(subp);
|
||||||
@ -226,29 +226,29 @@ void EQStream::ProcessPacket(EQProtocolPacket *p)
|
|||||||
case OP_Fragment: {
|
case OP_Fragment: {
|
||||||
if(!p->pBuffer || (p->Size() < 4))
|
if(!p->pBuffer || (p->Size() < 4))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Received OP_Fragment that was of malformed size" __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Received OP_Fragment that was of malformed size" __L);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
uint16 seq=ntohs(*(uint16 *)(p->pBuffer));
|
uint16 seq=ntohs(*(uint16 *)(p->pBuffer));
|
||||||
SeqOrder check=CompareSequence(NextInSeq,seq);
|
SeqOrder check=CompareSequence(NextInSeq,seq);
|
||||||
if (check == SeqFuture) {
|
if (check == SeqFuture) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Future OP_Fragment: Expecting Seq=%d, but got Seq=%d" __L, NextInSeq, seq);
|
Log(Logs::Detail, Logs::Netcode, _L "Future OP_Fragment: Expecting Seq=%d, but got Seq=%d" __L, NextInSeq, seq);
|
||||||
// _raw(NET__DEBUG, seq, p);
|
// _raw(NET__DEBUG, seq, p);
|
||||||
|
|
||||||
PacketQueue[seq]=p->Copy();
|
PacketQueue[seq]=p->Copy();
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "OP_Fragment Queue size=%d" __L, PacketQueue.size());
|
Log(Logs::Detail, Logs::Netcode, _L "OP_Fragment Queue size=%d" __L, PacketQueue.size());
|
||||||
|
|
||||||
//SendOutOfOrderAck(seq);
|
//SendOutOfOrderAck(seq);
|
||||||
|
|
||||||
} else if (check == SeqPast) {
|
} else if (check == SeqPast) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Duplicate OP_Fragment: Expecting Seq=%d, but got Seq=%d" __L, NextInSeq, seq);
|
Log(Logs::Detail, Logs::Netcode, _L "Duplicate OP_Fragment: Expecting Seq=%d, but got Seq=%d" __L, NextInSeq, seq);
|
||||||
// _raw(NET__DEBUG, seq, p);
|
// _raw(NET__DEBUG, seq, p);
|
||||||
SendOutOfOrderAck(seq);
|
SendOutOfOrderAck(seq);
|
||||||
} else {
|
} else {
|
||||||
// In case we did queue one before as well.
|
// In case we did queue one before as well.
|
||||||
EQProtocolPacket *qp=RemoveQueue(seq);
|
EQProtocolPacket *qp=RemoveQueue(seq);
|
||||||
if (qp) {
|
if (qp) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[NET_TRACE] OP_Fragment: Removing older queued packet with sequence %d", seq);
|
Log(Logs::General, Logs::Netcode, "[NET_TRACE] OP_Fragment: Removing older queued packet with sequence %d", seq);
|
||||||
delete qp;
|
delete qp;
|
||||||
}
|
}
|
||||||
SetNextAckToSend(seq);
|
SetNextAckToSend(seq);
|
||||||
@ -256,18 +256,18 @@ void EQStream::ProcessPacket(EQProtocolPacket *p)
|
|||||||
if (oversize_buffer) {
|
if (oversize_buffer) {
|
||||||
memcpy(oversize_buffer+oversize_offset,p->pBuffer+2,p->size-2);
|
memcpy(oversize_buffer+oversize_offset,p->pBuffer+2,p->size-2);
|
||||||
oversize_offset+=p->size-2;
|
oversize_offset+=p->size-2;
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Fragment of oversized of length %d, seq %d: now at %d/%d" __L, p->size-2, seq, oversize_offset, oversize_length);
|
Log(Logs::Detail, Logs::Netcode, _L "Fragment of oversized of length %d, seq %d: now at %d/%d" __L, p->size-2, seq, oversize_offset, oversize_length);
|
||||||
if (oversize_offset==oversize_length) {
|
if (oversize_offset==oversize_length) {
|
||||||
if (*(p->pBuffer+2)==0x00 && *(p->pBuffer+3)==0x19) {
|
if (*(p->pBuffer+2)==0x00 && *(p->pBuffer+3)==0x19) {
|
||||||
EQProtocolPacket *subp=MakeProtocolPacket(oversize_buffer,oversize_offset);
|
EQProtocolPacket *subp=MakeProtocolPacket(oversize_buffer,oversize_offset);
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "seq %d, Extracting combined oversize packet of length %d" __L, seq, subp->size);
|
Log(Logs::Detail, Logs::Netcode, _L "seq %d, Extracting combined oversize packet of length %d" __L, seq, subp->size);
|
||||||
//// _raw(NET__NET_CREATE_HEX, subp);
|
//// _raw(NET__NET_CREATE_HEX, subp);
|
||||||
subp->copyInfo(p);
|
subp->copyInfo(p);
|
||||||
ProcessPacket(subp);
|
ProcessPacket(subp);
|
||||||
delete subp;
|
delete subp;
|
||||||
} else {
|
} else {
|
||||||
EQRawApplicationPacket *ap=MakeApplicationPacket(oversize_buffer,oversize_offset);
|
EQRawApplicationPacket *ap=MakeApplicationPacket(oversize_buffer,oversize_offset);
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "seq %d, completed combined oversize packet of length %d" __L, seq, ap->size);
|
Log(Logs::Detail, Logs::Netcode, _L "seq %d, completed combined oversize packet of length %d" __L, seq, ap->size);
|
||||||
if (ap) {
|
if (ap) {
|
||||||
ap->copyInfo(p);
|
ap->copyInfo(p);
|
||||||
InboundQueuePush(ap);
|
InboundQueuePush(ap);
|
||||||
@ -282,20 +282,20 @@ void EQStream::ProcessPacket(EQProtocolPacket *p)
|
|||||||
oversize_buffer=new unsigned char[oversize_length];
|
oversize_buffer=new unsigned char[oversize_length];
|
||||||
memcpy(oversize_buffer,p->pBuffer+6,p->size-6);
|
memcpy(oversize_buffer,p->pBuffer+6,p->size-6);
|
||||||
oversize_offset=p->size-6;
|
oversize_offset=p->size-6;
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "First fragment of oversized of seq %d: now at %d/%d" __L, seq, oversize_offset, oversize_length);
|
Log(Logs::Detail, Logs::Netcode, _L "First fragment of oversized of seq %d: now at %d/%d" __L, seq, oversize_offset, oversize_length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case OP_KeepAlive: {
|
case OP_KeepAlive: {
|
||||||
NonSequencedPush(new EQProtocolPacket(p->opcode,p->pBuffer,p->size));
|
NonSequencedPush(new EQProtocolPacket(p->opcode,p->pBuffer,p->size));
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Received and queued reply to keep alive" __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Received and queued reply to keep alive" __L);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case OP_Ack: {
|
case OP_Ack: {
|
||||||
if(!p->pBuffer || (p->Size() < 4))
|
if(!p->pBuffer || (p->Size() < 4))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Received OP_Ack that was of malformed size" __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Received OP_Ack that was of malformed size" __L);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
uint16 seq=ntohs(*(uint16 *)(p->pBuffer));
|
uint16 seq=ntohs(*(uint16 *)(p->pBuffer));
|
||||||
@ -309,11 +309,11 @@ void EQStream::ProcessPacket(EQProtocolPacket *p)
|
|||||||
case OP_SessionRequest: {
|
case OP_SessionRequest: {
|
||||||
if(p->Size() < sizeof(SessionRequest))
|
if(p->Size() < sizeof(SessionRequest))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Received OP_SessionRequest that was of malformed size" __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Received OP_SessionRequest that was of malformed size" __L);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (GetState()==ESTABLISHED) {
|
if (GetState()==ESTABLISHED) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Received OP_SessionRequest in ESTABLISHED state (%d) streamactive (%i) attempt (%i)" __L, GetState(),streamactive,sessionAttempts);
|
Log(Logs::Detail, Logs::Netcode, _L "Received OP_SessionRequest in ESTABLISHED state (%d) streamactive (%i) attempt (%i)" __L, GetState(),streamactive,sessionAttempts);
|
||||||
|
|
||||||
// client seems to try a max of 30 times (initial+3 retries) then gives up, giving it a few more attempts just in case
|
// client seems to try a max of 30 times (initial+3 retries) then gives up, giving it a few more attempts just in case
|
||||||
// streamactive means we identified the opcode for the stream, we cannot re-establish this connection
|
// streamactive means we identified the opcode for the stream, we cannot re-establish this connection
|
||||||
@ -331,7 +331,7 @@ void EQStream::ProcessPacket(EQProtocolPacket *p)
|
|||||||
SessionRequest *Request=(SessionRequest *)p->pBuffer;
|
SessionRequest *Request=(SessionRequest *)p->pBuffer;
|
||||||
Session=ntohl(Request->Session);
|
Session=ntohl(Request->Session);
|
||||||
SetMaxLen(ntohl(Request->MaxLength));
|
SetMaxLen(ntohl(Request->MaxLength));
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Received OP_SessionRequest: session %lu, maxlen %d" __L, (unsigned long)Session, MaxLen);
|
Log(Logs::Detail, Logs::Netcode, _L "Received OP_SessionRequest: session %lu, maxlen %d" __L, (unsigned long)Session, MaxLen);
|
||||||
SetState(ESTABLISHED);
|
SetState(ESTABLISHED);
|
||||||
Key=0x11223344;
|
Key=0x11223344;
|
||||||
SendSessionResponse();
|
SendSessionResponse();
|
||||||
@ -340,7 +340,7 @@ void EQStream::ProcessPacket(EQProtocolPacket *p)
|
|||||||
case OP_SessionResponse: {
|
case OP_SessionResponse: {
|
||||||
if(p->Size() < sizeof(SessionResponse))
|
if(p->Size() < sizeof(SessionResponse))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Received OP_SessionResponse that was of malformed size" __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Received OP_SessionResponse that was of malformed size" __L);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -356,7 +356,7 @@ void EQStream::ProcessPacket(EQProtocolPacket *p)
|
|||||||
compressed=(Response->Format&FLAG_COMPRESSED);
|
compressed=(Response->Format&FLAG_COMPRESSED);
|
||||||
encoded=(Response->Format&FLAG_ENCODED);
|
encoded=(Response->Format&FLAG_ENCODED);
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Received OP_SessionResponse: session %lu, maxlen %d, key %lu, compressed? %s, encoded? %s" __L, (unsigned long)Session, MaxLen, (unsigned long)Key, compressed?"yes":"no", encoded?"yes":"no");
|
Log(Logs::Detail, Logs::Netcode, _L "Received OP_SessionResponse: session %lu, maxlen %d, key %lu, compressed? %s, encoded? %s" __L, (unsigned long)Session, MaxLen, (unsigned long)Key, compressed?"yes":"no", encoded?"yes":"no");
|
||||||
|
|
||||||
// Kinda kludgy, but trie for now
|
// Kinda kludgy, but trie for now
|
||||||
if (StreamType==UnknownStream) {
|
if (StreamType==UnknownStream) {
|
||||||
@ -379,17 +379,17 @@ void EQStream::ProcessPacket(EQProtocolPacket *p)
|
|||||||
EQStreamState state = GetState();
|
EQStreamState state = GetState();
|
||||||
if(state == ESTABLISHED) {
|
if(state == ESTABLISHED) {
|
||||||
//client initiated disconnect?
|
//client initiated disconnect?
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Received unsolicited OP_SessionDisconnect. Treating like a client-initiated disconnect." __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Received unsolicited OP_SessionDisconnect. Treating like a client-initiated disconnect." __L);
|
||||||
_SendDisconnect();
|
_SendDisconnect();
|
||||||
SetState(CLOSED);
|
SetState(CLOSED);
|
||||||
} else if(state == CLOSING) {
|
} else if(state == CLOSING) {
|
||||||
//we were waiting for this anyways, ignore pending messages, send the reply and be closed.
|
//we were waiting for this anyways, ignore pending messages, send the reply and be closed.
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Received OP_SessionDisconnect when we have a pending close, they beat us to it. Were happy though." __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Received OP_SessionDisconnect when we have a pending close, they beat us to it. Were happy though." __L);
|
||||||
_SendDisconnect();
|
_SendDisconnect();
|
||||||
SetState(CLOSED);
|
SetState(CLOSED);
|
||||||
} else {
|
} else {
|
||||||
//we are expecting this (or have already gotten it, but dont care either way)
|
//we are expecting this (or have already gotten it, but dont care either way)
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Received expected OP_SessionDisconnect. Moving to closed state." __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Received expected OP_SessionDisconnect. Moving to closed state." __L);
|
||||||
SetState(CLOSED);
|
SetState(CLOSED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -397,24 +397,24 @@ void EQStream::ProcessPacket(EQProtocolPacket *p)
|
|||||||
case OP_OutOfOrderAck: {
|
case OP_OutOfOrderAck: {
|
||||||
if(!p->pBuffer || (p->Size() < 4))
|
if(!p->pBuffer || (p->Size() < 4))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Received OP_OutOfOrderAck that was of malformed size" __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Received OP_OutOfOrderAck that was of malformed size" __L);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
uint16 seq=ntohs(*(uint16 *)(p->pBuffer));
|
uint16 seq=ntohs(*(uint16 *)(p->pBuffer));
|
||||||
MOutboundQueue.lock();
|
MOutboundQueue.lock();
|
||||||
|
|
||||||
if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
|
if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Pre-OOA Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, SequencedBase, SequencedQueue.size(), NextOutSeq);
|
Log(Logs::Detail, Logs::Netcode, _L "Pre-OOA Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, SequencedBase, SequencedQueue.size(), NextOutSeq);
|
||||||
}
|
}
|
||||||
|
|
||||||
//if the packet they got out of order is between our last acked packet and the last sent packet, then its valid.
|
//if the packet they got out of order is between our last acked packet and the last sent packet, then its valid.
|
||||||
if (CompareSequence(SequencedBase,seq) != SeqPast && CompareSequence(NextOutSeq,seq) == SeqPast) {
|
if (CompareSequence(SequencedBase,seq) != SeqPast && CompareSequence(NextOutSeq,seq) == SeqPast) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Received OP_OutOfOrderAck for sequence %d, starting retransmit at the start of our unacked buffer (seq %d, was %d)." __L,
|
Log(Logs::Detail, Logs::Netcode, _L "Received OP_OutOfOrderAck for sequence %d, starting retransmit at the start of our unacked buffer (seq %d, was %d)." __L,
|
||||||
seq, SequencedBase, SequencedBase+SequencedQueue.size());
|
seq, SequencedBase, SequencedBase+SequencedQueue.size());
|
||||||
|
|
||||||
uint16 sqsize = SequencedQueue.size();
|
uint16 sqsize = SequencedQueue.size();
|
||||||
uint16 index = seq - SequencedBase;
|
uint16 index = seq - SequencedBase;
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "OP_OutOfOrderAck marking packet acked in queue (queue index = %d, queue size = %d)." __L, index, sqsize);
|
Log(Logs::Detail, Logs::Netcode, _L "OP_OutOfOrderAck marking packet acked in queue (queue index = %d, queue size = %d)." __L, index, sqsize);
|
||||||
if (index < sqsize) {
|
if (index < sqsize) {
|
||||||
SequencedQueue[index]->acked = true;
|
SequencedQueue[index]->acked = true;
|
||||||
// flag packets for a resend
|
// flag packets for a resend
|
||||||
@ -423,7 +423,7 @@ void EQStream::ProcessPacket(EQProtocolPacket *p)
|
|||||||
for (auto sitr = SequencedQueue.begin(); sitr != SequencedQueue.end() && count < index; ++sitr, ++count) {
|
for (auto sitr = SequencedQueue.begin(); sitr != SequencedQueue.end() && count < index; ++sitr, ++count) {
|
||||||
if (!(*sitr)->acked && (*sitr)->sent_time > 0 && (((*sitr)->sent_time + timeout) < Timer::GetCurrentTime())) {
|
if (!(*sitr)->acked && (*sitr)->sent_time > 0 && (((*sitr)->sent_time + timeout) < Timer::GetCurrentTime())) {
|
||||||
(*sitr)->sent_time = 0;
|
(*sitr)->sent_time = 0;
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "OP_OutOfOrderAck Flagging packet %d for retransmission" __L, SequencedBase + count);
|
Log(Logs::Detail, Logs::Netcode, _L "OP_OutOfOrderAck Flagging packet %d for retransmission" __L, SequencedBase + count);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -432,11 +432,11 @@ void EQStream::ProcessPacket(EQProtocolPacket *p)
|
|||||||
retransmittimer = Timer::GetCurrentTime();
|
retransmittimer = Timer::GetCurrentTime();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Received OP_OutOfOrderAck for out-of-window %d. Window (%d->%d)." __L, seq, SequencedBase, NextOutSeq);
|
Log(Logs::Detail, Logs::Netcode, _L "Received OP_OutOfOrderAck for out-of-window %d. Window (%d->%d)." __L, seq, SequencedBase, NextOutSeq);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
|
if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Post-OOA Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, SequencedBase, SequencedQueue.size(), NextOutSeq);
|
Log(Logs::Detail, Logs::Netcode, _L "Post-OOA Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, SequencedBase, SequencedQueue.size(), NextOutSeq);
|
||||||
}
|
}
|
||||||
|
|
||||||
MOutboundQueue.unlock();
|
MOutboundQueue.unlock();
|
||||||
@ -445,11 +445,11 @@ void EQStream::ProcessPacket(EQProtocolPacket *p)
|
|||||||
case OP_SessionStatRequest: {
|
case OP_SessionStatRequest: {
|
||||||
if(p->Size() < sizeof(ClientSessionStats))
|
if(p->Size() < sizeof(ClientSessionStats))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Received OP_SessionStatRequest that was of malformed size" __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Received OP_SessionStatRequest that was of malformed size" __L);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
ClientSessionStats *ClientStats=(ClientSessionStats *)p->pBuffer;
|
ClientSessionStats *ClientStats=(ClientSessionStats *)p->pBuffer;
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Received Stats: %lu packets received, %lu packets sent, Deltas: local %lu, (%lu <- %lu -> %lu) remote %lu" __L,
|
Log(Logs::Detail, Logs::Netcode, _L "Received Stats: %lu packets received, %lu packets sent, Deltas: local %lu, (%lu <- %lu -> %lu) remote %lu" __L,
|
||||||
(unsigned long)ntohl(ClientStats->packets_received), (unsigned long)ntohl(ClientStats->packets_sent), (unsigned long)ntohl(ClientStats->last_local_delta),
|
(unsigned long)ntohl(ClientStats->packets_received), (unsigned long)ntohl(ClientStats->packets_sent), (unsigned long)ntohl(ClientStats->last_local_delta),
|
||||||
(unsigned long)ntohl(ClientStats->low_delta), (unsigned long)ntohl(ClientStats->average_delta),
|
(unsigned long)ntohl(ClientStats->low_delta), (unsigned long)ntohl(ClientStats->average_delta),
|
||||||
(unsigned long)ntohl(ClientStats->high_delta), (unsigned long)ntohl(ClientStats->last_remote_delta));
|
(unsigned long)ntohl(ClientStats->high_delta), (unsigned long)ntohl(ClientStats->last_remote_delta));
|
||||||
@ -468,7 +468,7 @@ void EQStream::ProcessPacket(EQProtocolPacket *p)
|
|||||||
retransmittimeout += 300;
|
retransmittimeout += 300;
|
||||||
if(retransmittimeout > RETRANSMIT_TIMEOUT_MAX)
|
if(retransmittimeout > RETRANSMIT_TIMEOUT_MAX)
|
||||||
retransmittimeout = RETRANSMIT_TIMEOUT_MAX;
|
retransmittimeout = RETRANSMIT_TIMEOUT_MAX;
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Retransmit timeout recalculated to %dms" __L, retransmittimeout);
|
Log(Logs::Detail, Logs::Netcode, _L "Retransmit timeout recalculated to %dms" __L, retransmittimeout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -485,11 +485,11 @@ void EQStream::ProcessPacket(EQProtocolPacket *p)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case OP_SessionStatResponse: {
|
case OP_SessionStatResponse: {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Received OP_SessionStatResponse. Ignoring." __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Received OP_SessionStatResponse. Ignoring." __L);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case OP_OutOfSession: {
|
case OP_OutOfSession: {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Received OP_OutOfSession. Ignoring." __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Received OP_OutOfSession. Ignoring." __L);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -520,7 +520,7 @@ void EQStream::FastQueuePacket(EQApplicationPacket **p, bool ack_req)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if(OpMgr == nullptr || *OpMgr == nullptr) {
|
if(OpMgr == nullptr || *OpMgr == nullptr) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Packet enqueued into a stream with no opcode manager, dropping." __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Packet enqueued into a stream with no opcode manager, dropping." __L);
|
||||||
delete pack;
|
delete pack;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -545,32 +545,32 @@ void EQStream::SendPacket(uint16 opcode, EQApplicationPacket *p)
|
|||||||
uint32 chunksize, used;
|
uint32 chunksize, used;
|
||||||
uint32 length;
|
uint32 length;
|
||||||
|
|
||||||
if (Log.log_settings[Logs::Server_Client_Packet].is_category_enabled == 1){
|
if (LogSys.log_settings[Logs::Server_Client_Packet].is_category_enabled == 1){
|
||||||
if (p->GetOpcode() != OP_SpecialMesg){
|
if (p->GetOpcode() != OP_SpecialMesg){
|
||||||
Log.Out(Logs::General, Logs::Server_Client_Packet, "[%s - 0x%04x] [Size: %u]", OpcodeManager::EmuToName(p->GetOpcode()), p->GetOpcode(), p->Size());
|
Log(Logs::General, Logs::Server_Client_Packet, "[%s - 0x%04x] [Size: %u]", OpcodeManager::EmuToName(p->GetOpcode()), p->GetOpcode(), p->Size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Log.log_settings[Logs::Server_Client_Packet_With_Dump].is_category_enabled == 1){
|
if (LogSys.log_settings[Logs::Server_Client_Packet_With_Dump].is_category_enabled == 1){
|
||||||
if (p->GetOpcode() != OP_SpecialMesg){
|
if (p->GetOpcode() != OP_SpecialMesg){
|
||||||
Log.Out(Logs::General, Logs::Server_Client_Packet_With_Dump, "[%s - 0x%04x] [Size: %u] %s", OpcodeManager::EmuToName(p->GetOpcode()), p->GetOpcode(), p->Size(), DumpPacketToString(p).c_str());
|
Log(Logs::General, Logs::Server_Client_Packet_With_Dump, "[%s - 0x%04x] [Size: %u] %s", OpcodeManager::EmuToName(p->GetOpcode()), p->GetOpcode(), p->Size(), DumpPacketToString(p).c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert the EQApplicationPacket to 1 or more EQProtocolPackets
|
// Convert the EQApplicationPacket to 1 or more EQProtocolPackets
|
||||||
if (p->size>(MaxLen-8)) { // proto-op(2), seq(2), app-op(2) ... data ... crc(2)
|
if (p->size>(MaxLen-8)) { // proto-op(2), seq(2), app-op(2) ... data ... crc(2)
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Making oversized packet, len %d" __L, p->Size());
|
Log(Logs::Detail, Logs::Netcode, _L "Making oversized packet, len %d" __L, p->Size());
|
||||||
|
|
||||||
auto tmpbuff = new unsigned char[p->size + 3];
|
auto tmpbuff = new unsigned char[p->size + 3];
|
||||||
length=p->serialize(opcode, tmpbuff);
|
length=p->serialize(opcode, tmpbuff);
|
||||||
if (length != p->Size())
|
if (length != p->Size())
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Packet adjustment, len %d to %d" __L, p->Size(), length);
|
Log(Logs::Detail, Logs::Netcode, _L "Packet adjustment, len %d to %d" __L, p->Size(), length);
|
||||||
|
|
||||||
auto out = new EQProtocolPacket(OP_Fragment, nullptr, MaxLen - 4);
|
auto out = new EQProtocolPacket(OP_Fragment, nullptr, MaxLen - 4);
|
||||||
*(uint32 *)(out->pBuffer+2)=htonl(length);
|
*(uint32 *)(out->pBuffer+2)=htonl(length);
|
||||||
used=MaxLen-10;
|
used=MaxLen-10;
|
||||||
memcpy(out->pBuffer+6,tmpbuff,used);
|
memcpy(out->pBuffer+6,tmpbuff,used);
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "First fragment: used %d/%d. Payload size %d in the packet" __L, used, length, p->size);
|
Log(Logs::Detail, Logs::Netcode, _L "First fragment: used %d/%d. Payload size %d in the packet" __L, used, length, p->size);
|
||||||
SequencedPush(out);
|
SequencedPush(out);
|
||||||
|
|
||||||
|
|
||||||
@ -581,7 +581,7 @@ void EQStream::SendPacket(uint16 opcode, EQApplicationPacket *p)
|
|||||||
out->size=chunksize+2;
|
out->size=chunksize+2;
|
||||||
SequencedPush(out);
|
SequencedPush(out);
|
||||||
used+=chunksize;
|
used+=chunksize;
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Subsequent fragment: len %d, used %d/%d." __L, chunksize, used, length);
|
Log(Logs::Detail, Logs::Netcode, _L "Subsequent fragment: len %d, used %d/%d." __L, chunksize, used, length);
|
||||||
}
|
}
|
||||||
delete p;
|
delete p;
|
||||||
delete[] tmpbuff;
|
delete[] tmpbuff;
|
||||||
@ -602,18 +602,18 @@ void EQStream::SequencedPush(EQProtocolPacket *p)
|
|||||||
{
|
{
|
||||||
MOutboundQueue.lock();
|
MOutboundQueue.lock();
|
||||||
if (uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
|
if (uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Pre-Push Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L,
|
Log(Logs::Detail, Logs::Netcode, _L "Pre-Push Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L,
|
||||||
SequencedBase, SequencedQueue.size(), NextOutSeq);
|
SequencedBase, SequencedQueue.size(), NextOutSeq);
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Pushing sequenced packet %d of length %d. Base Seq is %d." __L,
|
Log(Logs::Detail, Logs::Netcode, _L "Pushing sequenced packet %d of length %d. Base Seq is %d." __L,
|
||||||
NextOutSeq, p->size, SequencedBase);
|
NextOutSeq, p->size, SequencedBase);
|
||||||
*(uint16 *)(p->pBuffer) = htons(NextOutSeq);
|
*(uint16 *)(p->pBuffer) = htons(NextOutSeq);
|
||||||
SequencedQueue.push_back(p);
|
SequencedQueue.push_back(p);
|
||||||
NextOutSeq++;
|
NextOutSeq++;
|
||||||
|
|
||||||
if (uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
|
if (uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Push Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L,
|
Log(Logs::Detail, Logs::Netcode, _L "Push Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L,
|
||||||
SequencedBase, SequencedQueue.size(), NextOutSeq);
|
SequencedBase, SequencedQueue.size(), NextOutSeq);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -623,7 +623,7 @@ void EQStream::SequencedPush(EQProtocolPacket *p)
|
|||||||
void EQStream::NonSequencedPush(EQProtocolPacket *p)
|
void EQStream::NonSequencedPush(EQProtocolPacket *p)
|
||||||
{
|
{
|
||||||
MOutboundQueue.lock();
|
MOutboundQueue.lock();
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Pushing non-sequenced packet of length %d" __L, p->size);
|
Log(Logs::Detail, Logs::Netcode, _L "Pushing non-sequenced packet of length %d" __L, p->size);
|
||||||
NonSequencedQueue.push(p);
|
NonSequencedQueue.push(p);
|
||||||
MOutboundQueue.unlock();
|
MOutboundQueue.unlock();
|
||||||
}
|
}
|
||||||
@ -631,14 +631,14 @@ void EQStream::NonSequencedPush(EQProtocolPacket *p)
|
|||||||
void EQStream::SendAck(uint16 seq)
|
void EQStream::SendAck(uint16 seq)
|
||||||
{
|
{
|
||||||
uint16 Seq=htons(seq);
|
uint16 Seq=htons(seq);
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Sending ack with sequence %d" __L, seq);
|
Log(Logs::Detail, Logs::Netcode, _L "Sending ack with sequence %d" __L, seq);
|
||||||
SetLastAckSent(seq);
|
SetLastAckSent(seq);
|
||||||
NonSequencedPush(new EQProtocolPacket(OP_Ack,(unsigned char *)&Seq,sizeof(uint16)));
|
NonSequencedPush(new EQProtocolPacket(OP_Ack,(unsigned char *)&Seq,sizeof(uint16)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void EQStream::SendOutOfOrderAck(uint16 seq)
|
void EQStream::SendOutOfOrderAck(uint16 seq)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Sending out of order ack with sequence %d" __L, seq);
|
Log(Logs::Detail, Logs::Netcode, _L "Sending out of order ack with sequence %d" __L, seq);
|
||||||
uint16 Seq=htons(seq);
|
uint16 Seq=htons(seq);
|
||||||
NonSequencedPush(new EQProtocolPacket(OP_OutOfOrderAck,(unsigned char *)&Seq,sizeof(uint16)));
|
NonSequencedPush(new EQProtocolPacket(OP_OutOfOrderAck,(unsigned char *)&Seq,sizeof(uint16)));
|
||||||
}
|
}
|
||||||
@ -688,24 +688,24 @@ void EQStream::Write(int eq_fd)
|
|||||||
// If we don't have a packet to try to combine into, use this one as the base
|
// If we don't have a packet to try to combine into, use this one as the base
|
||||||
// And remove it form the queue
|
// And remove it form the queue
|
||||||
p = NonSequencedQueue.front();
|
p = NonSequencedQueue.front();
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Starting combined packet with non-seq packet of len %d" __L, p->size);
|
Log(Logs::Detail, Logs::Netcode, _L "Starting combined packet with non-seq packet of len %d" __L, p->size);
|
||||||
NonSequencedQueue.pop();
|
NonSequencedQueue.pop();
|
||||||
} else if (!p->combine(NonSequencedQueue.front())) {
|
} else if (!p->combine(NonSequencedQueue.front())) {
|
||||||
// Trying to combine this packet with the base didn't work (too big maybe)
|
// Trying to combine this packet with the base didn't work (too big maybe)
|
||||||
// So just send the base packet (we'll try this packet again later)
|
// So just send the base packet (we'll try this packet again later)
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Combined packet full at len %d, next non-seq packet is len %d" __L, p->size, (NonSequencedQueue.front())->size);
|
Log(Logs::Detail, Logs::Netcode, _L "Combined packet full at len %d, next non-seq packet is len %d" __L, p->size, (NonSequencedQueue.front())->size);
|
||||||
ReadyToSend.push(p);
|
ReadyToSend.push(p);
|
||||||
BytesWritten+=p->size;
|
BytesWritten+=p->size;
|
||||||
p=nullptr;
|
p=nullptr;
|
||||||
|
|
||||||
if (BytesWritten > threshold) {
|
if (BytesWritten > threshold) {
|
||||||
// Sent enough this round, lets stop to be fair
|
// Sent enough this round, lets stop to be fair
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Exceeded write threshold in nonseq (%d > %d)" __L, BytesWritten, threshold);
|
Log(Logs::Detail, Logs::Netcode, _L "Exceeded write threshold in nonseq (%d > %d)" __L, BytesWritten, threshold);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Combine worked, so just remove this packet and it's spot in the queue
|
// Combine worked, so just remove this packet and it's spot in the queue
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Combined non-seq packet of len %d, yeilding %d combined." __L, (NonSequencedQueue.front())->size, p->size);
|
Log(Logs::Detail, Logs::Netcode, _L "Combined non-seq packet of len %d, yeilding %d combined." __L, (NonSequencedQueue.front())->size, p->size);
|
||||||
delete NonSequencedQueue.front();
|
delete NonSequencedQueue.front();
|
||||||
NonSequencedQueue.pop();
|
NonSequencedQueue.pop();
|
||||||
}
|
}
|
||||||
@ -718,7 +718,7 @@ void EQStream::Write(int eq_fd)
|
|||||||
uint16 seq_send = SequencedBase + count; //just for logging...
|
uint16 seq_send = SequencedBase + count; //just for logging...
|
||||||
|
|
||||||
if(SequencedQueue.empty()) {
|
if(SequencedQueue.empty()) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Tried to write a packet with an empty queue (%d is past next out %d)" __L, seq_send, NextOutSeq);
|
Log(Logs::Detail, Logs::Netcode, _L "Tried to write a packet with an empty queue (%d is past next out %d)" __L, seq_send, NextOutSeq);
|
||||||
SeqEmpty=true;
|
SeqEmpty=true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -728,35 +728,35 @@ void EQStream::Write(int eq_fd)
|
|||||||
++sitr;
|
++sitr;
|
||||||
++count;
|
++count;
|
||||||
if (p) {
|
if (p) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Final combined packet not full, len %d" __L, p->size);
|
Log(Logs::Detail, Logs::Netcode, _L "Final combined packet not full, len %d" __L, p->size);
|
||||||
ReadyToSend.push(p);
|
ReadyToSend.push(p);
|
||||||
BytesWritten += p->size;
|
BytesWritten += p->size;
|
||||||
p = nullptr;
|
p = nullptr;
|
||||||
}
|
}
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Not retransmitting seq packet %d because already marked as acked" __L, seq_send);
|
Log(Logs::Detail, Logs::Netcode, _L "Not retransmitting seq packet %d because already marked as acked" __L, seq_send);
|
||||||
} else if (!p) {
|
} else if (!p) {
|
||||||
// If we don't have a packet to try to combine into, use this one as the base
|
// If we don't have a packet to try to combine into, use this one as the base
|
||||||
// Copy it first as it will still live until it is acked
|
// Copy it first as it will still live until it is acked
|
||||||
p=(*sitr)->Copy();
|
p=(*sitr)->Copy();
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Starting combined packet with seq packet %d of len %d" __L, seq_send, p->size);
|
Log(Logs::Detail, Logs::Netcode, _L "Starting combined packet with seq packet %d of len %d" __L, seq_send, p->size);
|
||||||
(*sitr)->sent_time = Timer::GetCurrentTime();
|
(*sitr)->sent_time = Timer::GetCurrentTime();
|
||||||
++sitr;
|
++sitr;
|
||||||
++count;
|
++count;
|
||||||
} else if (!p->combine(*sitr)) {
|
} else if (!p->combine(*sitr)) {
|
||||||
// Trying to combine this packet with the base didn't work (too big maybe)
|
// Trying to combine this packet with the base didn't work (too big maybe)
|
||||||
// So just send the base packet (we'll try this packet again later)
|
// So just send the base packet (we'll try this packet again later)
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Combined packet full at len %d, next seq packet %d is len %d" __L, p->size, seq_send + 1, (*sitr)->size);
|
Log(Logs::Detail, Logs::Netcode, _L "Combined packet full at len %d, next seq packet %d is len %d" __L, p->size, seq_send + 1, (*sitr)->size);
|
||||||
ReadyToSend.push(p);
|
ReadyToSend.push(p);
|
||||||
BytesWritten+=p->size;
|
BytesWritten+=p->size;
|
||||||
p=nullptr;
|
p=nullptr;
|
||||||
if ((*sitr)->opcode != OP_Fragment && BytesWritten > threshold) {
|
if ((*sitr)->opcode != OP_Fragment && BytesWritten > threshold) {
|
||||||
// Sent enough this round, lets stop to be fair
|
// Sent enough this round, lets stop to be fair
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Exceeded write threshold in seq (%d > %d)" __L, BytesWritten, threshold);
|
Log(Logs::Detail, Logs::Netcode, _L "Exceeded write threshold in seq (%d > %d)" __L, BytesWritten, threshold);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Combine worked
|
// Combine worked
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Combined seq packet %d of len %d, yeilding %d combined." __L, seq_send, (*sitr)->size, p->size);
|
Log(Logs::Detail, Logs::Netcode, _L "Combined seq packet %d of len %d, yeilding %d combined." __L, seq_send, (*sitr)->size, p->size);
|
||||||
(*sitr)->sent_time = Timer::GetCurrentTime();
|
(*sitr)->sent_time = Timer::GetCurrentTime();
|
||||||
++sitr;
|
++sitr;
|
||||||
++count;
|
++count;
|
||||||
@ -766,7 +766,7 @@ void EQStream::Write(int eq_fd)
|
|||||||
++sitr;
|
++sitr;
|
||||||
++count;
|
++count;
|
||||||
if (p) {
|
if (p) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Final combined packet not full, len %d" __L, p->size);
|
Log(Logs::Detail, Logs::Netcode, _L "Final combined packet not full, len %d" __L, p->size);
|
||||||
ReadyToSend.push(p);
|
ReadyToSend.push(p);
|
||||||
BytesWritten += p->size;
|
BytesWritten += p->size;
|
||||||
p = nullptr;
|
p = nullptr;
|
||||||
@ -776,25 +776,25 @@ void EQStream::Write(int eq_fd)
|
|||||||
// Copy it first as it will still live until it is acked
|
// Copy it first as it will still live until it is acked
|
||||||
p=(*sitr)->Copy();
|
p=(*sitr)->Copy();
|
||||||
(*sitr)->sent_time = Timer::GetCurrentTime();
|
(*sitr)->sent_time = Timer::GetCurrentTime();
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Starting combined packet with seq packet %d of len %d" __L, seq_send, p->size);
|
Log(Logs::Detail, Logs::Netcode, _L "Starting combined packet with seq packet %d of len %d" __L, seq_send, p->size);
|
||||||
++sitr;
|
++sitr;
|
||||||
++count;
|
++count;
|
||||||
} else if (!p->combine(*sitr)) {
|
} else if (!p->combine(*sitr)) {
|
||||||
// Trying to combine this packet with the base didn't work (too big maybe)
|
// Trying to combine this packet with the base didn't work (too big maybe)
|
||||||
// So just send the base packet (we'll try this packet again later)
|
// So just send the base packet (we'll try this packet again later)
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Combined packet full at len %d, next seq packet %d is len %d" __L, p->size, seq_send, (*sitr)->size);
|
Log(Logs::Detail, Logs::Netcode, _L "Combined packet full at len %d, next seq packet %d is len %d" __L, p->size, seq_send, (*sitr)->size);
|
||||||
ReadyToSend.push(p);
|
ReadyToSend.push(p);
|
||||||
BytesWritten+=p->size;
|
BytesWritten+=p->size;
|
||||||
p=nullptr;
|
p=nullptr;
|
||||||
|
|
||||||
if (BytesWritten > threshold) {
|
if (BytesWritten > threshold) {
|
||||||
// Sent enough this round, lets stop to be fair
|
// Sent enough this round, lets stop to be fair
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Exceeded write threshold in seq (%d > %d)" __L, BytesWritten, threshold);
|
Log(Logs::Detail, Logs::Netcode, _L "Exceeded write threshold in seq (%d > %d)" __L, BytesWritten, threshold);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Combine worked
|
// Combine worked
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Combined seq packet %d of len %d, yielding %d combined." __L, seq_send, (*sitr)->size, p->size);
|
Log(Logs::Detail, Logs::Netcode, _L "Combined seq packet %d of len %d, yielding %d combined." __L, seq_send, (*sitr)->size, p->size);
|
||||||
(*sitr)->sent_time = Timer::GetCurrentTime();
|
(*sitr)->sent_time = Timer::GetCurrentTime();
|
||||||
++sitr;
|
++sitr;
|
||||||
++count;
|
++count;
|
||||||
@ -802,7 +802,7 @@ void EQStream::Write(int eq_fd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
|
if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Post send Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, SequencedBase, SequencedQueue.size(), NextOutSeq);
|
Log(Logs::Detail, Logs::Netcode, _L "Post send Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, SequencedBase, SequencedQueue.size(), NextOutSeq);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// No more sequenced packets
|
// No more sequenced packets
|
||||||
@ -814,7 +814,7 @@ void EQStream::Write(int eq_fd)
|
|||||||
|
|
||||||
// We have a packet still, must have run out of both seq and non-seq, so send it
|
// We have a packet still, must have run out of both seq and non-seq, so send it
|
||||||
if (p) {
|
if (p) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Final combined packet not full, len %d" __L, p->size);
|
Log(Logs::Detail, Logs::Netcode, _L "Final combined packet not full, len %d" __L, p->size);
|
||||||
ReadyToSend.push(p);
|
ReadyToSend.push(p);
|
||||||
BytesWritten+=p->size;
|
BytesWritten+=p->size;
|
||||||
}
|
}
|
||||||
@ -831,7 +831,7 @@ void EQStream::Write(int eq_fd)
|
|||||||
if(SeqEmpty && NonSeqEmpty) {
|
if(SeqEmpty && NonSeqEmpty) {
|
||||||
//no more data to send
|
//no more data to send
|
||||||
if(CheckState(CLOSING)) {
|
if(CheckState(CLOSING)) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "All outgoing data flushed, closing stream." __L );
|
Log(Logs::Detail, Logs::Netcode, _L "All outgoing data flushed, closing stream." __L );
|
||||||
//we are waiting for the queues to empty, now we can do our disconnect.
|
//we are waiting for the queues to empty, now we can do our disconnect.
|
||||||
//this packet will not actually go out until the next call to Write().
|
//this packet will not actually go out until the next call to Write().
|
||||||
_SendDisconnect();
|
_SendDisconnect();
|
||||||
@ -896,7 +896,7 @@ void EQStream::SendSessionResponse()
|
|||||||
|
|
||||||
out->size=sizeof(SessionResponse);
|
out->size=sizeof(SessionResponse);
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Sending OP_SessionResponse: session %lu, maxlen=%d, key=0x%x, compressed? %s, encoded? %s" __L,
|
Log(Logs::Detail, Logs::Netcode, _L "Sending OP_SessionResponse: session %lu, maxlen=%d, key=0x%x, compressed? %s, encoded? %s" __L,
|
||||||
(unsigned long)Session, MaxLen, Key, compressed?"yes":"no", encoded?"yes":"no");
|
(unsigned long)Session, MaxLen, Key, compressed?"yes":"no", encoded?"yes":"no");
|
||||||
|
|
||||||
NonSequencedPush(out);
|
NonSequencedPush(out);
|
||||||
@ -910,7 +910,7 @@ void EQStream::SendSessionRequest()
|
|||||||
Request->Session=htonl(time(nullptr));
|
Request->Session=htonl(time(nullptr));
|
||||||
Request->MaxLength=htonl(512);
|
Request->MaxLength=htonl(512);
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Sending OP_SessionRequest: session %lu, maxlen=%d" __L, (unsigned long)ntohl(Request->Session), ntohl(Request->MaxLength));
|
Log(Logs::Detail, Logs::Netcode, _L "Sending OP_SessionRequest: session %lu, maxlen=%d" __L, (unsigned long)ntohl(Request->Session), ntohl(Request->MaxLength));
|
||||||
|
|
||||||
NonSequencedPush(out);
|
NonSequencedPush(out);
|
||||||
}
|
}
|
||||||
@ -924,7 +924,7 @@ void EQStream::_SendDisconnect()
|
|||||||
*(uint32 *)out->pBuffer=htonl(Session);
|
*(uint32 *)out->pBuffer=htonl(Session);
|
||||||
NonSequencedPush(out);
|
NonSequencedPush(out);
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Sending OP_SessionDisconnect: session %lu" __L, (unsigned long)Session);
|
Log(Logs::Detail, Logs::Netcode, _L "Sending OP_SessionDisconnect: session %lu" __L, (unsigned long)Session);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EQStream::InboundQueuePush(EQRawApplicationPacket *p)
|
void EQStream::InboundQueuePush(EQRawApplicationPacket *p)
|
||||||
@ -950,7 +950,7 @@ EQRawApplicationPacket *p=nullptr;
|
|||||||
if (OpMgr != nullptr && *OpMgr != nullptr) {
|
if (OpMgr != nullptr && *OpMgr != nullptr) {
|
||||||
EmuOpcode emu_op = (*OpMgr)->EQToEmu(p->opcode);
|
EmuOpcode emu_op = (*OpMgr)->EQToEmu(p->opcode);
|
||||||
if (emu_op == OP_Unknown) {
|
if (emu_op == OP_Unknown) {
|
||||||
// Log.Out(Logs::General, Logs::Client_Server_Packet_Unhandled, "Unknown :: [%s - 0x%04x] [Size: %u] %s", OpcodeManager::EmuToName(p->GetOpcode()), p->opcode, p->Size(), DumpPacketToString(p).c_str());
|
// Log(Logs::General, Logs::Client_Server_Packet_Unhandled, "Unknown :: [%s - 0x%04x] [Size: %u] %s", OpcodeManager::EmuToName(p->GetOpcode()), p->opcode, p->Size(), DumpPacketToString(p).c_str());
|
||||||
}
|
}
|
||||||
p->SetOpcode(emu_op);
|
p->SetOpcode(emu_op);
|
||||||
}
|
}
|
||||||
@ -976,7 +976,7 @@ EQRawApplicationPacket *p=nullptr;
|
|||||||
if(OpMgr != nullptr && *OpMgr != nullptr) {
|
if(OpMgr != nullptr && *OpMgr != nullptr) {
|
||||||
EmuOpcode emu_op = (*OpMgr)->EQToEmu(p->opcode);
|
EmuOpcode emu_op = (*OpMgr)->EQToEmu(p->opcode);
|
||||||
if(emu_op == OP_Unknown) {
|
if(emu_op == OP_Unknown) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "Unable to convert EQ opcode 0x%.4x to an Application opcode.", p->opcode);
|
Log(Logs::General, Logs::Netcode, "Unable to convert EQ opcode 0x%.4x to an Application opcode.", p->opcode);
|
||||||
}
|
}
|
||||||
|
|
||||||
p->SetOpcode(emu_op);
|
p->SetOpcode(emu_op);
|
||||||
@ -1004,7 +1004,7 @@ void EQStream::InboundQueueClear()
|
|||||||
{
|
{
|
||||||
EQApplicationPacket *p=nullptr;
|
EQApplicationPacket *p=nullptr;
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Clearing inbound queue" __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Clearing inbound queue" __L);
|
||||||
|
|
||||||
MInboundQueue.lock();
|
MInboundQueue.lock();
|
||||||
if (!InboundQueue.empty()) {
|
if (!InboundQueue.empty()) {
|
||||||
@ -1047,7 +1047,7 @@ void EQStream::OutboundQueueClear()
|
|||||||
{
|
{
|
||||||
EQProtocolPacket *p=nullptr;
|
EQProtocolPacket *p=nullptr;
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Clearing outbound queue" __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Clearing outbound queue" __L);
|
||||||
|
|
||||||
MOutboundQueue.lock();
|
MOutboundQueue.lock();
|
||||||
while(!NonSequencedQueue.empty()) {
|
while(!NonSequencedQueue.empty()) {
|
||||||
@ -1069,7 +1069,7 @@ void EQStream::PacketQueueClear()
|
|||||||
{
|
{
|
||||||
EQProtocolPacket *p=nullptr;
|
EQProtocolPacket *p=nullptr;
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Clearing future packet queue" __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Clearing future packet queue" __L);
|
||||||
|
|
||||||
if(!PacketQueue.empty()) {
|
if(!PacketQueue.empty()) {
|
||||||
std::map<unsigned short,EQProtocolPacket *>::iterator itr;
|
std::map<unsigned short,EQProtocolPacket *>::iterator itr;
|
||||||
@ -1101,7 +1101,7 @@ void EQStream::Process(const unsigned char *buffer, const uint32 length)
|
|||||||
delete p;
|
delete p;
|
||||||
ProcessQueue();
|
ProcessQueue();
|
||||||
} else {
|
} else {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Incoming packet failed checksum" __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Incoming packet failed checksum" __L);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1132,23 +1132,23 @@ std::deque<EQProtocolPacket *>::iterator itr, tmp;
|
|||||||
SeqOrder ord = CompareSequence(SequencedBase, seq);
|
SeqOrder ord = CompareSequence(SequencedBase, seq);
|
||||||
if(ord == SeqInOrder) {
|
if(ord == SeqInOrder) {
|
||||||
//they are not acking anything new...
|
//they are not acking anything new...
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Received an ack with no window advancement (seq %d)." __L, seq);
|
Log(Logs::Detail, Logs::Netcode, _L "Received an ack with no window advancement (seq %d)." __L, seq);
|
||||||
} else if(ord == SeqPast) {
|
} else if(ord == SeqPast) {
|
||||||
//they are nacking blocks going back before our buffer, wtf?
|
//they are nacking blocks going back before our buffer, wtf?
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Received an ack with backward window advancement (they gave %d, our window starts at %d). This is bad." __L, seq, SequencedBase);
|
Log(Logs::Detail, Logs::Netcode, _L "Received an ack with backward window advancement (they gave %d, our window starts at %d). This is bad." __L, seq, SequencedBase);
|
||||||
} else {
|
} else {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Received an ack up through sequence %d. Our base is %d." __L, seq, SequencedBase);
|
Log(Logs::Detail, Logs::Netcode, _L "Received an ack up through sequence %d. Our base is %d." __L, seq, SequencedBase);
|
||||||
|
|
||||||
|
|
||||||
//this is a good ack, we get to ack some blocks.
|
//this is a good ack, we get to ack some blocks.
|
||||||
seq++; //we stop at the block right after their ack, counting on the wrap of both numbers.
|
seq++; //we stop at the block right after their ack, counting on the wrap of both numbers.
|
||||||
while(SequencedBase != seq) {
|
while(SequencedBase != seq) {
|
||||||
if(SequencedQueue.empty()) {
|
if(SequencedQueue.empty()) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "OUT OF PACKETS acked packet with sequence %lu. Next send is %d before this." __L, (unsigned long)SequencedBase, SequencedQueue.size());
|
Log(Logs::Detail, Logs::Netcode, _L "OUT OF PACKETS acked packet with sequence %lu. Next send is %d before this." __L, (unsigned long)SequencedBase, SequencedQueue.size());
|
||||||
SequencedBase = NextOutSeq;
|
SequencedBase = NextOutSeq;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Removing acked packet with sequence %lu." __L, (unsigned long)SequencedBase);
|
Log(Logs::Detail, Logs::Netcode, _L "Removing acked packet with sequence %lu." __L, (unsigned long)SequencedBase);
|
||||||
//clean out the acked packet
|
//clean out the acked packet
|
||||||
delete SequencedQueue.front();
|
delete SequencedQueue.front();
|
||||||
SequencedQueue.pop_front();
|
SequencedQueue.pop_front();
|
||||||
@ -1156,7 +1156,7 @@ std::deque<EQProtocolPacket *>::iterator itr, tmp;
|
|||||||
SequencedBase++;
|
SequencedBase++;
|
||||||
}
|
}
|
||||||
if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
|
if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Post-Ack on %d Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, seq, SequencedBase, SequencedQueue.size(), NextOutSeq);
|
Log(Logs::Detail, Logs::Netcode, _L "Post-Ack on %d Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, seq, SequencedBase, SequencedQueue.size(), NextOutSeq);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1166,7 +1166,7 @@ std::deque<EQProtocolPacket *>::iterator itr, tmp;
|
|||||||
void EQStream::SetNextAckToSend(uint32 seq)
|
void EQStream::SetNextAckToSend(uint32 seq)
|
||||||
{
|
{
|
||||||
MAcks.lock();
|
MAcks.lock();
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Set Next Ack To Send to %lu" __L, (unsigned long)seq);
|
Log(Logs::Detail, Logs::Netcode, _L "Set Next Ack To Send to %lu" __L, (unsigned long)seq);
|
||||||
NextAckToSend=seq;
|
NextAckToSend=seq;
|
||||||
MAcks.unlock();
|
MAcks.unlock();
|
||||||
}
|
}
|
||||||
@ -1174,7 +1174,7 @@ void EQStream::SetNextAckToSend(uint32 seq)
|
|||||||
void EQStream::SetLastAckSent(uint32 seq)
|
void EQStream::SetLastAckSent(uint32 seq)
|
||||||
{
|
{
|
||||||
MAcks.lock();
|
MAcks.lock();
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Set Last Ack Sent to %lu" __L, (unsigned long)seq);
|
Log(Logs::Detail, Logs::Netcode, _L "Set Last Ack Sent to %lu" __L, (unsigned long)seq);
|
||||||
LastAckSent=seq;
|
LastAckSent=seq;
|
||||||
MAcks.unlock();
|
MAcks.unlock();
|
||||||
}
|
}
|
||||||
@ -1187,10 +1187,10 @@ void EQStream::ProcessQueue()
|
|||||||
|
|
||||||
EQProtocolPacket *qp=nullptr;
|
EQProtocolPacket *qp=nullptr;
|
||||||
while((qp=RemoveQueue(NextInSeq))!=nullptr) {
|
while((qp=RemoveQueue(NextInSeq))!=nullptr) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Processing Queued Packet: Seq=%d" __L, NextInSeq);
|
Log(Logs::Detail, Logs::Netcode, _L "Processing Queued Packet: Seq=%d" __L, NextInSeq);
|
||||||
ProcessPacket(qp);
|
ProcessPacket(qp);
|
||||||
delete qp;
|
delete qp;
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "OP_Packet Queue size=%d" __L, PacketQueue.size());
|
Log(Logs::Detail, Logs::Netcode, _L "OP_Packet Queue size=%d" __L, PacketQueue.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1201,21 +1201,21 @@ EQProtocolPacket *qp=nullptr;
|
|||||||
if ((itr=PacketQueue.find(seq))!=PacketQueue.end()) {
|
if ((itr=PacketQueue.find(seq))!=PacketQueue.end()) {
|
||||||
qp=itr->second;
|
qp=itr->second;
|
||||||
PacketQueue.erase(itr);
|
PacketQueue.erase(itr);
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "OP_Packet Queue size=%d" __L, PacketQueue.size());
|
Log(Logs::Detail, Logs::Netcode, _L "OP_Packet Queue size=%d" __L, PacketQueue.size());
|
||||||
}
|
}
|
||||||
return qp;
|
return qp;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EQStream::SetStreamType(EQStreamType type)
|
void EQStream::SetStreamType(EQStreamType type)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Changing stream type from %s to %s" __L, StreamTypeString(StreamType), StreamTypeString(type));
|
Log(Logs::Detail, Logs::Netcode, _L "Changing stream type from %s to %s" __L, StreamTypeString(StreamType), StreamTypeString(type));
|
||||||
StreamType=type;
|
StreamType=type;
|
||||||
switch (StreamType) {
|
switch (StreamType) {
|
||||||
case LoginStream:
|
case LoginStream:
|
||||||
app_opcode_size=1;
|
app_opcode_size=1;
|
||||||
compressed=false;
|
compressed=false;
|
||||||
encoded=false;
|
encoded=false;
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Login stream has app opcode size %d, is not compressed or encoded." __L, app_opcode_size);
|
Log(Logs::Detail, Logs::Netcode, _L "Login stream has app opcode size %d, is not compressed or encoded." __L, app_opcode_size);
|
||||||
break;
|
break;
|
||||||
case ChatOrMailStream:
|
case ChatOrMailStream:
|
||||||
case ChatStream:
|
case ChatStream:
|
||||||
@ -1223,7 +1223,7 @@ void EQStream::SetStreamType(EQStreamType type)
|
|||||||
app_opcode_size=1;
|
app_opcode_size=1;
|
||||||
compressed=false;
|
compressed=false;
|
||||||
encoded=true;
|
encoded=true;
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Chat/Mail stream has app opcode size %d, is not compressed, and is encoded." __L, app_opcode_size);
|
Log(Logs::Detail, Logs::Netcode, _L "Chat/Mail stream has app opcode size %d, is not compressed, and is encoded." __L, app_opcode_size);
|
||||||
break;
|
break;
|
||||||
case ZoneStream:
|
case ZoneStream:
|
||||||
case WorldStream:
|
case WorldStream:
|
||||||
@ -1231,7 +1231,7 @@ void EQStream::SetStreamType(EQStreamType type)
|
|||||||
app_opcode_size=2;
|
app_opcode_size=2;
|
||||||
compressed=true;
|
compressed=true;
|
||||||
encoded=false;
|
encoded=false;
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "World/Zone stream has app opcode size %d, is compressed, and is not encoded." __L, app_opcode_size);
|
Log(Logs::Detail, Logs::Netcode, _L "World/Zone stream has app opcode size %d, is compressed, and is not encoded." __L, app_opcode_size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1281,7 +1281,7 @@ EQStream::SeqOrder EQStream::CompareSequence(uint16 expected_seq , uint16 seq)
|
|||||||
|
|
||||||
void EQStream::SetState(EQStreamState state) {
|
void EQStream::SetState(EQStreamState state) {
|
||||||
MState.lock();
|
MState.lock();
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Changing state from %d to %d" __L, State, state);
|
Log(Logs::Detail, Logs::Netcode, _L "Changing state from %d to %d" __L, State, state);
|
||||||
State=state;
|
State=state;
|
||||||
MState.unlock();
|
MState.unlock();
|
||||||
}
|
}
|
||||||
@ -1293,29 +1293,29 @@ void EQStream::CheckTimeout(uint32 now, uint32 timeout) {
|
|||||||
|
|
||||||
EQStreamState orig_state = GetState();
|
EQStreamState orig_state = GetState();
|
||||||
if (orig_state == CLOSING && !outgoing_data) {
|
if (orig_state == CLOSING && !outgoing_data) {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Out of data in closing state, disconnecting." __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Out of data in closing state, disconnecting." __L);
|
||||||
_SendDisconnect();
|
_SendDisconnect();
|
||||||
SetState(DISCONNECTING);
|
SetState(DISCONNECTING);
|
||||||
} else if (LastPacket && (now-LastPacket) > timeout) {
|
} else if (LastPacket && (now-LastPacket) > timeout) {
|
||||||
switch(orig_state) {
|
switch(orig_state) {
|
||||||
case CLOSING:
|
case CLOSING:
|
||||||
//if we time out in the closing state, they are not acking us, just give up
|
//if we time out in the closing state, they are not acking us, just give up
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Timeout expired in closing state. Moving to closed state." __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Timeout expired in closing state. Moving to closed state." __L);
|
||||||
_SendDisconnect();
|
_SendDisconnect();
|
||||||
SetState(CLOSED);
|
SetState(CLOSED);
|
||||||
break;
|
break;
|
||||||
case DISCONNECTING:
|
case DISCONNECTING:
|
||||||
//we timed out waiting for them to send us the disconnect reply, just give up.
|
//we timed out waiting for them to send us the disconnect reply, just give up.
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Timeout expired in disconnecting state. Moving to closed state." __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Timeout expired in disconnecting state. Moving to closed state." __L);
|
||||||
SetState(CLOSED);
|
SetState(CLOSED);
|
||||||
break;
|
break;
|
||||||
case CLOSED:
|
case CLOSED:
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Timeout expired in closed state??" __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Timeout expired in closed state??" __L);
|
||||||
break;
|
break;
|
||||||
case ESTABLISHED:
|
case ESTABLISHED:
|
||||||
//we timed out during normal operation. Try to be nice about it.
|
//we timed out during normal operation. Try to be nice about it.
|
||||||
//we will almost certainly time out again waiting for the disconnect reply, but oh well.
|
//we will almost certainly time out again waiting for the disconnect reply, but oh well.
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Timeout expired in established state. Closing connection." __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Timeout expired in established state. Closing connection." __L);
|
||||||
_SendDisconnect();
|
_SendDisconnect();
|
||||||
SetState(DISCONNECTING);
|
SetState(DISCONNECTING);
|
||||||
break;
|
break;
|
||||||
@ -1342,7 +1342,7 @@ void EQStream::Decay()
|
|||||||
for (auto sitr = SequencedQueue.begin(); sitr != SequencedQueue.end(); ++sitr, count++) {
|
for (auto sitr = SequencedQueue.begin(); sitr != SequencedQueue.end(); ++sitr, count++) {
|
||||||
if (!(*sitr)->acked && (*sitr)->sent_time > 0 && ((*sitr)->sent_time + retransmittimeout) < Timer::GetCurrentTime()) {
|
if (!(*sitr)->acked && (*sitr)->sent_time > 0 && ((*sitr)->sent_time + retransmittimeout) < Timer::GetCurrentTime()) {
|
||||||
(*sitr)->sent_time = 0;
|
(*sitr)->sent_time = 0;
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Timeout exceeded for seq %d. Flagging packet for retransmission" __L, SequencedBase + count);
|
Log(Logs::Detail, Logs::Netcode, _L "Timeout exceeded for seq %d. Flagging packet for retransmission" __L, SequencedBase + count);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MOutboundQueue.unlock();
|
MOutboundQueue.unlock();
|
||||||
@ -1359,11 +1359,11 @@ void EQStream::AdjustRates(uint32 average_delta)
|
|||||||
DecayRate=DECAYBASE/average_delta;
|
DecayRate=DECAYBASE/average_delta;
|
||||||
if (BytesWritten > RateThreshold)
|
if (BytesWritten > RateThreshold)
|
||||||
BytesWritten = RateThreshold + DecayRate;
|
BytesWritten = RateThreshold + DecayRate;
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Adjusting data rate to thresh %d, decay %d based on avg delta %d" __L,
|
Log(Logs::Detail, Logs::Netcode, _L "Adjusting data rate to thresh %d, decay %d based on avg delta %d" __L,
|
||||||
RateThreshold, DecayRate, average_delta);
|
RateThreshold, DecayRate, average_delta);
|
||||||
MRate.unlock();
|
MRate.unlock();
|
||||||
} else {
|
} else {
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Not adjusting data rate because avg delta over max (%d > %d)" __L,
|
Log(Logs::Detail, Logs::Netcode, _L "Not adjusting data rate because avg delta over max (%d > %d)" __L,
|
||||||
average_delta, AVERAGE_DELTA_MAX);
|
average_delta, AVERAGE_DELTA_MAX);
|
||||||
AverageDelta = AVERAGE_DELTA_MAX;
|
AverageDelta = AVERAGE_DELTA_MAX;
|
||||||
}
|
}
|
||||||
@ -1374,7 +1374,7 @@ void EQStream::AdjustRates(uint32 average_delta)
|
|||||||
BytesWritten = 0;
|
BytesWritten = 0;
|
||||||
RateThreshold=RATEBASE/average_delta;
|
RateThreshold=RATEBASE/average_delta;
|
||||||
DecayRate=DECAYBASE/average_delta;
|
DecayRate=DECAYBASE/average_delta;
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Adjusting data rate to thresh %d, decay %d based on avg delta %d" __L,
|
Log(Logs::Detail, Logs::Netcode, _L "Adjusting data rate to thresh %d, decay %d based on avg delta %d" __L,
|
||||||
RateThreshold, DecayRate, average_delta);
|
RateThreshold, DecayRate, average_delta);
|
||||||
MRate.unlock();
|
MRate.unlock();
|
||||||
}
|
}
|
||||||
@ -1384,12 +1384,12 @@ void EQStream::AdjustRates(uint32 average_delta)
|
|||||||
void EQStream::Close() {
|
void EQStream::Close() {
|
||||||
if(HasOutgoingData()) {
|
if(HasOutgoingData()) {
|
||||||
//there is pending data, wait for it to go out.
|
//there is pending data, wait for it to go out.
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Stream requested to Close(), but there is pending data, waiting for it." __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Stream requested to Close(), but there is pending data, waiting for it." __L);
|
||||||
SetState(CLOSING);
|
SetState(CLOSING);
|
||||||
} else {
|
} else {
|
||||||
//otherwise, we are done, we can drop immediately.
|
//otherwise, we are done, we can drop immediately.
|
||||||
_SendDisconnect();
|
_SendDisconnect();
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, _L "Stream closing immediate due to Close()" __L);
|
Log(Logs::Detail, Logs::Netcode, _L "Stream closing immediate due to Close()" __L);
|
||||||
SetState(DISCONNECTING);
|
SetState(DISCONNECTING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1417,19 +1417,19 @@ EQStream::MatchState EQStream::CheckSignature(const Signature *sig) {
|
|||||||
} else if(p->opcode == sig->first_eq_opcode) {
|
} else if(p->opcode == sig->first_eq_opcode) {
|
||||||
//opcode matches, check length..
|
//opcode matches, check length..
|
||||||
if(p->size == sig->first_length) {
|
if(p->size == sig->first_length) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[IDENT_TRACE] %s:%d: First opcode matched 0x%x and length matched %d", long2ip(GetRemoteIP()).c_str(), ntohs(GetRemotePort()), sig->first_eq_opcode, p->size);
|
Log(Logs::General, Logs::Netcode, "[IDENT_TRACE] %s:%d: First opcode matched 0x%x and length matched %d", long2ip(GetRemoteIP()).c_str(), ntohs(GetRemotePort()), sig->first_eq_opcode, p->size);
|
||||||
res = MatchSuccessful;
|
res = MatchSuccessful;
|
||||||
} else if(sig->first_length == 0) {
|
} else if(sig->first_length == 0) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[IDENT_TRACE] %s:%d: First opcode matched 0x%x and length (%d) is ignored", long2ip(GetRemoteIP()).c_str(), ntohs(GetRemotePort()), sig->first_eq_opcode, p->size);
|
Log(Logs::General, Logs::Netcode, "[IDENT_TRACE] %s:%d: First opcode matched 0x%x and length (%d) is ignored", long2ip(GetRemoteIP()).c_str(), ntohs(GetRemotePort()), sig->first_eq_opcode, p->size);
|
||||||
res = MatchSuccessful;
|
res = MatchSuccessful;
|
||||||
} else {
|
} else {
|
||||||
//opcode matched but length did not.
|
//opcode matched but length did not.
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[IDENT_TRACE] %s:%d: First opcode matched 0x%x, but length %d did not match expected %d", long2ip(GetRemoteIP()).c_str(), ntohs(GetRemotePort()), sig->first_eq_opcode, p->size, sig->first_length);
|
Log(Logs::General, Logs::Netcode, "[IDENT_TRACE] %s:%d: First opcode matched 0x%x, but length %d did not match expected %d", long2ip(GetRemoteIP()).c_str(), ntohs(GetRemotePort()), sig->first_eq_opcode, p->size, sig->first_length);
|
||||||
res = MatchFailed;
|
res = MatchFailed;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//first opcode did not match..
|
//first opcode did not match..
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[IDENT_TRACE] %s:%d: First opcode 0x%x did not match expected 0x%x", long2ip(GetRemoteIP()).c_str(), ntohs(GetRemotePort()), p->opcode, sig->first_eq_opcode);
|
Log(Logs::General, Logs::Netcode, "[IDENT_TRACE] %s:%d: First opcode 0x%x did not match expected 0x%x", long2ip(GetRemoteIP()).c_str(), ntohs(GetRemotePort()), p->opcode, sig->first_eq_opcode);
|
||||||
res = MatchFailed;
|
res = MatchFailed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,18 +23,10 @@
|
|||||||
|
|
||||||
ThreadReturnType EQStreamFactoryReaderLoop(void *eqfs)
|
ThreadReturnType EQStreamFactoryReaderLoop(void *eqfs)
|
||||||
{
|
{
|
||||||
EQStreamFactory *fs=(EQStreamFactory *)eqfs;
|
EQStreamFactory *fs=(EQStreamFactory *)eqfs;
|
||||||
|
|
||||||
#ifndef WIN32
|
|
||||||
Log.Out(Logs::Detail, Logs::None, "Starting EQStreamFactoryReaderLoop with thread ID %d", pthread_self());
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fs->ReaderLoop();
|
fs->ReaderLoop();
|
||||||
|
|
||||||
#ifndef WIN32
|
|
||||||
Log.Out(Logs::Detail, Logs::None, "Ending EQStreamFactoryReaderLoop with thread ID %d", pthread_self());
|
|
||||||
#endif
|
|
||||||
|
|
||||||
THREAD_RETURN(nullptr);
|
THREAD_RETURN(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,16 +34,8 @@ ThreadReturnType EQStreamFactoryWriterLoop(void *eqfs)
|
|||||||
{
|
{
|
||||||
EQStreamFactory *fs=(EQStreamFactory *)eqfs;
|
EQStreamFactory *fs=(EQStreamFactory *)eqfs;
|
||||||
|
|
||||||
#ifndef WIN32
|
|
||||||
Log.Out(Logs::Detail, Logs::None, "Starting EQStreamFactoryWriterLoop with thread ID %d", pthread_self());
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fs->WriterLoop();
|
fs->WriterLoop();
|
||||||
|
|
||||||
#ifndef WIN32
|
|
||||||
Log.Out(Logs::Detail, Logs::None, "Ending EQStreamFactoryWriterLoop with thread ID %d", pthread_self());
|
|
||||||
#endif
|
|
||||||
|
|
||||||
THREAD_RETURN(nullptr);
|
THREAD_RETURN(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -46,8 +46,9 @@ void EQStreamIdentifier::Process() {
|
|||||||
|
|
||||||
//first see if this stream has expired
|
//first see if this stream has expired
|
||||||
if(r.expire.Check(false)) {
|
if(r.expire.Check(false)) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[IDENTIFY] Unable to identify stream from %s:%d before timeout.", r.stream->GetRemoteAddr().c_str(), ntohs(r.stream->GetRemotePort()));
|
Log(Logs::General, Logs::Netcode, "[IDENTIFY] Unable to identify stream from %s:%d before timeout.", r.stream->GetRemoteAddr().c_str(), ntohs(r.stream->GetRemotePort()));
|
||||||
r.stream->Close();
|
r.stream->Close();
|
||||||
|
|
||||||
cur = m_streams.erase(cur);
|
cur = m_streams.erase(cur);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -61,23 +62,23 @@ void EQStreamIdentifier::Process() {
|
|||||||
}
|
}
|
||||||
if(r.stream->GetState() != ESTABLISHED) {
|
if(r.stream->GetState() != ESTABLISHED) {
|
||||||
//the stream closed before it was identified.
|
//the stream closed before it was identified.
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[IDENTIFY] Unable to identify stream from %s:%d before it closed.", long2ip(r.stream->GetRemoteIP()).c_str(), ntohs(r.stream->GetRemotePort()));
|
Log(Logs::General, Logs::Netcode, "[IDENTIFY] Unable to identify stream from %s:%d before it closed.", long2ip(r.stream->GetRemoteIP()).c_str(), ntohs(r.stream->GetRemotePort()));
|
||||||
switch(r.stream->GetState())
|
switch(r.stream->GetState())
|
||||||
{
|
{
|
||||||
case ESTABLISHED:
|
case ESTABLISHED:
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[IDENTIFY] Stream state was Established");
|
Log(Logs::General, Logs::Netcode, "[IDENTIFY] Stream state was Established");
|
||||||
break;
|
break;
|
||||||
case CLOSING:
|
case CLOSING:
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[IDENTIFY] Stream state was Closing");
|
Log(Logs::General, Logs::Netcode, "[IDENTIFY] Stream state was Closing");
|
||||||
break;
|
break;
|
||||||
case DISCONNECTING:
|
case DISCONNECTING:
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[IDENTIFY] Stream state was Disconnecting");
|
Log(Logs::General, Logs::Netcode, "[IDENTIFY] Stream state was Disconnecting");
|
||||||
break;
|
break;
|
||||||
case CLOSED:
|
case CLOSED:
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[IDENTIFY] Stream state was Closed");
|
Log(Logs::General, Logs::Netcode, "[IDENTIFY] Stream state was Closed");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[IDENTIFY] Stream state was Unestablished or unknown");
|
Log(Logs::General, Logs::Netcode, "[IDENTIFY] Stream state was Unestablished or unknown");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
r.stream->ReleaseFromUse();
|
r.stream->ReleaseFromUse();
|
||||||
@ -107,7 +108,7 @@ void EQStreamIdentifier::Process() {
|
|||||||
case EQStreamInterface::MatchSuccessful: {
|
case EQStreamInterface::MatchSuccessful: {
|
||||||
//yay, a match.
|
//yay, a match.
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[IDENTIFY] Identified stream %s:%d with signature %s", long2ip(r.stream->GetRemoteIP()).c_str(), ntohs(r.stream->GetRemotePort()), p->name.c_str());
|
Log(Logs::General, Logs::Netcode, "[IDENTIFY] Identified stream %s:%d with signature %s", long2ip(r.stream->GetRemoteIP()).c_str(), ntohs(r.stream->GetRemotePort()), p->name.c_str());
|
||||||
|
|
||||||
// before we assign the eqstream to an interface, let the stream recognize it is in use and the session should not be reset any further
|
// before we assign the eqstream to an interface, let the stream recognize it is in use and the session should not be reset any further
|
||||||
r.stream->SetActive(true);
|
r.stream->SetActive(true);
|
||||||
@ -121,7 +122,7 @@ void EQStreamIdentifier::Process() {
|
|||||||
}
|
}
|
||||||
case EQStreamInterface::MatchFailed:
|
case EQStreamInterface::MatchFailed:
|
||||||
//do nothing...
|
//do nothing...
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[IDENT_TRACE] %s:%d: Tried patch %s, and it did not match.", long2ip(r.stream->GetRemoteIP()).c_str(), ntohs(r.stream->GetRemotePort()), p->name.c_str());
|
Log(Logs::General, Logs::Netcode, "[IDENT_TRACE] %s:%d: Tried patch %s, and it did not match.", long2ip(r.stream->GetRemoteIP()).c_str(), ntohs(r.stream->GetRemotePort()), p->name.c_str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -129,7 +130,7 @@ void EQStreamIdentifier::Process() {
|
|||||||
//if we checked all patches and did not find a match.
|
//if we checked all patches and did not find a match.
|
||||||
if(all_ready && !found_one) {
|
if(all_ready && !found_one) {
|
||||||
//the stream cannot be identified.
|
//the stream cannot be identified.
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[IDENTIFY] Unable to identify stream from %s:%d, no match found.", long2ip(r.stream->GetRemoteIP()).c_str(), ntohs(r.stream->GetRemotePort()));
|
Log(Logs::General, Logs::Netcode, "[IDENTIFY] Unable to identify stream from %s:%d, no match found.", long2ip(r.stream->GetRemoteIP()).c_str(), ntohs(r.stream->GetRemotePort()));
|
||||||
r.stream->ReleaseFromUse();
|
r.stream->ReleaseFromUse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
/* EQEMu: Everquest Server Emulator
|
/* EQEMu: Everquest Server Emulator
|
||||||
Copyright (C) 2001-2015 EQEMu Development Team (http://eqemulator.net)
|
Copyright (C) 2001-2015 EQEMu Development Team (http://eqemulator.net)
|
||||||
|
|
||||||
@ -38,7 +39,7 @@ namespace Logs {
|
|||||||
NOTE: Only add to the bottom of the enum because that is the type ID assignment
|
NOTE: Only add to the bottom of the enum because that is the type ID assignment
|
||||||
*/
|
*/
|
||||||
|
|
||||||
enum LogCategory {
|
enum LogCategory {
|
||||||
None = 0,
|
None = 0,
|
||||||
AA,
|
AA,
|
||||||
AI,
|
AI,
|
||||||
@ -86,10 +87,10 @@ namespace Logs {
|
|||||||
Client_Login,
|
Client_Login,
|
||||||
Headless_Client,
|
Headless_Client,
|
||||||
MaxCategoryID /* Don't Remove this*/
|
MaxCategoryID /* Don't Remove this*/
|
||||||
};
|
};
|
||||||
|
|
||||||
/* If you add to this, make sure you update LogCategory */
|
/* If you add to this, make sure you update LogCategory */
|
||||||
static const char* LogCategoryName[LogCategory::MaxCategoryID] = {
|
static const char* LogCategoryName[LogCategory::MaxCategoryID] = {
|
||||||
"",
|
"",
|
||||||
"AA",
|
"AA",
|
||||||
"AI",
|
"AI",
|
||||||
@ -135,9 +136,19 @@ namespace Logs {
|
|||||||
"Packet :: Client -> Server (Dump)",
|
"Packet :: Client -> Server (Dump)",
|
||||||
"Login Server",
|
"Login Server",
|
||||||
"Client Login"
|
"Client Login"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define Log(debug_level, log_category, message, ...) do {\
|
||||||
|
if (LogSys.log_settings[log_category].is_category_enabled == 1)\
|
||||||
|
LogSys.Out(debug_level, log_category, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogF(debug_level, log_category, message, ...) do {\
|
||||||
|
if (LogSys.log_settings[log_category].is_category_enabled == 1)\
|
||||||
|
LogSys.OutF(debug_level, log_category, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
class EQEmuLogSys {
|
class EQEmuLogSys {
|
||||||
public:
|
public:
|
||||||
EQEmuLogSys();
|
EQEmuLogSys();
|
||||||
@ -206,11 +217,11 @@ private:
|
|||||||
|
|
||||||
uint16 GetWindowsConsoleColorFromCategory(uint16 log_category); /* Windows console color messages mapped by category */
|
uint16 GetWindowsConsoleColorFromCategory(uint16 log_category); /* Windows console color messages mapped by category */
|
||||||
|
|
||||||
void ProcessConsoleMessage(uint16 debug_level, uint16 log_category, const std::string &message); /* ProcessConsoleMessage called via Log.Out */
|
void ProcessConsoleMessage(uint16 debug_level, uint16 log_category, const std::string &message); /* ProcessConsoleMessage called via Log */
|
||||||
void ProcessGMSay(uint16 debug_level, uint16 log_category, const std::string &message); /* ProcessGMSay called via Log.Out */
|
void ProcessGMSay(uint16 debug_level, uint16 log_category, const std::string &message); /* ProcessGMSay called via Log */
|
||||||
void ProcessLogWrite(uint16 debug_level, uint16 log_category, const std::string &message); /* ProcessLogWrite called via Log.Out */
|
void ProcessLogWrite(uint16 debug_level, uint16 log_category, const std::string &message); /* ProcessLogWrite called via Log */
|
||||||
};
|
};
|
||||||
|
|
||||||
extern EQEmuLogSys Log;
|
extern EQEmuLogSys LogSys;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -46,7 +46,7 @@ bool BaseGuildManager::LoadGuilds() {
|
|||||||
ClearGuilds();
|
ClearGuilds();
|
||||||
|
|
||||||
if(m_db == nullptr) {
|
if(m_db == nullptr) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Requested to load guilds when we have no database object.");
|
Log(Logs::Detail, Logs::Guilds, "Requested to load guilds when we have no database object.");
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,13 +77,13 @@ bool BaseGuildManager::LoadGuilds() {
|
|||||||
uint8 rankn = atoi(row[1]);
|
uint8 rankn = atoi(row[1]);
|
||||||
|
|
||||||
if(rankn > GUILD_MAX_RANK) {
|
if(rankn > GUILD_MAX_RANK) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Found invalid (too high) rank %d for guild %d, skipping.", rankn, guild_id);
|
Log(Logs::Detail, Logs::Guilds, "Found invalid (too high) rank %d for guild %d, skipping.", rankn, guild_id);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
res = m_guilds.find(guild_id);
|
res = m_guilds.find(guild_id);
|
||||||
if(res == m_guilds.end()) {
|
if(res == m_guilds.end()) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Found rank %d for non-existent guild %d, skipping.", rankn, guild_id);
|
Log(Logs::Detail, Logs::Guilds, "Found rank %d for non-existent guild %d, skipping.", rankn, guild_id);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,7 +105,7 @@ bool BaseGuildManager::LoadGuilds() {
|
|||||||
|
|
||||||
bool BaseGuildManager::RefreshGuild(uint32 guild_id) {
|
bool BaseGuildManager::RefreshGuild(uint32 guild_id) {
|
||||||
if(m_db == nullptr) {
|
if(m_db == nullptr) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Requested to refresh guild %d when we have no database object.", guild_id);
|
Log(Logs::Detail, Logs::Guilds, "Requested to refresh guild %d when we have no database object.", guild_id);
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -123,7 +123,7 @@ bool BaseGuildManager::RefreshGuild(uint32 guild_id) {
|
|||||||
|
|
||||||
if (results.RowCount() == 0)
|
if (results.RowCount() == 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Unable to find guild %d in the database.", guild_id);
|
Log(Logs::Detail, Logs::Guilds, "Unable to find guild %d in the database.", guild_id);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,7 +145,7 @@ bool BaseGuildManager::RefreshGuild(uint32 guild_id) {
|
|||||||
uint8 rankn = atoi(row[1]);
|
uint8 rankn = atoi(row[1]);
|
||||||
|
|
||||||
if(rankn > GUILD_MAX_RANK) {
|
if(rankn > GUILD_MAX_RANK) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Found invalid (too high) rank %d for guild %d, skipping.", rankn, guild_id);
|
Log(Logs::Detail, Logs::Guilds, "Found invalid (too high) rank %d for guild %d, skipping.", rankn, guild_id);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,7 +162,7 @@ bool BaseGuildManager::RefreshGuild(uint32 guild_id) {
|
|||||||
rank.permissions[GUILD_WARPEACE] = (row[10][0] == '1') ? true: false;
|
rank.permissions[GUILD_WARPEACE] = (row[10][0] == '1') ? true: false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Successfully refreshed guild %d from the database.", guild_id);
|
Log(Logs::Detail, Logs::Guilds, "Successfully refreshed guild %d from the database.", guild_id);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -214,14 +214,14 @@ BaseGuildManager::GuildInfo *BaseGuildManager::_CreateGuild(uint32 guild_id, con
|
|||||||
|
|
||||||
bool BaseGuildManager::_StoreGuildDB(uint32 guild_id) {
|
bool BaseGuildManager::_StoreGuildDB(uint32 guild_id) {
|
||||||
if(m_db == nullptr) {
|
if(m_db == nullptr) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Requested to store guild %d when we have no database object.", guild_id);
|
Log(Logs::Detail, Logs::Guilds, "Requested to store guild %d when we have no database object.", guild_id);
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<uint32, GuildInfo *>::const_iterator res;
|
std::map<uint32, GuildInfo *>::const_iterator res;
|
||||||
res = m_guilds.find(guild_id);
|
res = m_guilds.find(guild_id);
|
||||||
if(res == m_guilds.end()) {
|
if(res == m_guilds.end()) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Requested to store non-existent guild %d", guild_id);
|
Log(Logs::Detail, Logs::Guilds, "Requested to store non-existent guild %d", guild_id);
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
GuildInfo *info = res->second;
|
GuildInfo *info = res->second;
|
||||||
@ -289,14 +289,14 @@ bool BaseGuildManager::_StoreGuildDB(uint32 guild_id) {
|
|||||||
safe_delete_array(title_esc);
|
safe_delete_array(title_esc);
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Stored guild %d in the database", guild_id);
|
Log(Logs::Detail, Logs::Guilds, "Stored guild %d in the database", guild_id);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 BaseGuildManager::_GetFreeGuildID() {
|
uint32 BaseGuildManager::_GetFreeGuildID() {
|
||||||
if(m_db == nullptr) {
|
if(m_db == nullptr) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Requested find a free guild ID when we have no database object.");
|
Log(Logs::Detail, Logs::Guilds, "Requested find a free guild ID when we have no database object.");
|
||||||
return(GUILD_NONE);
|
return(GUILD_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -330,12 +330,12 @@ uint32 BaseGuildManager::_GetFreeGuildID() {
|
|||||||
|
|
||||||
if (results.RowCount() == 0)
|
if (results.RowCount() == 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Located free guild ID %d in the database", index);
|
Log(Logs::Detail, Logs::Guilds, "Located free guild ID %d in the database", index);
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Unable to find a free guild ID when requested.");
|
Log(Logs::Detail, Logs::Guilds, "Unable to find a free guild ID when requested.");
|
||||||
return GUILD_NONE;
|
return GUILD_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -505,11 +505,11 @@ uint32 BaseGuildManager::DBCreateGuild(const char* name, uint32 leader) {
|
|||||||
|
|
||||||
//now store the resulting guild setup into the DB.
|
//now store the resulting guild setup into the DB.
|
||||||
if(!_StoreGuildDB(new_id)) {
|
if(!_StoreGuildDB(new_id)) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Error storing new guild. It may have been partially created which may need manual removal.");
|
Log(Logs::Detail, Logs::Guilds, "Error storing new guild. It may have been partially created which may need manual removal.");
|
||||||
return(GUILD_NONE);
|
return(GUILD_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Created guild %d in the database.", new_id);
|
Log(Logs::Detail, Logs::Guilds, "Created guild %d in the database.", new_id);
|
||||||
|
|
||||||
return(new_id);
|
return(new_id);
|
||||||
}
|
}
|
||||||
@ -525,7 +525,7 @@ bool BaseGuildManager::DBDeleteGuild(uint32 guild_id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(m_db == nullptr) {
|
if(m_db == nullptr) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Requested to delete guild %d when we have no database object.", guild_id);
|
Log(Logs::Detail, Logs::Guilds, "Requested to delete guild %d when we have no database object.", guild_id);
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -545,14 +545,14 @@ bool BaseGuildManager::DBDeleteGuild(uint32 guild_id) {
|
|||||||
query = StringFormat("DELETE FROM guild_bank WHERE guildid=%lu", (unsigned long)guild_id);
|
query = StringFormat("DELETE FROM guild_bank WHERE guildid=%lu", (unsigned long)guild_id);
|
||||||
QueryWithLogging(query, "deleting guild bank");
|
QueryWithLogging(query, "deleting guild bank");
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Deleted guild %d from the database.", guild_id);
|
Log(Logs::Detail, Logs::Guilds, "Deleted guild %d from the database.", guild_id);
|
||||||
|
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BaseGuildManager::DBRenameGuild(uint32 guild_id, const char* name) {
|
bool BaseGuildManager::DBRenameGuild(uint32 guild_id, const char* name) {
|
||||||
if(m_db == nullptr) {
|
if(m_db == nullptr) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Requested to rename guild %d when we have no database object.", guild_id);
|
Log(Logs::Detail, Logs::Guilds, "Requested to rename guild %d when we have no database object.", guild_id);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -573,13 +573,13 @@ bool BaseGuildManager::DBRenameGuild(uint32 guild_id, const char* name) {
|
|||||||
|
|
||||||
if (!results.Success())
|
if (!results.Success())
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Error renaming guild %d '%s': %s", guild_id, query.c_str(), results.Success());
|
Log(Logs::Detail, Logs::Guilds, "Error renaming guild %d '%s': %s", guild_id, query.c_str(), results.Success());
|
||||||
safe_delete_array(esc);
|
safe_delete_array(esc);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
safe_delete_array(esc);
|
safe_delete_array(esc);
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Renamed guild %s (%d) to %s in database.", info->name.c_str(), guild_id, name);
|
Log(Logs::Detail, Logs::Guilds, "Renamed guild %s (%d) to %s in database.", info->name.c_str(), guild_id, name);
|
||||||
|
|
||||||
info->name = name; //update our local record.
|
info->name = name; //update our local record.
|
||||||
|
|
||||||
@ -588,7 +588,7 @@ bool BaseGuildManager::DBRenameGuild(uint32 guild_id, const char* name) {
|
|||||||
|
|
||||||
bool BaseGuildManager::DBSetGuildLeader(uint32 guild_id, uint32 leader) {
|
bool BaseGuildManager::DBSetGuildLeader(uint32 guild_id, uint32 leader) {
|
||||||
if(m_db == nullptr) {
|
if(m_db == nullptr) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Requested to set the leader for guild %d when we have no database object.", guild_id);
|
Log(Logs::Detail, Logs::Guilds, "Requested to set the leader for guild %d when we have no database object.", guild_id);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -614,7 +614,7 @@ bool BaseGuildManager::DBSetGuildLeader(uint32 guild_id, uint32 leader) {
|
|||||||
if(!DBSetGuildRank(leader, GUILD_LEADER))
|
if(!DBSetGuildRank(leader, GUILD_LEADER))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Set guild leader for guild %d to %d in the database", guild_id, leader);
|
Log(Logs::Detail, Logs::Guilds, "Set guild leader for guild %d to %d in the database", guild_id, leader);
|
||||||
|
|
||||||
info->leader_char_id = leader; //update our local record.
|
info->leader_char_id = leader; //update our local record.
|
||||||
|
|
||||||
@ -623,7 +623,7 @@ bool BaseGuildManager::DBSetGuildLeader(uint32 guild_id, uint32 leader) {
|
|||||||
|
|
||||||
bool BaseGuildManager::DBSetGuildMOTD(uint32 guild_id, const char* motd, const char *setter) {
|
bool BaseGuildManager::DBSetGuildMOTD(uint32 guild_id, const char* motd, const char *setter) {
|
||||||
if(m_db == nullptr) {
|
if(m_db == nullptr) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Requested to set the MOTD for guild %d when we have no database object.", guild_id);
|
Log(Logs::Detail, Logs::Guilds, "Requested to set the MOTD for guild %d when we have no database object.", guild_id);
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -654,7 +654,7 @@ bool BaseGuildManager::DBSetGuildMOTD(uint32 guild_id, const char* motd, const c
|
|||||||
safe_delete_array(esc);
|
safe_delete_array(esc);
|
||||||
safe_delete_array(esc_set);
|
safe_delete_array(esc_set);
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Set MOTD for guild %d in the database", guild_id);
|
Log(Logs::Detail, Logs::Guilds, "Set MOTD for guild %d in the database", guild_id);
|
||||||
|
|
||||||
info->motd = motd; //update our local record.
|
info->motd = motd; //update our local record.
|
||||||
info->motd_setter = setter; //update our local record.
|
info->motd_setter = setter; //update our local record.
|
||||||
@ -688,7 +688,7 @@ bool BaseGuildManager::DBSetGuildURL(uint32 GuildID, const char* URL)
|
|||||||
}
|
}
|
||||||
safe_delete_array(esc);
|
safe_delete_array(esc);
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Set URL for guild %d in the database", GuildID);
|
Log(Logs::Detail, Logs::Guilds, "Set URL for guild %d in the database", GuildID);
|
||||||
|
|
||||||
info->url = URL; //update our local record.
|
info->url = URL; //update our local record.
|
||||||
|
|
||||||
@ -722,7 +722,7 @@ bool BaseGuildManager::DBSetGuildChannel(uint32 GuildID, const char* Channel)
|
|||||||
}
|
}
|
||||||
safe_delete_array(esc);
|
safe_delete_array(esc);
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Set Channel for guild %d in the database", GuildID);
|
Log(Logs::Detail, Logs::Guilds, "Set Channel for guild %d in the database", GuildID);
|
||||||
|
|
||||||
info->channel = Channel; //update our local record.
|
info->channel = Channel; //update our local record.
|
||||||
|
|
||||||
@ -731,7 +731,7 @@ bool BaseGuildManager::DBSetGuildChannel(uint32 GuildID, const char* Channel)
|
|||||||
|
|
||||||
bool BaseGuildManager::DBSetGuild(uint32 charid, uint32 guild_id, uint8 rank) {
|
bool BaseGuildManager::DBSetGuild(uint32 charid, uint32 guild_id, uint8 rank) {
|
||||||
if(m_db == nullptr) {
|
if(m_db == nullptr) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Requested to set char to guild %d when we have no database object.", guild_id);
|
Log(Logs::Detail, Logs::Guilds, "Requested to set char to guild %d when we have no database object.", guild_id);
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -753,7 +753,7 @@ bool BaseGuildManager::DBSetGuild(uint32 charid, uint32 guild_id, uint8 rank) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Set char %d to guild %d and rank %d in the database.", charid, guild_id, rank);
|
Log(Logs::Detail, Logs::Guilds, "Set char %d to guild %d and rank %d in the database.", charid, guild_id, rank);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -845,7 +845,7 @@ bool BaseGuildManager::DBSetPublicNote(uint32 charid, const char* note) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Set public not for char %d", charid);
|
Log(Logs::Detail, Logs::Guilds, "Set public not for char %d", charid);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -924,14 +924,14 @@ bool BaseGuildManager::GetEntireGuild(uint32 guild_id, std::vector<CharGuildInfo
|
|||||||
members.push_back(ci);
|
members.push_back(ci);
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Retreived entire guild member list for guild %d from the database", guild_id);
|
Log(Logs::Detail, Logs::Guilds, "Retreived entire guild member list for guild %d from the database", guild_id);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BaseGuildManager::GetCharInfo(const char *char_name, CharGuildInfo &into) {
|
bool BaseGuildManager::GetCharInfo(const char *char_name, CharGuildInfo &into) {
|
||||||
if(m_db == nullptr) {
|
if(m_db == nullptr) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Requested char info on %s when we have no database object.", char_name);
|
Log(Logs::Detail, Logs::Guilds, "Requested char info on %s when we have no database object.", char_name);
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -953,7 +953,7 @@ bool BaseGuildManager::GetCharInfo(const char *char_name, CharGuildInfo &into) {
|
|||||||
|
|
||||||
auto row = results.begin();
|
auto row = results.begin();
|
||||||
ProcessGuildMember(row, into);
|
ProcessGuildMember(row, into);
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Retreived guild member info for char %s from the database", char_name);
|
Log(Logs::Detail, Logs::Guilds, "Retreived guild member info for char %s from the database", char_name);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
@ -962,7 +962,7 @@ bool BaseGuildManager::GetCharInfo(const char *char_name, CharGuildInfo &into) {
|
|||||||
|
|
||||||
bool BaseGuildManager::GetCharInfo(uint32 char_id, CharGuildInfo &into) {
|
bool BaseGuildManager::GetCharInfo(uint32 char_id, CharGuildInfo &into) {
|
||||||
if(m_db == nullptr) {
|
if(m_db == nullptr) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Requested char info on %d when we have no database object.", char_id);
|
Log(Logs::Detail, Logs::Guilds, "Requested char info on %d when we have no database object.", char_id);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -983,7 +983,7 @@ bool BaseGuildManager::GetCharInfo(uint32 char_id, CharGuildInfo &into) {
|
|||||||
|
|
||||||
auto row = results.begin();
|
auto row = results.begin();
|
||||||
ProcessGuildMember(row, into);
|
ProcessGuildMember(row, into);
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Retreived guild member info for char %d", char_id);
|
Log(Logs::Detail, Logs::Guilds, "Retreived guild member info for char %d", char_id);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
@ -1098,16 +1098,16 @@ bool BaseGuildManager::GuildExists(uint32 guild_id) const {
|
|||||||
|
|
||||||
bool BaseGuildManager::IsGuildLeader(uint32 guild_id, uint32 char_id) const {
|
bool BaseGuildManager::IsGuildLeader(uint32 guild_id, uint32 char_id) const {
|
||||||
if(guild_id == GUILD_NONE) {
|
if(guild_id == GUILD_NONE) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Check leader for char %d: not a guild.", char_id);
|
Log(Logs::Detail, Logs::Guilds, "Check leader for char %d: not a guild.", char_id);
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
std::map<uint32, GuildInfo *>::const_iterator res;
|
std::map<uint32, GuildInfo *>::const_iterator res;
|
||||||
res = m_guilds.find(guild_id);
|
res = m_guilds.find(guild_id);
|
||||||
if(res == m_guilds.end()) {
|
if(res == m_guilds.end()) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Check leader for char %d: invalid guild.", char_id);
|
Log(Logs::Detail, Logs::Guilds, "Check leader for char %d: invalid guild.", char_id);
|
||||||
return(false); //invalid guild
|
return(false); //invalid guild
|
||||||
}
|
}
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Check leader for guild %d, char %d: leader id=%d", guild_id, char_id, res->second->leader_char_id);
|
Log(Logs::Detail, Logs::Guilds, "Check leader for guild %d, char %d: leader id=%d", guild_id, char_id, res->second->leader_char_id);
|
||||||
return(char_id == res->second->leader_char_id);
|
return(char_id == res->second->leader_char_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1137,20 +1137,20 @@ uint8 BaseGuildManager::GetDisplayedRank(uint32 guild_id, uint8 rank, uint32 cha
|
|||||||
|
|
||||||
bool BaseGuildManager::CheckGMStatus(uint32 guild_id, uint8 status) const {
|
bool BaseGuildManager::CheckGMStatus(uint32 guild_id, uint8 status) const {
|
||||||
if(status >= 250) {
|
if(status >= 250) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Check permission on guild %d with user status %d > 250, granted.", guild_id, status);
|
Log(Logs::Detail, Logs::Guilds, "Check permission on guild %d with user status %d > 250, granted.", guild_id, status);
|
||||||
return(true); //250+ as allowed anything
|
return(true); //250+ as allowed anything
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<uint32, GuildInfo *>::const_iterator res;
|
std::map<uint32, GuildInfo *>::const_iterator res;
|
||||||
res = m_guilds.find(guild_id);
|
res = m_guilds.find(guild_id);
|
||||||
if(res == m_guilds.end()) {
|
if(res == m_guilds.end()) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Check permission on guild %d with user status %d, no such guild, denied.", guild_id, status);
|
Log(Logs::Detail, Logs::Guilds, "Check permission on guild %d with user status %d, no such guild, denied.", guild_id, status);
|
||||||
return(false); //invalid guild
|
return(false); //invalid guild
|
||||||
}
|
}
|
||||||
|
|
||||||
bool granted = (res->second->minstatus <= status);
|
bool granted = (res->second->minstatus <= status);
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Check permission on guild %s (%d) with user status %d. Min status %d: %s",
|
Log(Logs::Detail, Logs::Guilds, "Check permission on guild %s (%d) with user status %d. Min status %d: %s",
|
||||||
res->second->name.c_str(), guild_id, status, res->second->minstatus, granted?"granted":"denied");
|
res->second->name.c_str(), guild_id, status, res->second->minstatus, granted?"granted":"denied");
|
||||||
|
|
||||||
return(granted);
|
return(granted);
|
||||||
@ -1158,21 +1158,21 @@ bool BaseGuildManager::CheckGMStatus(uint32 guild_id, uint8 status) const {
|
|||||||
|
|
||||||
bool BaseGuildManager::CheckPermission(uint32 guild_id, uint8 rank, GuildAction act) const {
|
bool BaseGuildManager::CheckPermission(uint32 guild_id, uint8 rank, GuildAction act) const {
|
||||||
if(rank > GUILD_MAX_RANK) {
|
if(rank > GUILD_MAX_RANK) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Check permission on guild %d and rank %d for action %s (%d): Invalid rank, denied.",
|
Log(Logs::Detail, Logs::Guilds, "Check permission on guild %d and rank %d for action %s (%d): Invalid rank, denied.",
|
||||||
guild_id, rank, GuildActionNames[act], act);
|
guild_id, rank, GuildActionNames[act], act);
|
||||||
return(false); //invalid rank
|
return(false); //invalid rank
|
||||||
}
|
}
|
||||||
std::map<uint32, GuildInfo *>::const_iterator res;
|
std::map<uint32, GuildInfo *>::const_iterator res;
|
||||||
res = m_guilds.find(guild_id);
|
res = m_guilds.find(guild_id);
|
||||||
if(res == m_guilds.end()) {
|
if(res == m_guilds.end()) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Check permission on guild %d and rank %d for action %s (%d): Invalid guild, denied.",
|
Log(Logs::Detail, Logs::Guilds, "Check permission on guild %d and rank %d for action %s (%d): Invalid guild, denied.",
|
||||||
guild_id, rank, GuildActionNames[act], act);
|
guild_id, rank, GuildActionNames[act], act);
|
||||||
return(false); //invalid guild
|
return(false); //invalid guild
|
||||||
}
|
}
|
||||||
|
|
||||||
bool granted = res->second->ranks[rank].permissions[act];
|
bool granted = res->second->ranks[rank].permissions[act];
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Check permission on guild %s (%d) and rank %s (%d) for action %s (%d): %s",
|
Log(Logs::Detail, Logs::Guilds, "Check permission on guild %s (%d) and rank %s (%d) for action %s (%d): %s",
|
||||||
res->second->name.c_str(), guild_id,
|
res->second->name.c_str(), guild_id,
|
||||||
res->second->ranks[rank].name.c_str(), rank,
|
res->second->ranks[rank].name.c_str(), rank,
|
||||||
GuildActionNames[act], act,
|
GuildActionNames[act], act,
|
||||||
|
|||||||
@ -241,14 +241,45 @@ EQEmu::ItemInstance* EQEmu::InventoryProfile::GetCursorItem()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Swap items in inventory
|
// Swap items in inventory
|
||||||
bool EQEmu::InventoryProfile::SwapItem(int16 slot_a, int16 slot_b)
|
bool EQEmu::InventoryProfile::SwapItem(int16 slot_a, int16 slot_b, uint16 race_id, uint8 class_id, uint16 deity_id, uint8 level)
|
||||||
{
|
{
|
||||||
// Temp holding areas for a and b
|
// Temp holding areas for a and b
|
||||||
ItemInstance* inst_a = GetItem(slot_a);
|
ItemInstance* inst_a = GetItem(slot_a);
|
||||||
ItemInstance* inst_b = GetItem(slot_b);
|
ItemInstance* inst_b = GetItem(slot_b);
|
||||||
|
|
||||||
if (inst_a) { if (!inst_a->IsSlotAllowed(slot_b)) { return false; } }
|
if (inst_a) {
|
||||||
if (inst_b) { if (!inst_b->IsSlotAllowed(slot_a)) { return false; } }
|
if (!inst_a->IsSlotAllowed(slot_b))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if ((slot_b >= legacy::EQUIPMENT_BEGIN && slot_b <= legacy::EQUIPMENT_END) || slot_b == inventory::slotPowerSource) {
|
||||||
|
auto item_a = inst_a->GetItem();
|
||||||
|
if (!item_a)
|
||||||
|
return false;
|
||||||
|
if (race_id && class_id && !item_a->IsEquipable(race_id, class_id))
|
||||||
|
return false;
|
||||||
|
if (deity_id && item_a->Deity && !(deity::ConvertDeityTypeToDeityTypeBit((deity::DeityType)deity_id) & item_a->Deity))
|
||||||
|
return false;
|
||||||
|
if (level && item_a->ReqLevel && level < item_a->ReqLevel)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inst_b) {
|
||||||
|
if (!inst_b->IsSlotAllowed(slot_a))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if ((slot_a >= legacy::EQUIPMENT_BEGIN && slot_a <= legacy::EQUIPMENT_END) || slot_a == inventory::slotPowerSource) {
|
||||||
|
auto item_b = inst_b->GetItem();
|
||||||
|
if (!item_b)
|
||||||
|
return false;
|
||||||
|
if (race_id && class_id && !item_b->IsEquipable(race_id, class_id))
|
||||||
|
return false;
|
||||||
|
if (deity_id && item_b->Deity && !(deity::ConvertDeityTypeToDeityTypeBit((deity::DeityType)deity_id) & item_b->Deity))
|
||||||
|
return false;
|
||||||
|
if (level && item_b->ReqLevel && level < item_b->ReqLevel)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_PutItem(slot_a, inst_b); // Copy b->a
|
_PutItem(slot_a, inst_b); // Copy b->a
|
||||||
_PutItem(slot_b, inst_a); // Copy a->b
|
_PutItem(slot_b, inst_a); // Copy a->b
|
||||||
@ -1173,7 +1204,7 @@ int16 EQEmu::InventoryProfile::_PutItem(int16 slot_id, ItemInstance* inst)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (result == INVALID_INDEX) {
|
if (result == INVALID_INDEX) {
|
||||||
Log.Out(Logs::General, Logs::Error, "InventoryProfile::_PutItem: Invalid slot_id specified (%i) with parent slot id (%i)", slot_id, parentSlot);
|
Log(Logs::General, Logs::Error, "InventoryProfile::_PutItem: Invalid slot_id specified (%i) with parent slot id (%i)", slot_id, parentSlot);
|
||||||
InventoryProfile::MarkDirty(inst); // Slot not found, clean up
|
InventoryProfile::MarkDirty(inst); // Slot not found, clean up
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -127,7 +127,7 @@ namespace EQEmu
|
|||||||
ItemInstance* GetCursorItem();
|
ItemInstance* GetCursorItem();
|
||||||
|
|
||||||
// Swap items in inventory
|
// Swap items in inventory
|
||||||
bool SwapItem(int16 slot_a, int16 slot_b);
|
bool SwapItem(int16 slot_a, int16 slot_b, uint16 race_id = 0, uint8 class_id = 0, uint16 deity_id = 0, uint8 level = 0);
|
||||||
|
|
||||||
// Remove item from inventory
|
// Remove item from inventory
|
||||||
bool DeleteItem(int16 slot_id, uint8 quantity = 0);
|
bool DeleteItem(int16 slot_id, uint8 quantity = 0);
|
||||||
|
|||||||
@ -40,7 +40,7 @@
|
|||||||
#define VERIFY_PACKET_LENGTH(OPCode, Packet, StructName) \
|
#define VERIFY_PACKET_LENGTH(OPCode, Packet, StructName) \
|
||||||
if(Packet->size != sizeof(StructName)) \
|
if(Packet->size != sizeof(StructName)) \
|
||||||
{ \
|
{ \
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, "Size mismatch in " #OPCode " expected %i got %i", sizeof(StructName), Packet->size); \
|
Log(Logs::Detail, Logs::Netcode, "Size mismatch in " #OPCode " expected %i got %i", sizeof(StructName), Packet->size); \
|
||||||
DumpPacket(Packet); \
|
DumpPacket(Packet); \
|
||||||
return; \
|
return; \
|
||||||
}
|
}
|
||||||
|
|||||||
@ -188,7 +188,7 @@ void EQ::Net::DaybreakConnectionManager::ProcessPacket(const std::string &endpoi
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (size < DaybreakHeader::size()) {
|
if (size < DaybreakHeader::size()) {
|
||||||
Log.OutF(Logs::Detail, Logs::Netcode, "Packet of size {0} which is less than {1}", size, DaybreakHeader::size());
|
LogF(Logs::Detail, Logs::Netcode, "Packet of size {0} which is less than {1}", size, DaybreakHeader::size());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -218,7 +218,7 @@ void EQ::Net::DaybreakConnectionManager::ProcessPacket(const std::string &endpoi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (std::exception &ex) {
|
catch (std::exception &ex) {
|
||||||
Log.OutF(Logs::Detail, Logs::Netcode, "Error processing packet: {0}", ex.what());
|
LogF(Logs::Detail, Logs::Netcode, "Error processing packet: {0}", ex.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -364,7 +364,7 @@ void EQ::Net::DaybreakConnection::Process()
|
|||||||
ProcessQueue();
|
ProcessQueue();
|
||||||
}
|
}
|
||||||
catch (std::exception ex) {
|
catch (std::exception ex) {
|
||||||
Log.OutF(Logs::Detail, Logs::Netcode, "Error processing connection: {0}", ex.what());
|
LogF(Logs::Detail, Logs::Netcode, "Error processing connection: {0}", ex.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -379,7 +379,7 @@ void EQ::Net::DaybreakConnection::ProcessPacket(Packet &p)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (p.GetInt8(0) != 0) {
|
if (p.GetInt8(0) != 0) {
|
||||||
Log.OutF(Logs::Detail, Logs::Netcode, "Error parsing packet, did not start with a 0 frame, not a valid protocol packet.");
|
LogF(Logs::Detail, Logs::Netcode, "Error parsing packet, did not start with a 0 frame, not a valid protocol packet.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -390,7 +390,7 @@ void EQ::Net::DaybreakConnection::ProcessPacket(Packet &p)
|
|||||||
|
|
||||||
if (PacketCanBeEncoded(p)) {
|
if (PacketCanBeEncoded(p)) {
|
||||||
if (!ValidateCRC(p)) {
|
if (!ValidateCRC(p)) {
|
||||||
Log.OutF(Logs::Detail, Logs::Netcode, "Tossed packet that failed CRC of type {0:#x}", p.Length() >= 2 ? p.GetInt8(1) : 0);
|
LogF(Logs::Detail, Logs::Netcode, "Tossed packet that failed CRC of type {0:#x}", p.Length() >= 2 ? p.GetInt8(1) : 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -756,7 +756,7 @@ void EQ::Net::DaybreakConnection::ProcessDecodedPacket(const Packet &p)
|
|||||||
case OP_SessionStatResponse:
|
case OP_SessionStatResponse:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Log.OutF(Logs::Detail, Logs::Netcode, "Unhandled opcode {0:#x}", p.GetInt8(1));
|
LogF(Logs::Detail, Logs::Netcode, "Unhandled opcode {0:#x}", p.GetInt8(1));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -171,23 +171,23 @@ EQStreamInterface::MatchState EQ::Net::EQStream::CheckSignature(const Signature
|
|||||||
|
|
||||||
if (opcode == sig->first_eq_opcode) {
|
if (opcode == sig->first_eq_opcode) {
|
||||||
if (length == sig->first_length) {
|
if (length == sig->first_length) {
|
||||||
Log.OutF(Logs::General, Logs::Netcode, "[IDENT_TRACE] {0}:{1}: First opcode matched {2:#x} and length matched {3}",
|
LogF(Logs::General, Logs::Netcode, "[IDENT_TRACE] {0}:{1}: First opcode matched {2:#x} and length matched {3}",
|
||||||
RemoteEndpoint(), m_connection->RemotePort(), sig->first_eq_opcode, length);
|
RemoteEndpoint(), m_connection->RemotePort(), sig->first_eq_opcode, length);
|
||||||
return MatchSuccessful;
|
return MatchSuccessful;
|
||||||
}
|
}
|
||||||
else if (length == 0) {
|
else if (length == 0) {
|
||||||
Log.OutF(Logs::General, Logs::Netcode, "[IDENT_TRACE] {0}:{1}: First opcode matched {2:#x} and length is ignored.",
|
LogF(Logs::General, Logs::Netcode, "[IDENT_TRACE] {0}:{1}: First opcode matched {2:#x} and length is ignored.",
|
||||||
RemoteEndpoint(), m_connection->RemotePort(), sig->first_eq_opcode);
|
RemoteEndpoint(), m_connection->RemotePort(), sig->first_eq_opcode);
|
||||||
return MatchSuccessful;
|
return MatchSuccessful;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Log.OutF(Logs::General, Logs::Netcode, "[IDENT_TRACE] {0}:{1}: First opcode matched {2:#x} but length {3} did not match expected {4}",
|
LogF(Logs::General, Logs::Netcode, "[IDENT_TRACE] {0}:{1}: First opcode matched {2:#x} but length {3} did not match expected {4}",
|
||||||
RemoteEndpoint(), m_connection->RemotePort(), sig->first_eq_opcode, length, sig->first_length);
|
RemoteEndpoint(), m_connection->RemotePort(), sig->first_eq_opcode, length, sig->first_length);
|
||||||
return MatchFailed;
|
return MatchFailed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Log.OutF(Logs::General, Logs::Netcode, "[IDENT_TRACE] {0}:{1}: First opcode {1:#x} did not match expected {2:#x}",
|
LogF(Logs::General, Logs::Netcode, "[IDENT_TRACE] {0}:{1}: First opcode {1:#x} did not match expected {2:#x}",
|
||||||
RemoteEndpoint(), m_connection->RemotePort(), opcode, sig->first_eq_opcode);
|
RemoteEndpoint(), m_connection->RemotePort(), opcode, sig->first_eq_opcode);
|
||||||
return MatchFailed;
|
return MatchFailed;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -78,15 +78,15 @@ void EQ::Net::ServertalkClient::Connect()
|
|||||||
m_connecting = true;
|
m_connecting = true;
|
||||||
EQ::Net::TCPConnection::Connect(m_addr, m_port, false, [this](std::shared_ptr<EQ::Net::TCPConnection> connection) {
|
EQ::Net::TCPConnection::Connect(m_addr, m_port, false, [this](std::shared_ptr<EQ::Net::TCPConnection> connection) {
|
||||||
if (connection == nullptr) {
|
if (connection == nullptr) {
|
||||||
Log.OutF(Logs::General, Logs::TCP_Connection, "Error connecting to {0}:{1}, attempting to reconnect...", m_addr, m_port);
|
LogF(Logs::General, Logs::TCP_Connection, "Error connecting to {0}:{1}, attempting to reconnect...", m_addr, m_port);
|
||||||
m_connecting = false;
|
m_connecting = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.OutF(Logs::General, Logs::TCP_Connection, "Connected to {0}:{1}", m_addr, m_port);
|
LogF(Logs::General, Logs::TCP_Connection, "Connected to {0}:{1}", m_addr, m_port);
|
||||||
m_connection = connection;
|
m_connection = connection;
|
||||||
m_connection->OnDisconnect([this](EQ::Net::TCPConnection *c) {
|
m_connection->OnDisconnect([this](EQ::Net::TCPConnection *c) {
|
||||||
Log.OutF(Logs::General, Logs::TCP_Connection, "Connection lost to {0}:{1}, attempting to reconnect...", m_addr, m_port);
|
LogF(Logs::General, Logs::TCP_Connection, "Connection lost to {0}:{1}, attempting to reconnect...", m_addr, m_port);
|
||||||
m_encrypted = false;
|
m_encrypted = false;
|
||||||
m_connection.reset();
|
m_connection.reset();
|
||||||
});
|
});
|
||||||
@ -213,7 +213,7 @@ void EQ::Net::ServertalkClient::ProcessHello(EQ::Net::Packet &p)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Log.OutF(Logs::General, Logs::Error, "Could not process hello, size != {0}", 1 + crypto_box_PUBLICKEYBYTES + crypto_box_NONCEBYTES);
|
LogF(Logs::General, Logs::Error, "Could not process hello, size != {0}", 1 + crypto_box_PUBLICKEYBYTES + crypto_box_NONCEBYTES);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -225,7 +225,7 @@ void EQ::Net::ServertalkClient::ProcessHello(EQ::Net::Packet &p)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (std::exception &ex) {
|
catch (std::exception &ex) {
|
||||||
Log.OutF(Logs::General, Logs::Error, "Error parsing hello from server: {0}", ex.what());
|
LogF(Logs::General, Logs::Error, "Error parsing hello from server: {0}", ex.what());
|
||||||
m_connection->Disconnect();
|
m_connection->Disconnect();
|
||||||
|
|
||||||
if (m_on_connect_cb) {
|
if (m_on_connect_cb) {
|
||||||
@ -252,7 +252,7 @@ void EQ::Net::ServertalkClient::ProcessHello(EQ::Net::Packet &p)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (std::exception &ex) {
|
catch (std::exception &ex) {
|
||||||
Log.OutF(Logs::General, Logs::Error, "Error parsing hello from server: {0}", ex.what());
|
LogF(Logs::General, Logs::Error, "Error parsing hello from server: {0}", ex.what());
|
||||||
m_connection->Disconnect();
|
m_connection->Disconnect();
|
||||||
|
|
||||||
if (m_on_connect_cb) {
|
if (m_on_connect_cb) {
|
||||||
@ -275,7 +275,7 @@ void EQ::Net::ServertalkClient::ProcessMessage(EQ::Net::Packet &p)
|
|||||||
std::unique_ptr<unsigned char[]> decrypted_text(new unsigned char[message_len]);
|
std::unique_ptr<unsigned char[]> decrypted_text(new unsigned char[message_len]);
|
||||||
if (crypto_box_open_easy_afternm(&decrypted_text[0], (unsigned char*)&data[0], length, m_nonce_theirs, m_shared_key))
|
if (crypto_box_open_easy_afternm(&decrypted_text[0], (unsigned char*)&data[0], length, m_nonce_theirs, m_shared_key))
|
||||||
{
|
{
|
||||||
Log.OutF(Logs::General, Logs::Error, "Error decrypting message from server");
|
LogF(Logs::General, Logs::Error, "Error decrypting message from server");
|
||||||
(*(uint64_t*)&m_nonce_theirs[0])++;
|
(*(uint64_t*)&m_nonce_theirs[0])++;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -323,7 +323,7 @@ void EQ::Net::ServertalkClient::ProcessMessage(EQ::Net::Packet &p)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (std::exception &ex) {
|
catch (std::exception &ex) {
|
||||||
Log.OutF(Logs::General, Logs::Error, "Error parsing message from server: {0}", ex.what());
|
LogF(Logs::General, Logs::Error, "Error parsing message from server: {0}", ex.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -58,15 +58,15 @@ void EQ::Net::ServertalkLegacyClient::Connect()
|
|||||||
m_connecting = true;
|
m_connecting = true;
|
||||||
EQ::Net::TCPConnection::Connect(m_addr, m_port, false, [this](std::shared_ptr<EQ::Net::TCPConnection> connection) {
|
EQ::Net::TCPConnection::Connect(m_addr, m_port, false, [this](std::shared_ptr<EQ::Net::TCPConnection> connection) {
|
||||||
if (connection == nullptr) {
|
if (connection == nullptr) {
|
||||||
Log.OutF(Logs::General, Logs::TCP_Connection, "Error connecting to {0}:{1}, attempting to reconnect...", m_addr, m_port);
|
LogF(Logs::General, Logs::TCP_Connection, "Error connecting to {0}:{1}, attempting to reconnect...", m_addr, m_port);
|
||||||
m_connecting = false;
|
m_connecting = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.OutF(Logs::General, Logs::TCP_Connection, "Connected to {0}:{1}", m_addr, m_port);
|
LogF(Logs::General, Logs::TCP_Connection, "Connected to {0}:{1}", m_addr, m_port);
|
||||||
m_connection = connection;
|
m_connection = connection;
|
||||||
m_connection->OnDisconnect([this](EQ::Net::TCPConnection *c) {
|
m_connection->OnDisconnect([this](EQ::Net::TCPConnection *c) {
|
||||||
Log.OutF(Logs::General, Logs::TCP_Connection, "Connection lost to {0}:{1}, attempting to reconnect...", m_addr, m_port);
|
LogF(Logs::General, Logs::TCP_Connection, "Connection lost to {0}:{1}, attempting to reconnect...", m_addr, m_port);
|
||||||
m_connection.reset();
|
m_connection.reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -201,7 +201,7 @@ void EQ::Net::ServertalkServerConnection::ProcessHandshake(EQ::Net::Packet &p, b
|
|||||||
{
|
{
|
||||||
#ifdef ENABLE_SECURITY
|
#ifdef ENABLE_SECURITY
|
||||||
if (downgrade_security && m_allow_downgrade && m_encrypted) {
|
if (downgrade_security && m_allow_downgrade && m_encrypted) {
|
||||||
Log.OutF(Logs::General, Logs::TCP_Connection, "Downgraded encrypted connection to plaintext because otherside didn't support encryption {0}:{1}",
|
LogF(Logs::General, Logs::TCP_Connection, "Downgraded encrypted connection to plaintext because otherside didn't support encryption {0}:{1}",
|
||||||
m_connection->RemoteIP(), m_connection->RemotePort());
|
m_connection->RemoteIP(), m_connection->RemotePort());
|
||||||
m_encrypted = false;
|
m_encrypted = false;
|
||||||
}
|
}
|
||||||
@ -220,7 +220,7 @@ void EQ::Net::ServertalkServerConnection::ProcessHandshake(EQ::Net::Packet &p, b
|
|||||||
|
|
||||||
if (crypto_box_open_easy_afternm(&decrypted_text[0], (unsigned char*)p.Data() + crypto_box_PUBLICKEYBYTES + crypto_box_NONCEBYTES, cipher_len, m_nonce_theirs, m_shared_key))
|
if (crypto_box_open_easy_afternm(&decrypted_text[0], (unsigned char*)p.Data() + crypto_box_PUBLICKEYBYTES + crypto_box_NONCEBYTES, cipher_len, m_nonce_theirs, m_shared_key))
|
||||||
{
|
{
|
||||||
Log.OutF(Logs::General, Logs::Error, "Error decrypting handshake from client, dropping connection.");
|
LogF(Logs::General, Logs::Error, "Error decrypting handshake from client, dropping connection.");
|
||||||
m_connection->Disconnect();
|
m_connection->Disconnect();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -229,7 +229,7 @@ void EQ::Net::ServertalkServerConnection::ProcessHandshake(EQ::Net::Packet &p, b
|
|||||||
std::string credentials = (const char*)&decrypted_text[0] + (m_identifier.length() + 1);
|
std::string credentials = (const char*)&decrypted_text[0] + (m_identifier.length() + 1);
|
||||||
|
|
||||||
if (!m_parent->CheckCredentials(credentials)) {
|
if (!m_parent->CheckCredentials(credentials)) {
|
||||||
Log.OutF(Logs::General, Logs::Error, "Got incoming connection with invalid credentials during handshake, dropping connection.");
|
LogF(Logs::General, Logs::Error, "Got incoming connection with invalid credentials during handshake, dropping connection.");
|
||||||
m_connection->Disconnect();
|
m_connection->Disconnect();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -239,7 +239,7 @@ void EQ::Net::ServertalkServerConnection::ProcessHandshake(EQ::Net::Packet &p, b
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (std::exception &ex) {
|
catch (std::exception &ex) {
|
||||||
Log.OutF(Logs::General, Logs::Error, "Error parsing handshake from client: {0}", ex.what());
|
LogF(Logs::General, Logs::Error, "Error parsing handshake from client: {0}", ex.what());
|
||||||
m_connection->Disconnect();
|
m_connection->Disconnect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -249,7 +249,7 @@ void EQ::Net::ServertalkServerConnection::ProcessHandshake(EQ::Net::Packet &p, b
|
|||||||
auto credentials = p.GetCString(m_identifier.length() + 1);
|
auto credentials = p.GetCString(m_identifier.length() + 1);
|
||||||
|
|
||||||
if (!m_parent->CheckCredentials(credentials)) {
|
if (!m_parent->CheckCredentials(credentials)) {
|
||||||
Log.OutF(Logs::General, Logs::Error, "Got incoming connection with invalid credentials during handshake, dropping connection.");
|
LogF(Logs::General, Logs::Error, "Got incoming connection with invalid credentials during handshake, dropping connection.");
|
||||||
m_connection->Disconnect();
|
m_connection->Disconnect();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -257,7 +257,7 @@ void EQ::Net::ServertalkServerConnection::ProcessHandshake(EQ::Net::Packet &p, b
|
|||||||
m_parent->ConnectionIdentified(this);
|
m_parent->ConnectionIdentified(this);
|
||||||
}
|
}
|
||||||
catch (std::exception &ex) {
|
catch (std::exception &ex) {
|
||||||
Log.OutF(Logs::General, Logs::Error, "Error parsing handshake from client: {0}", ex.what());
|
LogF(Logs::General, Logs::Error, "Error parsing handshake from client: {0}", ex.what());
|
||||||
m_connection->Disconnect();
|
m_connection->Disconnect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -267,7 +267,7 @@ void EQ::Net::ServertalkServerConnection::ProcessHandshake(EQ::Net::Packet &p, b
|
|||||||
auto credentials = p.GetCString(m_identifier.length() + 1);
|
auto credentials = p.GetCString(m_identifier.length() + 1);
|
||||||
|
|
||||||
if (!m_parent->CheckCredentials(credentials)) {
|
if (!m_parent->CheckCredentials(credentials)) {
|
||||||
Log.OutF(Logs::General, Logs::Error, "Got incoming connection with invalid credentials during handshake, dropping connection.");
|
LogF(Logs::General, Logs::Error, "Got incoming connection with invalid credentials during handshake, dropping connection.");
|
||||||
m_connection->Disconnect();
|
m_connection->Disconnect();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -275,7 +275,7 @@ void EQ::Net::ServertalkServerConnection::ProcessHandshake(EQ::Net::Packet &p, b
|
|||||||
m_parent->ConnectionIdentified(this);
|
m_parent->ConnectionIdentified(this);
|
||||||
}
|
}
|
||||||
catch (std::exception &ex) {
|
catch (std::exception &ex) {
|
||||||
Log.OutF(Logs::General, Logs::Error, "Error parsing handshake from client: {0}", ex.what());
|
LogF(Logs::General, Logs::Error, "Error parsing handshake from client: {0}", ex.what());
|
||||||
m_connection->Disconnect();
|
m_connection->Disconnect();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -295,7 +295,7 @@ void EQ::Net::ServertalkServerConnection::ProcessMessage(EQ::Net::Packet &p)
|
|||||||
|
|
||||||
if (crypto_box_open_easy_afternm(&decrypted_text[0], (unsigned char*)&data[0], length, m_nonce_theirs, m_shared_key))
|
if (crypto_box_open_easy_afternm(&decrypted_text[0], (unsigned char*)&data[0], length, m_nonce_theirs, m_shared_key))
|
||||||
{
|
{
|
||||||
Log.OutF(Logs::General, Logs::Error, "Error decrypting message from client");
|
LogF(Logs::General, Logs::Error, "Error decrypting message from client");
|
||||||
(*(uint64_t*)&m_nonce_theirs[0])++;
|
(*(uint64_t*)&m_nonce_theirs[0])++;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -343,6 +343,6 @@ void EQ::Net::ServertalkServerConnection::ProcessMessage(EQ::Net::Packet &p)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (std::exception &ex) {
|
catch (std::exception &ex) {
|
||||||
Log.OutF(Logs::General, Logs::Error, "Error parsing message from client: {0}", ex.what());
|
LogF(Logs::General, Logs::Error, "Error parsing message from client: {0}", ex.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -83,7 +83,7 @@ namespace RoF
|
|||||||
//TODO: figure out how to support shared memory with multiple patches...
|
//TODO: figure out how to support shared memory with multiple patches...
|
||||||
opcodes = new RegularOpcodeManager();
|
opcodes = new RegularOpcodeManager();
|
||||||
if (!opcodes->LoadOpcodes(opfile.c_str())) {
|
if (!opcodes->LoadOpcodes(opfile.c_str())) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[OPCODES] Error loading opcodes file %s. Not registering patch %s.", opfile.c_str(), name);
|
Log(Logs::General, Logs::Netcode, "[OPCODES] Error loading opcodes file %s. Not registering patch %s.", opfile.c_str(), name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -106,7 +106,7 @@ namespace RoF
|
|||||||
signature.first_length = sizeof(structs::ClientZoneEntry_Struct);
|
signature.first_length = sizeof(structs::ClientZoneEntry_Struct);
|
||||||
signature.first_eq_opcode = opcodes->EmuToEQ(OP_ZoneEntry);
|
signature.first_eq_opcode = opcodes->EmuToEQ(OP_ZoneEntry);
|
||||||
into.RegisterPatch(signature, pname.c_str(), &opcodes, &struct_strategy);
|
into.RegisterPatch(signature, pname.c_str(), &opcodes, &struct_strategy);
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[IDENTIFY] Registered patch %s", name);
|
Log(Logs::General, Logs::Netcode, "[IDENTIFY] Registered patch %s", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Reload()
|
void Reload()
|
||||||
@ -123,10 +123,10 @@ namespace RoF
|
|||||||
opfile += name;
|
opfile += name;
|
||||||
opfile += ".conf";
|
opfile += ".conf";
|
||||||
if (!opcodes->ReloadOpcodes(opfile.c_str())) {
|
if (!opcodes->ReloadOpcodes(opfile.c_str())) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[OPCODES] Error reloading opcodes file %s for patch %s.", opfile.c_str(), name);
|
Log(Logs::General, Logs::Netcode, "[OPCODES] Error reloading opcodes file %s for patch %s.", opfile.c_str(), name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[OPCODES] Reloaded opcodes for patch %s", name);
|
Log(Logs::General, Logs::Netcode, "[OPCODES] Reloaded opcodes for patch %s", name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -347,7 +347,7 @@ namespace RoF
|
|||||||
|
|
||||||
if (EntryCount == 0 || (in->size % sizeof(BazaarSearchResults_Struct)) != 0)
|
if (EntryCount == 0 || (in->size % sizeof(BazaarSearchResults_Struct)) != 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(BazaarSearchResults_Struct));
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(BazaarSearchResults_Struct));
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -569,7 +569,7 @@ namespace RoF
|
|||||||
|
|
||||||
int item_count = in->size / sizeof(EQEmu::InternalSerializedItem_Struct);
|
int item_count = in->size / sizeof(EQEmu::InternalSerializedItem_Struct);
|
||||||
if (!item_count || (in->size % sizeof(EQEmu::InternalSerializedItem_Struct)) != 0) {
|
if (!item_count || (in->size % sizeof(EQEmu::InternalSerializedItem_Struct)) != 0) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d",
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d",
|
||||||
opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQEmu::InternalSerializedItem_Struct));
|
opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQEmu::InternalSerializedItem_Struct));
|
||||||
|
|
||||||
delete in;
|
delete in;
|
||||||
@ -586,7 +586,7 @@ namespace RoF
|
|||||||
for (int index = 0; index < item_count; ++index, ++eq) {
|
for (int index = 0; index < item_count; ++index, ++eq) {
|
||||||
SerializeItem(ob, (const EQEmu::ItemInstance*)eq->inst, eq->slot_id, 0);
|
SerializeItem(ob, (const EQEmu::ItemInstance*)eq->inst, eq->slot_id, 0);
|
||||||
if (ob.tellp() == last_pos)
|
if (ob.tellp() == last_pos)
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id);
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id);
|
||||||
|
|
||||||
last_pos = ob.tellp();
|
last_pos = ob.tellp();
|
||||||
}
|
}
|
||||||
@ -1512,7 +1512,7 @@ namespace RoF
|
|||||||
|
|
||||||
SerializeItem(ob, (const EQEmu::ItemInstance*)int_struct->inst, int_struct->slot_id, 0);
|
SerializeItem(ob, (const EQEmu::ItemInstance*)int_struct->inst, int_struct->slot_id, 0);
|
||||||
if (ob.tellp() == last_pos) {
|
if (ob.tellp() == last_pos) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d.", int_struct->slot_id);
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d.", int_struct->slot_id);
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2690,7 +2690,7 @@ namespace RoF
|
|||||||
|
|
||||||
outapp->WriteUInt8(0); // Unknown
|
outapp->WriteUInt8(0); // Unknown
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Player Profile Packet is %i bytes", outapp->GetWritePosition());
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Player Profile Packet is %i bytes", outapp->GetWritePosition());
|
||||||
|
|
||||||
auto NewBuffer = new unsigned char[outapp->GetWritePosition()];
|
auto NewBuffer = new unsigned char[outapp->GetWritePosition()];
|
||||||
memcpy(NewBuffer, outapp->pBuffer, outapp->GetWritePosition());
|
memcpy(NewBuffer, outapp->pBuffer, outapp->GetWritePosition());
|
||||||
@ -3550,7 +3550,7 @@ namespace RoF
|
|||||||
|
|
||||||
if (EntryCount == 0 || ((in->size % sizeof(Track_Struct))) != 0)
|
if (EntryCount == 0 || ((in->size % sizeof(Track_Struct))) != 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Track_Struct));
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Track_Struct));
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -3898,7 +3898,7 @@ namespace RoF
|
|||||||
//determine and verify length
|
//determine and verify length
|
||||||
int entrycount = in->size / sizeof(Spawn_Struct);
|
int entrycount = in->size / sizeof(Spawn_Struct);
|
||||||
if (entrycount == 0 || (in->size % sizeof(Spawn_Struct)) != 0) {
|
if (entrycount == 0 || (in->size % sizeof(Spawn_Struct)) != 0) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Spawn_Struct));
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Spawn_Struct));
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -4146,7 +4146,7 @@ namespace RoF
|
|||||||
Buffer += 29;
|
Buffer += 29;
|
||||||
if (Buffer != (BufferStart + PacketSize))
|
if (Buffer != (BufferStart + PacketSize))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[ERROR] SPAWN ENCODE LOGIC PROBLEM: Buffer pointer is now %i from end", Buffer - (BufferStart + PacketSize));
|
Log(Logs::General, Logs::Netcode, "[ERROR] SPAWN ENCODE LOGIC PROBLEM: Buffer pointer is now %i from end", Buffer - (BufferStart + PacketSize));
|
||||||
}
|
}
|
||||||
//Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending zone spawn for %s packet is %i bytes", emu->name, outapp->size);
|
//Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending zone spawn for %s packet is %i bytes", emu->name, outapp->size);
|
||||||
//Log.Hex(Logs::Netcode, outapp->pBuffer, outapp->size);
|
//Log.Hex(Logs::Netcode, outapp->pBuffer, outapp->size);
|
||||||
@ -4715,7 +4715,7 @@ namespace RoF
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, "Unhandled OP_GuildBank action");
|
Log(Logs::Detail, Logs::Netcode, "Unhandled OP_GuildBank action");
|
||||||
__packet->SetOpcode(OP_Unknown); /* invalidate the packet */
|
__packet->SetOpcode(OP_Unknown); /* invalidate the packet */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -4861,7 +4861,7 @@ namespace RoF
|
|||||||
SETUP_DIRECT_DECODE(MoveItem_Struct, structs::MoveItem_Struct);
|
SETUP_DIRECT_DECODE(MoveItem_Struct, structs::MoveItem_Struct);
|
||||||
|
|
||||||
//Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Moved item from %u to %u", eq->from_slot.MainSlot, eq->to_slot.MainSlot);
|
//Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Moved item from %u to %u", eq->from_slot.MainSlot, eq->to_slot.MainSlot);
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[RoF] MoveItem SlotType from %i to %i, MainSlot from %i to %i, SubSlot from %i to %i, AugSlot from %i to %i, Unknown01 from %i to %i, Number %u", eq->from_slot.Type, eq->to_slot.Type, eq->from_slot.Slot, eq->to_slot.Slot, eq->from_slot.SubIndex, eq->to_slot.SubIndex, eq->from_slot.AugIndex, eq->to_slot.AugIndex, eq->from_slot.Unknown01, eq->to_slot.Unknown01, eq->number_in_stack);
|
Log(Logs::General, Logs::Netcode, "[RoF] MoveItem SlotType from %i to %i, MainSlot from %i to %i, SubSlot from %i to %i, AugSlot from %i to %i, Unknown01 from %i to %i, Number %u", eq->from_slot.Type, eq->to_slot.Type, eq->from_slot.Slot, eq->to_slot.Slot, eq->from_slot.SubIndex, eq->to_slot.SubIndex, eq->from_slot.AugIndex, eq->to_slot.AugIndex, eq->from_slot.Unknown01, eq->to_slot.Unknown01, eq->number_in_stack);
|
||||||
emu->from_slot = RoFToServerSlot(eq->from_slot);
|
emu->from_slot = RoFToServerSlot(eq->from_slot);
|
||||||
emu->to_slot = RoFToServerSlot(eq->to_slot);
|
emu->to_slot = RoFToServerSlot(eq->to_slot);
|
||||||
IN(number_in_stack);
|
IN(number_in_stack);
|
||||||
@ -5721,7 +5721,7 @@ namespace RoF
|
|||||||
RoFSlot.Slot = TempSlot;
|
RoFSlot.Slot = TempSlot;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[ERROR] Convert Server Slot %i to RoF Slots: Type %i, Unk2 %i, Main %i, Sub %i, Aug %i, Unk1 %i", serverSlot, RoFSlot.Type, RoFSlot.Unknown02, RoFSlot.Slot, RoFSlot.SubIndex, RoFSlot.AugIndex, RoFSlot.Unknown01);
|
Log(Logs::General, Logs::Netcode, "[ERROR] Convert Server Slot %i to RoF Slots: Type %i, Unk2 %i, Main %i, Sub %i, Aug %i, Unk1 %i", serverSlot, RoFSlot.Type, RoFSlot.Unknown02, RoFSlot.Slot, RoFSlot.SubIndex, RoFSlot.AugIndex, RoFSlot.Unknown01);
|
||||||
|
|
||||||
return RoFSlot;
|
return RoFSlot;
|
||||||
}
|
}
|
||||||
@ -5762,7 +5762,7 @@ namespace RoF
|
|||||||
RoFSlot.SubIndex = TempSlot - ((RoFSlot.Slot + 2) * EQEmu::inventory::ContainerCount);
|
RoFSlot.SubIndex = TempSlot - ((RoFSlot.Slot + 2) * EQEmu::inventory::ContainerCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[ERROR] Convert Server Slot %i to RoF Slots: Main %i, Sub %i, Aug %i, Unk1 %i", serverSlot, RoFSlot.Slot, RoFSlot.SubIndex, RoFSlot.AugIndex, RoFSlot.Unknown01);
|
Log(Logs::General, Logs::Netcode, "[ERROR] Convert Server Slot %i to RoF Slots: Main %i, Sub %i, Aug %i, Unk1 %i", serverSlot, RoFSlot.Slot, RoFSlot.SubIndex, RoFSlot.AugIndex, RoFSlot.Unknown01);
|
||||||
|
|
||||||
return RoFSlot;
|
return RoFSlot;
|
||||||
}
|
}
|
||||||
@ -5867,7 +5867,7 @@ namespace RoF
|
|||||||
ServerSlot = INVALID_INDEX;
|
ServerSlot = INVALID_INDEX;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[ERROR] Convert RoF Slots: Type %i, Unk2 %i, Main %i, Sub %i, Aug %i, Unk1 %i to Server Slot %i", rofSlot.Type, rofSlot.Unknown02, rofSlot.Slot, rofSlot.SubIndex, rofSlot.AugIndex, rofSlot.Unknown01, ServerSlot);
|
Log(Logs::General, Logs::Netcode, "[ERROR] Convert RoF Slots: Type %i, Unk2 %i, Main %i, Sub %i, Aug %i, Unk1 %i to Server Slot %i", rofSlot.Type, rofSlot.Unknown02, rofSlot.Slot, rofSlot.SubIndex, rofSlot.AugIndex, rofSlot.Unknown01, ServerSlot);
|
||||||
|
|
||||||
return ServerSlot;
|
return ServerSlot;
|
||||||
}
|
}
|
||||||
@ -5902,7 +5902,7 @@ namespace RoF
|
|||||||
ServerSlot = TempSlot;
|
ServerSlot = TempSlot;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[ERROR] Convert RoF Slots: Main %i, Sub %i, Aug %i, Unk1 %i to Server Slot %i", rofSlot.Slot, rofSlot.SubIndex, rofSlot.AugIndex, rofSlot.Unknown01, ServerSlot);
|
Log(Logs::General, Logs::Netcode, "[ERROR] Convert RoF Slots: Main %i, Sub %i, Aug %i, Unk1 %i to Server Slot %i", rofSlot.Slot, rofSlot.SubIndex, rofSlot.AugIndex, rofSlot.Unknown01, ServerSlot);
|
||||||
|
|
||||||
return ServerSlot;
|
return ServerSlot;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -83,7 +83,7 @@ namespace RoF2
|
|||||||
//TODO: figure out how to support shared memory with multiple patches...
|
//TODO: figure out how to support shared memory with multiple patches...
|
||||||
opcodes = new RegularOpcodeManager();
|
opcodes = new RegularOpcodeManager();
|
||||||
if (!opcodes->LoadOpcodes(opfile.c_str())) {
|
if (!opcodes->LoadOpcodes(opfile.c_str())) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[OPCODES] Error loading opcodes file %s. Not registering patch %s.", opfile.c_str(), name);
|
Log(Logs::General, Logs::Netcode, "[OPCODES] Error loading opcodes file %s. Not registering patch %s.", opfile.c_str(), name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -109,7 +109,7 @@ namespace RoF2
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[IDENTIFY] Registered patch %s", name);
|
Log(Logs::General, Logs::Netcode, "[IDENTIFY] Registered patch %s", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Reload()
|
void Reload()
|
||||||
@ -126,10 +126,10 @@ namespace RoF2
|
|||||||
opfile += name;
|
opfile += name;
|
||||||
opfile += ".conf";
|
opfile += ".conf";
|
||||||
if (!opcodes->ReloadOpcodes(opfile.c_str())) {
|
if (!opcodes->ReloadOpcodes(opfile.c_str())) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[OPCODES] Error reloading opcodes file %s for patch %s.", opfile.c_str(), name);
|
Log(Logs::General, Logs::Netcode, "[OPCODES] Error reloading opcodes file %s for patch %s.", opfile.c_str(), name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[OPCODES] Reloaded opcodes for patch %s", name);
|
Log(Logs::General, Logs::Netcode, "[OPCODES] Reloaded opcodes for patch %s", name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -416,7 +416,7 @@ namespace RoF2
|
|||||||
|
|
||||||
if (EntryCount == 0 || (in->size % sizeof(BazaarSearchResults_Struct)) != 0)
|
if (EntryCount == 0 || (in->size % sizeof(BazaarSearchResults_Struct)) != 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(BazaarSearchResults_Struct));
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(BazaarSearchResults_Struct));
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -637,7 +637,7 @@ namespace RoF2
|
|||||||
|
|
||||||
int item_count = in->size / sizeof(EQEmu::InternalSerializedItem_Struct);
|
int item_count = in->size / sizeof(EQEmu::InternalSerializedItem_Struct);
|
||||||
if (!item_count || (in->size % sizeof(EQEmu::InternalSerializedItem_Struct)) != 0) {
|
if (!item_count || (in->size % sizeof(EQEmu::InternalSerializedItem_Struct)) != 0) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d",
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d",
|
||||||
opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQEmu::InternalSerializedItem_Struct));
|
opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQEmu::InternalSerializedItem_Struct));
|
||||||
|
|
||||||
delete in;
|
delete in;
|
||||||
@ -654,7 +654,7 @@ namespace RoF2
|
|||||||
for (int index = 0; index < item_count; ++index, ++eq) {
|
for (int index = 0; index < item_count; ++index, ++eq) {
|
||||||
SerializeItem(ob, (const EQEmu::ItemInstance*)eq->inst, eq->slot_id, 0, ItemPacketCharInventory);
|
SerializeItem(ob, (const EQEmu::ItemInstance*)eq->inst, eq->slot_id, 0, ItemPacketCharInventory);
|
||||||
if (ob.tellp() == last_pos)
|
if (ob.tellp() == last_pos)
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id);
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id);
|
||||||
|
|
||||||
last_pos = ob.tellp();
|
last_pos = ob.tellp();
|
||||||
}
|
}
|
||||||
@ -1581,7 +1581,7 @@ namespace RoF2
|
|||||||
|
|
||||||
SerializeItem(ob, (const EQEmu::ItemInstance*)int_struct->inst, int_struct->slot_id, 0, old_item_pkt->PacketType);
|
SerializeItem(ob, (const EQEmu::ItemInstance*)int_struct->inst, int_struct->slot_id, 0, old_item_pkt->PacketType);
|
||||||
if (ob.tellp() == last_pos) {
|
if (ob.tellp() == last_pos) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d.", int_struct->slot_id);
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d.", int_struct->slot_id);
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2779,7 +2779,7 @@ namespace RoF2
|
|||||||
// Think we need 1 byte of padding at the end
|
// Think we need 1 byte of padding at the end
|
||||||
outapp->WriteUInt8(0); // Unknown
|
outapp->WriteUInt8(0); // Unknown
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Player Profile Packet is %i bytes", outapp->GetWritePosition());
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Player Profile Packet is %i bytes", outapp->GetWritePosition());
|
||||||
|
|
||||||
auto NewBuffer = new unsigned char[outapp->GetWritePosition()];
|
auto NewBuffer = new unsigned char[outapp->GetWritePosition()];
|
||||||
memcpy(NewBuffer, outapp->pBuffer, outapp->GetWritePosition());
|
memcpy(NewBuffer, outapp->pBuffer, outapp->GetWritePosition());
|
||||||
@ -3620,7 +3620,7 @@ namespace RoF2
|
|||||||
|
|
||||||
if (EntryCount == 0 || ((in->size % sizeof(Track_Struct))) != 0)
|
if (EntryCount == 0 || ((in->size % sizeof(Track_Struct))) != 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Track_Struct));
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Track_Struct));
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -3730,7 +3730,7 @@ namespace RoF2
|
|||||||
|
|
||||||
OUT(TraderID);
|
OUT(TraderID);
|
||||||
snprintf(eq->SerialNumber, sizeof(eq->SerialNumber), "%016d", emu->ItemID);
|
snprintf(eq->SerialNumber, sizeof(eq->SerialNumber), "%016d", emu->ItemID);
|
||||||
Log.Out(Logs::Detail, Logs::Trading, "ENCODE(OP_TraderDelItem): TraderID %d, SerialNumber: %d", emu->TraderID, emu->ItemID);
|
Log(Logs::Detail, Logs::Trading, "ENCODE(OP_TraderDelItem): TraderID %d, SerialNumber: %d", emu->TraderID, emu->ItemID);
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
@ -3761,7 +3761,7 @@ namespace RoF2
|
|||||||
eq->Traders2 = emu->Traders;
|
eq->Traders2 = emu->Traders;
|
||||||
eq->Items2 = emu->Items;
|
eq->Items2 = emu->Items;
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Trading, "ENCODE(OP_TraderShop): BazaarWelcome_Struct Code %d, Traders %d, Items %d",
|
Log(Logs::Detail, Logs::Trading, "ENCODE(OP_TraderShop): BazaarWelcome_Struct Code %d, Traders %d, Items %d",
|
||||||
eq->Code, eq->Traders, eq->Items);
|
eq->Code, eq->Traders, eq->Items);
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
@ -3784,14 +3784,14 @@ namespace RoF2
|
|||||||
OUT(Quantity);
|
OUT(Quantity);
|
||||||
snprintf(eq->SerialNumber, sizeof(eq->SerialNumber), "%016d", emu->ItemID);
|
snprintf(eq->SerialNumber, sizeof(eq->SerialNumber), "%016d", emu->ItemID);
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Trading, "ENCODE(OP_TraderShop): Buy Action %d, Price %d, Trader %d, ItemID %d, Quantity %d, ItemName, %s",
|
Log(Logs::Detail, Logs::Trading, "ENCODE(OP_TraderShop): Buy Action %d, Price %d, Trader %d, ItemID %d, Quantity %d, ItemName, %s",
|
||||||
eq->Action, eq->Price, eq->TraderID, eq->ItemID, eq->Quantity, emu->ItemName);
|
eq->Action, eq->Price, eq->TraderID, eq->ItemID, eq->Quantity, emu->ItemName);
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::Trading, "ENCODE(OP_TraderShop): Encode Size Unknown (%d)", psize);
|
Log(Logs::Detail, Logs::Trading, "ENCODE(OP_TraderShop): Encode Size Unknown (%d)", psize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4043,7 +4043,7 @@ namespace RoF2
|
|||||||
//determine and verify length
|
//determine and verify length
|
||||||
int entrycount = in->size / sizeof(Spawn_Struct);
|
int entrycount = in->size / sizeof(Spawn_Struct);
|
||||||
if (entrycount == 0 || (in->size % sizeof(Spawn_Struct)) != 0) {
|
if (entrycount == 0 || (in->size % sizeof(Spawn_Struct)) != 0) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Spawn_Struct));
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Spawn_Struct));
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -4364,7 +4364,7 @@ namespace RoF2
|
|||||||
Buffer += 29;
|
Buffer += 29;
|
||||||
if (Buffer != (BufferStart + PacketSize))
|
if (Buffer != (BufferStart + PacketSize))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[ERROR] SPAWN ENCODE LOGIC PROBLEM: Buffer pointer is now %i from end", Buffer - (BufferStart + PacketSize));
|
Log(Logs::General, Logs::Netcode, "[ERROR] SPAWN ENCODE LOGIC PROBLEM: Buffer pointer is now %i from end", Buffer - (BufferStart + PacketSize));
|
||||||
}
|
}
|
||||||
//Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending zone spawn for %s packet is %i bytes", emu->name, outapp->size);
|
//Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending zone spawn for %s packet is %i bytes", emu->name, outapp->size);
|
||||||
//Log.Hex(Logs::Netcode, outapp->pBuffer, outapp->size);
|
//Log.Hex(Logs::Netcode, outapp->pBuffer, outapp->size);
|
||||||
@ -4945,7 +4945,7 @@ namespace RoF2
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, "Unhandled OP_GuildBank action");
|
Log(Logs::Detail, Logs::Netcode, "Unhandled OP_GuildBank action");
|
||||||
__packet->SetOpcode(OP_Unknown); /* invalidate the packet */
|
__packet->SetOpcode(OP_Unknown); /* invalidate the packet */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -5090,7 +5090,7 @@ namespace RoF2
|
|||||||
DECODE_LENGTH_EXACT(structs::MoveItem_Struct);
|
DECODE_LENGTH_EXACT(structs::MoveItem_Struct);
|
||||||
SETUP_DIRECT_DECODE(MoveItem_Struct, structs::MoveItem_Struct);
|
SETUP_DIRECT_DECODE(MoveItem_Struct, structs::MoveItem_Struct);
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[RoF2] MoveItem SlotType from %i to %i, MainSlot from %i to %i, SubSlot from %i to %i, AugSlot from %i to %i, Unknown01 from %i to %i, Number %u", eq->from_slot.Type, eq->to_slot.Type, eq->from_slot.Slot, eq->to_slot.Slot, eq->from_slot.SubIndex, eq->to_slot.SubIndex, eq->from_slot.AugIndex, eq->to_slot.AugIndex, eq->from_slot.Unknown01, eq->to_slot.Unknown01, eq->number_in_stack);
|
Log(Logs::General, Logs::Netcode, "[RoF2] MoveItem SlotType from %i to %i, MainSlot from %i to %i, SubSlot from %i to %i, AugSlot from %i to %i, Unknown01 from %i to %i, Number %u", eq->from_slot.Type, eq->to_slot.Type, eq->from_slot.Slot, eq->to_slot.Slot, eq->from_slot.SubIndex, eq->to_slot.SubIndex, eq->from_slot.AugIndex, eq->to_slot.AugIndex, eq->from_slot.Unknown01, eq->to_slot.Unknown01, eq->number_in_stack);
|
||||||
emu->from_slot = RoF2ToServerSlot(eq->from_slot);
|
emu->from_slot = RoF2ToServerSlot(eq->from_slot);
|
||||||
emu->to_slot = RoF2ToServerSlot(eq->to_slot);
|
emu->to_slot = RoF2ToServerSlot(eq->to_slot);
|
||||||
IN(number_in_stack);
|
IN(number_in_stack);
|
||||||
@ -5326,7 +5326,7 @@ namespace RoF2
|
|||||||
IN(Code);
|
IN(Code);
|
||||||
IN(TraderID);
|
IN(TraderID);
|
||||||
IN(Approval);
|
IN(Approval);
|
||||||
Log.Out(Logs::Detail, Logs::Trading, "DECODE(OP_TraderShop): TraderClick_Struct Code %d, TraderID %d, Approval %d",
|
Log(Logs::Detail, Logs::Trading, "DECODE(OP_TraderShop): TraderClick_Struct Code %d, TraderID %d, Approval %d",
|
||||||
eq->Code, eq->TraderID, eq->Approval);
|
eq->Code, eq->TraderID, eq->Approval);
|
||||||
|
|
||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
@ -5340,7 +5340,7 @@ namespace RoF2
|
|||||||
emu->Beginning.Action = eq->Code;
|
emu->Beginning.Action = eq->Code;
|
||||||
IN(Traders);
|
IN(Traders);
|
||||||
IN(Items);
|
IN(Items);
|
||||||
Log.Out(Logs::Detail, Logs::Trading, "DECODE(OP_TraderShop): BazaarWelcome_Struct Code %d, Traders %d, Items %d",
|
Log(Logs::Detail, Logs::Trading, "DECODE(OP_TraderShop): BazaarWelcome_Struct Code %d, Traders %d, Items %d",
|
||||||
eq->Code, eq->Traders, eq->Items);
|
eq->Code, eq->Traders, eq->Items);
|
||||||
|
|
||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
@ -5357,20 +5357,20 @@ namespace RoF2
|
|||||||
memcpy(emu->ItemName, eq->ItemName, sizeof(emu->ItemName));
|
memcpy(emu->ItemName, eq->ItemName, sizeof(emu->ItemName));
|
||||||
IN(ItemID);
|
IN(ItemID);
|
||||||
IN(Quantity);
|
IN(Quantity);
|
||||||
Log.Out(Logs::Detail, Logs::Trading, "DECODE(OP_TraderShop): TraderBuy_Struct (Unknowns) Unknown004 %d, Unknown008 %d, Unknown012 %d, Unknown076 %d, Unknown276 %d",
|
Log(Logs::Detail, Logs::Trading, "DECODE(OP_TraderShop): TraderBuy_Struct (Unknowns) Unknown004 %d, Unknown008 %d, Unknown012 %d, Unknown076 %d, Unknown276 %d",
|
||||||
eq->Unknown004, eq->Unknown008, eq->Unknown012, eq->Unknown076, eq->Unknown276);
|
eq->Unknown004, eq->Unknown008, eq->Unknown012, eq->Unknown076, eq->Unknown276);
|
||||||
Log.Out(Logs::Detail, Logs::Trading, "DECODE(OP_TraderShop): TraderBuy_Struct Buy Action %d, Price %d, Trader %d, ItemID %d, Quantity %d, ItemName, %s",
|
Log(Logs::Detail, Logs::Trading, "DECODE(OP_TraderShop): TraderBuy_Struct Buy Action %d, Price %d, Trader %d, ItemID %d, Quantity %d, ItemName, %s",
|
||||||
eq->Action, eq->Price, eq->TraderID, eq->ItemID, eq->Quantity, eq->ItemName);
|
eq->Action, eq->Price, eq->TraderID, eq->ItemID, eq->Quantity, eq->ItemName);
|
||||||
|
|
||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
else if (psize == 4)
|
else if (psize == 4)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::Trading, "DECODE(OP_TraderShop): Forwarding packet as-is with size 4");
|
Log(Logs::Detail, Logs::Trading, "DECODE(OP_TraderShop): Forwarding packet as-is with size 4");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::Trading, "DECODE(OP_TraderShop): Decode Size Unknown (%d)", psize);
|
Log(Logs::Detail, Logs::Trading, "DECODE(OP_TraderShop): Decode Size Unknown (%d)", psize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6024,7 +6024,7 @@ namespace RoF2
|
|||||||
RoF2Slot.Slot = TempSlot;
|
RoF2Slot.Slot = TempSlot;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[ERROR] Convert Server Slot %i to RoF2 Slots: Type %i, Unk2 %i, Main %i, Sub %i, Aug %i, Unk1 %i", serverSlot, RoF2Slot.Type, RoF2Slot.Unknown02, RoF2Slot.Slot, RoF2Slot.SubIndex, RoF2Slot.AugIndex, RoF2Slot.Unknown01);
|
Log(Logs::General, Logs::Netcode, "[ERROR] Convert Server Slot %i to RoF2 Slots: Type %i, Unk2 %i, Main %i, Sub %i, Aug %i, Unk1 %i", serverSlot, RoF2Slot.Type, RoF2Slot.Unknown02, RoF2Slot.Slot, RoF2Slot.SubIndex, RoF2Slot.AugIndex, RoF2Slot.Unknown01);
|
||||||
|
|
||||||
return RoF2Slot;
|
return RoF2Slot;
|
||||||
}
|
}
|
||||||
@ -6065,7 +6065,7 @@ namespace RoF2
|
|||||||
RoF2Slot.SubIndex = TempSlot - ((RoF2Slot.Slot + 2) * EQEmu::inventory::ContainerCount);
|
RoF2Slot.SubIndex = TempSlot - ((RoF2Slot.Slot + 2) * EQEmu::inventory::ContainerCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[ERROR] Convert Server Slot %i to RoF2 Slots: Main %i, Sub %i, Aug %i, Unk1 %i", serverSlot, RoF2Slot.Slot, RoF2Slot.SubIndex, RoF2Slot.AugIndex, RoF2Slot.Unknown01);
|
Log(Logs::General, Logs::Netcode, "[ERROR] Convert Server Slot %i to RoF2 Slots: Main %i, Sub %i, Aug %i, Unk1 %i", serverSlot, RoF2Slot.Slot, RoF2Slot.SubIndex, RoF2Slot.AugIndex, RoF2Slot.Unknown01);
|
||||||
|
|
||||||
return RoF2Slot;
|
return RoF2Slot;
|
||||||
}
|
}
|
||||||
@ -6174,7 +6174,7 @@ namespace RoF2
|
|||||||
ServerSlot = rof2Slot.Slot + EQEmu::legacy::CORPSE_BEGIN;
|
ServerSlot = rof2Slot.Slot + EQEmu::legacy::CORPSE_BEGIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[ERROR] Convert RoF2 Slots: Type %i, Unk2 %i, Main %i, Sub %i, Aug %i, Unk1 %i to Server Slot %i", rof2Slot.Type, rof2Slot.Unknown02, rof2Slot.Slot, rof2Slot.SubIndex, rof2Slot.AugIndex, rof2Slot.Unknown01, ServerSlot);
|
Log(Logs::General, Logs::Netcode, "[ERROR] Convert RoF2 Slots: Type %i, Unk2 %i, Main %i, Sub %i, Aug %i, Unk1 %i to Server Slot %i", rof2Slot.Type, rof2Slot.Unknown02, rof2Slot.Slot, rof2Slot.SubIndex, rof2Slot.AugIndex, rof2Slot.Unknown01, ServerSlot);
|
||||||
|
|
||||||
return ServerSlot;
|
return ServerSlot;
|
||||||
}
|
}
|
||||||
@ -6209,7 +6209,7 @@ namespace RoF2
|
|||||||
ServerSlot = TempSlot;
|
ServerSlot = TempSlot;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[ERROR] Convert RoF2 Slots: Main %i, Sub %i, Aug %i, Unk1 %i to Server Slot %i", rof2Slot.Slot, rof2Slot.SubIndex, rof2Slot.AugIndex, rof2Slot.Unknown01, ServerSlot);
|
Log(Logs::General, Logs::Netcode, "[ERROR] Convert RoF2 Slots: Main %i, Sub %i, Aug %i, Unk1 %i to Server Slot %i", rof2Slot.Slot, rof2Slot.SubIndex, rof2Slot.AugIndex, rof2Slot.Unknown01, ServerSlot);
|
||||||
|
|
||||||
return ServerSlot;
|
return ServerSlot;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -79,7 +79,7 @@ namespace SoD
|
|||||||
//TODO: figure out how to support shared memory with multiple patches...
|
//TODO: figure out how to support shared memory with multiple patches...
|
||||||
opcodes = new RegularOpcodeManager();
|
opcodes = new RegularOpcodeManager();
|
||||||
if (!opcodes->LoadOpcodes(opfile.c_str())) {
|
if (!opcodes->LoadOpcodes(opfile.c_str())) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[OPCODES] Error loading opcodes file %s. Not registering patch %s.", opfile.c_str(), name);
|
Log(Logs::General, Logs::Netcode, "[OPCODES] Error loading opcodes file %s. Not registering patch %s.", opfile.c_str(), name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -105,7 +105,7 @@ namespace SoD
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[IDENTIFY] Registered patch %s", name);
|
Log(Logs::General, Logs::Netcode, "[IDENTIFY] Registered patch %s", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Reload()
|
void Reload()
|
||||||
@ -122,10 +122,10 @@ namespace SoD
|
|||||||
opfile += name;
|
opfile += name;
|
||||||
opfile += ".conf";
|
opfile += ".conf";
|
||||||
if (!opcodes->ReloadOpcodes(opfile.c_str())) {
|
if (!opcodes->ReloadOpcodes(opfile.c_str())) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[OPCODES] Error reloading opcodes file %s for patch %s.", opfile.c_str(), name);
|
Log(Logs::General, Logs::Netcode, "[OPCODES] Error reloading opcodes file %s for patch %s.", opfile.c_str(), name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[OPCODES] Reloaded opcodes for patch %s", name);
|
Log(Logs::General, Logs::Netcode, "[OPCODES] Reloaded opcodes for patch %s", name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -278,7 +278,7 @@ namespace SoD
|
|||||||
|
|
||||||
if (EntryCount == 0 || (in->size % sizeof(BazaarSearchResults_Struct)) != 0)
|
if (EntryCount == 0 || (in->size % sizeof(BazaarSearchResults_Struct)) != 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(BazaarSearchResults_Struct));
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(BazaarSearchResults_Struct));
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -384,7 +384,7 @@ namespace SoD
|
|||||||
|
|
||||||
int item_count = in->size / sizeof(EQEmu::InternalSerializedItem_Struct);
|
int item_count = in->size / sizeof(EQEmu::InternalSerializedItem_Struct);
|
||||||
if (!item_count || (in->size % sizeof(EQEmu::InternalSerializedItem_Struct)) != 0) {
|
if (!item_count || (in->size % sizeof(EQEmu::InternalSerializedItem_Struct)) != 0) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d",
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d",
|
||||||
opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQEmu::InternalSerializedItem_Struct));
|
opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQEmu::InternalSerializedItem_Struct));
|
||||||
|
|
||||||
delete in;
|
delete in;
|
||||||
@ -401,7 +401,7 @@ namespace SoD
|
|||||||
for (int index = 0; index < item_count; ++index, ++eq) {
|
for (int index = 0; index < item_count; ++index, ++eq) {
|
||||||
SerializeItem(ob, (const EQEmu::ItemInstance*)eq->inst, eq->slot_id, 0);
|
SerializeItem(ob, (const EQEmu::ItemInstance*)eq->inst, eq->slot_id, 0);
|
||||||
if (ob.tellp() == last_pos)
|
if (ob.tellp() == last_pos)
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id);
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id);
|
||||||
|
|
||||||
last_pos = ob.tellp();
|
last_pos = ob.tellp();
|
||||||
}
|
}
|
||||||
@ -1065,7 +1065,7 @@ namespace SoD
|
|||||||
|
|
||||||
SerializeItem(ob, (const EQEmu::ItemInstance*)int_struct->inst, int_struct->slot_id, 0);
|
SerializeItem(ob, (const EQEmu::ItemInstance*)int_struct->inst, int_struct->slot_id, 0);
|
||||||
if (ob.tellp() == last_pos) {
|
if (ob.tellp() == last_pos) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d.", int_struct->slot_id);
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d.", int_struct->slot_id);
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2285,7 +2285,7 @@ namespace SoD
|
|||||||
|
|
||||||
if (EntryCount == 0 || ((in->size % sizeof(Track_Struct))) != 0)
|
if (EntryCount == 0 || ((in->size % sizeof(Track_Struct))) != 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Track_Struct));
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Track_Struct));
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2522,7 +2522,7 @@ namespace SoD
|
|||||||
//determine and verify length
|
//determine and verify length
|
||||||
int entrycount = in->size / sizeof(Spawn_Struct);
|
int entrycount = in->size / sizeof(Spawn_Struct);
|
||||||
if (entrycount == 0 || (in->size % sizeof(Spawn_Struct)) != 0) {
|
if (entrycount == 0 || (in->size % sizeof(Spawn_Struct)) != 0) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Spawn_Struct));
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Spawn_Struct));
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -3275,7 +3275,7 @@ namespace SoD
|
|||||||
DECODE_LENGTH_EXACT(structs::MoveItem_Struct);
|
DECODE_LENGTH_EXACT(structs::MoveItem_Struct);
|
||||||
SETUP_DIRECT_DECODE(MoveItem_Struct, structs::MoveItem_Struct);
|
SETUP_DIRECT_DECODE(MoveItem_Struct, structs::MoveItem_Struct);
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[SoD] Moved item from %u to %u", eq->from_slot, eq->to_slot);
|
Log(Logs::General, Logs::Netcode, "[SoD] Moved item from %u to %u", eq->from_slot, eq->to_slot);
|
||||||
|
|
||||||
emu->from_slot = SoDToServerSlot(eq->from_slot);
|
emu->from_slot = SoDToServerSlot(eq->from_slot);
|
||||||
emu->to_slot = SoDToServerSlot(eq->to_slot);
|
emu->to_slot = SoDToServerSlot(eq->to_slot);
|
||||||
|
|||||||
@ -79,7 +79,7 @@ namespace SoF
|
|||||||
//TODO: figure out how to support shared memory with multiple patches...
|
//TODO: figure out how to support shared memory with multiple patches...
|
||||||
opcodes = new RegularOpcodeManager();
|
opcodes = new RegularOpcodeManager();
|
||||||
if (!opcodes->LoadOpcodes(opfile.c_str())) {
|
if (!opcodes->LoadOpcodes(opfile.c_str())) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[OPCODES] Error loading opcodes file %s. Not registering patch %s.", opfile.c_str(), name);
|
Log(Logs::General, Logs::Netcode, "[OPCODES] Error loading opcodes file %s. Not registering patch %s.", opfile.c_str(), name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -105,7 +105,7 @@ namespace SoF
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[IDENTIFY] Registered patch %s", name);
|
Log(Logs::General, Logs::Netcode, "[IDENTIFY] Registered patch %s", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Reload()
|
void Reload()
|
||||||
@ -122,10 +122,10 @@ namespace SoF
|
|||||||
opfile += name;
|
opfile += name;
|
||||||
opfile += ".conf";
|
opfile += ".conf";
|
||||||
if (!opcodes->ReloadOpcodes(opfile.c_str())) {
|
if (!opcodes->ReloadOpcodes(opfile.c_str())) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[OPCODES] Error reloading opcodes file %s for patch %s.", opfile.c_str(), name);
|
Log(Logs::General, Logs::Netcode, "[OPCODES] Error reloading opcodes file %s for patch %s.", opfile.c_str(), name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[OPCODES] Reloaded opcodes for patch %s", name);
|
Log(Logs::General, Logs::Netcode, "[OPCODES] Reloaded opcodes for patch %s", name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -245,7 +245,7 @@ namespace SoF
|
|||||||
//determine and verify length
|
//determine and verify length
|
||||||
int entrycount = in->size / sizeof(BazaarSearchResults_Struct);
|
int entrycount = in->size / sizeof(BazaarSearchResults_Struct);
|
||||||
if (entrycount == 0 || (in->size % sizeof(BazaarSearchResults_Struct)) != 0) {
|
if (entrycount == 0 || (in->size % sizeof(BazaarSearchResults_Struct)) != 0) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d",
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d",
|
||||||
opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(BazaarSearchResults_Struct));
|
opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(BazaarSearchResults_Struct));
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
@ -366,7 +366,7 @@ namespace SoF
|
|||||||
|
|
||||||
int item_count = in->size / sizeof(EQEmu::InternalSerializedItem_Struct);
|
int item_count = in->size / sizeof(EQEmu::InternalSerializedItem_Struct);
|
||||||
if (!item_count || (in->size % sizeof(EQEmu::InternalSerializedItem_Struct)) != 0) {
|
if (!item_count || (in->size % sizeof(EQEmu::InternalSerializedItem_Struct)) != 0) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d",
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d",
|
||||||
opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQEmu::InternalSerializedItem_Struct));
|
opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQEmu::InternalSerializedItem_Struct));
|
||||||
|
|
||||||
delete in;
|
delete in;
|
||||||
@ -383,7 +383,7 @@ namespace SoF
|
|||||||
for (int index = 0; index < item_count; ++index, ++eq) {
|
for (int index = 0; index < item_count; ++index, ++eq) {
|
||||||
SerializeItem(ob, (const EQEmu::ItemInstance*)eq->inst, eq->slot_id, 0);
|
SerializeItem(ob, (const EQEmu::ItemInstance*)eq->inst, eq->slot_id, 0);
|
||||||
if (ob.tellp() == last_pos)
|
if (ob.tellp() == last_pos)
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id);
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id);
|
||||||
|
|
||||||
last_pos = ob.tellp();
|
last_pos = ob.tellp();
|
||||||
}
|
}
|
||||||
@ -862,7 +862,7 @@ namespace SoF
|
|||||||
|
|
||||||
SerializeItem(ob, (const EQEmu::ItemInstance*)int_struct->inst, int_struct->slot_id, 0);
|
SerializeItem(ob, (const EQEmu::ItemInstance*)int_struct->inst, int_struct->slot_id, 0);
|
||||||
if (ob.tellp() == last_pos) {
|
if (ob.tellp() == last_pos) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d.", int_struct->slot_id);
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d.", int_struct->slot_id);
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1916,7 +1916,7 @@ namespace SoF
|
|||||||
|
|
||||||
if (EntryCount == 0 || ((in->size % sizeof(Track_Struct))) != 0)
|
if (EntryCount == 0 || ((in->size % sizeof(Track_Struct))) != 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Track_Struct));
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Track_Struct));
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2078,7 +2078,7 @@ namespace SoF
|
|||||||
//determine and verify length
|
//determine and verify length
|
||||||
int entrycount = in->size / sizeof(Spawn_Struct);
|
int entrycount = in->size / sizeof(Spawn_Struct);
|
||||||
if (entrycount == 0 || (in->size % sizeof(Spawn_Struct)) != 0) {
|
if (entrycount == 0 || (in->size % sizeof(Spawn_Struct)) != 0) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Spawn_Struct));
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Spawn_Struct));
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2659,7 +2659,7 @@ namespace SoF
|
|||||||
DECODE_LENGTH_EXACT(structs::MoveItem_Struct);
|
DECODE_LENGTH_EXACT(structs::MoveItem_Struct);
|
||||||
SETUP_DIRECT_DECODE(MoveItem_Struct, structs::MoveItem_Struct);
|
SETUP_DIRECT_DECODE(MoveItem_Struct, structs::MoveItem_Struct);
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[SoF] Moved item from %u to %u", eq->from_slot, eq->to_slot);
|
Log(Logs::General, Logs::Netcode, "[SoF] Moved item from %u to %u", eq->from_slot, eq->to_slot);
|
||||||
|
|
||||||
emu->from_slot = SoFToServerSlot(eq->from_slot);
|
emu->from_slot = SoFToServerSlot(eq->from_slot);
|
||||||
emu->to_slot = SoFToServerSlot(eq->to_slot);
|
emu->to_slot = SoFToServerSlot(eq->to_slot);
|
||||||
|
|||||||
@ -87,14 +87,14 @@
|
|||||||
//check length of packet before decoding. Call before setup.
|
//check length of packet before decoding. Call before setup.
|
||||||
#define ENCODE_LENGTH_EXACT(struct_) \
|
#define ENCODE_LENGTH_EXACT(struct_) \
|
||||||
if((*p)->size != sizeof(struct_)) { \
|
if((*p)->size != sizeof(struct_)) { \
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, "Wrong size on outbound %s (" #struct_ "): Got %d, expected %d", opcodes->EmuToName((*p)->GetOpcode()), (*p)->size, sizeof(struct_)); \
|
Log(Logs::Detail, Logs::Netcode, "Wrong size on outbound %s (" #struct_ "): Got %d, expected %d", opcodes->EmuToName((*p)->GetOpcode()), (*p)->size, sizeof(struct_)); \
|
||||||
delete *p; \
|
delete *p; \
|
||||||
*p = nullptr; \
|
*p = nullptr; \
|
||||||
return; \
|
return; \
|
||||||
}
|
}
|
||||||
#define ENCODE_LENGTH_ATLEAST(struct_) \
|
#define ENCODE_LENGTH_ATLEAST(struct_) \
|
||||||
if((*p)->size < sizeof(struct_)) { \
|
if((*p)->size < sizeof(struct_)) { \
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, "Wrong size on outbound %s (" #struct_ "): Got %d, expected at least %d", opcodes->EmuToName((*p)->GetOpcode()), (*p)->size, sizeof(struct_)); \
|
Log(Logs::Detail, Logs::Netcode, "Wrong size on outbound %s (" #struct_ "): Got %d, expected at least %d", opcodes->EmuToName((*p)->GetOpcode()), (*p)->size, sizeof(struct_)); \
|
||||||
delete *p; \
|
delete *p; \
|
||||||
*p = nullptr; \
|
*p = nullptr; \
|
||||||
return; \
|
return; \
|
||||||
@ -153,13 +153,13 @@
|
|||||||
//check length of packet before decoding. Call before setup.
|
//check length of packet before decoding. Call before setup.
|
||||||
#define DECODE_LENGTH_EXACT(struct_) \
|
#define DECODE_LENGTH_EXACT(struct_) \
|
||||||
if(__packet->size != sizeof(struct_)) { \
|
if(__packet->size != sizeof(struct_)) { \
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, "Wrong size on incoming %s (" #struct_ "): Got %d, expected %d", opcodes->EmuToName(__packet->GetOpcode()), __packet->size, sizeof(struct_)); \
|
Log(Logs::Detail, Logs::Netcode, "Wrong size on incoming %s (" #struct_ "): Got %d, expected %d", opcodes->EmuToName(__packet->GetOpcode()), __packet->size, sizeof(struct_)); \
|
||||||
__packet->SetOpcode(OP_Unknown); /* invalidate the packet */ \
|
__packet->SetOpcode(OP_Unknown); /* invalidate the packet */ \
|
||||||
return; \
|
return; \
|
||||||
}
|
}
|
||||||
#define DECODE_LENGTH_ATLEAST(struct_) \
|
#define DECODE_LENGTH_ATLEAST(struct_) \
|
||||||
if(__packet->size < sizeof(struct_)) { \
|
if(__packet->size < sizeof(struct_)) { \
|
||||||
Log.Out(Logs::Detail, Logs::Netcode, "Wrong size on incoming %s (" #struct_ "): Got %d, expected at least %d", opcodes->EmuToName(__packet->GetOpcode()), __packet->size, sizeof(struct_)); \
|
Log(Logs::Detail, Logs::Netcode, "Wrong size on incoming %s (" #struct_ "): Got %d, expected at least %d", opcodes->EmuToName(__packet->GetOpcode()), __packet->size, sizeof(struct_)); \
|
||||||
__packet->SetOpcode(OP_Unknown); /* invalidate the packet */ \
|
__packet->SetOpcode(OP_Unknown); /* invalidate the packet */ \
|
||||||
return; \
|
return; \
|
||||||
}
|
}
|
||||||
|
|||||||
@ -78,7 +78,7 @@ namespace Titanium
|
|||||||
//TODO: figure out how to support shared memory with multiple patches...
|
//TODO: figure out how to support shared memory with multiple patches...
|
||||||
opcodes = new RegularOpcodeManager();
|
opcodes = new RegularOpcodeManager();
|
||||||
if (!opcodes->LoadOpcodes(opfile.c_str())) {
|
if (!opcodes->LoadOpcodes(opfile.c_str())) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[OPCODES] Error loading opcodes file %s. Not registering patch %s.", opfile.c_str(), name);
|
Log(Logs::General, Logs::Netcode, "[OPCODES] Error loading opcodes file %s. Not registering patch %s.", opfile.c_str(), name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -104,7 +104,7 @@ namespace Titanium
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[IDENTIFY] Registered patch %s", name);
|
Log(Logs::General, Logs::Netcode, "[IDENTIFY] Registered patch %s", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Reload()
|
void Reload()
|
||||||
@ -121,10 +121,10 @@ namespace Titanium
|
|||||||
opfile += name;
|
opfile += name;
|
||||||
opfile += ".conf";
|
opfile += ".conf";
|
||||||
if (!opcodes->ReloadOpcodes(opfile.c_str())) {
|
if (!opcodes->ReloadOpcodes(opfile.c_str())) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[OPCODES] Error reloading opcodes file %s for patch %s.", opfile.c_str(), name);
|
Log(Logs::General, Logs::Netcode, "[OPCODES] Error reloading opcodes file %s for patch %s.", opfile.c_str(), name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[OPCODES] Reloaded opcodes for patch %s", name);
|
Log(Logs::General, Logs::Netcode, "[OPCODES] Reloaded opcodes for patch %s", name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -219,7 +219,7 @@ namespace Titanium
|
|||||||
//determine and verify length
|
//determine and verify length
|
||||||
int entrycount = in->size / sizeof(BazaarSearchResults_Struct);
|
int entrycount = in->size / sizeof(BazaarSearchResults_Struct);
|
||||||
if (entrycount == 0 || (in->size % sizeof(BazaarSearchResults_Struct)) != 0) {
|
if (entrycount == 0 || (in->size % sizeof(BazaarSearchResults_Struct)) != 0) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d",
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d",
|
||||||
opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(BazaarSearchResults_Struct));
|
opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(BazaarSearchResults_Struct));
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
@ -319,7 +319,7 @@ namespace Titanium
|
|||||||
|
|
||||||
int itemcount = in->size / sizeof(EQEmu::InternalSerializedItem_Struct);
|
int itemcount = in->size / sizeof(EQEmu::InternalSerializedItem_Struct);
|
||||||
if (itemcount == 0 || (in->size % sizeof(EQEmu::InternalSerializedItem_Struct)) != 0) {
|
if (itemcount == 0 || (in->size % sizeof(EQEmu::InternalSerializedItem_Struct)) != 0) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d",
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d",
|
||||||
opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQEmu::InternalSerializedItem_Struct));
|
opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQEmu::InternalSerializedItem_Struct));
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
@ -334,7 +334,7 @@ namespace Titanium
|
|||||||
for (int r = 0; r < itemcount; r++, eq++) {
|
for (int r = 0; r < itemcount; r++, eq++) {
|
||||||
SerializeItem(ob, (const EQEmu::ItemInstance*)eq->inst, eq->slot_id, 0);
|
SerializeItem(ob, (const EQEmu::ItemInstance*)eq->inst, eq->slot_id, 0);
|
||||||
if (ob.tellp() == last_pos)
|
if (ob.tellp() == last_pos)
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id);
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id);
|
||||||
|
|
||||||
last_pos = ob.tellp();
|
last_pos = ob.tellp();
|
||||||
}
|
}
|
||||||
@ -820,7 +820,7 @@ namespace Titanium
|
|||||||
|
|
||||||
SerializeItem(ob, (const EQEmu::ItemInstance*)int_struct->inst, int_struct->slot_id, 0);
|
SerializeItem(ob, (const EQEmu::ItemInstance*)int_struct->inst, int_struct->slot_id, 0);
|
||||||
if (ob.tellp() == last_pos) {
|
if (ob.tellp() == last_pos) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d.", int_struct->slot_id);
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d.", int_struct->slot_id);
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1492,7 +1492,7 @@ namespace Titanium
|
|||||||
|
|
||||||
if (EntryCount == 0 || ((in->size % sizeof(Track_Struct))) != 0)
|
if (EntryCount == 0 || ((in->size % sizeof(Track_Struct))) != 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Track_Struct));
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Track_Struct));
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1610,7 +1610,7 @@ namespace Titanium
|
|||||||
//determine and verify length
|
//determine and verify length
|
||||||
int entrycount = in->size / sizeof(Spawn_Struct);
|
int entrycount = in->size / sizeof(Spawn_Struct);
|
||||||
if (entrycount == 0 || (in->size % sizeof(Spawn_Struct)) != 0) {
|
if (entrycount == 0 || (in->size % sizeof(Spawn_Struct)) != 0) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Spawn_Struct));
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Spawn_Struct));
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2014,7 +2014,7 @@ namespace Titanium
|
|||||||
DECODE_LENGTH_EXACT(structs::MoveItem_Struct);
|
DECODE_LENGTH_EXACT(structs::MoveItem_Struct);
|
||||||
SETUP_DIRECT_DECODE(MoveItem_Struct, structs::MoveItem_Struct);
|
SETUP_DIRECT_DECODE(MoveItem_Struct, structs::MoveItem_Struct);
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[Titanium] Moved item from %u to %u", eq->from_slot, eq->to_slot);
|
Log(Logs::General, Logs::Netcode, "[Titanium] Moved item from %u to %u", eq->from_slot, eq->to_slot);
|
||||||
|
|
||||||
emu->from_slot = TitaniumToServerSlot(eq->from_slot);
|
emu->from_slot = TitaniumToServerSlot(eq->from_slot);
|
||||||
emu->to_slot = TitaniumToServerSlot(eq->to_slot);
|
emu->to_slot = TitaniumToServerSlot(eq->to_slot);
|
||||||
|
|||||||
@ -79,7 +79,7 @@ namespace UF
|
|||||||
//TODO: figure out how to support shared memory with multiple patches...
|
//TODO: figure out how to support shared memory with multiple patches...
|
||||||
opcodes = new RegularOpcodeManager();
|
opcodes = new RegularOpcodeManager();
|
||||||
if (!opcodes->LoadOpcodes(opfile.c_str())) {
|
if (!opcodes->LoadOpcodes(opfile.c_str())) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[OPCODES] Error loading opcodes file %s. Not registering patch %s.", opfile.c_str(), name);
|
Log(Logs::General, Logs::Netcode, "[OPCODES] Error loading opcodes file %s. Not registering patch %s.", opfile.c_str(), name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -105,7 +105,7 @@ namespace UF
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[IDENTIFY] Registered patch %s", name);
|
Log(Logs::General, Logs::Netcode, "[IDENTIFY] Registered patch %s", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Reload()
|
void Reload()
|
||||||
@ -122,10 +122,10 @@ namespace UF
|
|||||||
opfile += name;
|
opfile += name;
|
||||||
opfile += ".conf";
|
opfile += ".conf";
|
||||||
if (!opcodes->ReloadOpcodes(opfile.c_str())) {
|
if (!opcodes->ReloadOpcodes(opfile.c_str())) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[OPCODES] Error reloading opcodes file %s for patch %s.", opfile.c_str(), name);
|
Log(Logs::General, Logs::Netcode, "[OPCODES] Error reloading opcodes file %s for patch %s.", opfile.c_str(), name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[OPCODES] Reloaded opcodes for patch %s", name);
|
Log(Logs::General, Logs::Netcode, "[OPCODES] Reloaded opcodes for patch %s", name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -339,7 +339,7 @@ namespace UF
|
|||||||
|
|
||||||
if (EntryCount == 0 || (in->size % sizeof(BazaarSearchResults_Struct)) != 0)
|
if (EntryCount == 0 || (in->size % sizeof(BazaarSearchResults_Struct)) != 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(BazaarSearchResults_Struct));
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(BazaarSearchResults_Struct));
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -512,7 +512,7 @@ namespace UF
|
|||||||
|
|
||||||
int item_count = in->size / sizeof(EQEmu::InternalSerializedItem_Struct);
|
int item_count = in->size / sizeof(EQEmu::InternalSerializedItem_Struct);
|
||||||
if (!item_count || (in->size % sizeof(EQEmu::InternalSerializedItem_Struct)) != 0) {
|
if (!item_count || (in->size % sizeof(EQEmu::InternalSerializedItem_Struct)) != 0) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d",
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d",
|
||||||
opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQEmu::InternalSerializedItem_Struct));
|
opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQEmu::InternalSerializedItem_Struct));
|
||||||
|
|
||||||
delete in;
|
delete in;
|
||||||
@ -529,7 +529,7 @@ namespace UF
|
|||||||
for (int index = 0; index < item_count; ++index, ++eq) {
|
for (int index = 0; index < item_count; ++index, ++eq) {
|
||||||
SerializeItem(ob, (const EQEmu::ItemInstance*)eq->inst, eq->slot_id, 0);
|
SerializeItem(ob, (const EQEmu::ItemInstance*)eq->inst, eq->slot_id, 0);
|
||||||
if (ob.tellp() == last_pos)
|
if (ob.tellp() == last_pos)
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id);
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id);
|
||||||
|
|
||||||
last_pos = ob.tellp();
|
last_pos = ob.tellp();
|
||||||
}
|
}
|
||||||
@ -1281,7 +1281,7 @@ namespace UF
|
|||||||
|
|
||||||
SerializeItem(ob, (const EQEmu::ItemInstance*)int_struct->inst, int_struct->slot_id, 0);
|
SerializeItem(ob, (const EQEmu::ItemInstance*)int_struct->inst, int_struct->slot_id, 0);
|
||||||
if (ob.tellp() == last_pos) {
|
if (ob.tellp() == last_pos) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d.", int_struct->slot_id);
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d.", int_struct->slot_id);
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2572,7 +2572,7 @@ namespace UF
|
|||||||
|
|
||||||
if (EntryCount == 0 || ((in->size % sizeof(Track_Struct))) != 0)
|
if (EntryCount == 0 || ((in->size % sizeof(Track_Struct))) != 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Track_Struct));
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Track_Struct));
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2804,7 +2804,7 @@ namespace UF
|
|||||||
//determine and verify length
|
//determine and verify length
|
||||||
int entrycount = in->size / sizeof(Spawn_Struct);
|
int entrycount = in->size / sizeof(Spawn_Struct);
|
||||||
if (entrycount == 0 || (in->size % sizeof(Spawn_Struct)) != 0) {
|
if (entrycount == 0 || (in->size % sizeof(Spawn_Struct)) != 0) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Spawn_Struct));
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(Spawn_Struct));
|
||||||
delete in;
|
delete in;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -3624,7 +3624,7 @@ namespace UF
|
|||||||
DECODE_LENGTH_EXACT(structs::MoveItem_Struct);
|
DECODE_LENGTH_EXACT(structs::MoveItem_Struct);
|
||||||
SETUP_DIRECT_DECODE(MoveItem_Struct, structs::MoveItem_Struct);
|
SETUP_DIRECT_DECODE(MoveItem_Struct, structs::MoveItem_Struct);
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[UF] Moved item from %u to %u", eq->from_slot, eq->to_slot);
|
Log(Logs::General, Logs::Netcode, "[UF] Moved item from %u to %u", eq->from_slot, eq->to_slot);
|
||||||
|
|
||||||
emu->from_slot = UFToServerSlot(eq->from_slot);
|
emu->from_slot = UFToServerSlot(eq->from_slot);
|
||||||
emu->to_slot = UFToServerSlot(eq->to_slot);
|
emu->to_slot = UFToServerSlot(eq->to_slot);
|
||||||
|
|||||||
@ -134,7 +134,7 @@ bool PersistentTimer::Load(Database *db) {
|
|||||||
(unsigned long)_char_id, _type);
|
(unsigned long)_char_id, _type);
|
||||||
auto results = db->QueryDatabase(query);
|
auto results = db->QueryDatabase(query);
|
||||||
if (!results.Success()) {
|
if (!results.Success()) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Error in PersistentTimer::Load, error: %s", results.ErrorMessage().c_str());
|
Log(Logs::General, Logs::Error, "Error in PersistentTimer::Load, error: %s", results.ErrorMessage().c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,7 +166,7 @@ bool PersistentTimer::Store(Database *db) {
|
|||||||
auto results = db->QueryDatabase(query);
|
auto results = db->QueryDatabase(query);
|
||||||
if (!results.Success()) {
|
if (!results.Success()) {
|
||||||
#if EQDEBUG > 5
|
#if EQDEBUG > 5
|
||||||
Log.Out(Logs::General, Logs::Error, "Error in PersistentTimer::Store, error: %s", results.ErrorMessage().c_str());
|
Log(Logs::General, Logs::Error, "Error in PersistentTimer::Store, error: %s", results.ErrorMessage().c_str());
|
||||||
#endif
|
#endif
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -186,7 +186,7 @@ bool PersistentTimer::Clear(Database *db) {
|
|||||||
auto results = db->QueryDatabase(query);
|
auto results = db->QueryDatabase(query);
|
||||||
if (!results.Success()) {
|
if (!results.Success()) {
|
||||||
#if EQDEBUG > 5
|
#if EQDEBUG > 5
|
||||||
Log.Out(Logs::General, Logs::Error, "Error in PersistentTimer::Clear, error: %s", results.ErrorMessage().c_str());
|
Log(Logs::General, Logs::Error, "Error in PersistentTimer::Clear, error: %s", results.ErrorMessage().c_str());
|
||||||
#endif
|
#endif
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -198,7 +198,7 @@ bool PersistentTimer::Clear(Database *db) {
|
|||||||
/* This function checks if the timer triggered */
|
/* This function checks if the timer triggered */
|
||||||
bool PersistentTimer::Expired(Database *db, bool iReset) {
|
bool PersistentTimer::Expired(Database *db, bool iReset) {
|
||||||
if (this == nullptr) {
|
if (this == nullptr) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Null timer during ->Check()!?\n");
|
Log(Logs::General, Logs::Error, "Null timer during ->Check()!?\n");
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
uint32 current_time = get_current_time();
|
uint32 current_time = get_current_time();
|
||||||
@ -290,7 +290,7 @@ bool PTimerList::Load(Database *db) {
|
|||||||
auto results = db->QueryDatabase(query);
|
auto results = db->QueryDatabase(query);
|
||||||
if (!results.Success()) {
|
if (!results.Success()) {
|
||||||
#if EQDEBUG > 5
|
#if EQDEBUG > 5
|
||||||
Log.Out(Logs::General, Logs::Error, "Error in PersistentTimer::Load, error: %s", results.ErrorMessage().c_str());
|
Log(Logs::General, Logs::Error, "Error in PersistentTimer::Load, error: %s", results.ErrorMessage().c_str());
|
||||||
#endif
|
#endif
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -349,7 +349,7 @@ bool PTimerList::Clear(Database *db) {
|
|||||||
auto results = db->QueryDatabase(query);
|
auto results = db->QueryDatabase(query);
|
||||||
if (!results.Success()) {
|
if (!results.Success()) {
|
||||||
#if EQDEBUG > 5
|
#if EQDEBUG > 5
|
||||||
Log.Out(Logs::General, Logs::Error, "Error in PersistentTimer::Clear, error: %s", results.ErrorMessage().c_str());
|
Log(Logs::General, Logs::Error, "Error in PersistentTimer::Clear, error: %s", results.ErrorMessage().c_str());
|
||||||
#endif
|
#endif
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -441,7 +441,7 @@ bool PTimerList::ClearOffline(Database *db, uint32 char_id, pTimerType type) {
|
|||||||
auto results = db->QueryDatabase(query);
|
auto results = db->QueryDatabase(query);
|
||||||
if (!results.Success()) {
|
if (!results.Success()) {
|
||||||
#if EQDEBUG > 5
|
#if EQDEBUG > 5
|
||||||
Log.Out(Logs::General, Logs::Error, "Error in PTimerList::ClearOffline, error: %s", results.ErrorMessage().c_str());
|
Log(Logs::General, Logs::Error, "Error in PTimerList::ClearOffline, error: %s", results.ErrorMessage().c_str());
|
||||||
#endif
|
#endif
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -78,7 +78,7 @@ bool RuleManager::ListRules(const char *catname, std::vector<const char *> &into
|
|||||||
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(Logs::Detail, Logs::Rules, "Unable to find category '%s'", catname);
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -138,11 +138,11 @@ bool RuleManager::SetRule(const char *rule_name, const char *rule_value, Databas
|
|||||||
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(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(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;
|
||||||
@ -150,7 +150,7 @@ bool RuleManager::SetRule(const char *rule_name, const char *rule_value, Databas
|
|||||||
val = 1;
|
val = 1;
|
||||||
|
|
||||||
m_RuleBoolValues[index] = val;
|
m_RuleBoolValues[index] = val;
|
||||||
Log.Out(Logs::Detail, Logs::Rules, "Set rule %s to value %s", rule_name, m_RuleBoolValues[index] == 1 ? "true" : "false");
|
Log(Logs::Detail, Logs::Rules, "Set rule %s to value %s", rule_name, m_RuleBoolValues[index] == 1 ? "true" : "false");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,7 +161,7 @@ bool RuleManager::SetRule(const char *rule_name, const char *rule_value, Databas
|
|||||||
}
|
}
|
||||||
|
|
||||||
void RuleManager::ResetRules() {
|
void RuleManager::ResetRules() {
|
||||||
Log.Out(Logs::Detail, Logs::Rules, "Resetting running rules to default values");
|
Log(Logs::Detail, Logs::Rules, "Resetting running rules to default values");
|
||||||
#define RULE_INT(cat, rule, default_value) \
|
#define RULE_INT(cat, rule, default_value) \
|
||||||
m_RuleIntValues[ Int__##rule ] = default_value;
|
m_RuleIntValues[ Int__##rule ] = default_value;
|
||||||
#define RULE_REAL(cat, rule, default_value) \
|
#define RULE_REAL(cat, rule, default_value) \
|
||||||
@ -185,7 +185,7 @@ bool RuleManager::_FindRule(const char *rule_name, RuleType &type_into, uint16 &
|
|||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Log.Out(Logs::Detail, Logs::Rules, "Unable to find rule '%s'", rule_name);
|
Log(Logs::Detail, Logs::Rules, "Unable to find rule '%s'", rule_name);
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -212,15 +212,15 @@ void RuleManager::SaveRules(Database *database, const char *ruleset_name) {
|
|||||||
|
|
||||||
m_activeRuleset = _FindOrCreateRuleset(database, ruleset_name);
|
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_name);
|
Log(Logs::Detail, Logs::Rules, "Unable to find or create rule set %s", ruleset_name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_activeName = ruleset_name;
|
m_activeName = ruleset_name;
|
||||||
}
|
}
|
||||||
Log.Out(Logs::Detail, Logs::Rules, "Saving running rules into rule set %s (%d)", ruleset_name, m_activeRuleset);
|
Log(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(Logs::Detail, Logs::Rules, "Saving running rules into running rule set %s", m_activeName.c_str(), m_activeRuleset);
|
||||||
}
|
}
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
@ -239,11 +239,11 @@ bool RuleManager::LoadRules(Database *database, const char *ruleset_name) {
|
|||||||
|
|
||||||
int ruleset_id = GetRulesetID(database, ruleset_name);
|
int ruleset_id = GetRulesetID(database, ruleset_name);
|
||||||
if (ruleset_id < 0) {
|
if (ruleset_id < 0) {
|
||||||
Log.Out(Logs::Detail, Logs::Rules, "Failed to find ruleset '%s' for load operation. Canceling.", ruleset_name);
|
Log(Logs::Detail, Logs::Rules, "Failed to find ruleset '%s' for load operation. Canceling.", ruleset_name);
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Rules, "Loading rule set '%s' (%d)", ruleset_name, ruleset_id);
|
Log(Logs::Detail, Logs::Rules, "Loading rule set '%s' (%d)", ruleset_name, ruleset_id);
|
||||||
|
|
||||||
m_activeRuleset = ruleset_id;
|
m_activeRuleset = ruleset_id;
|
||||||
m_activeName = ruleset_name;
|
m_activeName = ruleset_name;
|
||||||
@ -253,10 +253,10 @@ bool RuleManager::LoadRules(Database *database, const char *ruleset_name) {
|
|||||||
std::string default_ruleset_name = "default";
|
std::string default_ruleset_name = "default";
|
||||||
int default_ruleset_id = GetRulesetID(database, default_ruleset_name.c_str());
|
int default_ruleset_id = GetRulesetID(database, default_ruleset_name.c_str());
|
||||||
if (default_ruleset_id < 0) {
|
if (default_ruleset_id < 0) {
|
||||||
Log.Out(Logs::Detail, Logs::Rules, "Failed to find default ruleset '%s' for load operation. Canceling.", default_ruleset_name.c_str());
|
Log(Logs::Detail, Logs::Rules, "Failed to find default ruleset '%s' for load operation. Canceling.", default_ruleset_name.c_str());
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
Log.Out(Logs::Detail, Logs::Rules, "Loading rule set '%s' (%d)", default_ruleset_name.c_str(), default_ruleset_id);
|
Log(Logs::Detail, Logs::Rules, "Loading rule set '%s' (%d)", default_ruleset_name.c_str(), default_ruleset_id);
|
||||||
|
|
||||||
std::string query = StringFormat("SELECT rule_name, rule_value FROM rule_values WHERE ruleset_id = %d", default_ruleset_id);
|
std::string query = StringFormat("SELECT rule_name, rule_value FROM rule_values WHERE ruleset_id = %d", default_ruleset_id);
|
||||||
auto results = database->QueryDatabase(query);
|
auto results = database->QueryDatabase(query);
|
||||||
@ -265,7 +265,7 @@ bool RuleManager::LoadRules(Database *database, const char *ruleset_name) {
|
|||||||
|
|
||||||
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(Logs::Detail, Logs::Rules, "Unable to interpret rule record for %s", row[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string query = StringFormat("SELECT rule_name, rule_value FROM rule_values WHERE ruleset_id=%d", ruleset_id);
|
std::string query = StringFormat("SELECT rule_name, rule_value FROM rule_values WHERE ruleset_id=%d", ruleset_id);
|
||||||
@ -275,7 +275,7 @@ bool RuleManager::LoadRules(Database *database, const char *ruleset_name) {
|
|||||||
|
|
||||||
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(Logs::Detail, Logs::Rules, "Unable to interpret rule record for %s", row[0]);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -345,7 +345,7 @@ RULE_INT(Spells, MaxDiscSlotsNPC, 0) // NPCs don't have discs ...
|
|||||||
RULE_INT(Spells, MaxTotalSlotsNPC, 60) // default to Tit's limit
|
RULE_INT(Spells, MaxTotalSlotsNPC, 60) // default to Tit's limit
|
||||||
RULE_INT(Spells, MaxTotalSlotsPET, 30) // default to Tit's limit
|
RULE_INT(Spells, MaxTotalSlotsPET, 30) // default to Tit's limit
|
||||||
RULE_BOOL (Spells, EnableBlockedBuffs, true)
|
RULE_BOOL (Spells, EnableBlockedBuffs, true)
|
||||||
RULE_INT(Spells, ReflectType, 1) //0 = disabled, 1 = single target player spells only, 2 = all player spells, 3 = all single target spells, 4 = all spells
|
RULE_INT(Spells, ReflectType, 3) //0 = disabled, 1 = single target player spells only, 2 = all player spells, 3 = all single target spells, 4 = all spells
|
||||||
RULE_INT(Spells, VirusSpreadDistance, 30) // The distance a viral spell will jump to its next victim
|
RULE_INT(Spells, VirusSpreadDistance, 30) // The distance a viral spell will jump to its next victim
|
||||||
RULE_BOOL(Spells, LiveLikeFocusEffects, true) // Determines whether specific healing, dmg and mana reduction focuses are randomized
|
RULE_BOOL(Spells, LiveLikeFocusEffects, true) // Determines whether specific healing, dmg and mana reduction focuses are randomized
|
||||||
RULE_INT(Spells, BaseImmunityLevel, 55) // The level that targets start to be immune to stun, fear and mez spells with a max level of 0.
|
RULE_INT(Spells, BaseImmunityLevel, 55) // The level that targets start to be immune to stun, fear and mez spells with a max level of 0.
|
||||||
@ -559,6 +559,7 @@ RULE_INT(Range, SpellMessages, 75)
|
|||||||
RULE_INT(Range, SongMessages, 75)
|
RULE_INT(Range, SongMessages, 75)
|
||||||
RULE_INT(Range, MobPositionUpdates, 600)
|
RULE_INT(Range, MobPositionUpdates, 600)
|
||||||
RULE_INT(Range, CriticalDamage, 80)
|
RULE_INT(Range, CriticalDamage, 80)
|
||||||
|
RULE_INT(Range, ClientNPCScan, 300)
|
||||||
RULE_CATEGORY_END()
|
RULE_CATEGORY_END()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -98,10 +98,10 @@ std::string EQEmu::SayLinkEngine::GenerateLink()
|
|||||||
if ((m_Link.length() == 0) || (m_Link.length() > 250)) {
|
if ((m_Link.length() == 0) || (m_Link.length() > 250)) {
|
||||||
m_Error = true;
|
m_Error = true;
|
||||||
m_Link = "<LINKER ERROR>";
|
m_Link = "<LINKER ERROR>";
|
||||||
Log.Out(Logs::General, Logs::Error, "TextLink::GenerateLink() failed to generate a useable text link (LinkType: %i, Lengths: {link: %u, body: %u, text: %u})",
|
Log(Logs::General, Logs::Error, "TextLink::GenerateLink() failed to generate a useable text link (LinkType: %i, Lengths: {link: %u, body: %u, text: %u})",
|
||||||
m_LinkType, m_Link.length(), m_LinkBody.length(), m_LinkText.length());
|
m_LinkType, m_Link.length(), m_LinkBody.length(), m_LinkText.length());
|
||||||
Log.Out(Logs::General, Logs::Error, ">> LinkBody: %s", m_LinkBody.c_str());
|
Log(Logs::General, Logs::Error, ">> LinkBody: %s", m_LinkBody.c_str());
|
||||||
Log.Out(Logs::General, Logs::Error, ">> LinkText: %s", m_LinkText.c_str());
|
Log(Logs::General, Logs::Error, ">> LinkText: %s", m_LinkText.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_Link;
|
return m_Link;
|
||||||
|
|||||||
@ -429,7 +429,7 @@ bool SharedDatabase::GetSharedBank(uint32 id, EQEmu::InventoryProfile *inv, bool
|
|||||||
id);
|
id);
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
if (!results.Success()) {
|
if (!results.Success()) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Database::GetSharedBank(uint32 account_id): %s",
|
Log(Logs::General, Logs::Error, "Database::GetSharedBank(uint32 account_id): %s",
|
||||||
results.ErrorMessage().c_str());
|
results.ErrorMessage().c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -450,7 +450,7 @@ bool SharedDatabase::GetSharedBank(uint32 id, EQEmu::InventoryProfile *inv, bool
|
|||||||
const EQEmu::ItemData *item = GetItem(item_id);
|
const EQEmu::ItemData *item = GetItem(item_id);
|
||||||
|
|
||||||
if (!item) {
|
if (!item) {
|
||||||
Log.Out(Logs::General, Logs::Error,
|
Log(Logs::General, Logs::Error,
|
||||||
"Warning: %s %i has an invalid item_id %i in inventory slot %i",
|
"Warning: %s %i has an invalid item_id %i in inventory slot %i",
|
||||||
((is_charid == true) ? "charid" : "acctid"), id, item_id, slot_id);
|
((is_charid == true) ? "charid" : "acctid"), id, item_id, slot_id);
|
||||||
continue;
|
continue;
|
||||||
@ -499,7 +499,7 @@ bool SharedDatabase::GetSharedBank(uint32 id, EQEmu::InventoryProfile *inv, bool
|
|||||||
if (put_slot_id != INVALID_INDEX)
|
if (put_slot_id != INVALID_INDEX)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Error,
|
Log(Logs::General, Logs::Error,
|
||||||
"Warning: Invalid slot_id for item in shared bank inventory: %s=%i, item_id=%i, slot_id=%i",
|
"Warning: Invalid slot_id for item in shared bank inventory: %s=%i, item_id=%i, slot_id=%i",
|
||||||
((is_charid == true) ? "charid" : "acctid"), id, item_id, slot_id);
|
((is_charid == true) ? "charid" : "acctid"), id, item_id, slot_id);
|
||||||
|
|
||||||
@ -521,7 +521,7 @@ bool SharedDatabase::GetInventory(uint32 char_id, EQEmu::InventoryProfile *inv)
|
|||||||
char_id);
|
char_id);
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
if (!results.Success()) {
|
if (!results.Success()) {
|
||||||
Log.Out(Logs::General, Logs::Error, "If you got an error related to the 'instnodrop' field, run the "
|
Log(Logs::General, Logs::Error, "If you got an error related to the 'instnodrop' field, run the "
|
||||||
"following SQL Queries:\nalter table inventory add instnodrop "
|
"following SQL Queries:\nalter table inventory add instnodrop "
|
||||||
"tinyint(1) unsigned default 0 not null;\n");
|
"tinyint(1) unsigned default 0 not null;\n");
|
||||||
return false;
|
return false;
|
||||||
@ -553,7 +553,7 @@ bool SharedDatabase::GetInventory(uint32 char_id, EQEmu::InventoryProfile *inv)
|
|||||||
const EQEmu::ItemData *item = GetItem(item_id);
|
const EQEmu::ItemData *item = GetItem(item_id);
|
||||||
|
|
||||||
if (!item) {
|
if (!item) {
|
||||||
Log.Out(Logs::General, Logs::Error,
|
Log(Logs::General, Logs::Error,
|
||||||
"Warning: charid %i has an invalid item_id %i in inventory slot %i", char_id, item_id,
|
"Warning: charid %i has an invalid item_id %i in inventory slot %i", char_id, item_id,
|
||||||
slot_id);
|
slot_id);
|
||||||
continue;
|
continue;
|
||||||
@ -630,7 +630,7 @@ bool SharedDatabase::GetInventory(uint32 char_id, EQEmu::InventoryProfile *inv)
|
|||||||
put_slot_id = inv->PushCursor(*inst);
|
put_slot_id = inv->PushCursor(*inst);
|
||||||
} else if (slot_id >= 3111 && slot_id <= 3179) {
|
} else if (slot_id >= 3111 && slot_id <= 3179) {
|
||||||
// Admins: please report any occurrences of this error
|
// Admins: please report any occurrences of this error
|
||||||
Log.Out(Logs::General, Logs::Error, "Warning: Defunct location for item in inventory: "
|
Log(Logs::General, Logs::Error, "Warning: Defunct location for item in inventory: "
|
||||||
"charid=%i, item_id=%i, slot_id=%i .. pushing to cursor...",
|
"charid=%i, item_id=%i, slot_id=%i .. pushing to cursor...",
|
||||||
char_id, item_id, slot_id);
|
char_id, item_id, slot_id);
|
||||||
put_slot_id = inv->PushCursor(*inst);
|
put_slot_id = inv->PushCursor(*inst);
|
||||||
@ -642,7 +642,7 @@ bool SharedDatabase::GetInventory(uint32 char_id, EQEmu::InventoryProfile *inv)
|
|||||||
|
|
||||||
// Save ptr to item in inventory
|
// Save ptr to item in inventory
|
||||||
if (put_slot_id == INVALID_INDEX) {
|
if (put_slot_id == INVALID_INDEX) {
|
||||||
Log.Out(Logs::General, Logs::Error,
|
Log(Logs::General, Logs::Error,
|
||||||
"Warning: Invalid slot_id for item in inventory: charid=%i, item_id=%i, slot_id=%i",
|
"Warning: Invalid slot_id for item in inventory: charid=%i, item_id=%i, slot_id=%i",
|
||||||
char_id, item_id, slot_id);
|
char_id, item_id, slot_id);
|
||||||
}
|
}
|
||||||
@ -665,7 +665,7 @@ bool SharedDatabase::GetInventory(uint32 account_id, char *name, EQEmu::Inventor
|
|||||||
name, account_id);
|
name, account_id);
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
if (!results.Success()) {
|
if (!results.Success()) {
|
||||||
Log.Out(Logs::General, Logs::Error, "If you got an error related to the 'instnodrop' field, run the "
|
Log(Logs::General, Logs::Error, "If you got an error related to the 'instnodrop' field, run the "
|
||||||
"following SQL Queries:\nalter table inventory add instnodrop "
|
"following SQL Queries:\nalter table inventory add instnodrop "
|
||||||
"tinyint(1) unsigned default 0 not null;\n");
|
"tinyint(1) unsigned default 0 not null;\n");
|
||||||
return false;
|
return false;
|
||||||
@ -753,7 +753,7 @@ bool SharedDatabase::GetInventory(uint32 account_id, char *name, EQEmu::Inventor
|
|||||||
|
|
||||||
// Save ptr to item in inventory
|
// Save ptr to item in inventory
|
||||||
if (put_slot_id == INVALID_INDEX)
|
if (put_slot_id == INVALID_INDEX)
|
||||||
Log.Out(Logs::General, Logs::Error, "Warning: Invalid slot_id for item in inventory: name=%s, "
|
Log(Logs::General, Logs::Error, "Warning: Invalid slot_id for item in inventory: name=%s, "
|
||||||
"acctid=%i, item_id=%i, slot_id=%i",
|
"acctid=%i, item_id=%i, slot_id=%i",
|
||||||
name, account_id, item_id, slot_id);
|
name, account_id, item_id, slot_id);
|
||||||
}
|
}
|
||||||
@ -830,7 +830,7 @@ bool SharedDatabase::LoadItems(const std::string &prefix) {
|
|||||||
items_hash = std::unique_ptr<EQEmu::FixedMemoryHashSet<EQEmu::ItemData>>(new EQEmu::FixedMemoryHashSet<EQEmu::ItemData>(reinterpret_cast<uint8*>(items_mmf->Get()), items_mmf->Size()));
|
items_hash = std::unique_ptr<EQEmu::FixedMemoryHashSet<EQEmu::ItemData>>(new EQEmu::FixedMemoryHashSet<EQEmu::ItemData>(reinterpret_cast<uint8*>(items_mmf->Get()), items_mmf->Size()));
|
||||||
mutex.Unlock();
|
mutex.Unlock();
|
||||||
} catch(std::exception& ex) {
|
} catch(std::exception& ex) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Error Loading Items: %s", ex.what());
|
Log(Logs::General, Logs::Error, "Error Loading Items: %s", ex.what());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1091,7 +1091,7 @@ void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_
|
|||||||
try {
|
try {
|
||||||
hash.insert(item.ID, item);
|
hash.insert(item.ID, item);
|
||||||
} catch (std::exception &ex) {
|
} catch (std::exception &ex) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Database::LoadItems: %s", ex.what());
|
Log(Logs::General, Logs::Error, "Database::LoadItems: %s", ex.what());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1150,7 +1150,7 @@ std::string SharedDatabase::GetBook(const char *txtfile, int16 *language)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (results.RowCount() == 0) {
|
if (results.RowCount() == 0) {
|
||||||
Log.Out(Logs::General, Logs::Error, "No book to send, (%s)", txtfile);
|
Log(Logs::General, Logs::Error, "No book to send, (%s)", txtfile);
|
||||||
txtout.assign(" ",1);
|
txtout.assign(" ",1);
|
||||||
return txtout;
|
return txtout;
|
||||||
}
|
}
|
||||||
@ -1255,7 +1255,7 @@ bool SharedDatabase::LoadNPCFactionLists(const std::string &prefix) {
|
|||||||
faction_hash = std::unique_ptr<EQEmu::FixedMemoryHashSet<NPCFactionList>>(new EQEmu::FixedMemoryHashSet<NPCFactionList>(reinterpret_cast<uint8*>(faction_mmf->Get()), faction_mmf->Size()));
|
faction_hash = std::unique_ptr<EQEmu::FixedMemoryHashSet<NPCFactionList>>(new EQEmu::FixedMemoryHashSet<NPCFactionList>(reinterpret_cast<uint8*>(faction_mmf->Get()), faction_mmf->Size()));
|
||||||
mutex.Unlock();
|
mutex.Unlock();
|
||||||
} catch(std::exception& ex) {
|
} catch(std::exception& ex) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Error Loading npc factions: %s", ex.what());
|
Log(Logs::General, Logs::Error, "Error Loading npc factions: %s", ex.what());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1273,8 +1273,8 @@ EQEmu::ItemInstance* SharedDatabase::CreateItem(uint32 item_id, int16 charges, u
|
|||||||
inst = CreateBaseItem(item, charges);
|
inst = CreateBaseItem(item, charges);
|
||||||
|
|
||||||
if (inst == nullptr) {
|
if (inst == nullptr) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Error: valid item data returned a null reference for EQEmu::ItemInstance creation in SharedDatabase::CreateItem()");
|
Log(Logs::General, Logs::Error, "Error: valid item data returned a null reference for EQEmu::ItemInstance creation in SharedDatabase::CreateItem()");
|
||||||
Log.Out(Logs::General, Logs::Error, "Item Data = ID: %u, Name: %s, Charges: %i", item->ID, item->Name, charges);
|
Log(Logs::General, Logs::Error, "Item Data = ID: %u, Name: %s, Charges: %i", item->ID, item->Name, charges);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1299,8 +1299,8 @@ EQEmu::ItemInstance* SharedDatabase::CreateItem(const EQEmu::ItemData* item, int
|
|||||||
inst = CreateBaseItem(item, charges);
|
inst = CreateBaseItem(item, charges);
|
||||||
|
|
||||||
if (inst == nullptr) {
|
if (inst == nullptr) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Error: valid item data returned a null reference for EQEmu::ItemInstance creation in SharedDatabase::CreateItem()");
|
Log(Logs::General, Logs::Error, "Error: valid item data returned a null reference for EQEmu::ItemInstance creation in SharedDatabase::CreateItem()");
|
||||||
Log.Out(Logs::General, Logs::Error, "Item Data = ID: %u, Name: %s, Charges: %i", item->ID, item->Name, charges);
|
Log(Logs::General, Logs::Error, "Item Data = ID: %u, Name: %s, Charges: %i", item->ID, item->Name, charges);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1330,8 +1330,8 @@ EQEmu::ItemInstance* SharedDatabase::CreateBaseItem(const EQEmu::ItemData* item,
|
|||||||
inst = new EQEmu::ItemInstance(item, charges);
|
inst = new EQEmu::ItemInstance(item, charges);
|
||||||
|
|
||||||
if (inst == nullptr) {
|
if (inst == nullptr) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Error: valid item data returned a null reference for EQEmu::ItemInstance creation in SharedDatabase::CreateBaseItem()");
|
Log(Logs::General, Logs::Error, "Error: valid item data returned a null reference for EQEmu::ItemInstance creation in SharedDatabase::CreateBaseItem()");
|
||||||
Log.Out(Logs::General, Logs::Error, "Item Data = ID: %u, Name: %s, Charges: %i", item->ID, item->Name, charges);
|
Log(Logs::General, Logs::Error, "Item Data = ID: %u, Name: %s, Charges: %i", item->ID, item->Name, charges);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1406,7 +1406,7 @@ bool SharedDatabase::LoadSkillCaps(const std::string &prefix) {
|
|||||||
skill_caps_mmf = std::unique_ptr<EQEmu::MemoryMappedFile>(new EQEmu::MemoryMappedFile(file_name));
|
skill_caps_mmf = std::unique_ptr<EQEmu::MemoryMappedFile>(new EQEmu::MemoryMappedFile(file_name));
|
||||||
mutex.Unlock();
|
mutex.Unlock();
|
||||||
} catch(std::exception &ex) {
|
} catch(std::exception &ex) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Error loading skill caps: %s", ex.what());
|
Log(Logs::General, Logs::Error, "Error loading skill caps: %s", ex.what());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1422,7 +1422,7 @@ void SharedDatabase::LoadSkillCaps(void *data) {
|
|||||||
const std::string query = "SELECT skillID, class, level, cap FROM skill_caps ORDER BY skillID, class, level";
|
const std::string query = "SELECT skillID, class, level, cap FROM skill_caps ORDER BY skillID, class, level";
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
if (!results.Success()) {
|
if (!results.Success()) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Error loading skill caps from database: %s", results.ErrorMessage().c_str());
|
Log(Logs::General, Logs::Error, "Error loading skill caps from database: %s", results.ErrorMessage().c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1566,7 +1566,7 @@ bool SharedDatabase::LoadSpells(const std::string &prefix, int32 *records, const
|
|||||||
mutex.Unlock();
|
mutex.Unlock();
|
||||||
}
|
}
|
||||||
catch(std::exception& ex) {
|
catch(std::exception& ex) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Error Loading Spells: %s", ex.what());
|
Log(Logs::General, Logs::Error, "Error Loading Spells: %s", ex.what());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -1583,7 +1583,7 @@ void SharedDatabase::LoadSpells(void *data, int max_spells) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(results.ColumnCount() <= SPELL_LOAD_FIELD_COUNT) {
|
if(results.ColumnCount() <= SPELL_LOAD_FIELD_COUNT) {
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "Fatal error loading spells: Spell field count < SPELL_LOAD_FIELD_COUNT(%u)", SPELL_LOAD_FIELD_COUNT);
|
Log(Logs::Detail, Logs::Spells, "Fatal error loading spells: Spell field count < SPELL_LOAD_FIELD_COUNT(%u)", SPELL_LOAD_FIELD_COUNT);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1593,7 +1593,7 @@ void SharedDatabase::LoadSpells(void *data, int max_spells) {
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
tempid = atoi(row[0]);
|
tempid = atoi(row[0]);
|
||||||
if(tempid >= max_spells) {
|
if(tempid >= max_spells) {
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "Non fatal error: spell.id >= max_spells, ignoring.");
|
Log(Logs::Detail, Logs::Spells, "Non fatal error: spell.id >= max_spells, ignoring.");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1769,7 +1769,7 @@ bool SharedDatabase::LoadBaseData(const std::string &prefix) {
|
|||||||
base_data_mmf = std::unique_ptr<EQEmu::MemoryMappedFile>(new EQEmu::MemoryMappedFile(file_name));
|
base_data_mmf = std::unique_ptr<EQEmu::MemoryMappedFile>(new EQEmu::MemoryMappedFile(file_name));
|
||||||
mutex.Unlock();
|
mutex.Unlock();
|
||||||
} catch(std::exception& ex) {
|
} catch(std::exception& ex) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Error Loading Base Data: %s", ex.what());
|
Log(Logs::General, Logs::Error, "Error Loading Base Data: %s", ex.what());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1793,22 +1793,22 @@ void SharedDatabase::LoadBaseData(void *data, int max_level) {
|
|||||||
cl = atoi(row[1]);
|
cl = atoi(row[1]);
|
||||||
|
|
||||||
if(lvl <= 0) {
|
if(lvl <= 0) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Non fatal error: base_data.level <= 0, ignoring.");
|
Log(Logs::General, Logs::Error, "Non fatal error: base_data.level <= 0, ignoring.");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(lvl >= max_level) {
|
if(lvl >= max_level) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Non fatal error: base_data.level >= max_level, ignoring.");
|
Log(Logs::General, Logs::Error, "Non fatal error: base_data.level >= max_level, ignoring.");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(cl <= 0) {
|
if(cl <= 0) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Non fatal error: base_data.cl <= 0, ignoring.");
|
Log(Logs::General, Logs::Error, "Non fatal error: base_data.cl <= 0, ignoring.");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(cl > 16) {
|
if(cl > 16) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Non fatal error: base_data.class > 16, ignoring.");
|
Log(Logs::General, Logs::Error, "Non fatal error: base_data.class > 16, ignoring.");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2016,7 +2016,7 @@ bool SharedDatabase::LoadLoot(const std::string &prefix) {
|
|||||||
loot_drop_mmf->Size()));
|
loot_drop_mmf->Size()));
|
||||||
mutex.Unlock();
|
mutex.Unlock();
|
||||||
} catch(std::exception &ex) {
|
} catch(std::exception &ex) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Error loading loot: %s", ex.what());
|
Log(Logs::General, Logs::Error, "Error loading loot: %s", ex.what());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2032,7 +2032,7 @@ const LootTable_Struct* SharedDatabase::GetLootTable(uint32 loottable_id) {
|
|||||||
return &loot_table_hash->at(loottable_id);
|
return &loot_table_hash->at(loottable_id);
|
||||||
}
|
}
|
||||||
} catch(std::exception &ex) {
|
} catch(std::exception &ex) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Could not get loot table: %s", ex.what());
|
Log(Logs::General, Logs::Error, "Could not get loot table: %s", ex.what());
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -2046,7 +2046,7 @@ const LootDrop_Struct* SharedDatabase::GetLootDrop(uint32 lootdrop_id) {
|
|||||||
return &loot_drop_hash->at(lootdrop_id);
|
return &loot_drop_hash->at(lootdrop_id);
|
||||||
}
|
}
|
||||||
} catch(std::exception &ex) {
|
} catch(std::exception &ex) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Could not get loot drop: %s", ex.what());
|
Log(Logs::General, Logs::Error, "Could not get loot drop: %s", ex.what());
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -851,7 +851,7 @@ DmgShieldType GetDamageShieldType(uint16 spell_id, int32 DSType)
|
|||||||
// If we have a DamageShieldType for this spell from the damageshieldtypes table, return that,
|
// If we have a DamageShieldType for this spell from the damageshieldtypes table, return that,
|
||||||
// else, make a guess, based on the resist type. Default return value is DS_THORNS
|
// else, make a guess, based on the resist type. Default return value is DS_THORNS
|
||||||
if (IsValidSpell(spell_id)) {
|
if (IsValidSpell(spell_id)) {
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "DamageShieldType for spell %i (%s) is %X\n", spell_id,
|
Log(Logs::Detail, Logs::Spells, "DamageShieldType for spell %i (%s) is %X\n", spell_id,
|
||||||
spells[spell_id].name, spells[spell_id].DamageShieldType);
|
spells[spell_id].name, spells[spell_id].DamageShieldType);
|
||||||
|
|
||||||
if (spells[spell_id].DamageShieldType)
|
if (spells[spell_id].DamageShieldType)
|
||||||
|
|||||||
@ -41,13 +41,13 @@ void StructStrategy::ErrorEncoder(EQApplicationPacket **in_p, std::shared_ptr<EQ
|
|||||||
EQApplicationPacket *p = *in_p;
|
EQApplicationPacket *p = *in_p;
|
||||||
*in_p = nullptr;
|
*in_p = nullptr;
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Error encoding opcode %s: no encoder provided. Dropping.", OpcodeManager::EmuToName(p->GetOpcode()));
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Error encoding opcode %s: no encoder provided. Dropping.", OpcodeManager::EmuToName(p->GetOpcode()));
|
||||||
|
|
||||||
delete p;
|
delete p;
|
||||||
}
|
}
|
||||||
|
|
||||||
void StructStrategy::ErrorDecoder(EQApplicationPacket *p) {
|
void StructStrategy::ErrorDecoder(EQApplicationPacket *p) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Error decoding opcode %s: no decoder provided. Invalidating.", OpcodeManager::EmuToName(p->GetOpcode()));
|
Log(Logs::General, Logs::Netcode, "[STRUCTS] Error decoding opcode %s: no decoder provided. Invalidating.", OpcodeManager::EmuToName(p->GetOpcode()));
|
||||||
p->SetOpcode(OP_Unknown);
|
p->SetOpcode(OP_Unknown);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
942
common/tcp_connection.cpp
Normal file
942
common/tcp_connection.cpp
Normal file
@ -0,0 +1,942 @@
|
|||||||
|
/* EQEMu: Everquest Server Emulator
|
||||||
|
Copyright (C) 2001-2002 EQEMu Development Team (http://eqemu.org)
|
||||||
|
|
||||||
|
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 "../common/global_define.h"
|
||||||
|
#include "../common/eqemu_logsys.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <string.h>
|
||||||
|
#include <iomanip>
|
||||||
|
|
||||||
|
#include "tcp_connection.h"
|
||||||
|
|
||||||
|
#ifdef FREEBSD //Timothy Whitman - January 7, 2003
|
||||||
|
#define MSG_NOSIGNAL 0
|
||||||
|
#endif
|
||||||
|
#ifdef DARWIN
|
||||||
|
#define MSG_NOSIGNAL SO_NOSIGPIPE // Corysia Taware - Sept. 27, 2013
|
||||||
|
// See http://lists.apple.com/archives/macnetworkprog/2002/Dec/msg00091.html
|
||||||
|
#endif // DARWIN
|
||||||
|
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
InitWinsock winsock;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define LOOP_GRANULARITY 3 //# of ms between checking our socket/queues
|
||||||
|
|
||||||
|
#define TCPN_DEBUG 0
|
||||||
|
#define TCPN_DEBUG_Console 0
|
||||||
|
#define TCPN_DEBUG_Memory 0
|
||||||
|
#define TCPN_LOG_RAW_DATA_OUT 0 //1 = info, 2 = length limited dump, 3 = full dump
|
||||||
|
#define TCPN_LOG_RAW_DATA_IN 0 //1 = info, 2 = length limited dump, 3 = full dump
|
||||||
|
|
||||||
|
//client version
|
||||||
|
TCPConnection::TCPConnection()
|
||||||
|
: ConnectionType(Outgoing),
|
||||||
|
connection_socket(0),
|
||||||
|
id(0),
|
||||||
|
rIP(0),
|
||||||
|
rPort(0)
|
||||||
|
{
|
||||||
|
pState = TCPS_Ready;
|
||||||
|
pFree = false;
|
||||||
|
pEcho = false;
|
||||||
|
recvbuf = nullptr;
|
||||||
|
sendbuf = nullptr;
|
||||||
|
pRunLoop = false;
|
||||||
|
charAsyncConnect = 0;
|
||||||
|
pAsyncConnect = false;
|
||||||
|
m_previousLineEnd = false;
|
||||||
|
#if TCPN_DEBUG_Memory >= 7
|
||||||
|
std::cout << "Constructor #2 on outgoing TCP# " << GetID() << std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
//server version
|
||||||
|
TCPConnection::TCPConnection(uint32 ID, SOCKET in_socket, uint32 irIP, uint16 irPort)
|
||||||
|
: ConnectionType(Incoming),
|
||||||
|
connection_socket(in_socket),
|
||||||
|
id(ID),
|
||||||
|
rIP(irIP),
|
||||||
|
rPort(irPort)
|
||||||
|
{
|
||||||
|
pState = TCPS_Connected;
|
||||||
|
pFree = false;
|
||||||
|
pEcho = false;
|
||||||
|
recvbuf = nullptr;
|
||||||
|
sendbuf = nullptr;
|
||||||
|
pRunLoop = false;
|
||||||
|
charAsyncConnect = 0;
|
||||||
|
pAsyncConnect = false;
|
||||||
|
m_previousLineEnd = false;
|
||||||
|
#if TCPN_DEBUG_Memory >= 7
|
||||||
|
std::cout << "Constructor #2 on incoming TCP# " << GetID() << std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
TCPConnection::~TCPConnection() {
|
||||||
|
FinishDisconnect();
|
||||||
|
ClearBuffers();
|
||||||
|
if (ConnectionType == Outgoing) {
|
||||||
|
MRunLoop.lock();
|
||||||
|
pRunLoop = false;
|
||||||
|
MRunLoop.unlock();
|
||||||
|
MLoopRunning.lock();
|
||||||
|
MLoopRunning.unlock();
|
||||||
|
#if TCPN_DEBUG_Memory >= 6
|
||||||
|
std::cout << "Deconstructor on outgoing TCP# " << GetID() << std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#if TCPN_DEBUG_Memory >= 5
|
||||||
|
else {
|
||||||
|
std::cout << "Deconstructor on incoming TCP# " << GetID() << std::endl;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
safe_delete_array(recvbuf);
|
||||||
|
safe_delete_array(sendbuf);
|
||||||
|
safe_delete_array(charAsyncConnect);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPConnection::SetState(State_t in_state) {
|
||||||
|
MState.lock();
|
||||||
|
pState = in_state;
|
||||||
|
MState.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
TCPConnection::State_t TCPConnection::GetState() const {
|
||||||
|
State_t ret;
|
||||||
|
MState.lock();
|
||||||
|
ret = pState;
|
||||||
|
MState.unlock();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TCPConnection::GetSockName(char *host, uint16 *port)
|
||||||
|
{
|
||||||
|
bool result=false;
|
||||||
|
LockMutex lock(&MState);
|
||||||
|
if (!Connected())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
struct sockaddr_in local;
|
||||||
|
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
int addrlen;
|
||||||
|
#else
|
||||||
|
#ifdef FREEBSD
|
||||||
|
socklen_t addrlen;
|
||||||
|
#else
|
||||||
|
size_t addrlen;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
addrlen=sizeof(struct sockaddr_in);
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
if (!getsockname(connection_socket,(struct sockaddr *)&local,&addrlen)) {
|
||||||
|
#else
|
||||||
|
if (!getsockname(connection_socket,(struct sockaddr *)&local,(socklen_t *)&addrlen)) {
|
||||||
|
#endif
|
||||||
|
unsigned long ip=local.sin_addr.s_addr;
|
||||||
|
sprintf(host,"%d.%d.%d.%d",
|
||||||
|
*(unsigned char *)&ip,
|
||||||
|
*((unsigned char *)&ip+1),
|
||||||
|
*((unsigned char *)&ip+2),
|
||||||
|
*((unsigned char *)&ip+3));
|
||||||
|
*port=ntohs(local.sin_port);
|
||||||
|
|
||||||
|
result=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPConnection::Free() {
|
||||||
|
Disconnect();
|
||||||
|
pFree = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TCPConnection::Send(const uchar* data, int32 size) {
|
||||||
|
if (!Connected())
|
||||||
|
return false;
|
||||||
|
if (!size)
|
||||||
|
return true;
|
||||||
|
ServerSendQueuePushEnd(data, size);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPConnection::ServerSendQueuePushEnd(const uchar* data, int32 size) {
|
||||||
|
MSendQueue.lock();
|
||||||
|
if (sendbuf == nullptr) {
|
||||||
|
sendbuf = new uchar[size];
|
||||||
|
sendbuf_size = size;
|
||||||
|
sendbuf_used = 0;
|
||||||
|
}
|
||||||
|
else if (size > (sendbuf_size - sendbuf_used)) {
|
||||||
|
sendbuf_size += size + 1024;
|
||||||
|
auto tmp = new uchar[sendbuf_size];
|
||||||
|
memcpy(tmp, sendbuf, sendbuf_used);
|
||||||
|
safe_delete_array(sendbuf);
|
||||||
|
sendbuf = tmp;
|
||||||
|
}
|
||||||
|
memcpy(&sendbuf[sendbuf_used], data, size);
|
||||||
|
sendbuf_used += size;
|
||||||
|
MSendQueue.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPConnection::ServerSendQueuePushEnd(uchar** data, int32 size) {
|
||||||
|
MSendQueue.lock();
|
||||||
|
if (sendbuf == 0) {
|
||||||
|
sendbuf = *data;
|
||||||
|
sendbuf_size = size;
|
||||||
|
sendbuf_used = size;
|
||||||
|
MSendQueue.unlock();
|
||||||
|
*data = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (size > (sendbuf_size - sendbuf_used)) {
|
||||||
|
sendbuf_size += size;
|
||||||
|
auto tmp = new uchar[sendbuf_size];
|
||||||
|
memcpy(tmp, sendbuf, sendbuf_used);
|
||||||
|
safe_delete_array(sendbuf);
|
||||||
|
sendbuf = tmp;
|
||||||
|
}
|
||||||
|
memcpy(&sendbuf[sendbuf_used], *data, size);
|
||||||
|
sendbuf_used += size;
|
||||||
|
MSendQueue.unlock();
|
||||||
|
safe_delete_array(*data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPConnection::ServerSendQueuePushFront(uchar* data, int32 size) {
|
||||||
|
MSendQueue.lock();
|
||||||
|
if (sendbuf == 0) {
|
||||||
|
sendbuf = new uchar[size];
|
||||||
|
sendbuf_size = size;
|
||||||
|
sendbuf_used = 0;
|
||||||
|
}
|
||||||
|
else if (size > (sendbuf_size - sendbuf_used)) {
|
||||||
|
sendbuf_size += size;
|
||||||
|
auto tmp = new uchar[sendbuf_size];
|
||||||
|
memcpy(&tmp[size], sendbuf, sendbuf_used);
|
||||||
|
safe_delete_array(sendbuf);
|
||||||
|
sendbuf = tmp;
|
||||||
|
}
|
||||||
|
memcpy(sendbuf, data, size);
|
||||||
|
sendbuf_used += size;
|
||||||
|
MSendQueue.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TCPConnection::ServerSendQueuePop(uchar** data, int32* size) {
|
||||||
|
bool ret;
|
||||||
|
if (!MSendQueue.trylock())
|
||||||
|
return false;
|
||||||
|
if (sendbuf) {
|
||||||
|
*data = sendbuf;
|
||||||
|
*size = sendbuf_used;
|
||||||
|
sendbuf = 0;
|
||||||
|
ret = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ret = false;
|
||||||
|
}
|
||||||
|
MSendQueue.unlock();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TCPConnection::ServerSendQueuePopForce(uchar** data, int32* size) {
|
||||||
|
bool ret;
|
||||||
|
MSendQueue.lock();
|
||||||
|
if (sendbuf) {
|
||||||
|
*data = sendbuf;
|
||||||
|
*size = sendbuf_used;
|
||||||
|
sendbuf = 0;
|
||||||
|
ret = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ret = false;
|
||||||
|
}
|
||||||
|
MSendQueue.unlock();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* TCPConnection::PopLine() {
|
||||||
|
char* ret;
|
||||||
|
if (!MLineOutQueue.trylock())
|
||||||
|
return 0;
|
||||||
|
ret = (char*) LineOutQueue.pop();
|
||||||
|
MLineOutQueue.unlock();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TCPConnection::LineOutQueuePush(char* line) {
|
||||||
|
MLineOutQueue.lock();
|
||||||
|
LineOutQueue.push(line);
|
||||||
|
MLineOutQueue.unlock();
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TCPConnection::FinishDisconnect() {
|
||||||
|
MState.lock();
|
||||||
|
if (connection_socket != INVALID_SOCKET && connection_socket != 0) {
|
||||||
|
if (pState == TCPS_Connected || pState == TCPS_Disconnecting || pState == TCPS_Disconnected) {
|
||||||
|
bool sent_something = false;
|
||||||
|
SendData(sent_something);
|
||||||
|
}
|
||||||
|
pState = TCPS_Closing;
|
||||||
|
shutdown(connection_socket, 0x01);
|
||||||
|
shutdown(connection_socket, 0x00);
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
closesocket(connection_socket);
|
||||||
|
#else
|
||||||
|
close(connection_socket);
|
||||||
|
#endif
|
||||||
|
connection_socket = 0;
|
||||||
|
rIP = 0;
|
||||||
|
rPort = 0;
|
||||||
|
ClearBuffers();
|
||||||
|
}
|
||||||
|
pState = TCPS_Disconnected;
|
||||||
|
MState.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPConnection::Disconnect() {
|
||||||
|
MState.lock();
|
||||||
|
if(pState == TCPS_Connected || pState == TCPS_Connecting) {
|
||||||
|
pState = TCPS_Disconnecting;
|
||||||
|
}
|
||||||
|
MState.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TCPConnection::GetAsyncConnect() {
|
||||||
|
bool ret;
|
||||||
|
MAsyncConnect.lock();
|
||||||
|
ret = pAsyncConnect;
|
||||||
|
MAsyncConnect.unlock();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TCPConnection::SetAsyncConnect(bool iValue) {
|
||||||
|
bool ret;
|
||||||
|
MAsyncConnect.lock();
|
||||||
|
ret = pAsyncConnect;
|
||||||
|
pAsyncConnect = iValue;
|
||||||
|
MAsyncConnect.unlock();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TCPConnection::ConnectReady() const {
|
||||||
|
State_t s = GetState();
|
||||||
|
if (s != TCPS_Ready && s != TCPS_Disconnected)
|
||||||
|
return(false);
|
||||||
|
return(ConnectionType == Outgoing);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPConnection::AsyncConnect(const char* irAddress, uint16 irPort) {
|
||||||
|
safe_delete_array(charAsyncConnect);
|
||||||
|
charAsyncConnect = new char[strlen(irAddress) + 1];
|
||||||
|
strcpy(charAsyncConnect, irAddress);
|
||||||
|
AsyncConnect((uint32) 0, irPort);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPConnection::AsyncConnect(uint32 irIP, uint16 irPort) {
|
||||||
|
if (ConnectionType != Outgoing) {
|
||||||
|
// If this code runs, we got serious problems
|
||||||
|
// Crash and burn.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(!ConnectReady()) {
|
||||||
|
#if TCPN_DEBUG > 0
|
||||||
|
printf("Trying to do async connect in invalid state %s\n", GetState());
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
MAsyncConnect.lock();
|
||||||
|
if (pAsyncConnect) {
|
||||||
|
MAsyncConnect.unlock();
|
||||||
|
#if TCPN_DEBUG > 0
|
||||||
|
printf("Trying to do async connect when already doing one.\n");
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#if TCPN_DEBUG > 0
|
||||||
|
printf("Start async connect.\n");
|
||||||
|
#endif
|
||||||
|
pAsyncConnect = true;
|
||||||
|
if(irIP != 0)
|
||||||
|
safe_delete_array(charAsyncConnect);
|
||||||
|
rIP = irIP;
|
||||||
|
rPort = irPort;
|
||||||
|
MAsyncConnect.unlock();
|
||||||
|
if (!pRunLoop) {
|
||||||
|
pRunLoop = true;
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
_beginthread(TCPConnectionLoop, 0, this);
|
||||||
|
#else
|
||||||
|
pthread_t thread;
|
||||||
|
pthread_create(&thread, nullptr, TCPConnectionLoop, this);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TCPConnection::Connect(const char* irAddress, uint16 irPort, char* errbuf) {
|
||||||
|
if (errbuf)
|
||||||
|
errbuf[0] = 0;
|
||||||
|
uint32 tmpIP = ResolveIP(irAddress);
|
||||||
|
if (!tmpIP) {
|
||||||
|
if (errbuf) {
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
snprintf(errbuf, TCPConnection_ErrorBufferSize, "TCPConnection::Connect(): Couldnt resolve hostname. Error: %i", WSAGetLastError());
|
||||||
|
#else
|
||||||
|
snprintf(errbuf, TCPConnection_ErrorBufferSize, "TCPConnection::Connect(): Couldnt resolve hostname. Error #%i: %s", errno, strerror(errno));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return ConnectIP(tmpIP, irPort, errbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TCPConnection::ConnectIP(uint32 in_ip, uint16 in_port, char* errbuf) {
|
||||||
|
if (errbuf)
|
||||||
|
errbuf[0] = 0;
|
||||||
|
if (ConnectionType != Outgoing) {
|
||||||
|
// If this code runs, we got serious problems
|
||||||
|
// Crash and burn.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
MState.lock();
|
||||||
|
if (ConnectReady()) {
|
||||||
|
pState = TCPS_Connecting;
|
||||||
|
} else {
|
||||||
|
MState.unlock();
|
||||||
|
SetAsyncConnect(false);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
MState.unlock();
|
||||||
|
if (!pRunLoop) {
|
||||||
|
pRunLoop = true;
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
_beginthread(TCPConnectionLoop, 0, this);
|
||||||
|
#else
|
||||||
|
pthread_t thread;
|
||||||
|
pthread_create(&thread, nullptr, TCPConnectionLoop, this);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
connection_socket = INVALID_SOCKET;
|
||||||
|
struct sockaddr_in server_sin;
|
||||||
|
//struct in_addr in;
|
||||||
|
|
||||||
|
if ((connection_socket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET || connection_socket == 0) {
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
if (errbuf)
|
||||||
|
snprintf(errbuf, TCPConnection_ErrorBufferSize, "TCPConnection::Connect(): Allocating socket failed. Error: %i", WSAGetLastError());
|
||||||
|
#else
|
||||||
|
if (errbuf)
|
||||||
|
snprintf(errbuf, TCPConnection_ErrorBufferSize, "TCPConnection::Connect(): Allocating socket failed. Error: %s", strerror(errno));
|
||||||
|
#endif
|
||||||
|
SetState(TCPS_Ready);
|
||||||
|
SetAsyncConnect(false);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
server_sin.sin_family = AF_INET;
|
||||||
|
server_sin.sin_addr.s_addr = in_ip;
|
||||||
|
server_sin.sin_port = htons(in_port);
|
||||||
|
|
||||||
|
// Establish a connection to the server socket.
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
if (connect(connection_socket, (PSOCKADDR) &server_sin, sizeof (server_sin)) == SOCKET_ERROR) {
|
||||||
|
if (errbuf)
|
||||||
|
snprintf(errbuf, TCPConnection_ErrorBufferSize, "TCPConnection::Connect(): connect() failed. Error: %i", WSAGetLastError());
|
||||||
|
closesocket(connection_socket);
|
||||||
|
connection_socket = 0;
|
||||||
|
SetState(TCPS_Ready);
|
||||||
|
SetAsyncConnect(false);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (connect(connection_socket, (struct sockaddr *) &server_sin, sizeof (server_sin)) == SOCKET_ERROR) {
|
||||||
|
if (errbuf)
|
||||||
|
snprintf(errbuf, TCPConnection_ErrorBufferSize, "TCPConnection::Connect(): connect() failed. Error: %s", strerror(errno));
|
||||||
|
close(connection_socket);
|
||||||
|
connection_socket = 0;
|
||||||
|
SetState(TCPS_Ready);
|
||||||
|
SetAsyncConnect(false);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
int bufsize = 64 * 1024; // 64kbyte recieve buffer, up from default of 8k
|
||||||
|
setsockopt(connection_socket, SOL_SOCKET, SO_RCVBUF, (char*) &bufsize, sizeof(bufsize));
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
unsigned long nonblocking = 1;
|
||||||
|
ioctlsocket(connection_socket, FIONBIO, &nonblocking);
|
||||||
|
#else
|
||||||
|
fcntl(connection_socket, F_SETFL, O_NONBLOCK);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
SetEcho(false);
|
||||||
|
ClearBuffers();
|
||||||
|
|
||||||
|
rIP = in_ip;
|
||||||
|
rPort = in_port;
|
||||||
|
SetState(TCPS_Connected);
|
||||||
|
SetAsyncConnect(false);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPConnection::ClearBuffers() {
|
||||||
|
LockMutex lock1(&MSendQueue);
|
||||||
|
LockMutex lock3(&MRunLoop);
|
||||||
|
LockMutex lock4(&MState);
|
||||||
|
safe_delete_array(recvbuf);
|
||||||
|
safe_delete_array(sendbuf);
|
||||||
|
|
||||||
|
char* line = 0;
|
||||||
|
while ((line = LineOutQueue.pop()))
|
||||||
|
safe_delete_array(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TCPConnection::CheckNetActive() {
|
||||||
|
MState.lock();
|
||||||
|
if (pState == TCPS_Connected || pState == TCPS_Disconnecting) {
|
||||||
|
MState.unlock();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
MState.unlock();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is always called from an IO thread. Either the server socket's thread, or a
|
||||||
|
* special thread we create when we make an outbound connection. */
|
||||||
|
bool TCPConnection::Process() {
|
||||||
|
char errbuf[TCPConnection_ErrorBufferSize];
|
||||||
|
switch(GetState()) {
|
||||||
|
case TCPS_Ready:
|
||||||
|
case TCPS_Connecting:
|
||||||
|
if (ConnectionType == Outgoing) {
|
||||||
|
if (GetAsyncConnect()) {
|
||||||
|
if (charAsyncConnect)
|
||||||
|
rIP = ResolveIP(charAsyncConnect);
|
||||||
|
ConnectIP(rIP, rPort);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(true);
|
||||||
|
|
||||||
|
case TCPS_Connected:
|
||||||
|
// only receive data in the connected state, no others...
|
||||||
|
if (!RecvData(errbuf)) {
|
||||||
|
struct in_addr in;
|
||||||
|
in.s_addr = GetrIP();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
/* we break to do the send */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TCPS_Disconnecting: {
|
||||||
|
//waiting for any sending data to go out...
|
||||||
|
MSendQueue.lock();
|
||||||
|
if(sendbuf) {
|
||||||
|
if(sendbuf_used > 0) {
|
||||||
|
//something left to send, keep processing...
|
||||||
|
MSendQueue.unlock();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
//else, send buffer is empty.
|
||||||
|
safe_delete_array(sendbuf);
|
||||||
|
} //else, no send buffer, we are done.
|
||||||
|
MSendQueue.unlock();
|
||||||
|
}
|
||||||
|
/* Fallthrough */
|
||||||
|
|
||||||
|
case TCPS_Disconnected:
|
||||||
|
FinishDisconnect();
|
||||||
|
MRunLoop.lock();
|
||||||
|
pRunLoop = false;
|
||||||
|
MRunLoop.unlock();
|
||||||
|
// SetState(TCPS_Ready); //reset the state in case they want to use it again...
|
||||||
|
return(false);
|
||||||
|
|
||||||
|
case TCPS_Closing:
|
||||||
|
//I dont understand this state...
|
||||||
|
|
||||||
|
case TCPS_Error:
|
||||||
|
MRunLoop.lock();
|
||||||
|
pRunLoop = false;
|
||||||
|
MRunLoop.unlock();
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* we get here in connected or disconnecting with more data to send */
|
||||||
|
|
||||||
|
bool sent_something = false;
|
||||||
|
if (!SendData(sent_something, errbuf)) {
|
||||||
|
struct in_addr in;
|
||||||
|
in.s_addr = GetrIP();
|
||||||
|
std::cout << inet_ntoa(in) << ":" << GetrPort() << ": " << errbuf << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TCPConnection::RecvData(char* errbuf) {
|
||||||
|
if (errbuf)
|
||||||
|
errbuf[0] = 0;
|
||||||
|
if (!Connected()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int status = 0;
|
||||||
|
if (recvbuf == 0) {
|
||||||
|
recvbuf = new uchar[5120];
|
||||||
|
recvbuf_size = 5120;
|
||||||
|
recvbuf_used = 0;
|
||||||
|
recvbuf_echo = 0;
|
||||||
|
}
|
||||||
|
else if ((recvbuf_size - recvbuf_used) < 2048) {
|
||||||
|
auto tmpbuf = new uchar[recvbuf_size + 5120];
|
||||||
|
memcpy(tmpbuf, recvbuf, recvbuf_used);
|
||||||
|
recvbuf_size += 5120;
|
||||||
|
safe_delete_array(recvbuf);
|
||||||
|
recvbuf = tmpbuf;
|
||||||
|
if (recvbuf_size >= MaxTCPReceiveBuffferSize) {
|
||||||
|
if (errbuf)
|
||||||
|
snprintf(errbuf, TCPConnection_ErrorBufferSize, "TCPConnection::RecvData(): recvbuf_size >= MaxTCPReceiveBuffferSize");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
status = recv(connection_socket, (char *) &recvbuf[recvbuf_used], (recvbuf_size - recvbuf_used), 0);
|
||||||
|
|
||||||
|
if (status >= 1) {
|
||||||
|
#if TCPN_LOG_RAW_DATA_IN >= 1
|
||||||
|
struct in_addr in;
|
||||||
|
in.s_addr = GetrIP();
|
||||||
|
CoutTimestamp(true);
|
||||||
|
std::cout << ": Read " << status << " bytes from network. (recvbuf_used = " << recvbuf_used << ") " << inet_ntoa(in) << ":" << GetrPort();
|
||||||
|
std::cout << std::endl;
|
||||||
|
#if TCPN_LOG_RAW_DATA_IN == 2
|
||||||
|
int32 tmp = status;
|
||||||
|
if (tmp > 32)
|
||||||
|
tmp = 32;
|
||||||
|
DumpPacket(&recvbuf[recvbuf_used], status);
|
||||||
|
#elif TCPN_LOG_RAW_DATA_IN >= 3
|
||||||
|
DumpPacket(&recvbuf[recvbuf_used], status);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
recvbuf_used += status;
|
||||||
|
if (!ProcessReceivedData(errbuf))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (status == SOCKET_ERROR) {
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
if (!(WSAGetLastError() == WSAEWOULDBLOCK)) {
|
||||||
|
if (errbuf)
|
||||||
|
snprintf(errbuf, TCPConnection_ErrorBufferSize, "TCPConnection::RecvData(): Error: %i", WSAGetLastError());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (!(errno == EWOULDBLOCK)) {
|
||||||
|
if (errbuf)
|
||||||
|
snprintf(errbuf, TCPConnection_ErrorBufferSize, "TCPConnection::RecvData(): Error: %s", strerror(errno));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
} else if (status == 0) {
|
||||||
|
snprintf(errbuf, TCPConnection_ErrorBufferSize, "TCPConnection::RecvData(): Connection closed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool TCPConnection::GetEcho() {
|
||||||
|
bool ret;
|
||||||
|
ret = pEcho;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPConnection::SetEcho(bool iValue) {
|
||||||
|
pEcho = iValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TCPConnection::ProcessReceivedData(char* errbuf) {
|
||||||
|
if (errbuf)
|
||||||
|
errbuf[0] = 0;
|
||||||
|
if (!recvbuf)
|
||||||
|
return true;
|
||||||
|
#if TCPN_DEBUG_Console >= 4
|
||||||
|
if (recvbuf_used) {
|
||||||
|
std::cout << "Starting Processing: recvbuf=" << recvbuf_used << std::endl;
|
||||||
|
DumpPacket(recvbuf, recvbuf_used);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
for (int i=0; i < recvbuf_used; i++) {
|
||||||
|
if (GetEcho() && i >= recvbuf_echo) {
|
||||||
|
Send(&recvbuf[i], 1);
|
||||||
|
recvbuf_echo = i + 1;
|
||||||
|
}
|
||||||
|
switch(recvbuf[i]) {
|
||||||
|
case 0: { // 0 is the code for clear buffer
|
||||||
|
if (i==0) {
|
||||||
|
recvbuf_used--;
|
||||||
|
recvbuf_echo--;
|
||||||
|
memmove(recvbuf, &recvbuf[1], recvbuf_used);
|
||||||
|
i = -1;
|
||||||
|
} else {
|
||||||
|
if (i == recvbuf_used) {
|
||||||
|
safe_delete_array(recvbuf);
|
||||||
|
i = -1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
uchar* tmpdel = recvbuf;
|
||||||
|
recvbuf = new uchar[recvbuf_size];
|
||||||
|
memcpy(recvbuf, &tmpdel[i+1], recvbuf_used-i);
|
||||||
|
recvbuf_used -= i + 1;
|
||||||
|
recvbuf_echo -= i + 1;
|
||||||
|
safe_delete_array(tmpdel);
|
||||||
|
i = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#if TCPN_DEBUG_Console >= 5
|
||||||
|
std::cout << "Removed 0x00" << std::endl;
|
||||||
|
if (recvbuf_used) {
|
||||||
|
std::cout << "recvbuf left: " << recvbuf_used << std::endl;
|
||||||
|
DumpPacket(recvbuf, recvbuf_used);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
std::cout << "recbuf left: None" << std::endl;
|
||||||
|
#endif
|
||||||
|
m_previousLineEnd = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 10:
|
||||||
|
case 13: // newline marker
|
||||||
|
{
|
||||||
|
char *line = nullptr;
|
||||||
|
if (i==0) { // empty line
|
||||||
|
if(!m_previousLineEnd) {
|
||||||
|
//char right before this was NOT a CR, report the empty line.
|
||||||
|
line = new char[1];
|
||||||
|
line[0] = '\0';
|
||||||
|
m_previousLineEnd = true;
|
||||||
|
} else {
|
||||||
|
m_previousLineEnd = false;
|
||||||
|
}
|
||||||
|
recvbuf_used--;
|
||||||
|
recvbuf_echo--;
|
||||||
|
memcpy(recvbuf, &recvbuf[1], recvbuf_used);
|
||||||
|
i = -1;
|
||||||
|
} else {
|
||||||
|
line = new char[i+1];
|
||||||
|
memset(line, 0, i+1);
|
||||||
|
memcpy(line, recvbuf, i);
|
||||||
|
#if TCPN_DEBUG_Console >= 3
|
||||||
|
std::cout << "Line Out: " << std::endl;
|
||||||
|
DumpPacket((uchar*) line, i);
|
||||||
|
#endif
|
||||||
|
//line[i] = 0;
|
||||||
|
uchar* tmpdel = recvbuf;
|
||||||
|
recvbuf = new uchar[recvbuf_size];
|
||||||
|
recvbuf_used -= i+1;
|
||||||
|
recvbuf_echo -= i+1;
|
||||||
|
memcpy(recvbuf, &tmpdel[i+1], recvbuf_used);
|
||||||
|
#if TCPN_DEBUG_Console >= 5
|
||||||
|
std::cout << "i+1=" << i+1 << std::endl;
|
||||||
|
if (recvbuf_used) {
|
||||||
|
std::cout << "recvbuf left: " << recvbuf_used << std::endl;
|
||||||
|
DumpPacket(recvbuf, recvbuf_used);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
std::cout << "recbuf left: None" << std::endl;
|
||||||
|
#endif
|
||||||
|
safe_delete_array(tmpdel);
|
||||||
|
i = -1;
|
||||||
|
m_previousLineEnd = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(line != nullptr) {
|
||||||
|
bool finish_proc = false;
|
||||||
|
finish_proc = LineOutQueuePush(line);
|
||||||
|
if(finish_proc)
|
||||||
|
return(true); //break early as requested by LineOutQueuePush
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 8: // backspace
|
||||||
|
{
|
||||||
|
if (i==0) { // nothin to backspace
|
||||||
|
recvbuf_used--;
|
||||||
|
recvbuf_echo--;
|
||||||
|
memmove(recvbuf, &recvbuf[1], recvbuf_used);
|
||||||
|
i = -1;
|
||||||
|
} else {
|
||||||
|
uchar* tmpdel = recvbuf;
|
||||||
|
recvbuf = new uchar[recvbuf_size];
|
||||||
|
memcpy(recvbuf, tmpdel, i-1);
|
||||||
|
memcpy(&recvbuf[i-1], &tmpdel[i+1], recvbuf_used-i);
|
||||||
|
recvbuf_used -= 2;
|
||||||
|
recvbuf_echo -= 2;
|
||||||
|
safe_delete_array(tmpdel);
|
||||||
|
i -= 2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
m_previousLineEnd = false;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
m_previousLineEnd = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (recvbuf_used < 0)
|
||||||
|
safe_delete_array(recvbuf);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TCPConnection::SendData(bool &sent_something, char* errbuf) {
|
||||||
|
if (errbuf)
|
||||||
|
errbuf[0] = 0;
|
||||||
|
/************ Get first send packet on queue and send it! ************/
|
||||||
|
uchar* data = 0;
|
||||||
|
int32 size = 0;
|
||||||
|
int status = 0;
|
||||||
|
if (ServerSendQueuePop(&data, &size)) {
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
status = send(connection_socket, (const char *) data, size, 0);
|
||||||
|
#else
|
||||||
|
status = send(connection_socket, data, size, MSG_NOSIGNAL);
|
||||||
|
if(errno==EPIPE) status = SOCKET_ERROR;
|
||||||
|
#endif
|
||||||
|
if (status >= 1) {
|
||||||
|
#if TCPN_LOG_RAW_DATA_OUT >= 1
|
||||||
|
struct in_addr in;
|
||||||
|
in.s_addr = GetrIP();
|
||||||
|
CoutTimestamp(true);
|
||||||
|
std::cout << ": Wrote " << status << " bytes to network. " << inet_ntoa(in) << ":" << GetrPort();
|
||||||
|
std::cout << std::endl;
|
||||||
|
#if TCPN_LOG_RAW_DATA_OUT == 2
|
||||||
|
int32 tmp = status;
|
||||||
|
if (tmp > 32)
|
||||||
|
tmp = 32;
|
||||||
|
DumpPacket(data, status);
|
||||||
|
#elif TCPN_LOG_RAW_DATA_OUT >= 3
|
||||||
|
DumpPacket(data, status);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
sent_something = true;
|
||||||
|
if (status < (signed)size) {
|
||||||
|
#if TCPN_LOG_RAW_DATA_OUT >= 1
|
||||||
|
struct in_addr in;
|
||||||
|
in.s_addr = GetrIP();
|
||||||
|
CoutTimestamp(true);
|
||||||
|
std::cout << ": Pushed " << (size - status) << " bytes back onto the send queue. " << inet_ntoa(in) << ":" << GetrPort();
|
||||||
|
std::cout << std::endl;
|
||||||
|
#endif
|
||||||
|
// If there's network congestion, the number of bytes sent can be less than
|
||||||
|
// what we tried to give it... Push the extra back on the queue for later
|
||||||
|
ServerSendQueuePushFront(&data[status], size - status);
|
||||||
|
}
|
||||||
|
else if (status > (signed)size) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// else if (status == size) {}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ServerSendQueuePushFront(data, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
safe_delete_array(data);
|
||||||
|
if (status == SOCKET_ERROR) {
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
if (WSAGetLastError() != WSAEWOULDBLOCK)
|
||||||
|
#else
|
||||||
|
if (errno != EWOULDBLOCK)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
if (errbuf) {
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
snprintf(errbuf, TCPConnection_ErrorBufferSize, "TCPConnection::SendData(): send(): Errorcode: %i", WSAGetLastError());
|
||||||
|
#else
|
||||||
|
snprintf(errbuf, TCPConnection_ErrorBufferSize, "TCPConnection::SendData(): send(): Errorcode: %s", strerror(errno));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
//if we get an error while disconnecting, just jump to disconnected
|
||||||
|
MState.lock();
|
||||||
|
if(pState == TCPS_Disconnecting)
|
||||||
|
pState = TCPS_Disconnected;
|
||||||
|
MState.unlock();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ThreadReturnType TCPConnection::TCPConnectionLoop(void* tmp) {
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL);
|
||||||
|
#endif
|
||||||
|
if (tmp == 0) {
|
||||||
|
THREAD_RETURN(nullptr);
|
||||||
|
}
|
||||||
|
TCPConnection* tcpc = (TCPConnection*) tmp;
|
||||||
|
#ifndef WIN32
|
||||||
|
Log(Logs::Detail, Logs::TCP_Connection, "%s Starting TCPConnectionLoop with thread ID %d", __FUNCTION__, pthread_self());
|
||||||
|
#endif
|
||||||
|
tcpc->MLoopRunning.lock();
|
||||||
|
while (tcpc->RunLoop()) {
|
||||||
|
Sleep(LOOP_GRANULARITY);
|
||||||
|
if (!tcpc->ConnectReady()) {
|
||||||
|
if (!tcpc->Process()) {
|
||||||
|
//the processing loop has detecting an error..
|
||||||
|
//we want to drop the link immediately, so we clear buffers too.
|
||||||
|
tcpc->ClearBuffers();
|
||||||
|
tcpc->Disconnect();
|
||||||
|
}
|
||||||
|
Sleep(1);
|
||||||
|
}
|
||||||
|
else if (tcpc->GetAsyncConnect()) {
|
||||||
|
if (tcpc->charAsyncConnect)
|
||||||
|
tcpc->Connect(tcpc->charAsyncConnect, tcpc->GetrPort());
|
||||||
|
else
|
||||||
|
tcpc->ConnectIP(tcpc->GetrIP(), tcpc->GetrPort());
|
||||||
|
tcpc->SetAsyncConnect(false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Sleep(10); //nothing to do.
|
||||||
|
}
|
||||||
|
tcpc->MLoopRunning.unlock();
|
||||||
|
|
||||||
|
#ifndef WIN32
|
||||||
|
Log(Logs::Detail, Logs::TCP_Connection, "%s Ending TCPConnectionLoop with thread ID %d", __FUNCTION__, pthread_self());
|
||||||
|
#endif
|
||||||
|
|
||||||
|
THREAD_RETURN(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TCPConnection::RunLoop() {
|
||||||
|
bool ret;
|
||||||
|
MRunLoop.lock();
|
||||||
|
ret = pRunLoop;
|
||||||
|
MRunLoop.unlock();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
231
common/tcp_server.cpp
Normal file
231
common/tcp_server.cpp
Normal file
@ -0,0 +1,231 @@
|
|||||||
|
#include "global_define.h"
|
||||||
|
#include "tcp_server.h"
|
||||||
|
#include "../common/eqemu_logsys.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
#include <process.h>
|
||||||
|
#else
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#define INVALID_SOCKET -1
|
||||||
|
#define SOCKET_ERROR -1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SERVER_LOOP_GRANULARITY 3 //# of ms between checking our socket/queues
|
||||||
|
|
||||||
|
BaseTCPServer::BaseTCPServer(uint16 in_port) {
|
||||||
|
NextID = 1;
|
||||||
|
pPort = in_port;
|
||||||
|
sock = 0;
|
||||||
|
pRunLoop = true;
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
_beginthread(BaseTCPServer::TCPServerLoop, 0, this);
|
||||||
|
#else
|
||||||
|
pthread_t thread;
|
||||||
|
pthread_create(&thread, nullptr, &BaseTCPServer::TCPServerLoop, this);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
BaseTCPServer::~BaseTCPServer() {
|
||||||
|
StopLoopAndWait();
|
||||||
|
}
|
||||||
|
|
||||||
|
void BaseTCPServer::StopLoopAndWait() {
|
||||||
|
MRunLoop.lock();
|
||||||
|
if(pRunLoop) {
|
||||||
|
pRunLoop = false;
|
||||||
|
MRunLoop.unlock();
|
||||||
|
//wait for loop to stop.
|
||||||
|
MLoopRunning.lock();
|
||||||
|
MLoopRunning.unlock();
|
||||||
|
} else {
|
||||||
|
MRunLoop.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BaseTCPServer::RunLoop() {
|
||||||
|
bool ret;
|
||||||
|
MRunLoop.lock();
|
||||||
|
ret = pRunLoop;
|
||||||
|
MRunLoop.unlock();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ThreadReturnType BaseTCPServer::TCPServerLoop(void* tmp) {
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL);
|
||||||
|
#endif
|
||||||
|
if (tmp == 0) {
|
||||||
|
THREAD_RETURN(nullptr);
|
||||||
|
}
|
||||||
|
BaseTCPServer* tcps = (BaseTCPServer*) tmp;
|
||||||
|
|
||||||
|
#ifndef WIN32
|
||||||
|
Log(Logs::Detail, Logs::None, "Starting TCPServerLoop with thread ID %d", pthread_self());
|
||||||
|
#endif
|
||||||
|
|
||||||
|
tcps->MLoopRunning.lock();
|
||||||
|
while (tcps->RunLoop()) {
|
||||||
|
Sleep(SERVER_LOOP_GRANULARITY);
|
||||||
|
tcps->Process();
|
||||||
|
}
|
||||||
|
tcps->MLoopRunning.unlock();
|
||||||
|
|
||||||
|
#ifndef WIN32
|
||||||
|
Log(Logs::Detail, Logs::None, "Ending TCPServerLoop with thread ID %d", pthread_self());
|
||||||
|
#endif
|
||||||
|
|
||||||
|
THREAD_RETURN(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BaseTCPServer::Process() {
|
||||||
|
ListenNewConnections();
|
||||||
|
}
|
||||||
|
|
||||||
|
void BaseTCPServer::ListenNewConnections() {
|
||||||
|
SOCKET tmpsock;
|
||||||
|
struct sockaddr_in from;
|
||||||
|
struct in_addr in;
|
||||||
|
unsigned int fromlen;
|
||||||
|
unsigned short port;
|
||||||
|
|
||||||
|
from.sin_family = AF_INET;
|
||||||
|
fromlen = sizeof(from);
|
||||||
|
LockMutex lock(&MSock);
|
||||||
|
#ifndef DARWIN // Corysia - On OSX, 0 is a valid fd.
|
||||||
|
if (!sock)
|
||||||
|
return;
|
||||||
|
#else
|
||||||
|
if (sock == -1) return;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Check for pending connects
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
unsigned long nonblocking = 1;
|
||||||
|
while ((tmpsock = accept(sock, (struct sockaddr*) &from, (int *) &fromlen)) != INVALID_SOCKET) {
|
||||||
|
ioctlsocket (tmpsock, FIONBIO, &nonblocking);
|
||||||
|
#else
|
||||||
|
#ifdef __CYGWIN__
|
||||||
|
while ((tmpsock = accept(sock, (struct sockaddr *) &from, (int *) &fromlen)) != INVALID_SOCKET) {
|
||||||
|
#else
|
||||||
|
while ((tmpsock = accept(sock, (struct sockaddr*) &from, &fromlen)) != INVALID_SOCKET) {
|
||||||
|
#endif
|
||||||
|
fcntl(tmpsock, F_SETFL, O_NONBLOCK);
|
||||||
|
#endif
|
||||||
|
int bufsize = 64 * 1024; // 64kbyte recieve buffer, up from default of 8k
|
||||||
|
setsockopt(tmpsock, SOL_SOCKET, SO_RCVBUF, (char*) &bufsize, sizeof(bufsize));
|
||||||
|
port = from.sin_port;
|
||||||
|
in.s_addr = from.sin_addr.s_addr;
|
||||||
|
|
||||||
|
// New TCP connection, this must consume the socket.
|
||||||
|
CreateNewConnection(GetNextID(), tmpsock, in.s_addr, ntohs(from.sin_port));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BaseTCPServer::Open(uint16 in_port, char* errbuf) {
|
||||||
|
if (errbuf)
|
||||||
|
errbuf[0] = 0;
|
||||||
|
LockMutex lock(&MSock);
|
||||||
|
if (sock != 0) {
|
||||||
|
if (errbuf)
|
||||||
|
snprintf(errbuf, TCPServer_ErrorBufferSize, "Listening socket already open");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (in_port != 0) {
|
||||||
|
pPort = in_port;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
SOCKADDR_IN address;
|
||||||
|
unsigned long nonblocking = 1;
|
||||||
|
#else
|
||||||
|
struct sockaddr_in address;
|
||||||
|
#endif
|
||||||
|
int reuse_addr = 1;
|
||||||
|
|
||||||
|
// Setup internet address information.
|
||||||
|
// This is used with the bind() call
|
||||||
|
memset((char *) &address, 0, sizeof(address));
|
||||||
|
address.sin_family = AF_INET;
|
||||||
|
address.sin_port = htons(pPort);
|
||||||
|
address.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||||
|
|
||||||
|
// Setting up TCP port for new TCP connections
|
||||||
|
sock = socket(AF_INET, SOCK_STREAM, 0);
|
||||||
|
if (sock == INVALID_SOCKET) {
|
||||||
|
if (errbuf)
|
||||||
|
snprintf(errbuf, TCPServer_ErrorBufferSize, "socket(): INVALID_SOCKET");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Quag: dont think following is good stuff for TCP, good for UDP
|
||||||
|
// Mis: SO_REUSEADDR shouldn't be a problem for tcp--allows you to restart
|
||||||
|
// without waiting for conns in TIME_WAIT to die
|
||||||
|
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &reuse_addr, sizeof(reuse_addr));
|
||||||
|
|
||||||
|
|
||||||
|
if (bind(sock, (struct sockaddr *) &address, sizeof(address)) < 0) {
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
closesocket(sock);
|
||||||
|
#else
|
||||||
|
close(sock);
|
||||||
|
#endif
|
||||||
|
sock = 0;
|
||||||
|
if (errbuf)
|
||||||
|
sprintf(errbuf, "bind(): <0");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int bufsize = 64 * 1024; // 64kbyte recieve buffer, up from default of 8k
|
||||||
|
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char*) &bufsize, sizeof(bufsize));
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
ioctlsocket (sock, FIONBIO, &nonblocking);
|
||||||
|
#else
|
||||||
|
fcntl(sock, F_SETFL, O_NONBLOCK);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (listen(sock, SOMAXCONN) == SOCKET_ERROR) {
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
closesocket(sock);
|
||||||
|
if (errbuf)
|
||||||
|
snprintf(errbuf, TCPServer_ErrorBufferSize, "listen() failed, Error: %d", WSAGetLastError());
|
||||||
|
#else
|
||||||
|
close(sock);
|
||||||
|
if (errbuf)
|
||||||
|
snprintf(errbuf, TCPServer_ErrorBufferSize, "listen() failed, Error: %s", strerror(errno));
|
||||||
|
#endif
|
||||||
|
sock = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BaseTCPServer::Close() {
|
||||||
|
StopLoopAndWait();
|
||||||
|
|
||||||
|
LockMutex lock(&MSock);
|
||||||
|
if (sock) {
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
closesocket(sock);
|
||||||
|
#else
|
||||||
|
close(sock);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
sock = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BaseTCPServer::IsOpen() {
|
||||||
|
MSock.lock();
|
||||||
|
bool ret = (bool) (sock != 0);
|
||||||
|
MSock.unlock();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ void TimeoutManager::CheckTimeouts() {
|
|||||||
Timeoutable *it = *cur;
|
Timeoutable *it = *cur;
|
||||||
if(it->next_check.Check()) {
|
if(it->next_check.Check()) {
|
||||||
#ifdef TIMEOUT_DEBUG
|
#ifdef TIMEOUT_DEBUG
|
||||||
Log.Out(Logs::General, Logs::None,, "Checking timeout on 0x%x\n", it);
|
Log(Logs::General, Logs::None,, "Checking timeout on 0x%x\n", it);
|
||||||
#endif
|
#endif
|
||||||
it->CheckTimeout();
|
it->CheckTimeout();
|
||||||
}
|
}
|
||||||
@ -58,13 +58,13 @@ void TimeoutManager::AddMember(Timeoutable *who) {
|
|||||||
DeleteMember(who); //just in case... prolly not needed.
|
DeleteMember(who); //just in case... prolly not needed.
|
||||||
members.push_back(who);
|
members.push_back(who);
|
||||||
#ifdef TIMEOUT_DEBUG
|
#ifdef TIMEOUT_DEBUG
|
||||||
Log.Out(Logs::General, Logs::None,, "Adding timeoutable 0x%x\n", who);
|
Log(Logs::General, Logs::None,, "Adding timeoutable 0x%x\n", who);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void TimeoutManager::DeleteMember(Timeoutable *who) {
|
void TimeoutManager::DeleteMember(Timeoutable *who) {
|
||||||
#ifdef TIMEOUT_DEBUG
|
#ifdef TIMEOUT_DEBUG
|
||||||
Log.Out(Logs::General, Logs::None,, "Removing timeoutable 0x%x\n", who);
|
Log(Logs::General, Logs::None,, "Removing timeoutable 0x%x\n", who);
|
||||||
#endif
|
#endif
|
||||||
std::vector<Timeoutable *>::iterator cur,end;
|
std::vector<Timeoutable *>::iterator cur,end;
|
||||||
cur = members.begin();
|
cur = members.begin();
|
||||||
|
|||||||
87
common/worldconn.cpp
Normal file
87
common/worldconn.cpp
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
/* EQEMu: Everquest Server Emulator
|
||||||
|
Copyright (C) 2001-2006 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 "../common/global_define.h"
|
||||||
|
#include "../common/eqemu_logsys.h"
|
||||||
|
#include <iomanip>
|
||||||
|
|
||||||
|
#include "worldconn.h"
|
||||||
|
#include "eqemu_config.h"
|
||||||
|
#include "md5.h"
|
||||||
|
#include "servertalk.h"
|
||||||
|
|
||||||
|
WorldConnection::WorldConnection(EmuTCPConnection::ePacketMode mode, const char *password)
|
||||||
|
: m_password(password)
|
||||||
|
{
|
||||||
|
tcpc.SetPacketMode(mode);
|
||||||
|
pTryReconnect = true;
|
||||||
|
pConnected = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
WorldConnection::~WorldConnection() {
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WorldConnection::SendPacket(ServerPacket* pack) {
|
||||||
|
if (!Connected())
|
||||||
|
return false;
|
||||||
|
return tcpc.SendPacket(pack);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WorldConnection::OnConnected() {
|
||||||
|
const EQEmuConfig *Config=EQEmuConfig::get();
|
||||||
|
Log(Logs::General, Logs::Netcode, "[WORLD] Connected to World: %s:%d", Config->WorldIP.c_str(), Config->WorldTCPPort);
|
||||||
|
|
||||||
|
auto pack = new ServerPacket(ServerOP_ZAAuth, 16);
|
||||||
|
MD5::Generate((const uchar*) m_password.c_str(), m_password.length(), pack->pBuffer);
|
||||||
|
SendPacket(pack);
|
||||||
|
safe_delete(pack);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WorldConnection::Process() {
|
||||||
|
//persistent connection....
|
||||||
|
if (!Connected()) {
|
||||||
|
pConnected = tcpc.Connected();
|
||||||
|
if (pConnected) {
|
||||||
|
OnConnected();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void WorldConnection::AsyncConnect() {
|
||||||
|
const EQEmuConfig *Config=EQEmuConfig::get();
|
||||||
|
tcpc.AsyncConnect(Config->WorldIP.c_str(), Config->WorldTCPPort);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WorldConnection::Connect() {
|
||||||
|
const EQEmuConfig *Config=EQEmuConfig::get();
|
||||||
|
char errbuf[TCPConnection_ErrorBufferSize];
|
||||||
|
if (tcpc.Connect(Config->WorldIP.c_str(), Config->WorldTCPPort, errbuf)) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
Log(Logs::General, Logs::Netcode, "[WORLD] WorldConnection connect: Connecting to the server %s:%d failed: %s", Config->WorldIP.c_str(), Config->WorldTCPPort, errbuf);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WorldConnection::Disconnect() {
|
||||||
|
tcpc.Disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
@ -31,11 +31,7 @@
|
|||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#ifndef _WINDOWS
|
EQEmuLogSys LogSys;
|
||||||
#include "../common/unix.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
EQEmuLogSys Log;
|
|
||||||
|
|
||||||
bool RunLoops = false;
|
bool RunLoops = false;
|
||||||
|
|
||||||
@ -43,7 +39,7 @@ void CatchSignal(int sig_num);
|
|||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
RegisterExecutablePlatform(ExePlatformLaunch);
|
RegisterExecutablePlatform(ExePlatformLaunch);
|
||||||
Log.LoadLogSettingsDefaults();
|
LogSys.LoadLogSettingsDefaults();
|
||||||
set_exception_handler();
|
set_exception_handler();
|
||||||
|
|
||||||
std::string launcher_name;
|
std::string launcher_name;
|
||||||
@ -51,13 +47,13 @@ int main(int argc, char *argv[]) {
|
|||||||
launcher_name = argv[1];
|
launcher_name = argv[1];
|
||||||
}
|
}
|
||||||
if(launcher_name.length() < 1) {
|
if(launcher_name.length() < 1) {
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "You must specfify a launcher name as the first argument to this program.");
|
Log(Logs::Detail, Logs::Launcher, "You must specfify a launcher name as the first argument to this program.");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Loading server configuration..");
|
Log(Logs::Detail, Logs::Launcher, "Loading server configuration..");
|
||||||
if (!EQEmuConfig::LoadConfig()) {
|
if (!EQEmuConfig::LoadConfig()) {
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Loading server configuration failed.");
|
Log(Logs::Detail, Logs::Launcher, "Loading server configuration failed.");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
auto Config = EQEmuConfig::get();
|
auto Config = EQEmuConfig::get();
|
||||||
@ -66,16 +62,16 @@ int main(int argc, char *argv[]) {
|
|||||||
* Setup nice signal handlers
|
* Setup nice signal handlers
|
||||||
*/
|
*/
|
||||||
if (signal(SIGINT, CatchSignal) == SIG_ERR) {
|
if (signal(SIGINT, CatchSignal) == SIG_ERR) {
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Could not set signal handler");
|
Log(Logs::Detail, Logs::Launcher, "Could not set signal handler");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (signal(SIGTERM, CatchSignal) == SIG_ERR) {
|
if (signal(SIGTERM, CatchSignal) == SIG_ERR) {
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Could not set signal handler");
|
Log(Logs::Detail, Logs::Launcher, "Could not set signal handler");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
|
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Could not set signal handler");
|
Log(Logs::Detail, Logs::Launcher, "Could not set signal handler");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,7 +97,7 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
Timer InterserverTimer(INTERSERVER_TIMER); // does auto-reconnect
|
Timer InterserverTimer(INTERSERVER_TIMER); // does auto-reconnect
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Starting main loop...");
|
Log(Logs::Detail, Logs::Launcher, "Starting main loop...");
|
||||||
|
|
||||||
ProcLauncher *launch = ProcLauncher::get();
|
ProcLauncher *launch = ProcLauncher::get();
|
||||||
RunLoops = true;
|
RunLoops = true;
|
||||||
@ -160,14 +156,14 @@ int main(int argc, char *argv[]) {
|
|||||||
delete zone->second;
|
delete zone->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.CloseFileLogs();
|
LogSys.CloseFileLogs();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CatchSignal(int sig_num) {
|
void CatchSignal(int sig_num) {
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Caught signal %d", sig_num);
|
Log(Logs::Detail, Logs::Launcher, "Caught signal %d", sig_num);
|
||||||
RunLoops = false;
|
RunLoops = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,19 +1,19 @@
|
|||||||
/* EQEMu: Everquest Server Emulator
|
/* EQEMu: Everquest Server Emulator
|
||||||
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
|
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; version 2 of the License.
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
are required to give you total support for your newly bought product;
|
are required to give you total support for your newly bought product;
|
||||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
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"
|
||||||
@ -25,7 +25,7 @@
|
|||||||
#include "zone_launch.h"
|
#include "zone_launch.h"
|
||||||
|
|
||||||
WorldServer::WorldServer(std::map<std::string, ZoneLaunch *> &zones, const char *name, const EQEmuConfig *config)
|
WorldServer::WorldServer(std::map<std::string, ZoneLaunch *> &zones, const char *name, const EQEmuConfig *config)
|
||||||
: m_name(name),
|
: m_name(name),
|
||||||
m_config(config),
|
m_config(config),
|
||||||
m_zones(zones)
|
m_zones(zones)
|
||||||
{
|
{
|
||||||
@ -43,7 +43,7 @@ WorldServer::~WorldServer() {
|
|||||||
void WorldServer::OnConnected() {
|
void WorldServer::OnConnected() {
|
||||||
|
|
||||||
auto pack = new ServerPacket(ServerOP_LauncherConnectInfo, sizeof(LauncherConnectInfo));
|
auto pack = new ServerPacket(ServerOP_LauncherConnectInfo, sizeof(LauncherConnectInfo));
|
||||||
LauncherConnectInfo* sci = (LauncherConnectInfo*) pack->pBuffer;
|
LauncherConnectInfo* sci = (LauncherConnectInfo*)pack->pBuffer;
|
||||||
strn0cpy(sci->name, m_name, sizeof(sci->name));
|
strn0cpy(sci->name, m_name, sizeof(sci->name));
|
||||||
m_connection->SendPacket(pack);
|
m_connection->SendPacket(pack);
|
||||||
safe_delete(pack);
|
safe_delete(pack);
|
||||||
@ -52,7 +52,7 @@ void WorldServer::OnConnected() {
|
|||||||
std::map<std::string, ZoneLaunch *>::iterator cur, end;
|
std::map<std::string, ZoneLaunch *>::iterator cur, end;
|
||||||
cur = m_zones.begin();
|
cur = m_zones.begin();
|
||||||
end = m_zones.end();
|
end = m_zones.end();
|
||||||
for(; cur != end; ++cur) {
|
for (; cur != end; ++cur) {
|
||||||
cur->second->SendStatus();
|
cur->second->SendStatus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -61,7 +61,7 @@ void WorldServer::HandleMessage(uint16 opcode, EQ::Net::Packet &p) {
|
|||||||
ServerPacket tpack(opcode, p);
|
ServerPacket tpack(opcode, p);
|
||||||
ServerPacket *pack = &tpack;
|
ServerPacket *pack = &tpack;
|
||||||
|
|
||||||
switch(opcode) {
|
switch (opcode) {
|
||||||
case 0: {
|
case 0: {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -71,18 +71,19 @@ void WorldServer::HandleMessage(uint16 opcode, EQ::Net::Packet &p) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ServerOP_LauncherZoneRequest: {
|
case ServerOP_LauncherZoneRequest: {
|
||||||
if(pack->size != sizeof(LauncherZoneRequest)) {
|
if (pack->size != sizeof(LauncherZoneRequest)) {
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Invalid size of LauncherZoneRequest: %d", pack->size);
|
Log(Logs::Detail, Logs::Launcher, "Invalid size of LauncherZoneRequest: %d", pack->size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
const LauncherZoneRequest *lzr = (const LauncherZoneRequest *) pack->pBuffer;
|
const LauncherZoneRequest *lzr = (const LauncherZoneRequest *)pack->pBuffer;
|
||||||
|
|
||||||
switch(ZoneRequestCommands(lzr->command)) {
|
switch (ZoneRequestCommands(lzr->command)) {
|
||||||
case ZR_Start: {
|
case ZR_Start: {
|
||||||
if(m_zones.find(lzr->short_name) != m_zones.end()) {
|
if (m_zones.find(lzr->short_name) != m_zones.end()) {
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "World told us to start zone %s, but it is already running.", lzr->short_name);
|
Log(Logs::Detail, Logs::Launcher, "World told us to start zone %s, but it is already running.", lzr->short_name);
|
||||||
} else {
|
}
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "World told us to start zone %s.", lzr->short_name);
|
else {
|
||||||
|
Log(Logs::Detail, Logs::Launcher, "World told us to start zone %s.", lzr->short_name);
|
||||||
auto l = new ZoneLaunch(this, m_name, lzr->short_name, lzr->port, m_config);
|
auto l = new ZoneLaunch(this, m_name, lzr->short_name, lzr->port, m_config);
|
||||||
m_zones[lzr->short_name] = l;
|
m_zones[lzr->short_name] = l;
|
||||||
}
|
}
|
||||||
@ -90,20 +91,22 @@ void WorldServer::HandleMessage(uint16 opcode, EQ::Net::Packet &p) {
|
|||||||
}
|
}
|
||||||
case ZR_Restart: {
|
case ZR_Restart: {
|
||||||
auto res = m_zones.find(lzr->short_name);
|
auto res = m_zones.find(lzr->short_name);
|
||||||
if(res == m_zones.end()) {
|
if (res == m_zones.end()) {
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "World told us to restart zone %s, but it is not running.", lzr->short_name);
|
Log(Logs::Detail, Logs::Launcher, "World told us to restart zone %s, but it is not running.", lzr->short_name);
|
||||||
} else {
|
}
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "World told us to restart zone %s.", lzr->short_name);
|
else {
|
||||||
|
Log(Logs::Detail, Logs::Launcher, "World told us to restart zone %s.", lzr->short_name);
|
||||||
res->second->Restart();
|
res->second->Restart();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ZR_Stop: {
|
case ZR_Stop: {
|
||||||
auto res = m_zones.find(lzr->short_name);
|
auto res = m_zones.find(lzr->short_name);
|
||||||
if(res == m_zones.end()) {
|
if (res == m_zones.end()) {
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "World told us to stop zone %s, but it is not running.", lzr->short_name);
|
Log(Logs::Detail, Logs::Launcher, "World told us to stop zone %s, but it is not running.", lzr->short_name);
|
||||||
} else {
|
}
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "World told us to stop zone %s.", lzr->short_name);
|
else {
|
||||||
|
Log(Logs::Detail, Logs::Launcher, "World told us to stop zone %s.", lzr->short_name);
|
||||||
res->second->Stop();
|
res->second->Stop();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -117,7 +120,7 @@ void WorldServer::HandleMessage(uint16 opcode, EQ::Net::Packet &p) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
default: {
|
default: {
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Unknown opcode 0x%x from World of len %d", pack->opcode, pack->size);
|
Log(Logs::Detail, Logs::Launcher, "Unknown opcode 0x%x from World of len %d", pack->opcode, pack->size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -127,11 +130,11 @@ void WorldServer::HandleMessage(uint16 opcode, EQ::Net::Packet &p) {
|
|||||||
|
|
||||||
void WorldServer::SendStatus(const char *short_name, uint32 start_count, bool running) {
|
void WorldServer::SendStatus(const char *short_name, uint32 start_count, bool running) {
|
||||||
auto pack = new ServerPacket(ServerOP_LauncherZoneStatus, sizeof(LauncherZoneStatus));
|
auto pack = new ServerPacket(ServerOP_LauncherZoneStatus, sizeof(LauncherZoneStatus));
|
||||||
LauncherZoneStatus* it =(LauncherZoneStatus*) pack->pBuffer;
|
LauncherZoneStatus* it = (LauncherZoneStatus*)pack->pBuffer;
|
||||||
|
|
||||||
strn0cpy(it->short_name, short_name, 32);
|
strn0cpy(it->short_name, short_name, 32);
|
||||||
it->start_count = start_count;
|
it->start_count = start_count;
|
||||||
it->running = running?1:0;
|
it->running = running ? 1 : 0;
|
||||||
|
|
||||||
m_connection->SendPacket(pack);
|
m_connection->SendPacket(pack);
|
||||||
safe_delete(pack);
|
safe_delete(pack);
|
||||||
|
|||||||
@ -77,7 +77,7 @@ void ZoneLaunch::Start() {
|
|||||||
//spec is consumed, even on failure
|
//spec is consumed, even on failure
|
||||||
m_ref = ProcLauncher::get()->Launch(spec);
|
m_ref = ProcLauncher::get()->Launch(spec);
|
||||||
if(m_ref == ProcLauncher::ProcError) {
|
if(m_ref == ProcLauncher::ProcError) {
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Failure to launch '%s %s %s'. ", m_config->ZoneExe.c_str(), m_zone.c_str(), m_launcherName);
|
Log(Logs::Detail, Logs::Launcher, "Failure to launch '%s %s %s'. ", m_config->ZoneExe.c_str(), m_zone.c_str(), m_launcherName);
|
||||||
m_timer.Start(m_config->RestartWait);
|
m_timer.Start(m_config->RestartWait);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -89,17 +89,17 @@ void ZoneLaunch::Start() {
|
|||||||
|
|
||||||
SendStatus();
|
SendStatus();
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Zone %s has been started.", m_zone.c_str());
|
Log(Logs::Detail, Logs::Launcher, "Zone %s has been started.", m_zone.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ZoneLaunch::Restart() {
|
void ZoneLaunch::Restart() {
|
||||||
switch(m_state) {
|
switch(m_state) {
|
||||||
case StateRestartPending:
|
case StateRestartPending:
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Restart of zone %s requested when a restart is already pending.", m_zone.c_str());
|
Log(Logs::Detail, Logs::Launcher, "Restart of zone %s requested when a restart is already pending.", m_zone.c_str());
|
||||||
break;
|
break;
|
||||||
case StateStartPending:
|
case StateStartPending:
|
||||||
//we havent started yet, do nothing
|
//we havent started yet, do nothing
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Restart of %s before it has started. Ignoring.", m_zone.c_str());
|
Log(Logs::Detail, Logs::Launcher, "Restart of %s before it has started. Ignoring.", m_zone.c_str());
|
||||||
break;
|
break;
|
||||||
case StateStarted:
|
case StateStarted:
|
||||||
//process is running along, kill it off..
|
//process is running along, kill it off..
|
||||||
@ -107,20 +107,20 @@ void ZoneLaunch::Restart() {
|
|||||||
break; //we have no proc ref... cannot stop..
|
break; //we have no proc ref... cannot stop..
|
||||||
if(!ProcLauncher::get()->Terminate(m_ref, true)) {
|
if(!ProcLauncher::get()->Terminate(m_ref, true)) {
|
||||||
//failed to terminate the process, its not likely that it will work if we try again, so give up.
|
//failed to terminate the process, its not likely that it will work if we try again, so give up.
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Failed to terminate zone %s. Giving up and moving to stopped.", m_zone.c_str());
|
Log(Logs::Detail, Logs::Launcher, "Failed to terminate zone %s. Giving up and moving to stopped.", m_zone.c_str());
|
||||||
m_state = StateStopped;
|
m_state = StateStopped;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Termination signal sent to zone %s.", m_zone.c_str());
|
Log(Logs::Detail, Logs::Launcher, "Termination signal sent to zone %s.", m_zone.c_str());
|
||||||
m_timer.Start(m_config->TerminateWait);
|
m_timer.Start(m_config->TerminateWait);
|
||||||
m_state = StateRestartPending;
|
m_state = StateRestartPending;
|
||||||
break;
|
break;
|
||||||
case StateStopPending:
|
case StateStopPending:
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Restart of zone %s requested when a stop is pending. Ignoring.", m_zone.c_str());
|
Log(Logs::Detail, Logs::Launcher, "Restart of zone %s requested when a stop is pending. Ignoring.", m_zone.c_str());
|
||||||
break;
|
break;
|
||||||
case StateStopped:
|
case StateStopped:
|
||||||
//process is already stopped... nothing to do..
|
//process is already stopped... nothing to do..
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Restart requested when zone %s is already stopped.", m_zone.c_str());
|
Log(Logs::Detail, Logs::Launcher, "Restart requested when zone %s is already stopped.", m_zone.c_str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -129,7 +129,7 @@ void ZoneLaunch::Stop(bool graceful) {
|
|||||||
switch(m_state) {
|
switch(m_state) {
|
||||||
case StateStartPending:
|
case StateStartPending:
|
||||||
//we havent started yet, transition directly to stopped.
|
//we havent started yet, transition directly to stopped.
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Stopping zone %s before it has started.", m_zone.c_str());
|
Log(Logs::Detail, Logs::Launcher, "Stopping zone %s before it has started.", m_zone.c_str());
|
||||||
m_state = StateStopped;
|
m_state = StateStopped;
|
||||||
break;
|
break;
|
||||||
case StateStarted:
|
case StateStarted:
|
||||||
@ -139,17 +139,17 @@ void ZoneLaunch::Stop(bool graceful) {
|
|||||||
break; //we have no proc ref... cannot stop..
|
break; //we have no proc ref... cannot stop..
|
||||||
if(!ProcLauncher::get()->Terminate(m_ref, graceful)) {
|
if(!ProcLauncher::get()->Terminate(m_ref, graceful)) {
|
||||||
//failed to terminate the process, its not likely that it will work if we try again, so give up.
|
//failed to terminate the process, its not likely that it will work if we try again, so give up.
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Failed to terminate zone %s. Giving up and moving to stopped.", m_zone.c_str());
|
Log(Logs::Detail, Logs::Launcher, "Failed to terminate zone %s. Giving up and moving to stopped.", m_zone.c_str());
|
||||||
m_state = StateStopped;
|
m_state = StateStopped;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Termination signal sent to zone %s.", m_zone.c_str());
|
Log(Logs::Detail, Logs::Launcher, "Termination signal sent to zone %s.", m_zone.c_str());
|
||||||
m_timer.Start(m_config->TerminateWait);
|
m_timer.Start(m_config->TerminateWait);
|
||||||
m_state = StateStopPending;
|
m_state = StateStopPending;
|
||||||
break;
|
break;
|
||||||
case StateStopped:
|
case StateStopped:
|
||||||
//process is already stopped... nothing to do..
|
//process is already stopped... nothing to do..
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Stop requested when zone %s is already stopped.", m_zone.c_str());
|
Log(Logs::Detail, Logs::Launcher, "Stop requested when zone %s is already stopped.", m_zone.c_str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -169,17 +169,17 @@ bool ZoneLaunch::Process() {
|
|||||||
m_timer.Disable();
|
m_timer.Disable();
|
||||||
|
|
||||||
//actually start up the program
|
//actually start up the program
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Starting zone %s", m_zone.c_str());
|
Log(Logs::Detail, Logs::Launcher, "Starting zone %s", m_zone.c_str());
|
||||||
Start();
|
Start();
|
||||||
|
|
||||||
//now update the shared timer to reflect the proper start interval.
|
//now update the shared timer to reflect the proper start interval.
|
||||||
if(s_running == 1) {
|
if(s_running == 1) {
|
||||||
//we are the first zone started. wait that interval.
|
//we are the first zone started. wait that interval.
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Waiting %d milliseconds before booting the second zone.", m_config->InitialBootWait);
|
Log(Logs::Detail, Logs::Launcher, "Waiting %d milliseconds before booting the second zone.", m_config->InitialBootWait);
|
||||||
s_startTimer.Start(m_config->InitialBootWait);
|
s_startTimer.Start(m_config->InitialBootWait);
|
||||||
} else {
|
} else {
|
||||||
//just some follow on zone, use that interval.
|
//just some follow on zone, use that interval.
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Waiting %d milliseconds before booting the next zone.", m_config->ZoneBootInterval);
|
Log(Logs::Detail, Logs::Launcher, "Waiting %d milliseconds before booting the next zone.", m_config->ZoneBootInterval);
|
||||||
s_startTimer.Start(m_config->ZoneBootInterval);
|
s_startTimer.Start(m_config->ZoneBootInterval);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -192,7 +192,7 @@ bool ZoneLaunch::Process() {
|
|||||||
//waiting for notification that our child has died..
|
//waiting for notification that our child has died..
|
||||||
if(m_timer.Check()) {
|
if(m_timer.Check()) {
|
||||||
//we have timed out, try to kill the child again
|
//we have timed out, try to kill the child again
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Zone %s refused to die, killing again.", m_zone.c_str());
|
Log(Logs::Detail, Logs::Launcher, "Zone %s refused to die, killing again.", m_zone.c_str());
|
||||||
Restart();
|
Restart();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -202,12 +202,12 @@ bool ZoneLaunch::Process() {
|
|||||||
//we have timed out, try to kill the child again
|
//we have timed out, try to kill the child again
|
||||||
m_killFails++;
|
m_killFails++;
|
||||||
if(m_killFails > 5) { //should get this number from somewhere..
|
if(m_killFails > 5) { //should get this number from somewhere..
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Zone %s refused to die, giving up and acting like its dead.", m_zone.c_str());
|
Log(Logs::Detail, Logs::Launcher, "Zone %s refused to die, giving up and acting like its dead.", m_zone.c_str());
|
||||||
m_state = StateStopped;
|
m_state = StateStopped;
|
||||||
s_running--;
|
s_running--;
|
||||||
SendStatus();
|
SendStatus();
|
||||||
} else {
|
} else {
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Zone %s refused to die, killing again.", m_zone.c_str());
|
Log(Logs::Detail, Logs::Launcher, "Zone %s refused to die, killing again.", m_zone.c_str());
|
||||||
Stop(false);
|
Stop(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -226,29 +226,29 @@ void ZoneLaunch::OnTerminate(const ProcLauncher::ProcRef &ref, const ProcLaunche
|
|||||||
|
|
||||||
switch(m_state) {
|
switch(m_state) {
|
||||||
case StateStartPending:
|
case StateStartPending:
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Zone %s has gone down before we started it..?? Restart timer started.", m_zone.c_str());
|
Log(Logs::Detail, Logs::Launcher, "Zone %s has gone down before we started it..?? Restart timer started.", m_zone.c_str());
|
||||||
m_state = StateStartPending;
|
m_state = StateStartPending;
|
||||||
m_timer.Start(m_config->RestartWait);
|
m_timer.Start(m_config->RestartWait);
|
||||||
break;
|
break;
|
||||||
case StateStarted:
|
case StateStarted:
|
||||||
//something happened to our happy process...
|
//something happened to our happy process...
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Zone %s has gone down. Restart timer started.", m_zone.c_str());
|
Log(Logs::Detail, Logs::Launcher, "Zone %s has gone down. Restart timer started.", m_zone.c_str());
|
||||||
m_state = StateStartPending;
|
m_state = StateStartPending;
|
||||||
m_timer.Start(m_config->RestartWait);
|
m_timer.Start(m_config->RestartWait);
|
||||||
break;
|
break;
|
||||||
case StateRestartPending:
|
case StateRestartPending:
|
||||||
//it finally died, start it on up again
|
//it finally died, start it on up again
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Zone %s has terminated. Transitioning to starting state.", m_zone.c_str());
|
Log(Logs::Detail, Logs::Launcher, "Zone %s has terminated. Transitioning to starting state.", m_zone.c_str());
|
||||||
m_state = StateStartPending;
|
m_state = StateStartPending;
|
||||||
break;
|
break;
|
||||||
case StateStopPending:
|
case StateStopPending:
|
||||||
//it finally died, transition to close.
|
//it finally died, transition to close.
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Zone %s has terminated. Transitioning to stopped state.", m_zone.c_str());
|
Log(Logs::Detail, Logs::Launcher, "Zone %s has terminated. Transitioning to stopped state.", m_zone.c_str());
|
||||||
m_state = StateStopped;
|
m_state = StateStopped;
|
||||||
break;
|
break;
|
||||||
case StateStopped:
|
case StateStopped:
|
||||||
//we already thought it was stopped... dont care...
|
//we already thought it was stopped... dont care...
|
||||||
Log.Out(Logs::Detail, Logs::Launcher, "Notified of zone %s terminating when we thought it was stopped.", m_zone.c_str());
|
Log(Logs::Detail, Logs::Launcher, "Notified of zone %s terminating when we thought it was stopped.", m_zone.c_str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,19 +1,19 @@
|
|||||||
/* EQEMu: Everquest Server Emulator
|
/* EQEMu: Everquest Server Emulator
|
||||||
Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net)
|
Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net)
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; version 2 of the License.
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
are required to give you total support for your newly bought product;
|
are required to give you total support for your newly bought product;
|
||||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
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 "login_server.h"
|
#include "login_server.h"
|
||||||
@ -21,7 +21,6 @@
|
|||||||
#include "../common/misc_functions.h"
|
#include "../common/misc_functions.h"
|
||||||
#include "../common/eqemu_logsys.h"
|
#include "../common/eqemu_logsys.h"
|
||||||
|
|
||||||
extern EQEmuLogSys Log;
|
|
||||||
extern LoginServer server;
|
extern LoginServer server;
|
||||||
|
|
||||||
Client::Client(std::shared_ptr<EQStreamInterface> c, LSClientVersion v)
|
Client::Client(std::shared_ptr<EQStreamInterface> c, LSClientVersion v)
|
||||||
@ -37,14 +36,14 @@ Client::Client(std::shared_ptr<EQStreamInterface> c, LSClientVersion v)
|
|||||||
bool Client::Process()
|
bool Client::Process()
|
||||||
{
|
{
|
||||||
EQApplicationPacket *app = connection->PopPacket();
|
EQApplicationPacket *app = connection->PopPacket();
|
||||||
while(app)
|
while (app)
|
||||||
{
|
{
|
||||||
if(server.options.IsTraceOn())
|
if (server.options.IsTraceOn())
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Application packet received from client (size %u)", app->Size());
|
Log(Logs::General, Logs::Login_Server, "Application packet received from client (size %u)", app->Size());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(server.options.IsDumpInPacketsOn())
|
if (server.options.IsDumpInPacketsOn())
|
||||||
{
|
{
|
||||||
DumpPacket(app);
|
DumpPacket(app);
|
||||||
}
|
}
|
||||||
@ -55,28 +54,28 @@ bool Client::Process()
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(app->GetOpcode())
|
switch (app->GetOpcode())
|
||||||
{
|
{
|
||||||
case OP_SessionReady:
|
case OP_SessionReady:
|
||||||
{
|
{
|
||||||
if(server.options.IsTraceOn())
|
if (server.options.IsTraceOn())
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Session ready received from client.");
|
Log(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;
|
||||||
}
|
}
|
||||||
case OP_Login:
|
case OP_Login:
|
||||||
{
|
{
|
||||||
if(app->Size() < 20)
|
if (app->Size() < 20)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Login received but it is too small, discarding.");
|
Log(Logs::General, Logs::Error, "Login received but it is too small, discarding.");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(server.options.IsTraceOn())
|
if (server.options.IsTraceOn())
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Login received from client.");
|
Log(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());
|
||||||
@ -85,13 +84,13 @@ bool Client::Process()
|
|||||||
case OP_ServerListRequest:
|
case OP_ServerListRequest:
|
||||||
{
|
{
|
||||||
if (app->Size() < 4) {
|
if (app->Size() < 4) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Server List Request received but it is too small, discarding.");
|
Log(Logs::General, Logs::Error, "Server List Request received but it is too small, discarding.");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(server.options.IsTraceOn())
|
if (server.options.IsTraceOn())
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Server list request received from client.");
|
Log(Logs::General, Logs::Login_Server, "Server list request received from client.");
|
||||||
}
|
}
|
||||||
|
|
||||||
SendServerListPacket(*(uint32_t*)app->pBuffer);
|
SendServerListPacket(*(uint32_t*)app->pBuffer);
|
||||||
@ -99,9 +98,9 @@ bool Client::Process()
|
|||||||
}
|
}
|
||||||
case OP_PlayEverquestRequest:
|
case OP_PlayEverquestRequest:
|
||||||
{
|
{
|
||||||
if(app->Size() < sizeof(PlayEverquestRequest_Struct))
|
if (app->Size() < sizeof(PlayEverquestRequest_Struct))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Play received but it is too small, discarding.");
|
Log(Logs::General, Logs::Error, "Play received but it is too small, discarding.");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,10 +109,10 @@ bool Client::Process()
|
|||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
if (Log.log_settings[Logs::Client_Server_Packet_Unhandled].is_category_enabled == 1) {
|
if (LogSys.log_settings[Logs::Client_Server_Packet_Unhandled].is_category_enabled == 1) {
|
||||||
char dump[64];
|
char dump[64];
|
||||||
app->build_header_dump(dump);
|
app->build_header_dump(dump);
|
||||||
Log.Out(Logs::General, Logs::Error, "Recieved unhandled application packet from the client: %s.", dump);
|
Log(Logs::General, Logs::Error, "Recieved unhandled application packet from the client: %s.", dump);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -127,15 +126,15 @@ bool Client::Process()
|
|||||||
|
|
||||||
void Client::Handle_SessionReady(const char* data, unsigned int size)
|
void Client::Handle_SessionReady(const char* data, unsigned int size)
|
||||||
{
|
{
|
||||||
if(status != cs_not_sent_session_ready)
|
if (status != cs_not_sent_session_ready)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Session ready received again after already being received.");
|
Log(Logs::General, Logs::Error, "Session ready received again after already being received.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(size < sizeof(unsigned int))
|
if (size < sizeof(unsigned int))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Session ready was too small.");
|
Log(Logs::General, Logs::Error, "Session ready was too small.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -144,14 +143,14 @@ void Client::Handle_SessionReady(const char* data, unsigned int size)
|
|||||||
/**
|
/**
|
||||||
* The packets are mostly the same but slightly different between the two versions.
|
* The packets are mostly the same but slightly different between the two versions.
|
||||||
*/
|
*/
|
||||||
if(version == cv_sod)
|
if (version == cv_sod)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *outapp = new EQApplicationPacket(OP_ChatMessage, 17);
|
EQApplicationPacket *outapp = new EQApplicationPacket(OP_ChatMessage, 17);
|
||||||
outapp->pBuffer[0] = 0x02;
|
outapp->pBuffer[0] = 0x02;
|
||||||
outapp->pBuffer[10] = 0x01;
|
outapp->pBuffer[10] = 0x01;
|
||||||
outapp->pBuffer[11] = 0x65;
|
outapp->pBuffer[11] = 0x65;
|
||||||
|
|
||||||
if(server.options.IsDumpOutPacketsOn())
|
if (server.options.IsDumpOutPacketsOn())
|
||||||
{
|
{
|
||||||
DumpPacket(outapp);
|
DumpPacket(outapp);
|
||||||
}
|
}
|
||||||
@ -168,7 +167,7 @@ void Client::Handle_SessionReady(const char* data, unsigned int size)
|
|||||||
outapp->pBuffer[11] = 0x65;
|
outapp->pBuffer[11] = 0x65;
|
||||||
strcpy((char*)(outapp->pBuffer + 15), msg);
|
strcpy((char*)(outapp->pBuffer + 15), msg);
|
||||||
|
|
||||||
if(server.options.IsDumpOutPacketsOn())
|
if (server.options.IsDumpOutPacketsOn())
|
||||||
{
|
{
|
||||||
DumpPacket(outapp);
|
DumpPacket(outapp);
|
||||||
}
|
}
|
||||||
@ -182,13 +181,13 @@ void Client::Handle_Login(const char* data, unsigned int size)
|
|||||||
{
|
{
|
||||||
auto mode = server.options.GetEncryptionMode();
|
auto mode = server.options.GetEncryptionMode();
|
||||||
|
|
||||||
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.");
|
Log(Logs::General, Logs::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);
|
Log(Logs::General, Logs::Error, "Login received packet of size: %u, this would cause a block corruption, discarding.", size);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -200,13 +199,13 @@ void Client::Handle_Login(const char* data, unsigned int size)
|
|||||||
std::string outbuffer;
|
std::string outbuffer;
|
||||||
outbuffer.resize(size - 12);
|
outbuffer.resize(size - 12);
|
||||||
if (outbuffer.length() == 0) {
|
if (outbuffer.length() == 0) {
|
||||||
Log.OutF(Logs::General, Logs::Debug, "Corrupt buffer sent to server, no length.");
|
LogF(Logs::General, Logs::Debug, "Corrupt buffer sent to server, no length.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto r = eqcrypt_block(data + 10, size - 12, &outbuffer[0], 0);
|
auto r = eqcrypt_block(data + 10, size - 12, &outbuffer[0], 0);
|
||||||
if (r == nullptr) {
|
if (r == nullptr) {
|
||||||
Log.OutF(Logs::General, Logs::Debug, "Failed to decrypt eqcrypt block");
|
LogF(Logs::General, Logs::Debug, "Failed to decrypt eqcrypt block");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -214,12 +213,12 @@ void Client::Handle_Login(const char* data, unsigned int size)
|
|||||||
|
|
||||||
std::string user(&outbuffer[0]);
|
std::string user(&outbuffer[0]);
|
||||||
if (user.length() >= outbuffer.length()) {
|
if (user.length() >= outbuffer.length()) {
|
||||||
Log.OutF(Logs::General, Logs::Debug, "Corrupt buffer sent to server, preventing buffer overflow.");
|
LogF(Logs::General, Logs::Debug, "Corrupt buffer sent to server, preventing buffer overflow.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool result = false;
|
bool result = false;
|
||||||
if(outbuffer[0] == 0 && outbuffer[1] == 0) {
|
if (outbuffer[0] == 0 && outbuffer[1] == 0) {
|
||||||
if (server.options.IsTokenLoginAllowed()) {
|
if (server.options.IsTokenLoginAllowed()) {
|
||||||
cred = (&outbuffer[2 + user.length()]);
|
cred = (&outbuffer[2 + user.length()]);
|
||||||
result = server.db->GetLoginTokenDataFromToken(cred, connection->GetRemoteAddr(), db_account_id, user);
|
result = server.db->GetLoginTokenDataFromToken(cred, connection->GetRemoteAddr(), db_account_id, user);
|
||||||
@ -234,11 +233,11 @@ void Client::Handle_Login(const char* data, unsigned int size)
|
|||||||
server.options.CanAutoCreateAccounts() &&
|
server.options.CanAutoCreateAccounts() &&
|
||||||
server.db->CreateLoginData(user, eqcrypt_hash(user, cred, mode), db_account_id) == true
|
server.db->CreateLoginData(user, eqcrypt_hash(user, cred, mode), db_account_id) == true
|
||||||
) {
|
) {
|
||||||
Log.OutF(Logs::General, Logs::Error, "User {0} does not exist in the database, so we created it...", user);
|
LogF(Logs::General, Logs::Error, "User {0} does not exist in the database, so we created it...", user);
|
||||||
result = true;
|
result = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Log.OutF(Logs::General, Logs::Error, "Error logging in, user {0} does not exist in the database.", user);
|
LogF(Logs::General, Logs::Error, "Error logging in, user {0} does not exist in the database.", user);
|
||||||
result = false;
|
result = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -302,7 +301,7 @@ void Client::Handle_Login(const char* data, unsigned int size)
|
|||||||
char encrypted_buffer[80] = { 0 };
|
char encrypted_buffer[80] = { 0 };
|
||||||
auto rc = eqcrypt_block((const char*)login_failed_attempts, 75, encrypted_buffer, 1);
|
auto rc = eqcrypt_block((const char*)login_failed_attempts, 75, encrypted_buffer, 1);
|
||||||
if (rc == nullptr) {
|
if (rc == nullptr) {
|
||||||
Log.OutF(Logs::General, Logs::Debug, "Failed to encrypt eqcrypt block");
|
LogF(Logs::General, Logs::Debug, "Failed to encrypt eqcrypt block");
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(login_accepted->encrypt, encrypted_buffer, 80);
|
memcpy(login_accepted->encrypt, encrypted_buffer, 80);
|
||||||
@ -340,9 +339,9 @@ void Client::Handle_Login(const char* data, unsigned int size)
|
|||||||
|
|
||||||
void Client::Handle_Play(const char* data)
|
void Client::Handle_Play(const char* data)
|
||||||
{
|
{
|
||||||
if(status != cs_logged_in)
|
if (status != cs_logged_in)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Client sent a play request when they were not logged in, discarding.");
|
Log(Logs::General, Logs::Error, "Client sent a play request when they were not logged in, discarding.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -350,9 +349,9 @@ void Client::Handle_Play(const char* data)
|
|||||||
unsigned int server_id_in = (unsigned int)play->ServerNumber;
|
unsigned int server_id_in = (unsigned int)play->ServerNumber;
|
||||||
unsigned int sequence_in = (unsigned int)play->Sequence;
|
unsigned int sequence_in = (unsigned int)play->Sequence;
|
||||||
|
|
||||||
if(server.options.IsTraceOn())
|
if (server.options.IsTraceOn())
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Play received from client, server number %u sequence %u.", server_id_in, sequence_in);
|
Log(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;
|
||||||
@ -365,7 +364,7 @@ void Client::SendServerListPacket(uint32 seq)
|
|||||||
{
|
{
|
||||||
EQApplicationPacket *outapp = server.server_manager->CreateServerListPacket(this, seq);
|
EQApplicationPacket *outapp = server.server_manager->CreateServerListPacket(this, seq);
|
||||||
|
|
||||||
if(server.options.IsDumpOutPacketsOn())
|
if (server.options.IsDumpOutPacketsOn())
|
||||||
{
|
{
|
||||||
DumpPacket(outapp);
|
DumpPacket(outapp);
|
||||||
}
|
}
|
||||||
@ -376,9 +375,9 @@ void Client::SendServerListPacket(uint32 seq)
|
|||||||
|
|
||||||
void Client::SendPlayResponse(EQApplicationPacket *outapp)
|
void Client::SendPlayResponse(EQApplicationPacket *outapp)
|
||||||
{
|
{
|
||||||
if(server.options.IsTraceOn())
|
if (server.options.IsTraceOn())
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Netcode, "Sending play response for %s.", GetAccountName().c_str());
|
Log(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);
|
||||||
@ -403,4 +402,3 @@ void Client::GenerateKey()
|
|||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,19 +1,19 @@
|
|||||||
/* EQEMu: Everquest Server Emulator
|
/* EQEMu: Everquest Server Emulator
|
||||||
Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net)
|
Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net)
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; version 2 of the License.
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
are required to give you total support for your newly bought product;
|
are required to give you total support for your newly bought product;
|
||||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
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 "login_server.h"
|
#include "login_server.h"
|
||||||
@ -22,7 +22,6 @@ extern LoginServer server;
|
|||||||
extern bool run_server;
|
extern bool run_server;
|
||||||
|
|
||||||
#include "../common/eqemu_logsys.h"
|
#include "../common/eqemu_logsys.h"
|
||||||
extern EQEmuLogSys Log;
|
|
||||||
|
|
||||||
ClientManager::ClientManager()
|
ClientManager::ClientManager()
|
||||||
{
|
{
|
||||||
@ -30,15 +29,15 @@ ClientManager::ClientManager()
|
|||||||
EQ::Net::EQStreamManagerOptions titanium_opts(titanium_port, false, false);
|
EQ::Net::EQStreamManagerOptions titanium_opts(titanium_port, false, false);
|
||||||
titanium_stream = new EQ::Net::EQStreamManager(titanium_opts);
|
titanium_stream = new EQ::Net::EQStreamManager(titanium_opts);
|
||||||
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()))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "ClientManager fatal error: couldn't load opcodes for Titanium file %s.",
|
Log(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;
|
||||||
}
|
}
|
||||||
|
|
||||||
titanium_stream->OnNewConnection([this](std::shared_ptr<EQ::Net::EQStream> stream) {
|
titanium_stream->OnNewConnection([this](std::shared_ptr<EQ::Net::EQStream> stream) {
|
||||||
Log.OutF(Logs::General, Logs::Login_Server, "New Titanium client connection from {0}:{1}", stream->RemoteEndpoint(), stream->GetRemotePort());
|
LogF(Logs::General, Logs::Login_Server, "New Titanium client connection from {0}:{1}", stream->RemoteEndpoint(), stream->GetRemotePort());
|
||||||
stream->SetOpcodeManager(&titanium_ops);
|
stream->SetOpcodeManager(&titanium_ops);
|
||||||
Client *c = new Client(stream, cv_titanium);
|
Client *c = new Client(stream, cv_titanium);
|
||||||
clients.push_back(c);
|
clients.push_back(c);
|
||||||
@ -48,15 +47,15 @@ ClientManager::ClientManager()
|
|||||||
EQ::Net::EQStreamManagerOptions sod_opts(sod_port, false, false);
|
EQ::Net::EQStreamManagerOptions sod_opts(sod_port, false, false);
|
||||||
sod_stream = new EQ::Net::EQStreamManager(sod_opts);
|
sod_stream = new EQ::Net::EQStreamManager(sod_opts);
|
||||||
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()))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "ClientManager fatal error: couldn't load opcodes for SoD file %s.",
|
Log(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;
|
||||||
}
|
}
|
||||||
|
|
||||||
sod_stream->OnNewConnection([this](std::shared_ptr<EQ::Net::EQStream> stream) {
|
sod_stream->OnNewConnection([this](std::shared_ptr<EQ::Net::EQStream> stream) {
|
||||||
Log.OutF(Logs::General, Logs::Login_Server, "New SoD client connection from {0}:{1}", stream->RemoteEndpoint(), stream->GetRemotePort());
|
LogF(Logs::General, Logs::Login_Server, "New SoD client connection from {0}:{1}", stream->RemoteEndpoint(), stream->GetRemotePort());
|
||||||
stream->SetOpcodeManager(&sod_ops);
|
stream->SetOpcodeManager(&sod_ops);
|
||||||
Client *c = new Client(stream, cv_sod);
|
Client *c = new Client(stream, cv_sod);
|
||||||
clients.push_back(c);
|
clients.push_back(c);
|
||||||
@ -65,22 +64,22 @@ ClientManager::ClientManager()
|
|||||||
|
|
||||||
ClientManager::~ClientManager()
|
ClientManager::~ClientManager()
|
||||||
{
|
{
|
||||||
if(titanium_stream)
|
if (titanium_stream)
|
||||||
{
|
{
|
||||||
delete titanium_stream;
|
delete titanium_stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(titanium_ops)
|
if (titanium_ops)
|
||||||
{
|
{
|
||||||
delete titanium_ops;
|
delete titanium_ops;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(sod_stream)
|
if (sod_stream)
|
||||||
{
|
{
|
||||||
delete sod_stream;
|
delete sod_stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(sod_ops)
|
if (sod_ops)
|
||||||
{
|
{
|
||||||
delete sod_ops;
|
delete sod_ops;
|
||||||
}
|
}
|
||||||
@ -91,11 +90,11 @@ void ClientManager::Process()
|
|||||||
ProcessDisconnect();
|
ProcessDisconnect();
|
||||||
|
|
||||||
auto iter = clients.begin();
|
auto iter = clients.begin();
|
||||||
while(iter != clients.end())
|
while (iter != clients.end())
|
||||||
{
|
{
|
||||||
if((*iter)->Process() == false)
|
if ((*iter)->Process() == false)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Debug, "Client had a fatal error and had to be removed from the login.");
|
Log(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);
|
||||||
}
|
}
|
||||||
@ -109,12 +108,12 @@ void ClientManager::Process()
|
|||||||
void ClientManager::ProcessDisconnect()
|
void ClientManager::ProcessDisconnect()
|
||||||
{
|
{
|
||||||
auto iter = clients.begin();
|
auto iter = clients.begin();
|
||||||
while(iter != clients.end())
|
while (iter != clients.end())
|
||||||
{
|
{
|
||||||
std::shared_ptr<EQStreamInterface> c = (*iter)->GetConnection();
|
std::shared_ptr<EQStreamInterface> c = (*iter)->GetConnection();
|
||||||
if(c->CheckState(CLOSED))
|
if (c->CheckState(CLOSED))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Client disconnected from the server, removing client.");
|
Log(Logs::General, Logs::Login_Server, "Client disconnected from the server, removing client.");
|
||||||
delete (*iter);
|
delete (*iter);
|
||||||
iter = clients.erase(iter);
|
iter = clients.erase(iter);
|
||||||
}
|
}
|
||||||
@ -128,11 +127,11 @@ void ClientManager::ProcessDisconnect()
|
|||||||
void ClientManager::RemoveExistingClient(unsigned int account_id)
|
void ClientManager::RemoveExistingClient(unsigned int account_id)
|
||||||
{
|
{
|
||||||
auto iter = clients.begin();
|
auto iter = clients.begin();
|
||||||
while(iter != clients.end())
|
while (iter != clients.end())
|
||||||
{
|
{
|
||||||
if((*iter)->GetAccountID() == account_id)
|
if ((*iter)->GetAccountID() == account_id)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Client attempting to log in and existing client already logged in, removing existing client.");
|
Log(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);
|
||||||
}
|
}
|
||||||
@ -148,9 +147,9 @@ Client *ClientManager::GetClient(unsigned int account_id)
|
|||||||
Client *cur = nullptr;
|
Client *cur = nullptr;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
auto iter = clients.begin();
|
auto iter = clients.begin();
|
||||||
while(iter != clients.end())
|
while (iter != clients.end())
|
||||||
{
|
{
|
||||||
if((*iter)->GetAccountID() == account_id)
|
if ((*iter)->GetAccountID() == account_id)
|
||||||
{
|
{
|
||||||
cur = (*iter);
|
cur = (*iter);
|
||||||
count++;
|
count++;
|
||||||
@ -158,10 +157,9 @@ Client *ClientManager::GetClient(unsigned int account_id)
|
|||||||
++iter;
|
++iter;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(count > 1)
|
if (count > 1)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "More than one client with a given account_id existed in the client list.");
|
Log(Logs::General, Logs::Error, "More than one client with a given account_id existed in the client list.");
|
||||||
}
|
}
|
||||||
return cur;
|
return cur;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -19,7 +19,6 @@
|
|||||||
#include "../common/eqemu_logsys.h"
|
#include "../common/eqemu_logsys.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
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 +47,7 @@ void Config::Parse(const char *file_name)
|
|||||||
{
|
{
|
||||||
if(file_name == nullptr)
|
if(file_name == nullptr)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Config::Parse(), file_name passed was null.");
|
Log(Logs::General, Logs::Error, "Config::Parse(), file_name passed was null.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,7 +70,7 @@ void Config::Parse(const char *file_name)
|
|||||||
++iter;
|
++iter;
|
||||||
if(iter == tokens.end())
|
if(iter == tokens.end())
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Config::Parse(), EOF before title done parsing.");
|
Log(Logs::General, Logs::Error, "Config::Parse(), EOF before title done parsing.");
|
||||||
fclose(input);
|
fclose(input);
|
||||||
vars.clear();
|
vars.clear();
|
||||||
return;
|
return;
|
||||||
@ -104,7 +103,7 @@ void Config::Parse(const char *file_name)
|
|||||||
mode++;
|
mode++;
|
||||||
if((*iter).compare("=") != 0)
|
if((*iter).compare("=") != 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Config::Parse(), invalid parse token where = should be.");
|
Log(Logs::General, Logs::Error, "Config::Parse(), invalid parse token where = should be.");
|
||||||
fclose(input);
|
fclose(input);
|
||||||
vars.clear();
|
vars.clear();
|
||||||
return;
|
return;
|
||||||
@ -133,7 +132,7 @@ void Config::Parse(const char *file_name)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Config::Parse(), file was unable to be opened for parsing.");
|
Log(Logs::General, Logs::Error, "Config::Parse(), file was unable to be opened for parsing.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,19 +1,19 @@
|
|||||||
/* EQEMu: Everquest Server Emulator
|
/* EQEMu: Everquest Server Emulator
|
||||||
Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net)
|
Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net)
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; version 2 of the License.
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
are required to give you total support for your newly bought product;
|
are required to give you total support for your newly bought product;
|
||||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
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 "database.h"
|
#include "database.h"
|
||||||
@ -24,7 +24,6 @@
|
|||||||
#include "../common/eqemu_logsys.h"
|
#include "../common/eqemu_logsys.h"
|
||||||
#include "../common/string_util.h"
|
#include "../common/string_util.h"
|
||||||
|
|
||||||
extern EQEmuLogSys Log;
|
|
||||||
extern LoginServer server;
|
extern LoginServer server;
|
||||||
|
|
||||||
DatabaseMySQL::DatabaseMySQL(std::string user, std::string pass, std::string host, std::string port, std::string name)
|
DatabaseMySQL::DatabaseMySQL(std::string user, std::string pass, std::string host, std::string port, std::string name)
|
||||||
@ -35,26 +34,26 @@ DatabaseMySQL::DatabaseMySQL(std::string user, std::string pass, std::string hos
|
|||||||
this->name = name;
|
this->name = name;
|
||||||
|
|
||||||
database = mysql_init(nullptr);
|
database = mysql_init(nullptr);
|
||||||
if(database)
|
if (database)
|
||||||
{
|
{
|
||||||
my_bool r = 1;
|
my_bool r = 1;
|
||||||
mysql_options(database, MYSQL_OPT_RECONNECT, &r);
|
mysql_options(database, MYSQL_OPT_RECONNECT, &r);
|
||||||
if(!mysql_real_connect(database, 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(database);
|
mysql_close(database);
|
||||||
Log.Out(Logs::General, Logs::Error, "Failed to connect to MySQL database. Error: %s", mysql_error(database));
|
Log(Logs::General, Logs::Error, "Failed to connect to MySQL database. Error: %s", mysql_error(database));
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Failed to create db object in MySQL database.");
|
Log(Logs::General, Logs::Error, "Failed to create db object in MySQL database.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DatabaseMySQL::~DatabaseMySQL()
|
DatabaseMySQL::~DatabaseMySQL()
|
||||||
{
|
{
|
||||||
if(database)
|
if (database)
|
||||||
{
|
{
|
||||||
mysql_close(database);
|
mysql_close(database);
|
||||||
}
|
}
|
||||||
@ -76,7 +75,7 @@ bool DatabaseMySQL::GetLoginDataFromAccountName(std::string name, std::string &p
|
|||||||
|
|
||||||
if (mysql_query(database, query.str().c_str()) != 0)
|
if (mysql_query(database, query.str().c_str()) != 0)
|
||||||
{
|
{
|
||||||
Log.OutF(Logs::General, Logs::Error, "Mysql query failed: {0}", query.str());
|
LogF(Logs::General, Logs::Error, "Mysql query failed: {0}", query.str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,7 +92,7 @@ bool DatabaseMySQL::GetLoginDataFromAccountName(std::string name, std::string &p
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Error, "Mysql query returned no result: %s", query.str().c_str());
|
Log(Logs::General, Logs::Error, "Mysql query returned no result: %s", query.str().c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,7 +112,7 @@ bool DatabaseMySQL::GetLoginTokenDataFromToken(const std::string &token, const s
|
|||||||
|
|
||||||
if (mysql_query(database, query.str().c_str()) != 0)
|
if (mysql_query(database, query.str().c_str()) != 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
|
Log(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -158,15 +157,15 @@ bool DatabaseMySQL::CreateLoginData(const std::string &name, const std::string &
|
|||||||
query << " VALUES('" << name << "', '" << password << "', 'local_creation', NOW(), '127.0.0.1'); ";
|
query << " VALUES('" << name << "', '" << password << "', 'local_creation', NOW(), '127.0.0.1'); ";
|
||||||
|
|
||||||
if (mysql_query(database, query.str().c_str()) != 0) {
|
if (mysql_query(database, query.str().c_str()) != 0) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
|
Log(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
id = mysql_insert_id(database);
|
id = mysql_insert_id(database);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Error, "Mysql query returned no result: %s", query.str().c_str());
|
Log(Logs::General, Logs::Error, "Mysql query returned no result: %s", query.str().c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -194,7 +193,7 @@ bool DatabaseMySQL::GetWorldRegistration(std::string long_name, std::string shor
|
|||||||
|
|
||||||
if (mysql_query(database, query.str().c_str()) != 0)
|
if (mysql_query(database, query.str().c_str()) != 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
|
Log(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -219,7 +218,7 @@ bool DatabaseMySQL::GetWorldRegistration(std::string long_name, std::string shor
|
|||||||
|
|
||||||
if (mysql_query(database, query.str().c_str()) != 0)
|
if (mysql_query(database, query.str().c_str()) != 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
|
Log(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -235,14 +234,14 @@ bool DatabaseMySQL::GetWorldRegistration(std::string long_name, std::string shor
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Error, "Mysql query returned no result: %s", query.str().c_str());
|
Log(Logs::General, Logs::Error, "Mysql query returned no result: %s", query.str().c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Error, "Mysql query returned no result: %s", query.str().c_str());
|
Log(Logs::General, Logs::Error, "Mysql query returned no result: %s", query.str().c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -261,7 +260,7 @@ void DatabaseMySQL::UpdateLSAccountData(unsigned int id, std::string ip_address)
|
|||||||
|
|
||||||
if (mysql_query(database, query.str().c_str()) != 0)
|
if (mysql_query(database, query.str().c_str()) != 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
|
Log(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -280,7 +279,7 @@ void DatabaseMySQL::UpdateLSAccountInfo(unsigned int id, std::string name, std::
|
|||||||
|
|
||||||
if (mysql_query(database, query.str().c_str()) != 0)
|
if (mysql_query(database, query.str().c_str()) != 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
|
Log(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -305,7 +304,7 @@ void DatabaseMySQL::UpdateWorldRegistration(unsigned int id, std::string long_na
|
|||||||
|
|
||||||
if (mysql_query(database, query.str().c_str()) != 0)
|
if (mysql_query(database, query.str().c_str()) != 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
|
Log(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -330,7 +329,7 @@ bool DatabaseMySQL::CreateWorldRegistration(std::string long_name, std::string s
|
|||||||
|
|
||||||
if (mysql_query(database, query.str().c_str()) != 0)
|
if (mysql_query(database, query.str().c_str()) != 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
|
Log(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -349,15 +348,14 @@ bool DatabaseMySQL::CreateWorldRegistration(std::string long_name, std::string s
|
|||||||
|
|
||||||
if (mysql_query(database, query.str().c_str()) != 0)
|
if (mysql_query(database, query.str().c_str()) != 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
|
Log(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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());
|
Log(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;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Failed to connect to PostgreSQL Database.");
|
Log(Logs::General, Logs::Error, "Failed to connect to PostgreSQL Database.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(PQstatus(db) != CONNECTION_OK)
|
if(PQstatus(db) != CONNECTION_OK)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Failed to connect to PostgreSQL Database.");
|
Log(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)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Database error in DatabasePostgreSQL::GetLoginDataFromAccountName(): %s", error);
|
Log(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)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Database error in DatabasePostgreSQL::GetWorldRegistration(): %s", error);
|
Log(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)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Database error in DatabasePostgreSQL::GetLoginDataFromAccountName(): %s", error);
|
Log(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)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Database error in DatabasePostgreSQL::GetLoginDataFromAccountName(): %s", error);
|
Log(Logs::General, Logs::Error, "Database error in DatabasePostgreSQL::GetLoginDataFromAccountName(): %s", error);
|
||||||
}
|
}
|
||||||
PQclear(res);
|
PQclear(res);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,19 +1,19 @@
|
|||||||
/* EQEMu: Everquest Server Emulator
|
/* EQEMu: Everquest Server Emulator
|
||||||
Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net)
|
Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net)
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; version 2 of the License.
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
are required to give you total support for your newly bought product;
|
are required to give you total support for your newly bought product;
|
||||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
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/types.h"
|
#include "../common/types.h"
|
||||||
@ -30,7 +30,7 @@
|
|||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
LoginServer server;
|
LoginServer server;
|
||||||
EQEmuLogSys Log;
|
EQEmuLogSys LogSys;
|
||||||
bool run_server = true;
|
bool run_server = true;
|
||||||
|
|
||||||
void CatchSignal(int sig_num)
|
void CatchSignal(int sig_num)
|
||||||
@ -41,15 +41,15 @@ int main()
|
|||||||
{
|
{
|
||||||
RegisterExecutablePlatform(ExePlatformLogin);
|
RegisterExecutablePlatform(ExePlatformLogin);
|
||||||
set_exception_handler();
|
set_exception_handler();
|
||||||
Log.LoadLogSettingsDefaults();
|
LogSys.LoadLogSettingsDefaults();
|
||||||
|
|
||||||
Log.log_settings[Logs::Error].log_to_console = Logs::General;
|
LogSys.log_settings[Logs::Error].log_to_console = Logs::General;
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Logging System Init.");
|
Log(Logs::General, Logs::Login_Server, "Logging System Init.");
|
||||||
|
|
||||||
/* Parse out login.ini */
|
/* Parse out login.ini */
|
||||||
server.config = new Config();
|
server.config = new Config();
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Config System Init.");
|
Log(Logs::General, Logs::Login_Server, "Config System Init.");
|
||||||
server.config->Parse("login.ini");
|
server.config->Parse("login.ini");
|
||||||
|
|
||||||
if (server.config->GetVariable("options", "unregistered_allowed").compare("FALSE") == 0)
|
if (server.config->GetVariable("options", "unregistered_allowed").compare("FALSE") == 0)
|
||||||
@ -106,7 +106,7 @@ int main()
|
|||||||
/* Create database connection */
|
/* 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
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "MySQL Database Init.");
|
Log(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"),
|
||||||
@ -117,7 +117,7 @@ int main()
|
|||||||
}
|
}
|
||||||
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
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "PostgreSQL Database Init.");
|
Log(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"),
|
||||||
@ -129,39 +129,39 @@ int main()
|
|||||||
|
|
||||||
/* 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.");
|
Log(Logs::General, Logs::Error, "Database Initialization Failure.");
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Config System Shutdown.");
|
Log(Logs::General, Logs::Login_Server, "Config System Shutdown.");
|
||||||
delete server.config;
|
delete server.config;
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Log System Shutdown.");
|
Log(Logs::General, Logs::Login_Server, "Log System Shutdown.");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//create our server manager.
|
//create our server manager.
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Server Manager Initialize.");
|
Log(Logs::General, Logs::Login_Server, "Server Manager Initialize.");
|
||||||
server.server_manager = new ServerManager();
|
server.server_manager = new ServerManager();
|
||||||
if (!server.server_manager) {
|
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.
|
||||||
Log.Out(Logs::General, Logs::Error, "Server Manager Failed to Start.");
|
Log(Logs::General, Logs::Error, "Server Manager Failed to Start.");
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Database System Shutdown.");
|
Log(Logs::General, Logs::Login_Server, "Database System Shutdown.");
|
||||||
delete server.db;
|
delete server.db;
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Config System Shutdown.");
|
Log(Logs::General, Logs::Login_Server, "Config System Shutdown.");
|
||||||
delete server.config;
|
delete server.config;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//create our client manager.
|
//create our client manager.
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Client Manager Initialize.");
|
Log(Logs::General, Logs::Login_Server, "Client Manager Initialize.");
|
||||||
server.client_manager = new ClientManager();
|
server.client_manager = new ClientManager();
|
||||||
if (!server.client_manager) {
|
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.
|
||||||
Log.Out(Logs::General, Logs::Error, "Client Manager Failed to Start.");
|
Log(Logs::General, Logs::Error, "Client Manager Failed to Start.");
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Server Manager Shutdown.");
|
Log(Logs::General, Logs::Login_Server, "Server Manager Shutdown.");
|
||||||
delete server.server_manager;
|
delete server.server_manager;
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Database System Shutdown.");
|
Log(Logs::General, Logs::Login_Server, "Database System Shutdown.");
|
||||||
delete server.db;
|
delete server.db;
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Config System Shutdown.");
|
Log(Logs::General, Logs::Login_Server, "Config System Shutdown.");
|
||||||
delete server.config;
|
delete server.config;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -174,7 +174,7 @@ int main()
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Server Started.");
|
Log(Logs::General, Logs::Login_Server, "Server Started.");
|
||||||
while (run_server) {
|
while (run_server) {
|
||||||
Timer::SetCurrentTime();
|
Timer::SetCurrentTime();
|
||||||
server.client_manager->Process();
|
server.client_manager->Process();
|
||||||
@ -182,16 +182,15 @@ int main()
|
|||||||
Sleep(5);
|
Sleep(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Server Shutdown.");
|
Log(Logs::General, Logs::Login_Server, "Server Shutdown.");
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Client Manager Shutdown.");
|
Log(Logs::General, Logs::Login_Server, "Client Manager Shutdown.");
|
||||||
delete server.client_manager;
|
delete server.client_manager;
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Server Manager Shutdown.");
|
Log(Logs::General, Logs::Login_Server, "Server Manager Shutdown.");
|
||||||
delete server.server_manager;
|
delete server.server_manager;
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Database System Shutdown.");
|
Log(Logs::General, Logs::Login_Server, "Database System Shutdown.");
|
||||||
delete server.db;
|
delete server.db;
|
||||||
Log.Out(Logs::General, Logs::Login_Server, "Config System Shutdown.");
|
Log(Logs::General, Logs::Login_Server, "Config System Shutdown.");
|
||||||
delete server.config;
|
delete server.config;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,19 +1,19 @@
|
|||||||
/* EQEMu: Everquest Server Emulator
|
/* EQEMu: Everquest Server Emulator
|
||||||
Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net)
|
Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net)
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; version 2 of the License.
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
are required to give you total support for your newly bought product;
|
are required to give you total support for your newly bought product;
|
||||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
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 "server_manager.h"
|
#include "server_manager.h"
|
||||||
#include "login_server.h"
|
#include "login_server.h"
|
||||||
@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#include "../common/eqemu_logsys.h"
|
#include "../common/eqemu_logsys.h"
|
||||||
|
|
||||||
extern EQEmuLogSys Log;
|
|
||||||
extern LoginServer server;
|
extern LoginServer server;
|
||||||
extern bool run_server;
|
extern bool run_server;
|
||||||
|
|
||||||
@ -37,13 +36,13 @@ ServerManager::ServerManager()
|
|||||||
server_connection->Listen(opts);
|
server_connection->Listen(opts);
|
||||||
|
|
||||||
server_connection->OnConnectionIdentified("World", [this](std::shared_ptr<EQ::Net::ServertalkServerConnection> c) {
|
server_connection->OnConnectionIdentified("World", [this](std::shared_ptr<EQ::Net::ServertalkServerConnection> c) {
|
||||||
Log.OutF(Logs::General, Logs::Login_Server, "New world server connection from {0}:{1}", c->Handle()->RemoteIP(), c->Handle()->RemotePort());
|
LogF(Logs::General, Logs::Login_Server, "New world server connection from {0}:{1}", c->Handle()->RemoteIP(), c->Handle()->RemotePort());
|
||||||
|
|
||||||
auto iter = world_servers.begin();
|
auto iter = world_servers.begin();
|
||||||
while (iter != world_servers.end()) {
|
while (iter != world_servers.end()) {
|
||||||
if ((*iter)->GetConnection()->Handle()->RemoteIP().compare(c->Handle()->RemoteIP()) == 0 &&
|
if ((*iter)->GetConnection()->Handle()->RemoteIP().compare(c->Handle()->RemoteIP()) == 0 &&
|
||||||
(*iter)->GetConnection()->Handle()->RemotePort() == c->Handle()->RemotePort()) {
|
(*iter)->GetConnection()->Handle()->RemotePort() == c->Handle()->RemotePort()) {
|
||||||
Log.OutF(Logs::General, Logs::Login_Server, "World server already existed for {0}:{1}, removing existing connection.",
|
LogF(Logs::General, Logs::Login_Server, "World server already existed for {0}:{1}, removing existing connection.",
|
||||||
c->Handle()->RemoteIP(), c->Handle()->RemotePort());
|
c->Handle()->RemoteIP(), c->Handle()->RemotePort());
|
||||||
|
|
||||||
world_servers.erase(iter);
|
world_servers.erase(iter);
|
||||||
@ -60,7 +59,7 @@ ServerManager::ServerManager()
|
|||||||
auto iter = world_servers.begin();
|
auto iter = world_servers.begin();
|
||||||
while (iter != world_servers.end()) {
|
while (iter != world_servers.end()) {
|
||||||
if ((*iter)->GetConnection()->GetUUID() == c->GetUUID()) {
|
if ((*iter)->GetConnection()->GetUUID() == c->GetUUID()) {
|
||||||
Log.OutF(Logs::General, Logs::World_Server, "World server {0} has been disconnected, removing.", (*iter)->GetLongName().c_str());
|
LogF(Logs::General, Logs::World_Server, "World server {0} has been disconnected, removing.", (*iter)->GetLongName().c_str());
|
||||||
world_servers.erase(iter);
|
world_servers.erase(iter);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -222,14 +221,14 @@ void ServerManager::SendUserToWorldRequest(unsigned int server_id, unsigned int
|
|||||||
found = true;
|
found = true;
|
||||||
|
|
||||||
if (server.options.IsDumpInPacketsOn()) {
|
if (server.options.IsDumpInPacketsOn()) {
|
||||||
Log.OutF(Logs::General, Logs::Login_Server, "{0}", outapp.ToString());
|
LogF(Logs::General, Logs::Login_Server, "{0}", outapp.ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
++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);
|
Log(Logs::General, Logs::Error, "Client requested a user to world but supplied an invalid id of %u.", server_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,19 +1,19 @@
|
|||||||
/* EQEMu: Everquest Server Emulator
|
/* EQEMu: Everquest Server Emulator
|
||||||
Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net)
|
Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net)
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; version 2 of the License.
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
are required to give you total support for your newly bought product;
|
are required to give you total support for your newly bought product;
|
||||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
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 "login_server.h"
|
#include "login_server.h"
|
||||||
@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#include "../common/eqemu_logsys.h"
|
#include "../common/eqemu_logsys.h"
|
||||||
|
|
||||||
extern EQEmuLogSys Log;
|
|
||||||
extern LoginServer server;
|
extern LoginServer server;
|
||||||
|
|
||||||
WorldServer::WorldServer(std::shared_ptr<EQ::Net::ServertalkServerConnection> c)
|
WorldServer::WorldServer(std::shared_ptr<EQ::Net::ServertalkServerConnection> c)
|
||||||
@ -65,7 +64,7 @@ void WorldServer::ProcessNewLSInfo(uint16_t opcode, const EQ::Net::Packet &p)
|
|||||||
{
|
{
|
||||||
if (server.options.IsWorldTraceOn())
|
if (server.options.IsWorldTraceOn())
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Netcode, "Application packet received from server: 0x%.4X, (size %u)", opcode, p.Length());
|
Log(Logs::General, Logs::Netcode, "Application packet received from server: 0x%.4X, (size %u)", opcode, p.Length());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (server.options.IsDumpInPacketsOn())
|
if (server.options.IsDumpInPacketsOn())
|
||||||
@ -75,14 +74,14 @@ void WorldServer::ProcessNewLSInfo(uint16_t opcode, const EQ::Net::Packet &p)
|
|||||||
|
|
||||||
if (p.Length() < sizeof(ServerNewLSInfo_Struct))
|
if (p.Length() < sizeof(ServerNewLSInfo_Struct))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Received application packet from server that had opcode ServerOP_NewLSInfo, "
|
Log(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.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (server.options.IsWorldTraceOn())
|
if (server.options.IsWorldTraceOn())
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Netcode, "New Login Info Recieved.");
|
Log(Logs::General, Logs::Netcode, "New Login Info Recieved.");
|
||||||
}
|
}
|
||||||
|
|
||||||
ServerNewLSInfo_Struct *info = (ServerNewLSInfo_Struct*)p.Data();
|
ServerNewLSInfo_Struct *info = (ServerNewLSInfo_Struct*)p.Data();
|
||||||
@ -93,7 +92,7 @@ void WorldServer::ProcessLSStatus(uint16_t opcode, const EQ::Net::Packet &p)
|
|||||||
{
|
{
|
||||||
if (server.options.IsWorldTraceOn())
|
if (server.options.IsWorldTraceOn())
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Netcode, "Application packet received from server: 0x%.4X, (size %u)", opcode, p.Length());
|
Log(Logs::General, Logs::Netcode, "Application packet received from server: 0x%.4X, (size %u)", opcode, p.Length());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (server.options.IsDumpInPacketsOn())
|
if (server.options.IsDumpInPacketsOn())
|
||||||
@ -103,14 +102,14 @@ void WorldServer::ProcessLSStatus(uint16_t opcode, const EQ::Net::Packet &p)
|
|||||||
|
|
||||||
if (p.Length() < sizeof(ServerLSStatus_Struct))
|
if (p.Length() < sizeof(ServerLSStatus_Struct))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Recieved application packet from server that had opcode ServerOP_LSStatus, "
|
Log(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.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (server.options.IsWorldTraceOn())
|
if (server.options.IsWorldTraceOn())
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Netcode, "World Server Status Recieved.");
|
Log(Logs::General, Logs::Netcode, "World Server Status Recieved.");
|
||||||
}
|
}
|
||||||
|
|
||||||
ServerLSStatus_Struct *ls_status = (ServerLSStatus_Struct*)p.Data();
|
ServerLSStatus_Struct *ls_status = (ServerLSStatus_Struct*)p.Data();
|
||||||
@ -121,7 +120,7 @@ void WorldServer::ProcessUsertoWorldResp(uint16_t opcode, const EQ::Net::Packet
|
|||||||
{
|
{
|
||||||
if (server.options.IsWorldTraceOn())
|
if (server.options.IsWorldTraceOn())
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Netcode, "Application packet received from server: 0x%.4X, (size %u)", opcode, p.Length());
|
Log(Logs::General, Logs::Netcode, "Application packet received from server: 0x%.4X, (size %u)", opcode, p.Length());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (server.options.IsDumpInPacketsOn())
|
if (server.options.IsDumpInPacketsOn())
|
||||||
@ -131,7 +130,7 @@ void WorldServer::ProcessUsertoWorldResp(uint16_t opcode, const EQ::Net::Packet
|
|||||||
|
|
||||||
if (p.Length() < sizeof(UsertoWorldResponse_Struct))
|
if (p.Length() < sizeof(UsertoWorldResponse_Struct))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Recieved application packet from server that had opcode ServerOP_UsertoWorldResp, "
|
Log(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.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -141,22 +140,22 @@ void WorldServer::ProcessUsertoWorldResp(uint16_t opcode, const EQ::Net::Packet
|
|||||||
//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())
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Netcode, "User-To-World Response received.");
|
Log(Logs::General, Logs::Netcode, "User-To-World Response received.");
|
||||||
}
|
}
|
||||||
|
|
||||||
UsertoWorldResponse_Struct *utwr = (UsertoWorldResponse_Struct*)p.Data();
|
UsertoWorldResponse_Struct *utwr = (UsertoWorldResponse_Struct*)p.Data();
|
||||||
Log.Out(Logs::General, Logs::Debug, "Trying to find client with user id of %u.", utwr->lsaccountid);
|
Log(Logs::General, Logs::Debug, "Trying to find client with user id of %u.", utwr->lsaccountid);
|
||||||
Client *c = server.client_manager->GetClient(utwr->lsaccountid);
|
Client *c = server.client_manager->GetClient(utwr->lsaccountid);
|
||||||
if (c)
|
if (c)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Debug, "Found client with user id of %u and account name of %s.", utwr->lsaccountid, c->GetAccountName().c_str());
|
Log(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();
|
||||||
Log.Out(Logs::General, Logs::Debug, "Found sequence and play of %u %u", c->GetPlaySequence(), c->GetPlayServerID());
|
Log(Logs::General, Logs::Debug, "Found sequence and play of %u %u", c->GetPlaySequence(), c->GetPlayServerID());
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[Size: %u] %s", outapp->size, DumpPacketToString(outapp).c_str());
|
Log(Logs::General, Logs::Netcode, "[Size: %u] %s", outapp->size, DumpPacketToString(outapp).c_str());
|
||||||
|
|
||||||
if (utwr->response > 0)
|
if (utwr->response > 0)
|
||||||
{
|
{
|
||||||
@ -185,9 +184,9 @@ void WorldServer::ProcessUsertoWorldResp(uint16_t opcode, const EQ::Net::Packet
|
|||||||
|
|
||||||
if (server.options.IsTraceOn())
|
if (server.options.IsTraceOn())
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Netcode, "Sending play response with following data, allowed %u, sequence %u, server number %u, message %u",
|
Log(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);
|
||||||
Log.Out(Logs::General, Logs::Netcode, "[Size: %u] %s", outapp->size, DumpPacketToString(outapp).c_str());
|
Log(Logs::General, Logs::Netcode, "[Size: %u] %s", outapp->size, DumpPacketToString(outapp).c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (server.options.IsDumpOutPacketsOn())
|
if (server.options.IsDumpOutPacketsOn())
|
||||||
@ -200,7 +199,7 @@ void WorldServer::ProcessUsertoWorldResp(uint16_t opcode, const EQ::Net::Packet
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Recieved User-To-World Response for %u but could not find the client referenced!.", utwr->lsaccountid);
|
Log(Logs::General, Logs::Error, "Recieved User-To-World Response for %u but could not find the client referenced!.", utwr->lsaccountid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -208,7 +207,7 @@ void WorldServer::ProcessLSAccountUpdate(uint16_t opcode, const EQ::Net::Packet
|
|||||||
{
|
{
|
||||||
if (server.options.IsWorldTraceOn())
|
if (server.options.IsWorldTraceOn())
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Netcode, "Application packet received from server: 0x%.4X, (size %u)", opcode, p.Length());
|
Log(Logs::General, Logs::Netcode, "Application packet received from server: 0x%.4X, (size %u)", opcode, p.Length());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (server.options.IsDumpInPacketsOn())
|
if (server.options.IsDumpInPacketsOn())
|
||||||
@ -218,16 +217,16 @@ void WorldServer::ProcessLSAccountUpdate(uint16_t opcode, const EQ::Net::Packet
|
|||||||
|
|
||||||
if (p.Length() < sizeof(ServerLSAccountUpdate_Struct))
|
if (p.Length() < sizeof(ServerLSAccountUpdate_Struct))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Recieved application packet from server that had opcode ServerLSAccountUpdate_Struct, "
|
Log(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.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Netcode, "ServerOP_LSAccountUpdate packet received from: %s", short_name.c_str());
|
Log(Logs::General, Logs::Netcode, "ServerOP_LSAccountUpdate packet received from: %s", short_name.c_str());
|
||||||
ServerLSAccountUpdate_Struct *lsau = (ServerLSAccountUpdate_Struct*)p.Data();
|
ServerLSAccountUpdate_Struct *lsau = (ServerLSAccountUpdate_Struct*)p.Data();
|
||||||
if (is_server_trusted)
|
if (is_server_trusted)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Netcode, "ServerOP_LSAccountUpdate update processed for: %s", lsau->useraccount);
|
Log(Logs::General, Logs::Netcode, "ServerOP_LSAccountUpdate update processed for: %s", lsau->useraccount);
|
||||||
std::string name;
|
std::string name;
|
||||||
std::string password;
|
std::string password;
|
||||||
std::string email;
|
std::string email;
|
||||||
@ -240,57 +239,57 @@ void WorldServer::ProcessLSAccountUpdate(uint16_t opcode, const EQ::Net::Packet
|
|||||||
|
|
||||||
void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
|
void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
|
||||||
{
|
{
|
||||||
if(is_server_logged_in)
|
if (is_server_logged_in)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "WorldServer::Handle_NewLSInfo called but the login server was already marked as logged in, aborting.");
|
Log(Logs::General, Logs::Error, "WorldServer::Handle_NewLSInfo called but the login server was already marked as logged in, aborting.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(strlen(i->account) <= 30)
|
if (strlen(i->account) <= 30)
|
||||||
{
|
{
|
||||||
account_name = i->account;
|
account_name = i->account;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Handle_NewLSInfo error, account name was too long.");
|
Log(Logs::General, Logs::Error, "Handle_NewLSInfo error, account name was too long.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(strlen(i->password) <= 30)
|
if (strlen(i->password) <= 30)
|
||||||
{
|
{
|
||||||
account_password = i->password;
|
account_password = i->password;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Handle_NewLSInfo error, account password was too long.");
|
Log(Logs::General, Logs::Error, "Handle_NewLSInfo error, account password was too long.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(strlen(i->name) <= 200)
|
if (strlen(i->name) <= 200)
|
||||||
{
|
{
|
||||||
long_name = i->name;
|
long_name = i->name;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Handle_NewLSInfo error, long name was too long.");
|
Log(Logs::General, Logs::Error, "Handle_NewLSInfo error, long name was too long.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(strlen(i->shortname) <= 50)
|
if (strlen(i->shortname) <= 50)
|
||||||
{
|
{
|
||||||
short_name = i->shortname;
|
short_name = i->shortname;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Handle_NewLSInfo error, short name was too long.");
|
Log(Logs::General, Logs::Error, "Handle_NewLSInfo error, short name was too long.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(strlen(i->local_address) <= 125)
|
if (strlen(i->local_address) <= 125)
|
||||||
{
|
{
|
||||||
if(strlen(i->local_address) == 0)
|
if (strlen(i->local_address) == 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Handle_NewLSInfo error, local address was null, defaulting to localhost");
|
Log(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
|
||||||
@ -300,16 +299,16 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Handle_NewLSInfo error, local address was too long.");
|
Log(Logs::General, Logs::Error, "Handle_NewLSInfo error, local address was too long.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(strlen(i->remote_address) <= 125)
|
if (strlen(i->remote_address) <= 125)
|
||||||
{
|
{
|
||||||
if(strlen(i->remote_address) == 0)
|
if (strlen(i->remote_address) == 0)
|
||||||
{
|
{
|
||||||
remote_ip = GetConnection()->Handle()->RemoteIP();
|
remote_ip = GetConnection()->Handle()->RemoteIP();
|
||||||
Log.Out(Logs::General, Logs::Error, "Handle_NewLSInfo error, remote address was null, defaulting to stream address %s.", remote_ip.c_str());
|
Log(Logs::General, Logs::Error, "Handle_NewLSInfo error, remote address was null, defaulting to stream address %s.", remote_ip.c_str());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -319,52 +318,52 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
remote_ip = GetConnection()->Handle()->RemoteIP();
|
remote_ip = GetConnection()->Handle()->RemoteIP();
|
||||||
Log.Out(Logs::General, Logs::Error, "Handle_NewLSInfo error, remote address was too long, defaulting to stream address %s.", remote_ip.c_str());
|
Log(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)
|
||||||
{
|
{
|
||||||
version = i->serverversion;
|
version = i->serverversion;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Handle_NewLSInfo error, server version was too long.");
|
Log(Logs::General, Logs::Error, "Handle_NewLSInfo error, server version was too long.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(strlen(i->protocolversion) <= 25)
|
if (strlen(i->protocolversion) <= 25)
|
||||||
{
|
{
|
||||||
protocol = i->protocolversion;
|
protocol = i->protocolversion;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Handle_NewLSInfo error, protocol version was too long.");
|
Log(Logs::General, Logs::Error, "Handle_NewLSInfo error, protocol version was too long.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
server_type = i->servertype;
|
server_type = i->servertype;
|
||||||
is_server_logged_in = true;
|
is_server_logged_in = true;
|
||||||
|
|
||||||
if(server.options.IsRejectingDuplicateServers())
|
if (server.options.IsRejectingDuplicateServers())
|
||||||
{
|
{
|
||||||
if(server.server_manager->ServerExists(long_name, short_name, this))
|
if (server.server_manager->ServerExists(long_name, short_name, this))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "World tried to login but there already exists a server that has that name.");
|
Log(Logs::General, Logs::Error, "World tried to login but there already exists a server that has that name.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(server.server_manager->ServerExists(long_name, short_name, this))
|
if (server.server_manager->ServerExists(long_name, short_name, this))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "World tried to login but there already exists a server that has that name.");
|
Log(Logs::General, Logs::Error, "World tried to login but there already exists a server that has that name.");
|
||||||
server.server_manager->DestroyServerByName(long_name, short_name, this);
|
server.server_manager->DestroyServerByName(long_name, short_name, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!server.options.IsUnregisteredAllowed())
|
if (!server.options.IsUnregisteredAllowed())
|
||||||
{
|
{
|
||||||
if(account_name.size() > 0 && account_password.size() > 0)
|
if (account_name.size() > 0 && account_password.size() > 0)
|
||||||
{
|
{
|
||||||
unsigned int s_id = 0;
|
unsigned int s_id = 0;
|
||||||
unsigned int s_list_type = 0;
|
unsigned int s_list_type = 0;
|
||||||
@ -373,27 +372,27 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
|
|||||||
std::string s_list_desc;
|
std::string s_list_desc;
|
||||||
std::string s_acct_name;
|
std::string s_acct_name;
|
||||||
std::string s_acct_pass;
|
std::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, s_id, s_desc, s_list_type, s_trusted, s_list_desc, s_acct_name, s_acct_pass))
|
||||||
{
|
{
|
||||||
if(s_acct_name.size() == 0 || s_acct_pass.size() == 0)
|
if (s_acct_name.size() == 0 || s_acct_pass.size() == 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Server %s(%s) successfully logged into account that had no user/password requirement.",
|
Log(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());
|
||||||
is_server_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)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Server %s(%s) successfully logged in.",
|
Log(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());
|
||||||
is_server_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");
|
Log(Logs::General, Logs::Netcode, "ServerOP_LSAccountUpdate sent to world");
|
||||||
is_server_trusted = true;
|
is_server_trusted = true;
|
||||||
|
|
||||||
EQ::Net::DynamicPacket outapp;
|
EQ::Net::DynamicPacket outapp;
|
||||||
@ -401,19 +400,19 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
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"
|
Log(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"
|
||||||
" 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.",
|
Log(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.",
|
||||||
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.",
|
Log(Logs::General, Logs::World_Server, "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;
|
||||||
}
|
}
|
||||||
@ -428,7 +427,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
|
|||||||
std::string server_account_password;
|
std::string server_account_password;
|
||||||
|
|
||||||
|
|
||||||
if(server.db->GetWorldRegistration(
|
if (server.db->GetWorldRegistration(
|
||||||
long_name,
|
long_name,
|
||||||
short_name,
|
short_name,
|
||||||
server_id,
|
server_id,
|
||||||
@ -440,17 +439,17 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
|
|||||||
server_account_password))
|
server_account_password))
|
||||||
{
|
{
|
||||||
|
|
||||||
if(account_name.size() > 0 && account_password.size() > 0) {
|
if (account_name.size() > 0 && account_password.size() > 0) {
|
||||||
if(server_account_name.compare(account_name) == 0 && server_account_password.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.",
|
Log(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());
|
||||||
is_server_authorized = true;
|
is_server_authorized = true;
|
||||||
SetRuntimeID(server_id);
|
SetRuntimeID(server_id);
|
||||||
server_list_id = server_list_type;
|
server_list_id = server_list_type;
|
||||||
desc = server_description;
|
desc = server_description;
|
||||||
|
|
||||||
if(is_server_trusted) {
|
if (is_server_trusted) {
|
||||||
Log.Out(Logs::General, Logs::Netcode, "ServerOP_LSAccountUpdate sent to world");
|
Log(Logs::General, Logs::Netcode, "ServerOP_LSAccountUpdate sent to world");
|
||||||
is_server_trusted = true;
|
is_server_trusted = true;
|
||||||
EQ::Net::DynamicPacket outapp;
|
EQ::Net::DynamicPacket outapp;
|
||||||
connection->Send(ServerOP_LSAccountUpdate, outapp);
|
connection->Send(ServerOP_LSAccountUpdate, outapp);
|
||||||
@ -458,18 +457,18 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
|
|||||||
}
|
}
|
||||||
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
|
||||||
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.",
|
Log(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 (server_account_name.size() > 0 || server_account_password.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
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Server %s(%s) did not attempt to log in but this server requires a password.",
|
Log(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.",
|
Log(Logs::General, Logs::World_Server, "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());
|
||||||
is_server_authorized = true;
|
is_server_authorized = true;
|
||||||
SetRuntimeID(server_id);
|
SetRuntimeID(server_id);
|
||||||
@ -479,9 +478,9 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
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.",
|
Log(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, server_id)) {
|
if (server.db->CreateWorldRegistration(long_name, short_name, server_id)) {
|
||||||
is_server_authorized = true;
|
is_server_authorized = true;
|
||||||
SetRuntimeID(server_id);
|
SetRuntimeID(server_id);
|
||||||
server_list_id = 3;
|
server_list_id = 3;
|
||||||
@ -531,4 +530,3 @@ void WorldServer::SendClientAuth(std::string ip, std::string account, std::strin
|
|||||||
DumpPacket(ServerOP_LSClientAuth, outapp);
|
DumpPacket(ServerOP_LSClientAuth, outapp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -69,14 +69,14 @@ bool Database::Connect(const char* host, const char* user, const char* passwd, c
|
|||||||
char errbuf[MYSQL_ERRMSG_SIZE];
|
char errbuf[MYSQL_ERRMSG_SIZE];
|
||||||
if (!Open(host, user, passwd, database, port, &errnum, errbuf))
|
if (!Open(host, user, passwd, database, port, &errnum, errbuf))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Failed to connect to database: Error: %s", errbuf);
|
Log(Logs::General, Logs::Error, "Failed to connect to database: Error: %s", errbuf);
|
||||||
HandleMysqlError(errnum);
|
HandleMysqlError(errnum);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Status, "Using database '%s' at %s:%d",database,host,port);
|
Log(Logs::General, Logs::Status, "Using database '%s' at %s:%d",database,host,port);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -116,8 +116,8 @@ void Database::AddSpeech(const char* from, const char* to, const char* message,
|
|||||||
safe_delete_array(escapedMessage);
|
safe_delete_array(escapedMessage);
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
if(!results.Success()) {
|
if(!results.Success()) {
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "Failed Speech Entry Insert: %s", results.ErrorMessage().c_str());
|
Log(Logs::Detail, Logs::QS_Server, "Failed Speech Entry Insert: %s", results.ErrorMessage().c_str());
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
Log(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -136,8 +136,8 @@ void Database::LogPlayerTrade(QSPlayerLogTrade_Struct* QS, uint32 detailCount) {
|
|||||||
QS->char2_money.silver, QS->char2_money.copper, QS->char2_count);
|
QS->char2_money.silver, QS->char2_money.copper, QS->char2_count);
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
if(!results.Success()) {
|
if(!results.Success()) {
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "Failed Trade Log Record Insert: %s", results.ErrorMessage().c_str());
|
Log(Logs::Detail, Logs::QS_Server, "Failed Trade Log Record Insert: %s", results.ErrorMessage().c_str());
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
Log(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(detailCount == 0)
|
if(detailCount == 0)
|
||||||
@ -156,8 +156,8 @@ void Database::LogPlayerTrade(QSPlayerLogTrade_Struct* QS, uint32 detailCount) {
|
|||||||
QS->items[i].aug_3, QS->items[i].aug_4, QS->items[i].aug_5);
|
QS->items[i].aug_3, QS->items[i].aug_4, QS->items[i].aug_5);
|
||||||
results = QueryDatabase(query);
|
results = QueryDatabase(query);
|
||||||
if(!results.Success()) {
|
if(!results.Success()) {
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "Failed Trade Log Record Entry Insert: %s", results.ErrorMessage().c_str());
|
Log(Logs::Detail, Logs::QS_Server, "Failed Trade Log Record Entry Insert: %s", results.ErrorMessage().c_str());
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
Log(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -179,8 +179,8 @@ void Database::LogPlayerHandin(QSPlayerLogHandin_Struct* QS, uint32 detailCount)
|
|||||||
QS->npc_count);
|
QS->npc_count);
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
if(!results.Success()) {
|
if(!results.Success()) {
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "Failed Handin Log Record Insert: %s", results.ErrorMessage().c_str());
|
Log(Logs::Detail, Logs::QS_Server, "Failed Handin Log Record Insert: %s", results.ErrorMessage().c_str());
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
Log(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(detailCount == 0)
|
if(detailCount == 0)
|
||||||
@ -198,8 +198,8 @@ void Database::LogPlayerHandin(QSPlayerLogHandin_Struct* QS, uint32 detailCount)
|
|||||||
QS->items[i].aug_2, QS->items[i].aug_3, QS->items[i].aug_4,
|
QS->items[i].aug_2, QS->items[i].aug_3, QS->items[i].aug_4,
|
||||||
QS->items[i].aug_5);
|
QS->items[i].aug_5);
|
||||||
if(!results.Success()) {
|
if(!results.Success()) {
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "Failed Handin Log Record Entry Insert: %s", results.ErrorMessage().c_str());
|
Log(Logs::Detail, Logs::QS_Server, "Failed Handin Log Record Entry Insert: %s", results.ErrorMessage().c_str());
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
Log(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,8 +213,8 @@ void Database::LogPlayerNPCKill(QSPlayerLogNPCKill_Struct* QS, uint32 members){
|
|||||||
QS->s1.NPCID, QS->s1.Type, QS->s1.ZoneID);
|
QS->s1.NPCID, QS->s1.Type, QS->s1.ZoneID);
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
if(!results.Success()) {
|
if(!results.Success()) {
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "Failed NPC Kill Log Record Insert: %s", results.ErrorMessage().c_str());
|
Log(Logs::Detail, Logs::QS_Server, "Failed NPC Kill Log Record Insert: %s", results.ErrorMessage().c_str());
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
Log(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(members == 0)
|
if(members == 0)
|
||||||
@ -228,8 +228,8 @@ void Database::LogPlayerNPCKill(QSPlayerLogNPCKill_Struct* QS, uint32 members){
|
|||||||
lastIndex, QS->Chars[i].char_id);
|
lastIndex, QS->Chars[i].char_id);
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
if(!results.Success()) {
|
if(!results.Success()) {
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "Failed NPC Kill Log Entry Insert: %s", results.ErrorMessage().c_str());
|
Log(Logs::Detail, Logs::QS_Server, "Failed NPC Kill Log Entry Insert: %s", results.ErrorMessage().c_str());
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
Log(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -243,8 +243,8 @@ void Database::LogPlayerDelete(QSPlayerLogDelete_Struct* QS, uint32 items) {
|
|||||||
QS->char_id, QS->stack_size, QS->char_count, QS->char_count);
|
QS->char_id, QS->stack_size, QS->char_count, QS->char_count);
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
if(!results.Success()) {
|
if(!results.Success()) {
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "Failed Delete Log Record Insert: %s", results.ErrorMessage().c_str());
|
Log(Logs::Detail, Logs::QS_Server, "Failed Delete Log Record Insert: %s", results.ErrorMessage().c_str());
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
Log(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(items == 0)
|
if(items == 0)
|
||||||
@ -261,8 +261,8 @@ void Database::LogPlayerDelete(QSPlayerLogDelete_Struct* QS, uint32 items) {
|
|||||||
QS->items[i].aug_5);
|
QS->items[i].aug_5);
|
||||||
results = QueryDatabase(query);
|
results = QueryDatabase(query);
|
||||||
if(!results.Success()) {
|
if(!results.Success()) {
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "Failed Delete Log Record Entry Insert: %s", results.ErrorMessage().c_str());
|
Log(Logs::Detail, Logs::QS_Server, "Failed Delete Log Record Entry Insert: %s", results.ErrorMessage().c_str());
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
Log(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -279,8 +279,8 @@ void Database::LogPlayerMove(QSPlayerLogMove_Struct* QS, uint32 items) {
|
|||||||
QS->char_count, QS->postaction);
|
QS->char_count, QS->postaction);
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
if(!results.Success()) {
|
if(!results.Success()) {
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "Failed Move Log Record Insert: %s", results.ErrorMessage().c_str());
|
Log(Logs::Detail, Logs::QS_Server, "Failed Move Log Record Insert: %s", results.ErrorMessage().c_str());
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
Log(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(items == 0)
|
if(items == 0)
|
||||||
@ -297,8 +297,8 @@ void Database::LogPlayerMove(QSPlayerLogMove_Struct* QS, uint32 items) {
|
|||||||
QS->items[i].aug_3, QS->items[i].aug_4, QS->items[i].aug_5);
|
QS->items[i].aug_3, QS->items[i].aug_4, QS->items[i].aug_5);
|
||||||
results = QueryDatabase(query);
|
results = QueryDatabase(query);
|
||||||
if(!results.Success()) {
|
if(!results.Success()) {
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "Failed Move Log Record Entry Insert: %s", results.ErrorMessage().c_str());
|
Log(Logs::Detail, Logs::QS_Server, "Failed Move Log Record Entry Insert: %s", results.ErrorMessage().c_str());
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
Log(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -320,8 +320,8 @@ void Database::LogMerchantTransaction(QSMerchantLogTransaction_Struct* QS, uint3
|
|||||||
QS->char_money.copper, QS->char_count);
|
QS->char_money.copper, QS->char_count);
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
if(!results.Success()) {
|
if(!results.Success()) {
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "Failed Transaction Log Record Insert: %s", results.ErrorMessage().c_str());
|
Log(Logs::Detail, Logs::QS_Server, "Failed Transaction Log Record Insert: %s", results.ErrorMessage().c_str());
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
Log(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(items == 0)
|
if(items == 0)
|
||||||
@ -338,8 +338,8 @@ void Database::LogMerchantTransaction(QSMerchantLogTransaction_Struct* QS, uint3
|
|||||||
QS->items[i].aug_5);
|
QS->items[i].aug_5);
|
||||||
results = QueryDatabase(query);
|
results = QueryDatabase(query);
|
||||||
if(!results.Success()) {
|
if(!results.Success()) {
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "Failed Transaction Log Record Entry Insert: %s", results.ErrorMessage().c_str());
|
Log(Logs::Detail, Logs::QS_Server, "Failed Transaction Log Record Entry Insert: %s", results.ErrorMessage().c_str());
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
Log(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -356,8 +356,8 @@ void Database::GeneralQueryReceive(ServerPacket *pack) {
|
|||||||
std::string query(queryBuffer);
|
std::string query(queryBuffer);
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
if (!results.Success()) {
|
if (!results.Success()) {
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "Failed Delete Log Record Insert: %s", results.ErrorMessage().c_str());
|
Log(Logs::Detail, Logs::QS_Server, "Failed Delete Log Record Insert: %s", results.ErrorMessage().c_str());
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
Log(Logs::Detail, Logs::QS_Server, "%s", query.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
safe_delete(pack);
|
safe_delete(pack);
|
||||||
@ -378,7 +378,7 @@ void Database::LoadLogSettings(EQEmuLogSys::LogSettings* log_settings){
|
|||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
|
|
||||||
int log_category = 0;
|
int log_category = 0;
|
||||||
Log.file_logs_enabled = false;
|
LogSys.file_logs_enabled = false;
|
||||||
|
|
||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
log_category = atoi(row[0]);
|
log_category = atoi(row[0]);
|
||||||
@ -401,7 +401,7 @@ void Database::LoadLogSettings(EQEmuLogSys::LogSettings* log_settings){
|
|||||||
If we go through this whole loop and nothing is set to any debug level, there is no point to create a file or keep anything open
|
If we go through this whole loop and nothing is set to any debug level, there is no point to create a file or keep anything open
|
||||||
*/
|
*/
|
||||||
if (log_settings[log_category].log_to_file > 0){
|
if (log_settings[log_category].log_to_file > 0){
|
||||||
Log.file_logs_enabled = true;
|
LogSys.file_logs_enabled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -40,7 +40,7 @@ LFGuildManager lfguildmanager;
|
|||||||
std::string WorldShortName;
|
std::string WorldShortName;
|
||||||
const queryservconfig *Config;
|
const queryservconfig *Config;
|
||||||
WorldServer *worldserver = 0;
|
WorldServer *worldserver = 0;
|
||||||
EQEmuLogSys Log;
|
EQEmuLogSys LogSys;
|
||||||
|
|
||||||
void CatchSignal(int sig_num) {
|
void CatchSignal(int sig_num) {
|
||||||
RunLoops = false;
|
RunLoops = false;
|
||||||
@ -48,20 +48,20 @@ void CatchSignal(int sig_num) {
|
|||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
RegisterExecutablePlatform(ExePlatformQueryServ);
|
RegisterExecutablePlatform(ExePlatformQueryServ);
|
||||||
Log.LoadLogSettingsDefaults();
|
LogSys.LoadLogSettingsDefaults();
|
||||||
set_exception_handler();
|
set_exception_handler();
|
||||||
Timer LFGuildExpireTimer(60000);
|
Timer LFGuildExpireTimer(60000);
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::QS_Server, "Starting EQEmu QueryServ.");
|
Log(Logs::General, Logs::QS_Server, "Starting EQEmu QueryServ.");
|
||||||
if (!queryservconfig::LoadConfig()) {
|
if (!queryservconfig::LoadConfig()) {
|
||||||
Log.Out(Logs::General, Logs::QS_Server, "Loading server configuration failed.");
|
Log(Logs::General, Logs::QS_Server, "Loading server configuration failed.");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Config = queryservconfig::get();
|
Config = queryservconfig::get();
|
||||||
WorldShortName = Config->ShortName;
|
WorldShortName = Config->ShortName;
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::QS_Server, "Connecting to MySQL...");
|
Log(Logs::General, Logs::QS_Server, "Connecting to MySQL...");
|
||||||
|
|
||||||
/* MySQL Connection */
|
/* MySQL Connection */
|
||||||
if (!database.Connect(
|
if (!database.Connect(
|
||||||
@ -70,20 +70,20 @@ int main() {
|
|||||||
Config->QSDatabasePassword.c_str(),
|
Config->QSDatabasePassword.c_str(),
|
||||||
Config->QSDatabaseDB.c_str(),
|
Config->QSDatabaseDB.c_str(),
|
||||||
Config->QSDatabasePort)) {
|
Config->QSDatabasePort)) {
|
||||||
Log.Out(Logs::General, Logs::QS_Server, "Cannot continue without a database connection.");
|
Log(Logs::General, Logs::QS_Server, "Cannot continue without a database connection.");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Register Log System and Settings */
|
/* Register Log System and Settings */
|
||||||
database.LoadLogSettings(Log.log_settings);
|
database.LoadLogSettings(LogSys.log_settings);
|
||||||
Log.StartFileLogs();
|
LogSys.StartFileLogs();
|
||||||
|
|
||||||
if (signal(SIGINT, CatchSignal) == SIG_ERR) {
|
if (signal(SIGINT, CatchSignal) == SIG_ERR) {
|
||||||
Log.Out(Logs::General, Logs::QS_Server, "Could not set signal handler");
|
Log(Logs::General, Logs::QS_Server, "Could not set signal handler");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (signal(SIGTERM, CatchSignal) == SIG_ERR) {
|
if (signal(SIGTERM, CatchSignal) == SIG_ERR) {
|
||||||
Log.Out(Logs::General, Logs::QS_Server, "Could not set signal handler");
|
Log(Logs::General, Logs::QS_Server, "Could not set signal handler");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,7 +102,7 @@ int main() {
|
|||||||
EQ::EventLoop::Get().Process();
|
EQ::EventLoop::Get().Process();
|
||||||
Sleep(5);
|
Sleep(5);
|
||||||
}
|
}
|
||||||
Log.CloseFileLogs();
|
LogSys.CloseFileLogs();
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateWindowTitle(char* iNewTitle) {
|
void UpdateWindowTitle(char* iNewTitle) {
|
||||||
|
|||||||
@ -1,19 +1,19 @@
|
|||||||
/* EQEMu: Everquest Server Emulator
|
/* EQEMu: Everquest Server Emulator
|
||||||
Copyright (C) 2001-2002 EQEMu Development Team (http://eqemu.org)
|
Copyright (C) 2001-2002 EQEMu Development Team (http://eqemu.org)
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; version 2 of the License.
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
are required to give you total support for your newly bought product;
|
are required to give you total support for your newly bought product;
|
||||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@ -79,9 +79,7 @@ bool WorldServer::Connected() const
|
|||||||
|
|
||||||
void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
|
void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
|
||||||
{
|
{
|
||||||
Log.OutF(Logs::General, Logs::Debug, "Received Opcode: {0}\n{1}", opcode, p.ToString());
|
switch (opcode) {
|
||||||
|
|
||||||
switch(opcode) {
|
|
||||||
case 0: {
|
case 0: {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -154,8 +152,8 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
|
|||||||
auto from = p.GetCString(8);
|
auto from = p.GetCString(8);
|
||||||
uint32 Type = p.GetUInt32(8 + from.length() + 1);
|
uint32 Type = p.GetUInt32(8 + from.length() + 1);
|
||||||
|
|
||||||
switch(Type) {
|
switch (Type) {
|
||||||
case QSG_LFGuild:{
|
case QSG_LFGuild: {
|
||||||
ServerPacket pack;
|
ServerPacket pack;
|
||||||
pack.pBuffer = (uchar*)p.Data();
|
pack.pBuffer = (uchar*)p.Data();
|
||||||
pack.opcode = opcode;
|
pack.opcode = opcode;
|
||||||
@ -165,7 +163,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
Log.Out(Logs::Detail, Logs::QS_Server, "Received unhandled ServerOP_QueryServGeneric", Type);
|
Log(Logs::Detail, Logs::QS_Server, "Received unhandled ServerOP_QueryServGeneric", Type);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -34,7 +34,7 @@
|
|||||||
#include "spells.h"
|
#include "spells.h"
|
||||||
#include "base_data.h"
|
#include "base_data.h"
|
||||||
|
|
||||||
EQEmuLogSys Log;
|
EQEmuLogSys LogSys;
|
||||||
|
|
||||||
#ifdef _WINDOWS
|
#ifdef _WINDOWS
|
||||||
#include <direct.h>
|
#include <direct.h>
|
||||||
@ -71,33 +71,33 @@ inline bool MakeDirectory(const std::string &directory_name)
|
|||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
RegisterExecutablePlatform(ExePlatformSharedMemory);
|
RegisterExecutablePlatform(ExePlatformSharedMemory);
|
||||||
Log.LoadLogSettingsDefaults();
|
LogSys.LoadLogSettingsDefaults();
|
||||||
set_exception_handler();
|
set_exception_handler();
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Status, "Shared Memory Loader Program");
|
Log(Logs::General, Logs::Status, "Shared Memory Loader Program");
|
||||||
if(!EQEmuConfig::LoadConfig()) {
|
if(!EQEmuConfig::LoadConfig()) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Unable to load configuration file.");
|
Log(Logs::General, Logs::Error, "Unable to load configuration file.");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Config = EQEmuConfig::get();
|
auto Config = EQEmuConfig::get();
|
||||||
|
|
||||||
SharedDatabase database;
|
SharedDatabase database;
|
||||||
Log.Out(Logs::General, Logs::Status, "Connecting to database...");
|
Log(Logs::General, Logs::Status, "Connecting to database...");
|
||||||
if(!database.Connect(Config->DatabaseHost.c_str(), Config->DatabaseUsername.c_str(),
|
if(!database.Connect(Config->DatabaseHost.c_str(), Config->DatabaseUsername.c_str(),
|
||||||
Config->DatabasePassword.c_str(), Config->DatabaseDB.c_str(), Config->DatabasePort)) {
|
Config->DatabasePassword.c_str(), Config->DatabaseDB.c_str(), Config->DatabasePort)) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Unable to connect to the database, cannot continue without a "
|
Log(Logs::General, Logs::Error, "Unable to connect to the database, cannot continue without a "
|
||||||
"database connection");
|
"database connection");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Register Log System and Settings */
|
/* Register Log System and Settings */
|
||||||
database.LoadLogSettings(Log.log_settings);
|
database.LoadLogSettings(LogSys.log_settings);
|
||||||
Log.StartFileLogs();
|
LogSys.StartFileLogs();
|
||||||
|
|
||||||
std::string shared_mem_directory = Config->SharedMemDir;
|
std::string shared_mem_directory = Config->SharedMemDir;
|
||||||
if (MakeDirectory(shared_mem_directory)) {
|
if (MakeDirectory(shared_mem_directory)) {
|
||||||
Log.Out(Logs::General, Logs::Status, "Shared Memory folder doesn't exist, so we created it... '%s'", shared_mem_directory.c_str());
|
Log(Logs::General, Logs::Status, "Shared Memory folder doesn't exist, so we created it... '%s'", shared_mem_directory.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
database.LoadVariables();
|
database.LoadVariables();
|
||||||
@ -106,7 +106,7 @@ int main(int argc, char **argv) {
|
|||||||
std::string db_hotfix_name;
|
std::string db_hotfix_name;
|
||||||
if (database.GetVariable("hotfix_name", db_hotfix_name)) {
|
if (database.GetVariable("hotfix_name", db_hotfix_name)) {
|
||||||
if (!db_hotfix_name.empty() && strcasecmp("hotfix_", db_hotfix_name.c_str()) == 0) {
|
if (!db_hotfix_name.empty() && strcasecmp("hotfix_", db_hotfix_name.c_str()) == 0) {
|
||||||
Log.Out(Logs::General, Logs::Status, "Current hotfix in variables is the default %s, clearing out variable", db_hotfix_name.c_str());
|
Log(Logs::General, Logs::Status, "Current hotfix in variables is the default %s, clearing out variable", db_hotfix_name.c_str());
|
||||||
std::string query = StringFormat("UPDATE `variables` SET `value`='' WHERE (`varname`='hotfix_name')");
|
std::string query = StringFormat("UPDATE `variables` SET `value`='' WHERE (`varname`='hotfix_name')");
|
||||||
database.QueryDatabase(query);
|
database.QueryDatabase(query);
|
||||||
}
|
}
|
||||||
@ -177,69 +177,69 @@ int main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(hotfix_name.length() > 0) {
|
if(hotfix_name.length() > 0) {
|
||||||
Log.Out(Logs::General, Logs::Status, "Writing data for hotfix '%s'", hotfix_name.c_str());
|
Log(Logs::General, Logs::Status, "Writing data for hotfix '%s'", hotfix_name.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(load_all || load_items) {
|
if(load_all || load_items) {
|
||||||
Log.Out(Logs::General, Logs::Status, "Loading items...");
|
Log(Logs::General, Logs::Status, "Loading items...");
|
||||||
try {
|
try {
|
||||||
LoadItems(&database, hotfix_name);
|
LoadItems(&database, hotfix_name);
|
||||||
} catch(std::exception &ex) {
|
} catch(std::exception &ex) {
|
||||||
Log.Out(Logs::General, Logs::Error, "%s", ex.what());
|
Log(Logs::General, Logs::Error, "%s", ex.what());
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(load_all || load_factions) {
|
if(load_all || load_factions) {
|
||||||
Log.Out(Logs::General, Logs::Status, "Loading factions...");
|
Log(Logs::General, Logs::Status, "Loading factions...");
|
||||||
try {
|
try {
|
||||||
LoadFactions(&database, hotfix_name);
|
LoadFactions(&database, hotfix_name);
|
||||||
} catch(std::exception &ex) {
|
} catch(std::exception &ex) {
|
||||||
Log.Out(Logs::General, Logs::Error, "%s", ex.what());
|
Log(Logs::General, Logs::Error, "%s", ex.what());
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(load_all || load_loot) {
|
if(load_all || load_loot) {
|
||||||
Log.Out(Logs::General, Logs::Status, "Loading loot...");
|
Log(Logs::General, Logs::Status, "Loading loot...");
|
||||||
try {
|
try {
|
||||||
LoadLoot(&database, hotfix_name);
|
LoadLoot(&database, hotfix_name);
|
||||||
} catch(std::exception &ex) {
|
} catch(std::exception &ex) {
|
||||||
Log.Out(Logs::General, Logs::Error, "%s", ex.what());
|
Log(Logs::General, Logs::Error, "%s", ex.what());
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(load_all || load_skill_caps) {
|
if(load_all || load_skill_caps) {
|
||||||
Log.Out(Logs::General, Logs::Status, "Loading skill caps...");
|
Log(Logs::General, Logs::Status, "Loading skill caps...");
|
||||||
try {
|
try {
|
||||||
LoadSkillCaps(&database, hotfix_name);
|
LoadSkillCaps(&database, hotfix_name);
|
||||||
} catch(std::exception &ex) {
|
} catch(std::exception &ex) {
|
||||||
Log.Out(Logs::General, Logs::Error, "%s", ex.what());
|
Log(Logs::General, Logs::Error, "%s", ex.what());
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(load_all || load_spells) {
|
if(load_all || load_spells) {
|
||||||
Log.Out(Logs::General, Logs::Status, "Loading spells...");
|
Log(Logs::General, Logs::Status, "Loading spells...");
|
||||||
try {
|
try {
|
||||||
LoadSpells(&database, hotfix_name);
|
LoadSpells(&database, hotfix_name);
|
||||||
} catch(std::exception &ex) {
|
} catch(std::exception &ex) {
|
||||||
Log.Out(Logs::General, Logs::Error, "%s", ex.what());
|
Log(Logs::General, Logs::Error, "%s", ex.what());
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(load_all || load_bd) {
|
if(load_all || load_bd) {
|
||||||
Log.Out(Logs::General, Logs::Status, "Loading base data...");
|
Log(Logs::General, Logs::Status, "Loading base data...");
|
||||||
try {
|
try {
|
||||||
LoadBaseData(&database, hotfix_name);
|
LoadBaseData(&database, hotfix_name);
|
||||||
} catch(std::exception &ex) {
|
} catch(std::exception &ex) {
|
||||||
Log.Out(Logs::General, Logs::Error, "%s", ex.what());
|
Log(Logs::General, Logs::Error, "%s", ex.what());
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.CloseFileLogs();
|
LogSys.CloseFileLogs();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -43,7 +43,7 @@ ChatChannel::ChatChannel(std::string inName, std::string inOwner, std::string in
|
|||||||
|
|
||||||
Moderated = false;
|
Moderated = false;
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "New ChatChannel created: Name: [%s], Owner: [%s], Password: [%s], MinStatus: %i",
|
Log(Logs::Detail, Logs::UCS_Server, "New ChatChannel created: Name: [%s], Owner: [%s], Password: [%s], MinStatus: %i",
|
||||||
Name.c_str(), Owner.c_str(), Password.c_str(), MinimumStatus);
|
Name.c_str(), Owner.c_str(), Password.c_str(), MinimumStatus);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -150,7 +150,7 @@ void ChatChannelList::SendAllChannels(Client *c) {
|
|||||||
|
|
||||||
void ChatChannelList::RemoveChannel(ChatChannel *Channel) {
|
void ChatChannelList::RemoveChannel(ChatChannel *Channel) {
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "RemoveChannel(%s)", Channel->GetName().c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "RemoveChannel(%s)", Channel->GetName().c_str());
|
||||||
|
|
||||||
LinkedListIterator<ChatChannel*> iterator(ChatChannels);
|
LinkedListIterator<ChatChannel*> iterator(ChatChannels);
|
||||||
|
|
||||||
@ -171,7 +171,7 @@ void ChatChannelList::RemoveChannel(ChatChannel *Channel) {
|
|||||||
|
|
||||||
void ChatChannelList::RemoveAllChannels() {
|
void ChatChannelList::RemoveAllChannels() {
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "RemoveAllChannels");
|
Log(Logs::Detail, Logs::UCS_Server, "RemoveAllChannels");
|
||||||
|
|
||||||
LinkedListIterator<ChatChannel*> iterator(ChatChannels);
|
LinkedListIterator<ChatChannel*> iterator(ChatChannels);
|
||||||
|
|
||||||
@ -229,7 +229,7 @@ void ChatChannel::AddClient(Client *c) {
|
|||||||
|
|
||||||
if(IsClientInChannel(c)) {
|
if(IsClientInChannel(c)) {
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Client %s already in channel %s", c->GetName().c_str(), GetName().c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "Client %s already in channel %s", c->GetName().c_str(), GetName().c_str());
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -238,7 +238,7 @@ void ChatChannel::AddClient(Client *c) {
|
|||||||
|
|
||||||
int AccountStatus = c->GetAccountStatus();
|
int AccountStatus = c->GetAccountStatus();
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Adding %s to channel %s", c->GetName().c_str(), Name.c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "Adding %s to channel %s", c->GetName().c_str(), Name.c_str());
|
||||||
|
|
||||||
LinkedListIterator<Client*> iterator(ClientsInChannel);
|
LinkedListIterator<Client*> iterator(ClientsInChannel);
|
||||||
|
|
||||||
@ -263,7 +263,7 @@ bool ChatChannel::RemoveClient(Client *c) {
|
|||||||
|
|
||||||
if(!c) return false;
|
if(!c) return false;
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "RemoveClient %s from channel %s", c->GetName().c_str(), GetName().c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "RemoveClient %s from channel %s", c->GetName().c_str(), GetName().c_str());
|
||||||
|
|
||||||
bool HideMe = c->GetHideMe();
|
bool HideMe = c->GetHideMe();
|
||||||
|
|
||||||
@ -300,7 +300,7 @@ bool ChatChannel::RemoveClient(Client *c) {
|
|||||||
if((Password.length() == 0) || (RuleI(Channels, DeleteTimer) == 0))
|
if((Password.length() == 0) || (RuleI(Channels, DeleteTimer) == 0))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Starting delete timer for empty password protected channel %s", Name.c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "Starting delete timer for empty password protected channel %s", Name.c_str());
|
||||||
|
|
||||||
DeleteTimer.Start(RuleI(Channels, DeleteTimer) * 60000);
|
DeleteTimer.Start(RuleI(Channels, DeleteTimer) * 60000);
|
||||||
}
|
}
|
||||||
@ -396,7 +396,7 @@ void ChatChannel::SendMessageToChannel(std::string Message, Client* Sender) {
|
|||||||
|
|
||||||
if(ChannelClient)
|
if(ChannelClient)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Sending message to %s from %s",
|
Log(Logs::Detail, Logs::UCS_Server, "Sending message to %s from %s",
|
||||||
ChannelClient->GetName().c_str(), Sender->GetName().c_str());
|
ChannelClient->GetName().c_str(), Sender->GetName().c_str());
|
||||||
ChannelClient->SendChannelMessage(Name, Message, Sender);
|
ChannelClient->SendChannelMessage(Name, Message, Sender);
|
||||||
}
|
}
|
||||||
@ -478,7 +478,7 @@ ChatChannel *ChatChannelList::AddClientToChannel(std::string ChannelName, Client
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "AddClient to channel [%s] with password [%s]", NormalisedName.c_str(), Password.c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "AddClient to channel [%s] with password [%s]", NormalisedName.c_str(), Password.c_str());
|
||||||
|
|
||||||
ChatChannel *RequiredChannel = FindChannel(NormalisedName);
|
ChatChannel *RequiredChannel = FindChannel(NormalisedName);
|
||||||
|
|
||||||
@ -554,7 +554,7 @@ void ChatChannelList::Process() {
|
|||||||
|
|
||||||
if(CurrentChannel && CurrentChannel->ReadyToDelete()) {
|
if(CurrentChannel && CurrentChannel->ReadyToDelete()) {
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Empty temporary password protected channel %s being destroyed.",
|
Log(Logs::Detail, Logs::UCS_Server, "Empty temporary password protected channel %s being destroyed.",
|
||||||
CurrentChannel->GetName().c_str());
|
CurrentChannel->GetName().c_str());
|
||||||
|
|
||||||
RemoveChannel(CurrentChannel);
|
RemoveChannel(CurrentChannel);
|
||||||
@ -570,7 +570,7 @@ void ChatChannel::AddInvitee(const std::string &Invitee)
|
|||||||
if (!IsInvitee(Invitee)) {
|
if (!IsInvitee(Invitee)) {
|
||||||
Invitees.push_back(Invitee);
|
Invitees.push_back(Invitee);
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Added %s as invitee to channel %s", Invitee.c_str(), Name.c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "Added %s as invitee to channel %s", Invitee.c_str(), Name.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -581,7 +581,7 @@ void ChatChannel::RemoveInvitee(std::string Invitee)
|
|||||||
|
|
||||||
if(it != std::end(Invitees)) {
|
if(it != std::end(Invitees)) {
|
||||||
Invitees.erase(it);
|
Invitees.erase(it);
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Removed %s as invitee to channel %s", Invitee.c_str(), Name.c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "Removed %s as invitee to channel %s", Invitee.c_str(), Name.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -595,7 +595,7 @@ void ChatChannel::AddModerator(const std::string &Moderator)
|
|||||||
if (!IsModerator(Moderator)) {
|
if (!IsModerator(Moderator)) {
|
||||||
Moderators.push_back(Moderator);
|
Moderators.push_back(Moderator);
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Added %s as moderator to channel %s", Moderator.c_str(), Name.c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "Added %s as moderator to channel %s", Moderator.c_str(), Name.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -606,7 +606,7 @@ void ChatChannel::RemoveModerator(const std::string &Moderator)
|
|||||||
|
|
||||||
if (it != std::end(Moderators)) {
|
if (it != std::end(Moderators)) {
|
||||||
Moderators.erase(it);
|
Moderators.erase(it);
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Removed %s as moderator to channel %s", Moderator.c_str(), Name.c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "Removed %s as moderator to channel %s", Moderator.c_str(), Name.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -620,7 +620,7 @@ void ChatChannel::AddVoice(const std::string &inVoiced)
|
|||||||
if (!HasVoice(inVoiced)) {
|
if (!HasVoice(inVoiced)) {
|
||||||
Voiced.push_back(inVoiced);
|
Voiced.push_back(inVoiced);
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Added %s as voiced to channel %s", inVoiced.c_str(), Name.c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "Added %s as voiced to channel %s", inVoiced.c_str(), Name.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -631,7 +631,7 @@ void ChatChannel::RemoveVoice(const std::string &inVoiced)
|
|||||||
if (it != std::end(Voiced)) {
|
if (it != std::end(Voiced)) {
|
||||||
Voiced.erase(it);
|
Voiced.erase(it);
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Removed %s as voiced to channel %s", inVoiced.c_str(), Name.c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "Removed %s as voiced to channel %s", inVoiced.c_str(), Name.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -74,14 +74,14 @@ bool Database::Connect(const char* host, const char* user, const char* passwd, c
|
|||||||
char errbuf[MYSQL_ERRMSG_SIZE];
|
char errbuf[MYSQL_ERRMSG_SIZE];
|
||||||
if (!Open(host, user, passwd, database, port, &errnum, errbuf))
|
if (!Open(host, user, passwd, database, port, &errnum, errbuf))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Failed to connect to database: Error: %s", errbuf);
|
Log(Logs::General, Logs::Error, "Failed to connect to database: Error: %s", errbuf);
|
||||||
HandleMysqlError(errnum);
|
HandleMysqlError(errnum);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Status, "Using database '%s' at %s:%d",database,host,port);
|
Log(Logs::General, Logs::Status, "Using database '%s' at %s:%d",database,host,port);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -110,15 +110,15 @@ void Database::GetAccountStatus(Client *client) {
|
|||||||
client->GetAccountID());
|
client->GetAccountID());
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
if (!results.Success()) {
|
if (!results.Success()) {
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Unable to get account status for character %s, error %s", client->GetName().c_str(), results.ErrorMessage().c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "Unable to get account status for character %s, error %s", client->GetName().c_str(), results.ErrorMessage().c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "GetAccountStatus Query: %s", query.c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "GetAccountStatus Query: %s", query.c_str());
|
||||||
|
|
||||||
if(results.RowCount() != 1)
|
if(results.RowCount() != 1)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Error in GetAccountStatus");
|
Log(Logs::Detail, Logs::UCS_Server, "Error in GetAccountStatus");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -129,13 +129,13 @@ void Database::GetAccountStatus(Client *client) {
|
|||||||
client->SetKarma(atoi(row[2]));
|
client->SetKarma(atoi(row[2]));
|
||||||
client->SetRevoked((atoi(row[3])==1?true:false));
|
client->SetRevoked((atoi(row[3])==1?true:false));
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Set account status to %i, hideme to %i and karma to %i for %s", client->GetAccountStatus(), client->GetHideMe(), client->GetKarma(), client->GetName().c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "Set account status to %i, hideme to %i and karma to %i for %s", client->GetAccountStatus(), client->GetHideMe(), client->GetKarma(), client->GetName().c_str());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int Database::FindAccount(const char *characterName, Client *client) {
|
int Database::FindAccount(const char *characterName, Client *client) {
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "FindAccount for character %s", characterName);
|
Log(Logs::Detail, Logs::UCS_Server, "FindAccount for character %s", characterName);
|
||||||
|
|
||||||
|
|
||||||
client->ClearCharacters();
|
client->ClearCharacters();
|
||||||
@ -144,12 +144,12 @@ int Database::FindAccount(const char *characterName, Client *client) {
|
|||||||
characterName);
|
characterName);
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
if (!results.Success()) {
|
if (!results.Success()) {
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "FindAccount query failed: %s", query.c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "FindAccount query failed: %s", query.c_str());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (results.RowCount() != 1) {
|
if (results.RowCount() != 1) {
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Bad result from query");
|
Log(Logs::Detail, Logs::UCS_Server, "Bad result from query");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -158,7 +158,7 @@ int Database::FindAccount(const char *characterName, Client *client) {
|
|||||||
|
|
||||||
int accountID = atoi(row[1]);
|
int accountID = atoi(row[1]);
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Account ID for %s is %i", characterName, accountID);
|
Log(Logs::Detail, Logs::UCS_Server, "Account ID for %s is %i", characterName, accountID);
|
||||||
|
|
||||||
query = StringFormat("SELECT `id`, `name`, `level` FROM `character_data` "
|
query = StringFormat("SELECT `id`, `name`, `level` FROM `character_data` "
|
||||||
"WHERE `account_id` = %i AND `name` != '%s'",
|
"WHERE `account_id` = %i AND `name` != '%s'",
|
||||||
@ -179,7 +179,7 @@ bool Database::VerifyMailKey(std::string characterName, int IPAddress, std::stri
|
|||||||
characterName.c_str());
|
characterName.c_str());
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
if (!results.Success()) {
|
if (!results.Success()) {
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Error retrieving mailkey from database: %s", results.ErrorMessage().c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "Error retrieving mailkey from database: %s", results.ErrorMessage().c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -195,7 +195,7 @@ bool Database::VerifyMailKey(std::string characterName, int IPAddress, std::stri
|
|||||||
else
|
else
|
||||||
sprintf(combinedKey, "%s", MailKey.c_str());
|
sprintf(combinedKey, "%s", MailKey.c_str());
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "DB key is [%s], Client key is [%s]", (row[0] ? row[0] : ""), combinedKey);
|
Log(Logs::Detail, Logs::UCS_Server, "DB key is [%s], Client key is [%s]", (row[0] ? row[0] : ""), combinedKey);
|
||||||
|
|
||||||
return !strcmp(row[0], combinedKey);
|
return !strcmp(row[0], combinedKey);
|
||||||
}
|
}
|
||||||
@ -213,7 +213,7 @@ int Database::FindCharacter(const char *characterName)
|
|||||||
safe_delete_array(safeCharName);
|
safe_delete_array(safeCharName);
|
||||||
|
|
||||||
if (results.RowCount() != 1) {
|
if (results.RowCount() != 1) {
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Bad result from FindCharacter query for character %s",
|
Log(Logs::Detail, Logs::UCS_Server, "Bad result from FindCharacter query for character %s",
|
||||||
characterName);
|
characterName);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -245,7 +245,7 @@ bool Database::GetVariable(const char* varname, char* varvalue, uint16 varvalue_
|
|||||||
|
|
||||||
bool Database::LoadChatChannels() {
|
bool Database::LoadChatChannels() {
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Loading chat channels from the database.");
|
Log(Logs::Detail, Logs::UCS_Server, "Loading chat channels from the database.");
|
||||||
|
|
||||||
const std::string query = "SELECT `name`, `owner`, `password`, `minstatus` FROM `chatchannels`";
|
const std::string query = "SELECT `name`, `owner`, `password`, `minstatus` FROM `chatchannels`";
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
@ -266,7 +266,7 @@ bool Database::LoadChatChannels() {
|
|||||||
|
|
||||||
void Database::SetChannelPassword(std::string channelName, std::string password) {
|
void Database::SetChannelPassword(std::string channelName, std::string password) {
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Database::SetChannelPassword(%s, %s)", channelName.c_str(), password.c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "Database::SetChannelPassword(%s, %s)", channelName.c_str(), password.c_str());
|
||||||
|
|
||||||
std::string query = StringFormat("UPDATE `chatchannels` SET `password` = '%s' WHERE `name` = '%s'",
|
std::string query = StringFormat("UPDATE `chatchannels` SET `password` = '%s' WHERE `name` = '%s'",
|
||||||
password.c_str(), channelName.c_str());
|
password.c_str(), channelName.c_str());
|
||||||
@ -275,7 +275,7 @@ void Database::SetChannelPassword(std::string channelName, std::string password)
|
|||||||
|
|
||||||
void Database::SetChannelOwner(std::string channelName, std::string owner) {
|
void Database::SetChannelOwner(std::string channelName, std::string owner) {
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Database::SetChannelOwner(%s, %s)", channelName.c_str(), owner.c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "Database::SetChannelOwner(%s, %s)", channelName.c_str(), owner.c_str());
|
||||||
|
|
||||||
std::string query = StringFormat("UPDATE `chatchannels` SET `owner` = '%s' WHERE `name` = '%s'",
|
std::string query = StringFormat("UPDATE `chatchannels` SET `owner` = '%s' WHERE `name` = '%s'",
|
||||||
owner.c_str(), channelName.c_str());
|
owner.c_str(), channelName.c_str());
|
||||||
@ -288,7 +288,7 @@ void Database::SendHeaders(Client *client) {
|
|||||||
int unknownField3 = 1;
|
int unknownField3 = 1;
|
||||||
int characterID = FindCharacter(client->MailBoxName().c_str());
|
int characterID = FindCharacter(client->MailBoxName().c_str());
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Sendheaders for %s, CharID is %i", client->MailBoxName().c_str(), characterID);
|
Log(Logs::Detail, Logs::UCS_Server, "Sendheaders for %s, CharID is %i", client->MailBoxName().c_str(), characterID);
|
||||||
|
|
||||||
if(characterID <= 0)
|
if(characterID <= 0)
|
||||||
return;
|
return;
|
||||||
@ -373,7 +373,7 @@ void Database::SendBody(Client *client, int messageNumber) {
|
|||||||
|
|
||||||
int characterID = FindCharacter(client->MailBoxName().c_str());
|
int characterID = FindCharacter(client->MailBoxName().c_str());
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "SendBody: MsgID %i, to %s, CharID is %i", messageNumber, client->MailBoxName().c_str(), characterID);
|
Log(Logs::Detail, Logs::UCS_Server, "SendBody: MsgID %i, to %s, CharID is %i", messageNumber, client->MailBoxName().c_str(), characterID);
|
||||||
|
|
||||||
if(characterID <= 0)
|
if(characterID <= 0)
|
||||||
return;
|
return;
|
||||||
@ -390,7 +390,7 @@ void Database::SendBody(Client *client, int messageNumber) {
|
|||||||
|
|
||||||
auto row = results.begin();
|
auto row = results.begin();
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Message: %i body (%i bytes)", messageNumber, strlen(row[1]));
|
Log(Logs::Detail, Logs::UCS_Server, "Message: %i body (%i bytes)", messageNumber, strlen(row[1]));
|
||||||
|
|
||||||
int packetLength = 12 + strlen(row[0]) + strlen(row[1]) + strlen(row[2]);
|
int packetLength = 12 + strlen(row[0]) + strlen(row[1]) + strlen(row[2]);
|
||||||
|
|
||||||
@ -435,7 +435,7 @@ bool Database::SendMail(std::string recipient, std::string from, std::string sub
|
|||||||
|
|
||||||
characterID = FindCharacter(characterName.c_str());
|
characterID = FindCharacter(characterName.c_str());
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "SendMail: CharacterID for recipient %s is %i", characterName.c_str(), characterID);
|
Log(Logs::Detail, Logs::UCS_Server, "SendMail: CharacterID for recipient %s is %i", characterName.c_str(), characterID);
|
||||||
|
|
||||||
if(characterID <= 0)
|
if(characterID <= 0)
|
||||||
return false;
|
return false;
|
||||||
@ -460,7 +460,7 @@ bool Database::SendMail(std::string recipient, std::string from, std::string sub
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "MessageID %i generated, from %s, to %s", results.LastInsertedID(), from.c_str(), recipient.c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "MessageID %i generated, from %s, to %s", results.LastInsertedID(), from.c_str(), recipient.c_str());
|
||||||
|
|
||||||
|
|
||||||
Client *client = g_Clientlist->IsCharacterOnline(characterName);
|
Client *client = g_Clientlist->IsCharacterOnline(characterName);
|
||||||
@ -477,7 +477,7 @@ bool Database::SendMail(std::string recipient, std::string from, std::string sub
|
|||||||
|
|
||||||
void Database::SetMessageStatus(int messageNumber, int status) {
|
void Database::SetMessageStatus(int messageNumber, int status) {
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "SetMessageStatus %i %i", messageNumber, status);
|
Log(Logs::Detail, Logs::UCS_Server, "SetMessageStatus %i %i", messageNumber, status);
|
||||||
|
|
||||||
if(status == 0) {
|
if(status == 0) {
|
||||||
std::string query = StringFormat("DELETE FROM `mail` WHERE `msgid` = %i", messageNumber);
|
std::string query = StringFormat("DELETE FROM `mail` WHERE `msgid` = %i", messageNumber);
|
||||||
@ -491,7 +491,7 @@ void Database::SetMessageStatus(int messageNumber, int status) {
|
|||||||
|
|
||||||
void Database::ExpireMail() {
|
void Database::ExpireMail() {
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Expiring mail...");
|
Log(Logs::Detail, Logs::UCS_Server, "Expiring mail...");
|
||||||
|
|
||||||
std::string query = "SELECT COUNT(*) FROM `mail`";
|
std::string query = "SELECT COUNT(*) FROM `mail`";
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
@ -501,7 +501,7 @@ void Database::ExpireMail() {
|
|||||||
|
|
||||||
auto row = results.begin();
|
auto row = results.begin();
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "There are %s messages in the database.", row[0]);
|
Log(Logs::Detail, Logs::UCS_Server, "There are %s messages in the database.", row[0]);
|
||||||
|
|
||||||
// Expire Trash
|
// Expire Trash
|
||||||
if(RuleI(Mail, ExpireTrash) >= 0) {
|
if(RuleI(Mail, ExpireTrash) >= 0) {
|
||||||
@ -509,7 +509,7 @@ void Database::ExpireMail() {
|
|||||||
time(nullptr) - RuleI(Mail, ExpireTrash));
|
time(nullptr) - RuleI(Mail, ExpireTrash));
|
||||||
results = QueryDatabase(query);
|
results = QueryDatabase(query);
|
||||||
if(results.Success())
|
if(results.Success())
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Expired %i trash messages.", results.RowsAffected());
|
Log(Logs::Detail, Logs::UCS_Server, "Expired %i trash messages.", results.RowsAffected());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Expire Read
|
// Expire Read
|
||||||
@ -518,7 +518,7 @@ void Database::ExpireMail() {
|
|||||||
time(nullptr) - RuleI(Mail, ExpireRead));
|
time(nullptr) - RuleI(Mail, ExpireRead));
|
||||||
results = QueryDatabase(query);
|
results = QueryDatabase(query);
|
||||||
if(results.Success())
|
if(results.Success())
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Expired %i read messages.", results.RowsAffected());
|
Log(Logs::Detail, Logs::UCS_Server, "Expired %i read messages.", results.RowsAffected());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Expire Unread
|
// Expire Unread
|
||||||
@ -527,7 +527,7 @@ void Database::ExpireMail() {
|
|||||||
time(nullptr) - RuleI(Mail, ExpireUnread));
|
time(nullptr) - RuleI(Mail, ExpireUnread));
|
||||||
results = QueryDatabase(query);
|
results = QueryDatabase(query);
|
||||||
if(results.Success())
|
if(results.Success())
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Expired %i unread messages.", results.RowsAffected());
|
Log(Logs::Detail, Logs::UCS_Server, "Expired %i unread messages.", results.RowsAffected());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -538,7 +538,7 @@ void Database::AddFriendOrIgnore(int charID, int type, std::string name) {
|
|||||||
charID, type, CapitaliseName(name).c_str());
|
charID, type, CapitaliseName(name).c_str());
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
if(results.Success())
|
if(results.Success())
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Wrote Friend/Ignore entry for charid %i, type %i, name %s to database.", charID, type, name.c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "Wrote Friend/Ignore entry for charid %i, type %i, name %s to database.", charID, type, name.c_str());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -548,11 +548,12 @@ void Database::RemoveFriendOrIgnore(int charID, int type, std::string name) {
|
|||||||
"AND `type` = %i AND `name` = '%s'",
|
"AND `type` = %i AND `name` = '%s'",
|
||||||
charID, type, CapitaliseName(name).c_str());
|
charID, type, CapitaliseName(name).c_str());
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
if(!results.Success())
|
if (!results.Success()) {
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Error removing friend/ignore, query was %s", query.c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "Error removing friend/ignore, query was %s", query.c_str());
|
||||||
else
|
}
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Removed Friend/Ignore entry for charid %i, type %i, name %s from database.", charID, type, name.c_str());
|
else {
|
||||||
|
Log(Logs::Detail, Logs::UCS_Server, "Removed Friend/Ignore entry for charid %i, type %i, name %s from database.", charID, type, name.c_str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Database::GetFriendsAndIgnore(int charID, std::vector<std::string> &friends, std::vector<std::string> &ignorees) {
|
void Database::GetFriendsAndIgnore(int charID, std::vector<std::string> &friends, std::vector<std::string> &ignorees) {
|
||||||
@ -570,12 +571,12 @@ void Database::GetFriendsAndIgnore(int charID, std::vector<std::string> &friends
|
|||||||
if(atoi(row[0]) == 0)
|
if(atoi(row[0]) == 0)
|
||||||
{
|
{
|
||||||
ignorees.push_back(name);
|
ignorees.push_back(name);
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Added Ignoree from DB %s", name.c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "Added Ignoree from DB %s", name.c_str());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
friends.push_back(name);
|
friends.push_back(name);
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Added Friend from DB %s", name.c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "Added Friend from DB %s", name.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -594,7 +595,7 @@ void Database::LoadLogSettings(EQEmuLogSys::LogSettings* log_settings){
|
|||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
|
|
||||||
int log_category = 0;
|
int log_category = 0;
|
||||||
Log.file_logs_enabled = false;
|
LogSys.file_logs_enabled = false;
|
||||||
|
|
||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
log_category = atoi(row[0]);
|
log_category = atoi(row[0]);
|
||||||
@ -617,7 +618,7 @@ void Database::LoadLogSettings(EQEmuLogSys::LogSettings* log_settings){
|
|||||||
If we go through this whole loop and nothing is set to any debug level, there is no point to create a file or keep anything open
|
If we go through this whole loop and nothing is set to any debug level, there is no point to create a file or keep anything open
|
||||||
*/
|
*/
|
||||||
if (log_settings[log_category].log_to_file > 0){
|
if (log_settings[log_category].log_to_file > 0){
|
||||||
Log.file_logs_enabled = true;
|
LogSys.file_logs_enabled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
32
ucs/ucs.cpp
32
ucs/ucs.cpp
@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
ChatChannelList *ChannelList;
|
ChatChannelList *ChannelList;
|
||||||
Clientlist *g_Clientlist;
|
Clientlist *g_Clientlist;
|
||||||
EQEmuLogSys Log;
|
EQEmuLogSys LogSys;
|
||||||
Database database;
|
Database database;
|
||||||
WorldServer *worldserver = nullptr;
|
WorldServer *worldserver = nullptr;
|
||||||
|
|
||||||
@ -64,7 +64,7 @@ std::string GetMailPrefix() {
|
|||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
RegisterExecutablePlatform(ExePlatformUCS);
|
RegisterExecutablePlatform(ExePlatformUCS);
|
||||||
Log.LoadLogSettingsDefaults();
|
LogSys.LoadLogSettingsDefaults();
|
||||||
set_exception_handler();
|
set_exception_handler();
|
||||||
|
|
||||||
// Check every minute for unused channels we can delete
|
// Check every minute for unused channels we can delete
|
||||||
@ -73,10 +73,10 @@ int main() {
|
|||||||
|
|
||||||
Timer InterserverTimer(INTERSERVER_TIMER); // does auto-reconnect
|
Timer InterserverTimer(INTERSERVER_TIMER); // does auto-reconnect
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::UCS_Server, "Starting EQEmu Universal Chat Server.");
|
Log(Logs::General, Logs::UCS_Server, "Starting EQEmu Universal Chat Server.");
|
||||||
|
|
||||||
if (!ucsconfig::LoadConfig()) {
|
if (!ucsconfig::LoadConfig()) {
|
||||||
Log.Out(Logs::General, Logs::UCS_Server, "Loading server configuration failed.");
|
Log(Logs::General, Logs::UCS_Server, "Loading server configuration failed.");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,7 +84,7 @@ int main() {
|
|||||||
|
|
||||||
WorldShortName = Config->ShortName;
|
WorldShortName = Config->ShortName;
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::UCS_Server, "Connecting to MySQL...");
|
Log(Logs::General, Logs::UCS_Server, "Connecting to MySQL...");
|
||||||
|
|
||||||
if (!database.Connect(
|
if (!database.Connect(
|
||||||
Config->DatabaseHost.c_str(),
|
Config->DatabaseHost.c_str(),
|
||||||
@ -92,26 +92,26 @@ int main() {
|
|||||||
Config->DatabasePassword.c_str(),
|
Config->DatabasePassword.c_str(),
|
||||||
Config->DatabaseDB.c_str(),
|
Config->DatabaseDB.c_str(),
|
||||||
Config->DatabasePort)) {
|
Config->DatabasePort)) {
|
||||||
Log.Out(Logs::General, Logs::UCS_Server, "Cannot continue without a database connection.");
|
Log(Logs::General, Logs::UCS_Server, "Cannot continue without a database connection.");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Register Log System and Settings */
|
/* Register Log System and Settings */
|
||||||
database.LoadLogSettings(Log.log_settings);
|
database.LoadLogSettings(LogSys.log_settings);
|
||||||
Log.StartFileLogs();
|
LogSys.StartFileLogs();
|
||||||
|
|
||||||
char tmp[64];
|
char tmp[64];
|
||||||
|
|
||||||
if (database.GetVariable("RuleSet", tmp, sizeof(tmp)-1)) {
|
if (database.GetVariable("RuleSet", tmp, sizeof(tmp)-1)) {
|
||||||
Log.Out(Logs::General, Logs::UCS_Server, "Loading rule set '%s'", tmp);
|
Log(Logs::General, Logs::UCS_Server, "Loading rule set '%s'", tmp);
|
||||||
if(!RuleManager::Instance()->LoadRules(&database, tmp)) {
|
if(!RuleManager::Instance()->LoadRules(&database, tmp)) {
|
||||||
Log.Out(Logs::General, Logs::UCS_Server, "Failed to load ruleset '%s', falling back to defaults.", tmp);
|
Log(Logs::General, Logs::UCS_Server, "Failed to load ruleset '%s', falling back to defaults.", tmp);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if(!RuleManager::Instance()->LoadRules(&database, "default")) {
|
if(!RuleManager::Instance()->LoadRules(&database, "default")) {
|
||||||
Log.Out(Logs::General, Logs::UCS_Server, "No rule set configured, using default rules");
|
Log(Logs::General, Logs::UCS_Server, "No rule set configured, using default rules");
|
||||||
} else {
|
} else {
|
||||||
Log.Out(Logs::General, Logs::UCS_Server, "Loaded default rule set 'default'", tmp);
|
Log(Logs::General, Logs::UCS_Server, "Loaded default rule set 'default'", tmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,7 +119,7 @@ int main() {
|
|||||||
|
|
||||||
if(Config->ChatPort != Config->MailPort)
|
if(Config->ChatPort != Config->MailPort)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::UCS_Server, "MailPort and CharPort must be the same in eqemu_config.xml for UCS.");
|
Log(Logs::General, Logs::UCS_Server, "MailPort and CharPort must be the same in eqemu_config.xml for UCS.");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,11 +130,11 @@ int main() {
|
|||||||
database.LoadChatChannels();
|
database.LoadChatChannels();
|
||||||
|
|
||||||
if (signal(SIGINT, CatchSignal) == SIG_ERR) {
|
if (signal(SIGINT, CatchSignal) == SIG_ERR) {
|
||||||
Log.Out(Logs::General, Logs::UCS_Server, "Could not set signal handler");
|
Log(Logs::General, Logs::UCS_Server, "Could not set signal handler");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (signal(SIGTERM, CatchSignal) == SIG_ERR) {
|
if (signal(SIGTERM, CatchSignal) == SIG_ERR) {
|
||||||
Log.Out(Logs::General, Logs::UCS_Server, "Could not set signal handler");
|
Log(Logs::General, Logs::UCS_Server, "Could not set signal handler");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -158,7 +158,7 @@ int main() {
|
|||||||
|
|
||||||
g_Clientlist->CloseAllConnections();
|
g_Clientlist->CloseAllConnections();
|
||||||
|
|
||||||
Log.CloseFileLogs();
|
LogSys.CloseFileLogs();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,19 +1,19 @@
|
|||||||
/* EQEMu: Everquest Server Emulator
|
/* EQEMu: Everquest Server Emulator
|
||||||
Copyright (C) 2001-2002 EQEMu Development Team (http://eqemu.org)
|
Copyright (C) 2001-2002 EQEMu Development Team (http://eqemu.org)
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; version 2 of the License.
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
are required to give you total support for your newly bought product;
|
are required to give you total support for your newly bought product;
|
||||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
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 "../common/eqemu_logsys.h"
|
||||||
@ -56,9 +56,9 @@ void WorldServer::ProcessMessage(uint16 opcode, EQ::Net::Packet &p)
|
|||||||
ServerPacket tpack(opcode, p);
|
ServerPacket tpack(opcode, p);
|
||||||
ServerPacket *pack = &tpack;
|
ServerPacket *pack = &tpack;
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Received Opcode: %4X", opcode);
|
Log(Logs::Detail, Logs::UCS_Server, "Received Opcode: %4X", opcode);
|
||||||
|
|
||||||
switch(opcode)
|
switch (opcode)
|
||||||
{
|
{
|
||||||
case 0: {
|
case 0: {
|
||||||
break;
|
break;
|
||||||
@ -77,26 +77,26 @@ void WorldServer::ProcessMessage(uint16 opcode, EQ::Net::Packet &p)
|
|||||||
|
|
||||||
std::string Message = Buffer;
|
std::string Message = Buffer;
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Player: %s, Sent Message: %s", From, Message.c_str());
|
Log(Logs::Detail, Logs::UCS_Server, "Player: %s, Sent Message: %s", From, Message.c_str());
|
||||||
|
|
||||||
Client *c = g_Clientlist->FindCharacter(From);
|
Client *c = g_Clientlist->FindCharacter(From);
|
||||||
|
|
||||||
safe_delete_array(From);
|
safe_delete_array(From);
|
||||||
|
|
||||||
if(Message.length() < 2)
|
if (Message.length() < 2)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if(!c)
|
if (!c)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Client not found.");
|
Log(Logs::Detail, Logs::UCS_Server, "Client not found.");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Message[0] == ';')
|
if (Message[0] == ';')
|
||||||
{
|
{
|
||||||
c->SendChannelMessageByNumber(Message.substr(1, std::string::npos));
|
c->SendChannelMessageByNumber(Message.substr(1, std::string::npos));
|
||||||
}
|
}
|
||||||
else if(Message[0] == '[')
|
else if (Message[0] == '[')
|
||||||
{
|
{
|
||||||
g_Clientlist->ProcessOPMailCommand(c, Message.substr(1, std::string::npos));
|
g_Clientlist->ProcessOPMailCommand(c, Message.substr(1, std::string::npos));
|
||||||
}
|
}
|
||||||
@ -116,4 +116,3 @@ void WorldServer::ProcessMessage(uint16 opcode, EQ::Net::Packet &p)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
9007|2016_06_23_bots_camel_case_name_rule.sql|SELECT * FROM `rule_values` WHERE `rule_name` LIKE 'Bots:AllowCamelCaseNames'|empty|
|
9007|2016_06_23_bots_camel_case_name_rule.sql|SELECT * FROM `rule_values` WHERE `rule_name` LIKE 'Bots:AllowCamelCaseNames'|empty|
|
||||||
9008|2016_06_28_bots_inventory_charges_update.sql|SELECT * FROM `information_schema`.`COLUMNS` isc WHERE isc.`TABLE_SCHEMA` = DATABASE() AND isc.`TABLE_NAME` = 'bot_inventories' AND isc.`COLUMN_NAME` = 'inst_charges' AND isc.`DATA_TYPE` = 'tinyint'|not_empty|
|
9008|2016_06_28_bots_inventory_charges_update.sql|SELECT * FROM `information_schema`.`COLUMNS` isc WHERE isc.`TABLE_SCHEMA` = DATABASE() AND isc.`TABLE_NAME` = 'bot_inventories' AND isc.`COLUMN_NAME` = 'inst_charges' AND isc.`DATA_TYPE` = 'tinyint'|not_empty|
|
||||||
9009|2017_02_15_bots_bot_spells_entries.sql|SELECT `id` FROM `npc_spells_entries` WHERE `npc_spells_id` >= 701 AND `npc_spells_id` <= 712|not_empty|
|
9009|2017_02_15_bots_bot_spells_entries.sql|SELECT `id` FROM `npc_spells_entries` WHERE `npc_spells_id` >= 701 AND `npc_spells_id` <= 712|not_empty|
|
||||||
9010|2017_02_20_bots_bard_spell_update.sql|SELECT * FROM `bot_spells_entries` WHERE `npc_spells_id` = 711 AND (`type` & 0xFFFF0000) = 0xFFFF0000|empty|
|
9010|2017_02_20_bots_bard_spell_update.sql|SELECT * FROM `bot_spells_entries` WHERE (`npc_spells_id` = 711 OR `npc_spells_id` = 3008) AND `type` >= 0xFFFF0000|empty|
|
||||||
9011|2017_02_23_bots_spell_casting_chances.sql|SHOW TABLES LIKE 'bot_spell_casting_chances'|empty|
|
9011|2017_02_23_bots_spell_casting_chances.sql|SHOW TABLES LIKE 'bot_spell_casting_chances'|empty|
|
||||||
9012|2017_02_26_bots_npc_spells_update_for_bots.sql|SELECT * FROM `npc_spells` WHERE `id` = '701' AND `name` = 'Cleric Bot'|not_empty|
|
9012|2017_02_26_bots_npc_spells_update_for_bots.sql|SELECT * FROM `npc_spells` WHERE `id` = '701' AND `name` = 'Cleric Bot'|not_empty|
|
||||||
9013|2017_02_26_bots_spells_id_update_for_saved_bots.sql|SELECT * FROM `bot_data` WHERE `spells_id` >= '701' AND `spells_id` <= '712'|not_empty|
|
9013|2017_02_26_bots_spells_id_update_for_saved_bots.sql|SELECT * FROM `bot_data` WHERE `spells_id` >= '701' AND `spells_id` <= '712'|not_empty|
|
||||||
|
|||||||
174
world/client.cpp
174
world/client.cpp
@ -157,7 +157,7 @@ void Client::SendEnterWorld(std::string name)
|
|||||||
eqs->Close();
|
eqs->Close();
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Telling client to continue session.");
|
Log(Logs::Detail, Logs::World_Server,"Telling client to continue session.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -201,7 +201,7 @@ void Client::SendCharInfo() {
|
|||||||
QueuePacket(outapp);
|
QueuePacket(outapp);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Log.Out(Logs::General, Logs::World_Server, "[Error] Database did not return an OP_SendCharInfo packet for account %u", GetAccountID());
|
Log(Logs::General, Logs::World_Server, "[Error] Database did not return an OP_SendCharInfo packet for account %u", GetAccountID());
|
||||||
}
|
}
|
||||||
safe_delete(outapp);
|
safe_delete(outapp);
|
||||||
}
|
}
|
||||||
@ -406,7 +406,7 @@ bool Client::HandleSendLoginInfoPacket(const EQApplicationPacket *app) {
|
|||||||
|
|
||||||
if (strlen(password) <= 1) {
|
if (strlen(password) <= 1) {
|
||||||
// TODO: Find out how to tell the client wrong username/password
|
// TODO: Find out how to tell the client wrong username/password
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Login without a password");
|
Log(Logs::Detail, Logs::World_Server,"Login without a password");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -433,17 +433,19 @@ bool Client::HandleSendLoginInfoPacket(const EQApplicationPacket *app) {
|
|||||||
else
|
else
|
||||||
id=atoi(name);
|
id=atoi(name);
|
||||||
if (loginserverlist.Connected() == false && !is_player_zoning) {
|
if (loginserverlist.Connected() == false && !is_player_zoning) {
|
||||||
Log.Out(Logs::General, Logs::World_Server,"Error: Login server login while not connected to login server.");
|
Log(Logs::General, Logs::World_Server,"Error: Login server login while not connected to login server.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (((cle = client_list.CheckAuth(name, password)) || (cle = client_list.CheckAuth(id, password))))
|
if (((cle = client_list.CheckAuth(name, password)) || (cle = client_list.CheckAuth(id, password))))
|
||||||
{
|
{
|
||||||
if (cle->AccountID() == 0 || (!minilogin && cle->LSID()==0)) {
|
if (cle->AccountID() == 0 || (!minilogin && cle->LSID()==0)) {
|
||||||
Log.Out(Logs::General, Logs::World_Server,"ID is 0. Is this server connected to minilogin?");
|
Log(Logs::General, Logs::World_Server,"ID is 0. Is this server connected to minilogin?");
|
||||||
if(!minilogin)
|
if (!minilogin) {
|
||||||
Log.Out(Logs::General, Logs::World_Server,"If so you forget the minilogin variable...");
|
Log(Logs::General, Logs::World_Server, "If so you forget the minilogin variable...");
|
||||||
else
|
}
|
||||||
Log.Out(Logs::General, Logs::World_Server,"Could not find a minilogin account, verify ip address logging into minilogin is the same that is in your account table.");
|
else {
|
||||||
|
Log(Logs::General, Logs::World_Server, "Could not find a minilogin account, verify ip address logging into minilogin is the same that is in your account table.");
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -451,11 +453,11 @@ bool Client::HandleSendLoginInfoPacket(const EQApplicationPacket *app) {
|
|||||||
|
|
||||||
if(minilogin){
|
if(minilogin){
|
||||||
WorldConfig::DisableStats();
|
WorldConfig::DisableStats();
|
||||||
Log.Out(Logs::General, Logs::World_Server, "MiniLogin Account #%d",cle->AccountID());
|
Log(Logs::General, Logs::World_Server, "MiniLogin Account #%d",cle->AccountID());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (!is_player_zoning) {
|
if (!is_player_zoning) {
|
||||||
Log.Out(Logs::General, Logs::World_Server,
|
Log(Logs::General, Logs::World_Server,
|
||||||
"Account (%s) Logging in :: LSID: %d ", cle->AccountName(), cle->LSID());
|
"Account (%s) Logging in :: LSID: %d ", cle->AccountName(), cle->LSID());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -491,7 +493,7 @@ bool Client::HandleSendLoginInfoPacket(const EQApplicationPacket *app) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// TODO: Find out how to tell the client wrong username/password
|
// TODO: Find out how to tell the client wrong username/password
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Bad/Expired session key '%s'",name);
|
Log(Logs::Detail, Logs::World_Server,"Bad/Expired session key '%s'",name);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -505,7 +507,7 @@ bool Client::HandleSendLoginInfoPacket(const EQApplicationPacket *app) {
|
|||||||
bool Client::HandleNameApprovalPacket(const EQApplicationPacket *app)
|
bool Client::HandleNameApprovalPacket(const EQApplicationPacket *app)
|
||||||
{
|
{
|
||||||
if (GetAccountID() == 0) {
|
if (GetAccountID() == 0) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Name approval request with no logged in account");
|
Log(Logs::Detail, Logs::World_Server,"Name approval request with no logged in account");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -513,7 +515,7 @@ bool Client::HandleNameApprovalPacket(const EQApplicationPacket *app)
|
|||||||
uchar race = app->pBuffer[64];
|
uchar race = app->pBuffer[64];
|
||||||
uchar clas = app->pBuffer[68];
|
uchar clas = app->pBuffer[68];
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Name approval request. Name=%s, race=%s, class=%s", char_name, GetRaceIDName(race), GetClassIDName(clas));
|
Log(Logs::Detail, Logs::World_Server, "Name approval request. Name=%s, race=%s, class=%s", char_name, GetRaceIDName(race), GetClassIDName(clas));
|
||||||
|
|
||||||
EQApplicationPacket *outapp;
|
EQApplicationPacket *outapp;
|
||||||
outapp = new EQApplicationPacket;
|
outapp = new EQApplicationPacket;
|
||||||
@ -674,11 +676,11 @@ bool Client::HandleCharacterCreateRequestPacket(const EQApplicationPacket *app)
|
|||||||
|
|
||||||
bool Client::HandleCharacterCreatePacket(const EQApplicationPacket *app) {
|
bool Client::HandleCharacterCreatePacket(const EQApplicationPacket *app) {
|
||||||
if (GetAccountID() == 0) {
|
if (GetAccountID() == 0) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Account ID not set; unable to create character.");
|
Log(Logs::Detail, Logs::World_Server,"Account ID not set; unable to create character.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if (app->size != sizeof(CharCreate_Struct)) {
|
else if (app->size != sizeof(CharCreate_Struct)) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Wrong size on OP_CharacterCreate. Got: %d, Expected: %d",app->size,sizeof(CharCreate_Struct));
|
Log(Logs::Detail, Logs::World_Server,"Wrong size on OP_CharacterCreate. Got: %d, Expected: %d",app->size,sizeof(CharCreate_Struct));
|
||||||
DumpPacket(app);
|
DumpPacket(app);
|
||||||
// the previous behavior was essentially returning true here
|
// the previous behavior was essentially returning true here
|
||||||
// but that seems a bit odd to me.
|
// but that seems a bit odd to me.
|
||||||
@ -705,14 +707,14 @@ bool Client::HandleCharacterCreatePacket(const EQApplicationPacket *app) {
|
|||||||
|
|
||||||
bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) {
|
bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) {
|
||||||
if (GetAccountID() == 0) {
|
if (GetAccountID() == 0) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Enter world with no logged in account");
|
Log(Logs::Detail, Logs::World_Server,"Enter world with no logged in account");
|
||||||
eqs->Close();
|
eqs->Close();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(GetAdmin() < 0)
|
if(GetAdmin() < 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Account banned or suspended.");
|
Log(Logs::Detail, Logs::World_Server,"Account banned or suspended.");
|
||||||
eqs->Close();
|
eqs->Close();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -728,14 +730,14 @@ bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) {
|
|||||||
uint32 tmpaccid = 0;
|
uint32 tmpaccid = 0;
|
||||||
charid = database.GetCharacterInfo(char_name, &tmpaccid, &zone_id, &instance_id);
|
charid = database.GetCharacterInfo(char_name, &tmpaccid, &zone_id, &instance_id);
|
||||||
if (charid == 0 || tmpaccid != GetAccountID()) {
|
if (charid == 0 || tmpaccid != GetAccountID()) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Could not get CharInfo for '%s'",char_name);
|
Log(Logs::Detail, Logs::World_Server,"Could not get CharInfo for '%s'",char_name);
|
||||||
eqs->Close();
|
eqs->Close();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make sure this account owns this character
|
// Make sure this account owns this character
|
||||||
if (tmpaccid != GetAccountID()) {
|
if (tmpaccid != GetAccountID()) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"This account does not own the character named '%s'",char_name);
|
Log(Logs::Detail, Logs::World_Server,"This account does not own the character named '%s'",char_name);
|
||||||
eqs->Close();
|
eqs->Close();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -777,7 +779,7 @@ bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) {
|
|||||||
zone_id = database.MoveCharacterToBind(charid, 4);
|
zone_id = database.MoveCharacterToBind(charid, 4);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "'%s' is trying to go home before they're able...", char_name);
|
Log(Logs::Detail, Logs::World_Server, "'%s' is trying to go home before they're able...", char_name);
|
||||||
database.SetHackerFlag(GetAccountName(), char_name, "MQGoHome: player tried to go home before they were able.");
|
database.SetHackerFlag(GetAccountName(), char_name, "MQGoHome: player tried to go home before they were able.");
|
||||||
eqs->Close();
|
eqs->Close();
|
||||||
return true;
|
return true;
|
||||||
@ -801,7 +803,7 @@ bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) {
|
|||||||
database.MoveCharacterToZone(charid, database.GetZoneName(zone_id));
|
database.MoveCharacterToZone(charid, database.GetZoneName(zone_id));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "'%s' is trying to go to tutorial but are not allowed...", char_name);
|
Log(Logs::Detail, Logs::World_Server, "'%s' is trying to go to tutorial but are not allowed...", char_name);
|
||||||
database.SetHackerFlag(GetAccountName(), char_name, "MQTutorial: player tried to enter the tutorial without having tutorial enabled for this character.");
|
database.SetHackerFlag(GetAccountName(), char_name, "MQTutorial: player tried to enter the tutorial without having tutorial enabled for this character.");
|
||||||
eqs->Close();
|
eqs->Close();
|
||||||
return true;
|
return true;
|
||||||
@ -812,7 +814,7 @@ bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) {
|
|||||||
if (zone_id == 0 || !database.GetZoneName(zone_id)) {
|
if (zone_id == 0 || !database.GetZoneName(zone_id)) {
|
||||||
// This is to save people in an invalid zone, once it's removed from the DB
|
// This is to save people in an invalid zone, once it's removed from the DB
|
||||||
database.MoveCharacterToZone(charid, "arena");
|
database.MoveCharacterToZone(charid, "arena");
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Zone not found in database zone_id=%i, moveing char to arena character:%s", zone_id, char_name);
|
Log(Logs::Detail, Logs::World_Server, "Zone not found in database zone_id=%i, moveing char to arena character:%s", zone_id, char_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(instance_id > 0)
|
if(instance_id > 0)
|
||||||
@ -926,7 +928,7 @@ bool Client::HandleDeleteCharacterPacket(const EQApplicationPacket *app) {
|
|||||||
|
|
||||||
uint32 char_acct_id = database.GetAccountIDByChar((char*)app->pBuffer);
|
uint32 char_acct_id = database.GetAccountIDByChar((char*)app->pBuffer);
|
||||||
if(char_acct_id == GetAccountID()) {
|
if(char_acct_id == GetAccountID()) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Delete character: %s",app->pBuffer);
|
Log(Logs::Detail, Logs::World_Server,"Delete character: %s",app->pBuffer);
|
||||||
database.DeleteCharacter((char *)app->pBuffer);
|
database.DeleteCharacter((char *)app->pBuffer);
|
||||||
SendCharInfo();
|
SendCharInfo();
|
||||||
}
|
}
|
||||||
@ -947,24 +949,24 @@ bool Client::HandlePacket(const EQApplicationPacket *app) {
|
|||||||
|
|
||||||
EmuOpcode opcode = app->GetOpcode();
|
EmuOpcode opcode = app->GetOpcode();
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Recevied EQApplicationPacket");
|
Log(Logs::Detail, Logs::World_Server,"Recevied EQApplicationPacket");
|
||||||
|
|
||||||
if (!eqs->CheckState(ESTABLISHED)) {
|
if (!eqs->CheckState(ESTABLISHED)) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Client disconnected (net inactive on send)");
|
Log(Logs::Detail, Logs::World_Server,"Client disconnected (net inactive on send)");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Voidd: Anti-GM Account hack, Checks source ip against valid GM Account IP Addresses
|
// Voidd: Anti-GM Account hack, Checks source ip against valid GM Account IP Addresses
|
||||||
if (RuleB(World, GMAccountIPList) && this->GetAdmin() >= (RuleI(World, MinGMAntiHackStatus))) {
|
if (RuleB(World, GMAccountIPList) && this->GetAdmin() >= (RuleI(World, MinGMAntiHackStatus))) {
|
||||||
if(!database.CheckGMIPs(long2ip(this->GetIP()).c_str(), this->GetAccountID())) {
|
if(!database.CheckGMIPs(long2ip(this->GetIP()).c_str(), this->GetAccountID())) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"GM Account not permited from source address %s and accountid %i", long2ip(this->GetIP()).c_str(), this->GetAccountID());
|
Log(Logs::Detail, Logs::World_Server,"GM Account not permited from source address %s and accountid %i", long2ip(this->GetIP()).c_str(), this->GetAccountID());
|
||||||
eqs->Close();
|
eqs->Close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetAccountID() == 0 && opcode != OP_SendLoginInfo) {
|
if (GetAccountID() == 0 && opcode != OP_SendLoginInfo) {
|
||||||
// Got a packet other than OP_SendLoginInfo when not logged in
|
// Got a packet other than OP_SendLoginInfo when not logged in
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Expecting OP_SendLoginInfo, got %s", OpcodeNames[opcode]);
|
Log(Logs::Detail, Logs::World_Server,"Expecting OP_SendLoginInfo, got %s", OpcodeNames[opcode]);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if (opcode == OP_AckPacket) {
|
else if (opcode == OP_AckPacket) {
|
||||||
@ -1042,7 +1044,7 @@ bool Client::HandlePacket(const EQApplicationPacket *app) {
|
|||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Received unknown EQApplicationPacket");
|
Log(Logs::Detail, Logs::World_Server,"Received unknown EQApplicationPacket");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1060,7 +1062,7 @@ bool Client::Process() {
|
|||||||
to.sin_addr.s_addr = ip;
|
to.sin_addr.s_addr = ip;
|
||||||
|
|
||||||
if (autobootup_timeout.Check()) {
|
if (autobootup_timeout.Check()) {
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Zone bootup timer expired, bootup failed or too slow.");
|
Log(Logs::General, Logs::World_Server, "Zone bootup timer expired, bootup failed or too slow.");
|
||||||
TellClientZoneUnavailable();
|
TellClientZoneUnavailable();
|
||||||
}
|
}
|
||||||
if(connect.Check()){
|
if(connect.Check()){
|
||||||
@ -1094,7 +1096,7 @@ bool Client::Process() {
|
|||||||
loginserverlist.SendPacket(pack);
|
loginserverlist.SendPacket(pack);
|
||||||
safe_delete(pack);
|
safe_delete(pack);
|
||||||
}
|
}
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Client disconnected (not active in process)");
|
Log(Logs::Detail, Logs::World_Server,"Client disconnected (not active in process)");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1143,17 +1145,17 @@ void Client::EnterWorld(bool TryBootup) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (TryBootup) {
|
if (TryBootup) {
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Attempting autobootup of %s (%d:%d)", zone_name, zone_id, instance_id);
|
Log(Logs::General, Logs::World_Server, "Attempting autobootup of %s (%d:%d)", zone_name, zone_id, instance_id);
|
||||||
autobootup_timeout.Start();
|
autobootup_timeout.Start();
|
||||||
zone_waiting_for_bootup = zoneserver_list.TriggerBootup(zone_id, instance_id);
|
zone_waiting_for_bootup = zoneserver_list.TriggerBootup(zone_id, instance_id);
|
||||||
if (zone_waiting_for_bootup == 0) {
|
if (zone_waiting_for_bootup == 0) {
|
||||||
Log.Out(Logs::General, Logs::World_Server, "No zoneserver available to boot up.");
|
Log(Logs::General, Logs::World_Server, "No zoneserver available to boot up.");
|
||||||
TellClientZoneUnavailable();
|
TellClientZoneUnavailable();
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Requested zone %s is not running.", zone_name);
|
Log(Logs::General, Logs::World_Server, "Requested zone %s is not running.", zone_name);
|
||||||
TellClientZoneUnavailable();
|
TellClientZoneUnavailable();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1167,7 +1169,7 @@ void Client::EnterWorld(bool TryBootup) {
|
|||||||
cle->SetChar(charid, char_name);
|
cle->SetChar(charid, char_name);
|
||||||
database.UpdateLiveChar(char_name, GetAccountID());
|
database.UpdateLiveChar(char_name, GetAccountID());
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::World_Server,
|
Log(Logs::General, Logs::World_Server,
|
||||||
"(%s) %s %s (Zone ID %d: Instance ID: %d) ",
|
"(%s) %s %s (Zone ID %d: Instance ID: %d) ",
|
||||||
char_name,
|
char_name,
|
||||||
(seen_character_select ? "Zoning from character select" : "Zoning to"),
|
(seen_character_select ? "Zoning from character select" : "Zoning to"),
|
||||||
@ -1178,7 +1180,7 @@ void Client::EnterWorld(bool TryBootup) {
|
|||||||
|
|
||||||
if (seen_character_select) {
|
if (seen_character_select) {
|
||||||
if (GetAdmin() < 80 && zoneserver_list.IsZoneLocked(zone_id)) {
|
if (GetAdmin() < 80 && zoneserver_list.IsZoneLocked(zone_id)) {
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Enter world failed. Zone is locked.");
|
Log(Logs::General, Logs::World_Server, "Enter world failed. Zone is locked.");
|
||||||
TellClientZoneUnavailable();
|
TellClientZoneUnavailable();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1216,9 +1218,9 @@ void Client::Clearance(int8 response)
|
|||||||
{
|
{
|
||||||
if (zs == 0)
|
if (zs == 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Unable to find zoneserver in Client::Clearance!!");
|
Log(Logs::Detail, Logs::World_Server,"Unable to find zoneserver in Client::Clearance!!");
|
||||||
} else {
|
} else {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Invalid response %d in Client::Clearance", response);
|
Log(Logs::Detail, Logs::World_Server, "Invalid response %d in Client::Clearance", response);
|
||||||
}
|
}
|
||||||
|
|
||||||
TellClientZoneUnavailable();
|
TellClientZoneUnavailable();
|
||||||
@ -1228,20 +1230,20 @@ void Client::Clearance(int8 response)
|
|||||||
EQApplicationPacket* outapp;
|
EQApplicationPacket* outapp;
|
||||||
|
|
||||||
if (zs->GetCAddress() == nullptr) {
|
if (zs->GetCAddress() == nullptr) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Unable to do zs->GetCAddress() in Client::Clearance!!");
|
Log(Logs::Detail, Logs::World_Server, "Unable to do zs->GetCAddress() in Client::Clearance!!");
|
||||||
TellClientZoneUnavailable();
|
TellClientZoneUnavailable();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (zone_id == 0) {
|
if (zone_id == 0) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "zoneID is nullptr in Client::Clearance!!");
|
Log(Logs::Detail, Logs::World_Server, "zoneID is nullptr in Client::Clearance!!");
|
||||||
TellClientZoneUnavailable();
|
TellClientZoneUnavailable();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* zonename = database.GetZoneName(zone_id);
|
const char* zonename = database.GetZoneName(zone_id);
|
||||||
if (zonename == 0) {
|
if (zonename == 0) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "zonename is nullptr in Client::Clearance!!");
|
Log(Logs::Detail, Logs::World_Server, "zonename is nullptr in Client::Clearance!!");
|
||||||
TellClientZoneUnavailable();
|
TellClientZoneUnavailable();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1259,10 +1261,10 @@ void Client::Clearance(int8 response)
|
|||||||
} else {
|
} else {
|
||||||
if(strcmp(zs->GetIP().c_str(), "127.0.0.1") == 0)
|
if(strcmp(zs->GetIP().c_str(), "127.0.0.1") == 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Local zone address was %s, setting local address to: %s", zs_addr, WorldConfig::get()->LocalAddress.c_str());
|
Log(Logs::Detail, Logs::World_Server, "Local zone address was %s, setting local address to: %s", zs_addr, WorldConfig::get()->LocalAddress.c_str());
|
||||||
zs_addr = WorldConfig::get()->LocalAddress.c_str();
|
zs_addr = WorldConfig::get()->LocalAddress.c_str();
|
||||||
} else {
|
} else {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Local zone address %s", zs_addr);
|
Log(Logs::Detail, Logs::World_Server, "Local zone address %s", zs_addr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1277,7 +1279,7 @@ void Client::Clearance(int8 response)
|
|||||||
|
|
||||||
strcpy(zsi->ip, zs_addr);
|
strcpy(zsi->ip, zs_addr);
|
||||||
zsi->port =zs->GetCPort();
|
zsi->port =zs->GetCPort();
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Sending client to zone %s (%d:%d) at %s:%d",zonename,zone_id,instance_id,zsi->ip,zsi->port);
|
Log(Logs::Detail, Logs::World_Server,"Sending client to zone %s (%d:%d) at %s:%d",zonename,zone_id,instance_id,zsi->ip,zsi->port);
|
||||||
QueuePacket(outapp);
|
QueuePacket(outapp);
|
||||||
safe_delete(outapp);
|
safe_delete(outapp);
|
||||||
|
|
||||||
@ -1308,7 +1310,7 @@ bool Client::GenPassKey(char* key) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Client::QueuePacket(const EQApplicationPacket* app, bool ack_req) {
|
void Client::QueuePacket(const EQApplicationPacket* app, bool ack_req) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Sending EQApplicationPacket OpCode 0x%04x",app->GetOpcode());
|
Log(Logs::Detail, Logs::World_Server, "Sending EQApplicationPacket OpCode 0x%04x",app->GetOpcode());
|
||||||
|
|
||||||
ack_req = true; // It's broke right now, dont delete this line till fix it. =P
|
ack_req = true; // It's broke right now, dont delete this line till fix it. =P
|
||||||
eqs->QueuePacket(app, ack_req);
|
eqs->QueuePacket(app, ack_req);
|
||||||
@ -1391,27 +1393,27 @@ bool Client::OPCharCreate(char *name, CharCreate_Struct *cc)
|
|||||||
|
|
||||||
in.s_addr = GetIP();
|
in.s_addr = GetIP();
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Character creation request from %s LS#%d (%s:%d) : ", GetCLE()->LSName(), GetCLE()->LSID(), inet_ntoa(in), GetPort());
|
Log(Logs::Detail, Logs::World_Server, "Character creation request from %s LS#%d (%s:%d) : ", GetCLE()->LSName(), GetCLE()->LSID(), inet_ntoa(in), GetPort());
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Name: %s", name);
|
Log(Logs::Detail, Logs::World_Server, "Name: %s", name);
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Race: %d Class: %d Gender: %d Deity: %d Start zone: %d Tutorial: %s",
|
Log(Logs::Detail, Logs::World_Server, "Race: %d Class: %d Gender: %d Deity: %d Start zone: %d Tutorial: %s",
|
||||||
cc->race, cc->class_, cc->gender, cc->deity, cc->start_zone, cc->tutorial ? "true" : "false");
|
cc->race, cc->class_, cc->gender, cc->deity, cc->start_zone, cc->tutorial ? "true" : "false");
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "STR STA AGI DEX WIS INT CHA Total");
|
Log(Logs::Detail, Logs::World_Server, "STR STA AGI DEX WIS INT CHA Total");
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "%3d %3d %3d %3d %3d %3d %3d %3d",
|
Log(Logs::Detail, Logs::World_Server, "%3d %3d %3d %3d %3d %3d %3d %3d",
|
||||||
cc->STR, cc->STA, cc->AGI, cc->DEX, cc->WIS, cc->INT, cc->CHA,
|
cc->STR, cc->STA, cc->AGI, cc->DEX, cc->WIS, cc->INT, cc->CHA,
|
||||||
stats_sum);
|
stats_sum);
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Face: %d Eye colors: %d %d", cc->face, cc->eyecolor1, cc->eyecolor2);
|
Log(Logs::Detail, Logs::World_Server, "Face: %d Eye colors: %d %d", cc->face, cc->eyecolor1, cc->eyecolor2);
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Hairstyle: %d Haircolor: %d", cc->hairstyle, cc->haircolor);
|
Log(Logs::Detail, Logs::World_Server, "Hairstyle: %d Haircolor: %d", cc->hairstyle, cc->haircolor);
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Beard: %d Beardcolor: %d", cc->beard, cc->beardcolor);
|
Log(Logs::Detail, Logs::World_Server, "Beard: %d Beardcolor: %d", cc->beard, cc->beardcolor);
|
||||||
|
|
||||||
/* Validate the char creation struct */
|
/* Validate the char creation struct */
|
||||||
if (m_ClientVersionBit & EQEmu::versions::bit_SoFAndLater) {
|
if (m_ClientVersionBit & EQEmu::versions::bit_SoFAndLater) {
|
||||||
if (!CheckCharCreateInfoSoF(cc)) {
|
if (!CheckCharCreateInfoSoF(cc)) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"CheckCharCreateInfo did not validate the request (bad race/class/stats)");
|
Log(Logs::Detail, Logs::World_Server,"CheckCharCreateInfo did not validate the request (bad race/class/stats)");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!CheckCharCreateInfoTitanium(cc)) {
|
if (!CheckCharCreateInfoTitanium(cc)) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"CheckCharCreateInfo did not validate the request (bad race/class/stats)");
|
Log(Logs::Detail, Logs::World_Server,"CheckCharCreateInfo did not validate the request (bad race/class/stats)");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1476,14 +1478,14 @@ bool Client::OPCharCreate(char *name, CharCreate_Struct *cc)
|
|||||||
|
|
||||||
/* If it is an SoF Client and the SoF Start Zone rule is set, send new chars there */
|
/* If it is an SoF Client and the SoF Start Zone rule is set, send new chars there */
|
||||||
if (m_ClientVersionBit & EQEmu::versions::bit_SoFAndLater) {
|
if (m_ClientVersionBit & EQEmu::versions::bit_SoFAndLater) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Found 'SoFStartZoneID' rule setting: %i", RuleI(World, SoFStartZoneID));
|
Log(Logs::Detail, Logs::World_Server,"Found 'SoFStartZoneID' rule setting: %i", RuleI(World, SoFStartZoneID));
|
||||||
if (RuleI(World, SoFStartZoneID) > 0) {
|
if (RuleI(World, SoFStartZoneID) > 0) {
|
||||||
pp.zone_id = RuleI(World, SoFStartZoneID);
|
pp.zone_id = RuleI(World, SoFStartZoneID);
|
||||||
cc->start_zone = pp.zone_id;
|
cc->start_zone = pp.zone_id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Found 'TitaniumStartZoneID' rule setting: %i", RuleI(World, TitaniumStartZoneID));
|
Log(Logs::General, Logs::World_Server, "Found 'TitaniumStartZoneID' rule setting: %i", RuleI(World, TitaniumStartZoneID));
|
||||||
if (RuleI(World, TitaniumStartZoneID) > 0) { /* if there's a startzone variable put them in there */
|
if (RuleI(World, TitaniumStartZoneID) > 0) { /* if there's a startzone variable put them in there */
|
||||||
|
|
||||||
pp.zone_id = RuleI(World, TitaniumStartZoneID);
|
pp.zone_id = RuleI(World, TitaniumStartZoneID);
|
||||||
@ -1543,11 +1545,11 @@ bool Client::OPCharCreate(char *name, CharCreate_Struct *cc)
|
|||||||
pp.binds[0].heading = pp.heading;
|
pp.binds[0].heading = pp.heading;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Current location: %s (%d) %0.2f, %0.2f, %0.2f, %0.2f",
|
Log(Logs::Detail, Logs::World_Server,"Current location: %s (%d) %0.2f, %0.2f, %0.2f, %0.2f",
|
||||||
database.GetZoneName(pp.zone_id), pp.zone_id, pp.x, pp.y, pp.z, pp.heading);
|
database.GetZoneName(pp.zone_id), pp.zone_id, pp.x, pp.y, pp.z, pp.heading);
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Bind location: %s (%d) %0.2f, %0.2f, %0.2f",
|
Log(Logs::Detail, Logs::World_Server,"Bind location: %s (%d) %0.2f, %0.2f, %0.2f",
|
||||||
database.GetZoneName(pp.binds[0].zoneId), pp.binds[0].zoneId, pp.binds[0].x, pp.binds[0].y, pp.binds[0].z);
|
database.GetZoneName(pp.binds[0].zoneId), pp.binds[0].zoneId, pp.binds[0].x, pp.binds[0].y, pp.binds[0].z);
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Home location: %s (%d) %0.2f, %0.2f, %0.2f",
|
Log(Logs::Detail, Logs::World_Server,"Home location: %s (%d) %0.2f, %0.2f, %0.2f",
|
||||||
database.GetZoneName(pp.binds[4].zoneId), pp.binds[4].zoneId, pp.binds[4].x, pp.binds[4].y, pp.binds[4].z);
|
database.GetZoneName(pp.binds[4].zoneId), pp.binds[4].zoneId, pp.binds[4].x, pp.binds[4].y, pp.binds[4].z);
|
||||||
|
|
||||||
/* Starting Items inventory */
|
/* Starting Items inventory */
|
||||||
@ -1556,10 +1558,10 @@ bool Client::OPCharCreate(char *name, CharCreate_Struct *cc)
|
|||||||
// now we give the pp and the inv we made to StoreCharacter
|
// now we give the pp and the inv we made to StoreCharacter
|
||||||
// to see if we can store it
|
// to see if we can store it
|
||||||
if (!database.StoreCharacter(GetAccountID(), &pp, &inv)) {
|
if (!database.StoreCharacter(GetAccountID(), &pp, &inv)) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Character creation failed: %s", pp.name);
|
Log(Logs::Detail, Logs::World_Server,"Character creation failed: %s", pp.name);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Character creation successful: %s", pp.name);
|
Log(Logs::Detail, Logs::World_Server,"Character creation successful: %s", pp.name);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1569,7 +1571,7 @@ bool CheckCharCreateInfoSoF(CharCreate_Struct *cc)
|
|||||||
if (!cc)
|
if (!cc)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Validating char creation info...");
|
Log(Logs::Detail, Logs::World_Server, "Validating char creation info...");
|
||||||
|
|
||||||
RaceClassCombos class_combo;
|
RaceClassCombos class_combo;
|
||||||
bool found = false;
|
bool found = false;
|
||||||
@ -1586,7 +1588,7 @@ bool CheckCharCreateInfoSoF(CharCreate_Struct *cc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!found) {
|
if (!found) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Could not find class/race/deity/start_zone combination");
|
Log(Logs::Detail, Logs::World_Server, "Could not find class/race/deity/start_zone combination");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1603,7 +1605,7 @@ bool CheckCharCreateInfoSoF(CharCreate_Struct *cc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!found) {
|
if (!found) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Could not find starting stats for selected character combo, cannot verify stats");
|
Log(Logs::Detail, Logs::World_Server, "Could not find starting stats for selected character combo, cannot verify stats");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1616,37 +1618,37 @@ bool CheckCharCreateInfoSoF(CharCreate_Struct *cc)
|
|||||||
allocation.DefaultPointAllocation[6];
|
allocation.DefaultPointAllocation[6];
|
||||||
|
|
||||||
if (cc->STR > allocation.BaseStats[0] + max_stats || cc->STR < allocation.BaseStats[0]) {
|
if (cc->STR > allocation.BaseStats[0] + max_stats || cc->STR < allocation.BaseStats[0]) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Strength out of range");
|
Log(Logs::Detail, Logs::World_Server, "Strength out of range");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cc->DEX > allocation.BaseStats[1] + max_stats || cc->DEX < allocation.BaseStats[1]) {
|
if (cc->DEX > allocation.BaseStats[1] + max_stats || cc->DEX < allocation.BaseStats[1]) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Dexterity out of range");
|
Log(Logs::Detail, Logs::World_Server, "Dexterity out of range");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cc->AGI > allocation.BaseStats[2] + max_stats || cc->AGI < allocation.BaseStats[2]) {
|
if (cc->AGI > allocation.BaseStats[2] + max_stats || cc->AGI < allocation.BaseStats[2]) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Agility out of range");
|
Log(Logs::Detail, Logs::World_Server, "Agility out of range");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cc->STA > allocation.BaseStats[3] + max_stats || cc->STA < allocation.BaseStats[3]) {
|
if (cc->STA > allocation.BaseStats[3] + max_stats || cc->STA < allocation.BaseStats[3]) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Stamina out of range");
|
Log(Logs::Detail, Logs::World_Server, "Stamina out of range");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cc->INT > allocation.BaseStats[4] + max_stats || cc->INT < allocation.BaseStats[4]) {
|
if (cc->INT > allocation.BaseStats[4] + max_stats || cc->INT < allocation.BaseStats[4]) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Intelligence out of range");
|
Log(Logs::Detail, Logs::World_Server, "Intelligence out of range");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cc->WIS > allocation.BaseStats[5] + max_stats || cc->WIS < allocation.BaseStats[5]) {
|
if (cc->WIS > allocation.BaseStats[5] + max_stats || cc->WIS < allocation.BaseStats[5]) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Wisdom out of range");
|
Log(Logs::Detail, Logs::World_Server, "Wisdom out of range");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cc->CHA > allocation.BaseStats[6] + max_stats || cc->CHA < allocation.BaseStats[6]) {
|
if (cc->CHA > allocation.BaseStats[6] + max_stats || cc->CHA < allocation.BaseStats[6]) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Charisma out of range");
|
Log(Logs::Detail, Logs::World_Server, "Charisma out of range");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1659,7 +1661,7 @@ bool CheckCharCreateInfoSoF(CharCreate_Struct *cc)
|
|||||||
current_stats += cc->WIS - allocation.BaseStats[5];
|
current_stats += cc->WIS - allocation.BaseStats[5];
|
||||||
current_stats += cc->CHA - allocation.BaseStats[6];
|
current_stats += cc->CHA - allocation.BaseStats[6];
|
||||||
if (current_stats > max_stats) {
|
if (current_stats > max_stats) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Current Stats > Maximum Stats");
|
Log(Logs::Detail, Logs::World_Server, "Current Stats > Maximum Stats");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1740,7 +1742,7 @@ bool CheckCharCreateInfoTitanium(CharCreate_Struct *cc)
|
|||||||
if (!cc)
|
if (!cc)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Validating char creation info...");
|
Log(Logs::Detail, Logs::World_Server,"Validating char creation info...");
|
||||||
|
|
||||||
classtemp = cc->class_ - 1;
|
classtemp = cc->class_ - 1;
|
||||||
racetemp = cc->race - 1;
|
racetemp = cc->race - 1;
|
||||||
@ -1753,16 +1755,16 @@ bool CheckCharCreateInfoTitanium(CharCreate_Struct *cc)
|
|||||||
// if out of range looking it up in the table would crash stuff
|
// if out of range looking it up in the table would crash stuff
|
||||||
// so we return from these
|
// so we return from these
|
||||||
if (classtemp >= PLAYER_CLASS_COUNT) {
|
if (classtemp >= PLAYER_CLASS_COUNT) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server," class is out of range");
|
Log(Logs::Detail, Logs::World_Server," class is out of range");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (racetemp >= _TABLE_RACES) {
|
if (racetemp >= _TABLE_RACES) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server," race is out of range");
|
Log(Logs::Detail, Logs::World_Server," race is out of range");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ClassRaceLookupTable[classtemp][racetemp]) { //Lookup table better than a bunch of ifs?
|
if (!ClassRaceLookupTable[classtemp][racetemp]) { //Lookup table better than a bunch of ifs?
|
||||||
Log.Out(Logs::Detail, Logs::World_Server," invalid race/class combination");
|
Log(Logs::Detail, Logs::World_Server," invalid race/class combination");
|
||||||
// we return from this one, since if it's an invalid combination our table
|
// we return from this one, since if it's an invalid combination our table
|
||||||
// doesn't have meaningful values for the stats
|
// doesn't have meaningful values for the stats
|
||||||
return false;
|
return false;
|
||||||
@ -1790,43 +1792,43 @@ bool CheckCharCreateInfoTitanium(CharCreate_Struct *cc)
|
|||||||
// that are messed up not just the first hit
|
// that are messed up not just the first hit
|
||||||
|
|
||||||
if (bTOTAL + stat_points != cTOTAL) {
|
if (bTOTAL + stat_points != cTOTAL) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server," stat points total doesn't match expected value: expecting %d got %d", bTOTAL + stat_points, cTOTAL);
|
Log(Logs::Detail, Logs::World_Server," stat points total doesn't match expected value: expecting %d got %d", bTOTAL + stat_points, cTOTAL);
|
||||||
Charerrors++;
|
Charerrors++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cc->STR > bSTR + stat_points || cc->STR < bSTR) {
|
if (cc->STR > bSTR + stat_points || cc->STR < bSTR) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server," stat STR is out of range");
|
Log(Logs::Detail, Logs::World_Server," stat STR is out of range");
|
||||||
Charerrors++;
|
Charerrors++;
|
||||||
}
|
}
|
||||||
if (cc->STA > bSTA + stat_points || cc->STA < bSTA) {
|
if (cc->STA > bSTA + stat_points || cc->STA < bSTA) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server," stat STA is out of range");
|
Log(Logs::Detail, Logs::World_Server," stat STA is out of range");
|
||||||
Charerrors++;
|
Charerrors++;
|
||||||
}
|
}
|
||||||
if (cc->AGI > bAGI + stat_points || cc->AGI < bAGI) {
|
if (cc->AGI > bAGI + stat_points || cc->AGI < bAGI) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server," stat AGI is out of range");
|
Log(Logs::Detail, Logs::World_Server," stat AGI is out of range");
|
||||||
Charerrors++;
|
Charerrors++;
|
||||||
}
|
}
|
||||||
if (cc->DEX > bDEX + stat_points || cc->DEX < bDEX) {
|
if (cc->DEX > bDEX + stat_points || cc->DEX < bDEX) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server," stat DEX is out of range");
|
Log(Logs::Detail, Logs::World_Server," stat DEX is out of range");
|
||||||
Charerrors++;
|
Charerrors++;
|
||||||
}
|
}
|
||||||
if (cc->WIS > bWIS + stat_points || cc->WIS < bWIS) {
|
if (cc->WIS > bWIS + stat_points || cc->WIS < bWIS) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server," stat WIS is out of range");
|
Log(Logs::Detail, Logs::World_Server," stat WIS is out of range");
|
||||||
Charerrors++;
|
Charerrors++;
|
||||||
}
|
}
|
||||||
if (cc->INT > bINT + stat_points || cc->INT < bINT) {
|
if (cc->INT > bINT + stat_points || cc->INT < bINT) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server," stat INT is out of range");
|
Log(Logs::Detail, Logs::World_Server," stat INT is out of range");
|
||||||
Charerrors++;
|
Charerrors++;
|
||||||
}
|
}
|
||||||
if (cc->CHA > bCHA + stat_points || cc->CHA < bCHA) {
|
if (cc->CHA > bCHA + stat_points || cc->CHA < bCHA) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server," stat CHA is out of range");
|
Log(Logs::Detail, Logs::World_Server," stat CHA is out of range");
|
||||||
Charerrors++;
|
Charerrors++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*TODO: Check for deity/class/race.. it'd be nice, but probably of any real use to hack(faction, deity based items are all I can think of)
|
/*TODO: Check for deity/class/race.. it'd be nice, but probably of any real use to hack(faction, deity based items are all I can think of)
|
||||||
I am NOT writing those tables - kathgar*/
|
I am NOT writing those tables - kathgar*/
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Found %d errors in character creation request", Charerrors);
|
Log(Logs::Detail, Logs::World_Server,"Found %d errors in character creation request", Charerrors);
|
||||||
|
|
||||||
return Charerrors == 0;
|
return Charerrors == 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -283,7 +283,7 @@ bool ClientListEntry::CheckAuth(uint32 iLSID, const char* iKey) {
|
|||||||
int16 tmpStatus = WorldConfig::get()->DefaultStatus;
|
int16 tmpStatus = WorldConfig::get()->DefaultStatus;
|
||||||
paccountid = database.CreateAccount(plsname, 0, tmpStatus, LSID());
|
paccountid = database.CreateAccount(plsname, 0, tmpStatus, LSID());
|
||||||
if (!paccountid) {
|
if (!paccountid) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Error adding local account for LS login: '%s', duplicate name?" ,plsname);
|
Log(Logs::Detail, Logs::World_Server,"Error adding local account for LS login: '%s', duplicate name?" ,plsname);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
strn0cpy(paccountname, plsname, sizeof(paccountname));
|
strn0cpy(paccountname, plsname, sizeof(paccountname));
|
||||||
|
|||||||
@ -63,7 +63,7 @@ void ClientList::Process() {
|
|||||||
if (!iterator.GetData()->Process()) {
|
if (!iterator.GetData()->Process()) {
|
||||||
struct in_addr in;
|
struct in_addr in;
|
||||||
in.s_addr = iterator.GetData()->GetIP();
|
in.s_addr = iterator.GetData()->GetIP();
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Removing client from %s:%d", inet_ntoa(in), iterator.GetData()->GetPort());
|
Log(Logs::Detail, Logs::World_Server,"Removing client from %s:%d", inet_ntoa(in), iterator.GetData()->GetPort());
|
||||||
//the client destructor should take care of this.
|
//the client destructor should take care of this.
|
||||||
// iterator.GetData()->Free();
|
// iterator.GetData()->Free();
|
||||||
iterator.RemoveCurrent();
|
iterator.RemoveCurrent();
|
||||||
@ -158,16 +158,16 @@ void ClientList::GetCLEIP(uint32 iIP) {
|
|||||||
countCLEIPs = iterator.GetData();
|
countCLEIPs = iterator.GetData();
|
||||||
if ((countCLEIPs->GetIP() == iIP) && ((countCLEIPs->Admin() < (RuleI(World, ExemptMaxClientsStatus))) || (RuleI(World, ExemptMaxClientsStatus) < 0))) { // If the IP matches, and the connection admin status is below the exempt status, or exempt status is less than 0 (no-one is exempt)
|
if ((countCLEIPs->GetIP() == iIP) && ((countCLEIPs->Admin() < (RuleI(World, ExemptMaxClientsStatus))) || (RuleI(World, ExemptMaxClientsStatus) < 0))) { // If the IP matches, and the connection admin status is below the exempt status, or exempt status is less than 0 (no-one is exempt)
|
||||||
IPInstances++; // Increment the occurences of this IP address
|
IPInstances++; // Increment the occurences of this IP address
|
||||||
Log.Out(Logs::General, Logs::Client_Login, "Account ID: %i Account Name: %s IP: %s.", countCLEIPs->LSID(), countCLEIPs->LSName(), long2ip(countCLEIPs->GetIP()).c_str());
|
Log(Logs::General, Logs::Client_Login, "Account ID: %i Account Name: %s IP: %s.", countCLEIPs->LSID(), countCLEIPs->LSName(), long2ip(countCLEIPs->GetIP()).c_str());
|
||||||
if (RuleB(World, EnableIPExemptions)) {
|
if (RuleB(World, EnableIPExemptions)) {
|
||||||
Log.Out(Logs::General, Logs::Client_Login, "Account ID: %i Account Name: %s IP: %s IP Instances: %i Max IP Instances: %i", countCLEIPs->LSID(), countCLEIPs->LSName(), long2ip(countCLEIPs->GetIP()).c_str(), IPInstances, database.GetIPExemption(long2ip(countCLEIPs->GetIP()).c_str()));
|
Log(Logs::General, Logs::Client_Login, "Account ID: %i Account Name: %s IP: %s IP Instances: %i Max IP Instances: %i", countCLEIPs->LSID(), countCLEIPs->LSName(), long2ip(countCLEIPs->GetIP()).c_str(), IPInstances, database.GetIPExemption(long2ip(countCLEIPs->GetIP()).c_str()));
|
||||||
if (IPInstances > database.GetIPExemption(long2ip(countCLEIPs->GetIP()).c_str())) {
|
if (IPInstances > database.GetIPExemption(long2ip(countCLEIPs->GetIP()).c_str())) {
|
||||||
if(RuleB(World, IPLimitDisconnectAll)) {
|
if(RuleB(World, IPLimitDisconnectAll)) {
|
||||||
Log.Out(Logs::General, Logs::Client_Login, "Disconnect: All accounts on IP %s", long2ip(countCLEIPs->GetIP()).c_str());
|
Log(Logs::General, Logs::Client_Login, "Disconnect: All accounts on IP %s", long2ip(countCLEIPs->GetIP()).c_str());
|
||||||
DisconnectByIP(iIP);
|
DisconnectByIP(iIP);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
Log.Out(Logs::General, Logs::Client_Login, "Disconnect: Account %s on IP %s.", countCLEIPs->LSName(), long2ip(countCLEIPs->GetIP()).c_str());
|
Log(Logs::General, Logs::Client_Login, "Disconnect: Account %s on IP %s.", countCLEIPs->LSName(), long2ip(countCLEIPs->GetIP()).c_str());
|
||||||
countCLEIPs->SetOnline(CLE_Status_Offline);
|
countCLEIPs->SetOnline(CLE_Status_Offline);
|
||||||
iterator.RemoveCurrent();
|
iterator.RemoveCurrent();
|
||||||
continue;
|
continue;
|
||||||
@ -176,14 +176,14 @@ void ClientList::GetCLEIP(uint32 iIP) {
|
|||||||
} else {
|
} else {
|
||||||
if (IPInstances > (RuleI(World, MaxClientsPerIP))) { // If the number of connections exceeds the lower limit
|
if (IPInstances > (RuleI(World, MaxClientsPerIP))) { // If the number of connections exceeds the lower limit
|
||||||
if (RuleB(World, MaxClientsSetByStatus)) { // If MaxClientsSetByStatus is set to True, override other IP Limit Rules
|
if (RuleB(World, MaxClientsSetByStatus)) { // If MaxClientsSetByStatus is set to True, override other IP Limit Rules
|
||||||
Log.Out(Logs::General, Logs::Client_Login, "Account ID: %i Account Name: %s IP: %s IP Instances: %i Max IP Instances: %i", countCLEIPs->LSID(), countCLEIPs->LSName(), long2ip(countCLEIPs->GetIP()).c_str(), IPInstances, countCLEIPs->Admin());
|
Log(Logs::General, Logs::Client_Login, "Account ID: %i Account Name: %s IP: %s IP Instances: %i Max IP Instances: %i", countCLEIPs->LSID(), countCLEIPs->LSName(), long2ip(countCLEIPs->GetIP()).c_str(), IPInstances, countCLEIPs->Admin());
|
||||||
if (IPInstances > countCLEIPs->Admin()) { // The IP Limit is set by the status of the account if status > MaxClientsPerIP
|
if (IPInstances > countCLEIPs->Admin()) { // The IP Limit is set by the status of the account if status > MaxClientsPerIP
|
||||||
if(RuleB(World, IPLimitDisconnectAll)) {
|
if(RuleB(World, IPLimitDisconnectAll)) {
|
||||||
Log.Out(Logs::General, Logs::Client_Login, "Disconnect: All accounts on IP %s", long2ip(countCLEIPs->GetIP()).c_str());
|
Log(Logs::General, Logs::Client_Login, "Disconnect: All accounts on IP %s", long2ip(countCLEIPs->GetIP()).c_str());
|
||||||
DisconnectByIP(iIP);
|
DisconnectByIP(iIP);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
Log.Out(Logs::General, Logs::Client_Login, "Disconnect: Account %s on IP %s.", countCLEIPs->LSName(), long2ip(countCLEIPs->GetIP()).c_str());
|
Log(Logs::General, Logs::Client_Login, "Disconnect: Account %s on IP %s.", countCLEIPs->LSName(), long2ip(countCLEIPs->GetIP()).c_str());
|
||||||
countCLEIPs->SetOnline(CLE_Status_Offline); // Remove the connection
|
countCLEIPs->SetOnline(CLE_Status_Offline); // Remove the connection
|
||||||
iterator.RemoveCurrent();
|
iterator.RemoveCurrent();
|
||||||
continue;
|
continue;
|
||||||
@ -191,22 +191,22 @@ void ClientList::GetCLEIP(uint32 iIP) {
|
|||||||
}
|
}
|
||||||
} else if ((countCLEIPs->Admin() < RuleI(World, AddMaxClientsStatus)) || (RuleI(World, AddMaxClientsStatus) < 0)) { // Else if the Admin status of the connection is not eligible for the higher limit, or there is no higher limit (AddMaxClientStatus < 0)
|
} else if ((countCLEIPs->Admin() < RuleI(World, AddMaxClientsStatus)) || (RuleI(World, AddMaxClientsStatus) < 0)) { // Else if the Admin status of the connection is not eligible for the higher limit, or there is no higher limit (AddMaxClientStatus < 0)
|
||||||
if(RuleB(World, IPLimitDisconnectAll)) {
|
if(RuleB(World, IPLimitDisconnectAll)) {
|
||||||
Log.Out(Logs::General, Logs::Client_Login, "Disconnect: All accounts on IP %s", long2ip(countCLEIPs->GetIP()).c_str());
|
Log(Logs::General, Logs::Client_Login, "Disconnect: All accounts on IP %s", long2ip(countCLEIPs->GetIP()).c_str());
|
||||||
DisconnectByIP(iIP);
|
DisconnectByIP(iIP);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
Log.Out(Logs::General, Logs::Client_Login, "Disconnect: Account %s on IP %s.", countCLEIPs->LSName(), long2ip(countCLEIPs->GetIP()).c_str());
|
Log(Logs::General, Logs::Client_Login, "Disconnect: Account %s on IP %s.", countCLEIPs->LSName(), long2ip(countCLEIPs->GetIP()).c_str());
|
||||||
countCLEIPs->SetOnline(CLE_Status_Offline); // Remove the connection
|
countCLEIPs->SetOnline(CLE_Status_Offline); // Remove the connection
|
||||||
iterator.RemoveCurrent();
|
iterator.RemoveCurrent();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else if (IPInstances > RuleI(World, AddMaxClientsPerIP)) { // else they are eligible for the higher limit, but if they exceed that
|
} else if (IPInstances > RuleI(World, AddMaxClientsPerIP)) { // else they are eligible for the higher limit, but if they exceed that
|
||||||
if(RuleB(World, IPLimitDisconnectAll)) {
|
if(RuleB(World, IPLimitDisconnectAll)) {
|
||||||
Log.Out(Logs::General, Logs::Client_Login, "Disconnect: All accounts on IP %s", long2ip(countCLEIPs->GetIP()).c_str());
|
Log(Logs::General, Logs::Client_Login, "Disconnect: All accounts on IP %s", long2ip(countCLEIPs->GetIP()).c_str());
|
||||||
DisconnectByIP(iIP);
|
DisconnectByIP(iIP);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
Log.Out(Logs::General, Logs::Client_Login, "Disconnect: Account %s on IP %s.", countCLEIPs->LSName(), long2ip(countCLEIPs->GetIP()).c_str());
|
Log(Logs::General, Logs::Client_Login, "Disconnect: Account %s on IP %s.", countCLEIPs->LSName(), long2ip(countCLEIPs->GetIP()).c_str());
|
||||||
countCLEIPs->SetOnline(CLE_Status_Offline); // Remove the connection
|
countCLEIPs->SetOnline(CLE_Status_Offline); // Remove the connection
|
||||||
iterator.RemoveCurrent();
|
iterator.RemoveCurrent();
|
||||||
continue;
|
continue;
|
||||||
@ -468,7 +468,7 @@ void ClientList::SendOnlineGuildMembers(uint32 FromID, uint32 GuildID)
|
|||||||
|
|
||||||
if(!from)
|
if(!from)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Invalid client. FromID=%i GuildID=%i", FromID, GuildID);
|
Log(Logs::Detail, Logs::World_Server,"Invalid client. FromID=%i GuildID=%i", FromID, GuildID);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -771,7 +771,7 @@ void ClientList::SendWhoAll(uint32 fromid,const char* to, int16 admin, Who_All_S
|
|||||||
safe_delete_array(output);
|
safe_delete_array(output);
|
||||||
}
|
}
|
||||||
catch(...){
|
catch(...){
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Unknown error in world's SendWhoAll (probably mem error), ignoring...");
|
Log(Logs::Detail, Logs::World_Server,"Unknown error in world's SendWhoAll (probably mem error), ignoring...");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -914,7 +914,7 @@ void ClientList::SendFriendsWho(ServerFriendsWho_Struct *FriendsWho, WorldTCPCon
|
|||||||
safe_delete(pack2);
|
safe_delete(pack2);
|
||||||
}
|
}
|
||||||
catch(...){
|
catch(...){
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Unknown error in world's SendFriendsWho (probably mem error), ignoring...");
|
Log(Logs::Detail, Logs::World_Server,"Unknown error in world's SendFriendsWho (probably mem error), ignoring...");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1147,7 +1147,7 @@ Client* ClientList::FindByAccountID(uint32 account_id) {
|
|||||||
|
|
||||||
iterator.Reset();
|
iterator.Reset();
|
||||||
while(iterator.MoreElements()) {
|
while(iterator.MoreElements()) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "ClientList[0x%08x]::FindByAccountID(%p) iterator.GetData()[%p]", this, account_id, iterator.GetData());
|
Log(Logs::Detail, Logs::World_Server, "ClientList[0x%08x]::FindByAccountID(%p) iterator.GetData()[%p]", this, account_id, iterator.GetData());
|
||||||
if (iterator.GetData()->GetAccountID() == account_id) {
|
if (iterator.GetData()->GetAccountID() == account_id) {
|
||||||
Client* tmp = iterator.GetData();
|
Client* tmp = iterator.GetData();
|
||||||
return tmp;
|
return tmp;
|
||||||
@ -1162,7 +1162,7 @@ Client* ClientList::FindByName(char* charname) {
|
|||||||
|
|
||||||
iterator.Reset();
|
iterator.Reset();
|
||||||
while(iterator.MoreElements()) {
|
while(iterator.MoreElements()) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "ClientList[0x%08x]::FindByName(\"%s\") iterator.GetData()[%p]", this, charname, iterator.GetData());
|
Log(Logs::Detail, Logs::World_Server, "ClientList[0x%08x]::FindByName(\"%s\") iterator.GetData()[%p]", this, charname, iterator.GetData());
|
||||||
if (iterator.GetData()->GetCharName() == charname) {
|
if (iterator.GetData()->GetCharName() == charname) {
|
||||||
Client* tmp = iterator.GetData();
|
Client* tmp = iterator.GetData();
|
||||||
return tmp;
|
return tmp;
|
||||||
|
|||||||
890
world/console.cpp
Normal file
890
world/console.cpp
Normal file
@ -0,0 +1,890 @@
|
|||||||
|
/* EQEMu: Everquest Server Emulator
|
||||||
|
Copyright (C) 2001-2002 EQEMu Development Team (http://eqemu.org)
|
||||||
|
|
||||||
|
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 "../common/global_define.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "../common/version.h"
|
||||||
|
#include "console.h"
|
||||||
|
#include "zoneserver.h"
|
||||||
|
#include "worlddb.h"
|
||||||
|
#include "../common/packet_dump.h"
|
||||||
|
#include "../common/seperator.h"
|
||||||
|
#include "../common/eq_packet_structs.h"
|
||||||
|
#include "../common/eq_packet.h"
|
||||||
|
#include "login_server.h"
|
||||||
|
#include "login_server_list.h"
|
||||||
|
#include "../common/serverinfo.h"
|
||||||
|
#include "../common/md5.h"
|
||||||
|
#include "../common/opcodemgr.h"
|
||||||
|
#include "../common/rulesys.h"
|
||||||
|
#include "../common/ruletypes.h"
|
||||||
|
#include "../common/string_util.h"
|
||||||
|
#include "world_config.h"
|
||||||
|
#include "zoneserver.h"
|
||||||
|
#include "zonelist.h"
|
||||||
|
#include "clientlist.h"
|
||||||
|
#include "launcher_list.h"
|
||||||
|
#include "ucs.h"
|
||||||
|
#include "queryserv.h"
|
||||||
|
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
#define snprintf _snprintf
|
||||||
|
#define strncasecmp _strnicmp
|
||||||
|
#define strcasecmp _stricmp
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern ZSList zoneserver_list;
|
||||||
|
extern uint32 numzones;
|
||||||
|
extern LoginServerList loginserverlist;
|
||||||
|
extern ClientList client_list;
|
||||||
|
extern LauncherList launcher_list;
|
||||||
|
extern UCSConnection UCSLink;
|
||||||
|
extern QueryServConnection QSLink;
|
||||||
|
extern volatile bool RunLoops;
|
||||||
|
|
||||||
|
ConsoleList console_list;
|
||||||
|
void CatchSignal(int sig_num);
|
||||||
|
|
||||||
|
Console::Console(EmuTCPConnection* itcpc)
|
||||||
|
: WorldTCPConnection(),
|
||||||
|
timeout_timer(RuleI(Console, SessionTimeOut)),
|
||||||
|
prompt_timer(1)
|
||||||
|
{
|
||||||
|
tcpc = itcpc;
|
||||||
|
tcpc->SetEcho(true);
|
||||||
|
state = 0;
|
||||||
|
paccountid = 0;
|
||||||
|
memset(paccountname, 0, sizeof(paccountname));
|
||||||
|
admin = 0;
|
||||||
|
pAcceptMessages = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Console::~Console() {
|
||||||
|
if (tcpc)
|
||||||
|
tcpc->Free();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Console::Die() {
|
||||||
|
state = CONSOLE_STATE_CLOSED;
|
||||||
|
struct in_addr in;
|
||||||
|
in.s_addr = GetIP();
|
||||||
|
Log(Logs::Detail, Logs::World_Server,"Removing console from %s:%d",inet_ntoa(in),GetPort());
|
||||||
|
tcpc->Disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Console::SendChannelMessage(const ServerChannelMessage_Struct* scm) {
|
||||||
|
if (!pAcceptMessages)
|
||||||
|
return false;
|
||||||
|
switch (scm->chan_num) {
|
||||||
|
if(RuleB(Chat, ServerWideAuction)){
|
||||||
|
case 4: {
|
||||||
|
SendMessage(1, "%s auctions, '%s'", scm->from, scm->message);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(RuleB(Chat, ServerWideOOC)){
|
||||||
|
case 5: {
|
||||||
|
SendMessage(1, "%s says ooc, '%s'", scm->from, scm->message);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 6: {
|
||||||
|
SendMessage(1, "%s BROADCASTS, '%s'", scm->from, scm->message);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 7: {
|
||||||
|
SendMessage(1, "[%s] tells you, '%s'", scm->from, scm->message);
|
||||||
|
auto pack = new ServerPacket(ServerOP_ChannelMessage,
|
||||||
|
sizeof(ServerChannelMessage_Struct) + strlen(scm->message) + 1);
|
||||||
|
memcpy(pack->pBuffer, scm, pack->size);
|
||||||
|
ServerChannelMessage_Struct* scm2 = (ServerChannelMessage_Struct*) pack->pBuffer;
|
||||||
|
strcpy(scm2->deliverto, scm2->from);
|
||||||
|
scm2->noreply = true;
|
||||||
|
client_list.SendPacket(scm->from, pack);
|
||||||
|
safe_delete(pack);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 11: {
|
||||||
|
SendMessage(1, "%s GMSAYS, '%s'", scm->from, scm->message);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Console::SendEmoteMessage(uint32 type, const char* message, ...) {
|
||||||
|
if (!message)
|
||||||
|
return false;
|
||||||
|
if (!pAcceptMessages)
|
||||||
|
return false;
|
||||||
|
va_list argptr;
|
||||||
|
char buffer[1024];
|
||||||
|
|
||||||
|
va_start(argptr, message);
|
||||||
|
vsnprintf(buffer, sizeof(buffer), message, argptr);
|
||||||
|
va_end(argptr);
|
||||||
|
|
||||||
|
SendMessage(1, message);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Console::SendEmoteMessageRaw(uint32 type, const char* message) {
|
||||||
|
if (!message)
|
||||||
|
return false;
|
||||||
|
if (!pAcceptMessages)
|
||||||
|
return false;
|
||||||
|
SendMessage(1, message);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Console::SendEmoteMessage(const char* to, uint32 to_guilddbid, int16 to_minstatus, uint32 type, const char* message, ...) {
|
||||||
|
if (!message)
|
||||||
|
return;
|
||||||
|
if (to_guilddbid != 0 || to_minstatus > Admin())
|
||||||
|
return;
|
||||||
|
va_list argptr;
|
||||||
|
char buffer[1024];
|
||||||
|
|
||||||
|
va_start(argptr, message);
|
||||||
|
vsnprintf(buffer, sizeof(buffer), message, argptr);
|
||||||
|
va_end(argptr);
|
||||||
|
|
||||||
|
SendEmoteMessageRaw(to, to_guilddbid, to_minstatus, type, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Console::SendEmoteMessageRaw(const char* to, uint32 to_guilddbid, int16 to_minstatus, uint32 type, const char* message) {
|
||||||
|
if (!message)
|
||||||
|
return;
|
||||||
|
if (to_guilddbid != 0 || to_minstatus > Admin())
|
||||||
|
return;
|
||||||
|
SendMessage(1, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Console::SendMessage(uint8 newline, const char* message, ...) {
|
||||||
|
if (!message)
|
||||||
|
return;
|
||||||
|
char* buffer = 0;
|
||||||
|
uint32 bufsize = 1500;
|
||||||
|
if (message)
|
||||||
|
bufsize += strlen(message);
|
||||||
|
buffer = new char[bufsize];
|
||||||
|
memset(buffer, 0, bufsize);
|
||||||
|
if (message != 0) {
|
||||||
|
va_list argptr;
|
||||||
|
|
||||||
|
va_start(argptr, message);
|
||||||
|
vsnprintf(buffer, bufsize - 512, message, argptr);
|
||||||
|
va_end(argptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newline) {
|
||||||
|
char outbuf[3];
|
||||||
|
outbuf[0] = 13;
|
||||||
|
outbuf[1] = 10;
|
||||||
|
outbuf[2] = 0;
|
||||||
|
for (int i=0; i < newline; i++)
|
||||||
|
strcat(buffer, outbuf);
|
||||||
|
}
|
||||||
|
tcpc->Send((uchar*) buffer, strlen(buffer));
|
||||||
|
safe_delete_array(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Console::Process() {
|
||||||
|
if (state == CONSOLE_STATE_CLOSED)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!tcpc->Connected()) {
|
||||||
|
struct in_addr in;
|
||||||
|
in.s_addr = GetIP();
|
||||||
|
Log(Logs::Detail, Logs::World_Server,"Removing console (!tcpc->Connected) from %s:%d",inet_ntoa(in),GetPort());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//if we have not gotten the special markers after this timer, send login prompt
|
||||||
|
if(prompt_timer.Check()) {
|
||||||
|
struct in_addr in;
|
||||||
|
in.s_addr = GetIP();
|
||||||
|
|
||||||
|
std::string connecting_ip = inet_ntoa(in);
|
||||||
|
|
||||||
|
SendMessage(2, StringFormat("Establishing connection from IP: %s Port: %d", inet_ntoa(in), GetPort()).c_str());
|
||||||
|
|
||||||
|
if (connecting_ip.find("127.0.0.1") != std::string::npos) {
|
||||||
|
SendMessage(2, StringFormat("Connecting established from local host, auto assuming admin").c_str());
|
||||||
|
state = CONSOLE_STATE_CONNECTED;
|
||||||
|
tcpc->SetEcho(false);
|
||||||
|
admin = 255;
|
||||||
|
SendPrompt();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (tcpc->GetMode() == EmuTCPConnection::modeConsole)
|
||||||
|
tcpc->Send((const uchar*) "Username: ", strlen("Username: "));
|
||||||
|
}
|
||||||
|
|
||||||
|
prompt_timer.Disable();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (timeout_timer.Check()) {
|
||||||
|
SendMessage(1, 0);
|
||||||
|
SendMessage(1, "Timeout, disconnecting...");
|
||||||
|
struct in_addr in;
|
||||||
|
in.s_addr = GetIP();
|
||||||
|
Log(Logs::Detail, Logs::World_Server,"TCP connection timeout from %s:%d",inet_ntoa(in),GetPort());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tcpc->GetMode() == EmuTCPConnection::modePacket) {
|
||||||
|
struct in_addr in;
|
||||||
|
in.s_addr = GetIP();
|
||||||
|
if(tcpc->GetPacketMode() == EmuTCPConnection::packetModeZone) {
|
||||||
|
auto zs = new ZoneServer(tcpc);
|
||||||
|
Log(Logs::Detail, Logs::World_Server,"New zoneserver #%d from %s:%d", zs->GetID(), inet_ntoa(in), GetPort());
|
||||||
|
zoneserver_list.Add(zs);
|
||||||
|
numzones++;
|
||||||
|
tcpc = 0;
|
||||||
|
} else if(tcpc->GetPacketMode() == EmuTCPConnection::packetModeLauncher) {
|
||||||
|
Log(Logs::Detail, Logs::World_Server,"New launcher from %s:%d", inet_ntoa(in), GetPort());
|
||||||
|
launcher_list.Add(tcpc);
|
||||||
|
tcpc = 0;
|
||||||
|
}
|
||||||
|
else if(tcpc->GetPacketMode() == EmuTCPConnection::packetModeUCS)
|
||||||
|
{
|
||||||
|
Log(Logs::Detail, Logs::World_Server,"New UCS Connection from %s:%d", inet_ntoa(in), GetPort());
|
||||||
|
UCSLink.SetConnection(tcpc);
|
||||||
|
tcpc = 0;
|
||||||
|
}
|
||||||
|
else if(tcpc->GetPacketMode() == EmuTCPConnection::packetModeQueryServ)
|
||||||
|
{
|
||||||
|
Log(Logs::Detail, Logs::World_Server,"New QS Connection from %s:%d", inet_ntoa(in), GetPort());
|
||||||
|
QSLink.SetConnection(tcpc);
|
||||||
|
tcpc = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Log(Logs::Detail, Logs::World_Server,"Unsupported packet mode from %s:%d", inet_ntoa(in), GetPort());
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
char* command = 0;
|
||||||
|
while ((command = tcpc->PopLine())) {
|
||||||
|
timeout_timer.Start();
|
||||||
|
ProcessCommand(command);
|
||||||
|
delete command;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConsoleList::Add(Console* con) {
|
||||||
|
list.Insert(con);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConsoleList::Process() {
|
||||||
|
LinkedListIterator<Console*> iterator(list);
|
||||||
|
iterator.Reset();
|
||||||
|
|
||||||
|
while(iterator.MoreElements()) {
|
||||||
|
if (!iterator.GetData()->Process())
|
||||||
|
iterator.RemoveCurrent();
|
||||||
|
else
|
||||||
|
iterator.Advance();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConsoleList::KillAll() {
|
||||||
|
LinkedListIterator<Console*> iterator(list);
|
||||||
|
iterator.Reset();
|
||||||
|
|
||||||
|
while(iterator.MoreElements()) {
|
||||||
|
iterator.GetData()->Die();
|
||||||
|
iterator.RemoveCurrent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConsoleList::SendConsoleWho(WorldTCPConnection* connection, const char* to, int16 admin, char** output, uint32* outsize, uint32* outlen) {
|
||||||
|
LinkedListIterator<Console*> iterator(list);
|
||||||
|
iterator.Reset();
|
||||||
|
struct in_addr in;
|
||||||
|
int x = 0;
|
||||||
|
|
||||||
|
while(iterator.MoreElements()) {
|
||||||
|
in.s_addr = iterator.GetData()->GetIP();
|
||||||
|
if (admin >= iterator.GetData()->Admin())
|
||||||
|
AppendAnyLenString(output, outsize, outlen, " Console: %s:%i AccID: %i AccName: %s", inet_ntoa(in), iterator.GetData()->GetPort(), iterator.GetData()->AccountID(), iterator.GetData()->AccountName());
|
||||||
|
else
|
||||||
|
AppendAnyLenString(output, outsize, outlen, " Console: AccID: %i AccName: %s", iterator.GetData()->AccountID(), iterator.GetData()->AccountName());
|
||||||
|
if (*outlen >= 3584) {
|
||||||
|
connection->SendEmoteMessageRaw(to, 0, 0, 10, *output);
|
||||||
|
safe_delete(*output);
|
||||||
|
*outsize = 0;
|
||||||
|
*outlen = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (connection->IsConsole())
|
||||||
|
AppendAnyLenString(output, outsize, outlen, "\r\n");
|
||||||
|
else
|
||||||
|
AppendAnyLenString(output, outsize, outlen, "\n");
|
||||||
|
}
|
||||||
|
x++;
|
||||||
|
iterator.Advance();
|
||||||
|
}
|
||||||
|
AppendAnyLenString(output, outsize, outlen, "%i consoles connected", x);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConsoleList::SendChannelMessage(const ServerChannelMessage_Struct* scm) {
|
||||||
|
LinkedListIterator<Console*> iterator(list);
|
||||||
|
iterator.Reset();
|
||||||
|
|
||||||
|
while(iterator.MoreElements()) {
|
||||||
|
iterator.GetData()->SendChannelMessage(scm);
|
||||||
|
iterator.Advance();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConsoleList::SendEmoteMessage(uint32 type, const char* message, ...) {
|
||||||
|
va_list argptr;
|
||||||
|
char buffer[1024];
|
||||||
|
|
||||||
|
va_start(argptr, message);
|
||||||
|
vsnprintf(buffer, sizeof(buffer), message, argptr);
|
||||||
|
va_end(argptr);
|
||||||
|
|
||||||
|
SendEmoteMessageRaw(type, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConsoleList::SendEmoteMessageRaw(uint32 type, const char* message) {
|
||||||
|
LinkedListIterator<Console*> iterator(list);
|
||||||
|
iterator.Reset();
|
||||||
|
|
||||||
|
while(iterator.MoreElements()) {
|
||||||
|
iterator.GetData()->SendEmoteMessageRaw(type, message);
|
||||||
|
iterator.Advance();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Console* ConsoleList::FindByAccountName(const char* accname) {
|
||||||
|
LinkedListIterator<Console*> iterator(list);
|
||||||
|
iterator.Reset();
|
||||||
|
|
||||||
|
while(iterator.MoreElements()) {
|
||||||
|
if (strcasecmp(iterator.GetData()->AccountName(), accname) == 0)
|
||||||
|
return iterator.GetData();
|
||||||
|
|
||||||
|
iterator.Advance();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Console::ProcessCommand(const char* command) {
|
||||||
|
switch(state)
|
||||||
|
{
|
||||||
|
case CONSOLE_STATE_USERNAME:
|
||||||
|
{
|
||||||
|
if (strlen(command) >= 16) {
|
||||||
|
SendMessage(1, 0);
|
||||||
|
SendMessage(2, "Username buffer overflow.");
|
||||||
|
SendMessage(1, "Bye Bye.");
|
||||||
|
state = CONSOLE_STATE_CLOSED;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
strcpy(paccountname, command);
|
||||||
|
state = CONSOLE_STATE_PASSWORD;
|
||||||
|
SendMessage(0, "Password: ");
|
||||||
|
tcpc->SetEcho(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CONSOLE_STATE_PASSWORD:
|
||||||
|
{
|
||||||
|
if (strlen(command) >= 16) {
|
||||||
|
SendMessage(1, 0);
|
||||||
|
SendMessage(2, "Password buffer overflow.");
|
||||||
|
SendMessage(1, "Bye Bye.");
|
||||||
|
state = CONSOLE_STATE_CLOSED;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
paccountid = database.CheckLogin(paccountname ,command);
|
||||||
|
if (paccountid == 0) {
|
||||||
|
SendMessage(1, 0);
|
||||||
|
SendMessage(2, "Login failed.");
|
||||||
|
SendMessage(1, "Bye Bye.");
|
||||||
|
state = CONSOLE_STATE_CLOSED;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
database.GetAccountName(paccountid, paccountname); // fixes case and stuff
|
||||||
|
admin = database.CheckStatus(paccountid);
|
||||||
|
if (!(admin >= consoleLoginStatus)) {
|
||||||
|
SendMessage(1, 0);
|
||||||
|
SendMessage(2, "Access denied.");
|
||||||
|
SendMessage(1, "Bye Bye.");
|
||||||
|
state = CONSOLE_STATE_CLOSED;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Log(Logs::Detail, Logs::World_Server,"TCP console authenticated: Username=%s, Admin=%d",paccountname,admin);
|
||||||
|
SendMessage(1, 0);
|
||||||
|
SendMessage(2, "Login accepted.");
|
||||||
|
state = CONSOLE_STATE_CONNECTED;
|
||||||
|
tcpc->SetEcho(true);
|
||||||
|
SendPrompt();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CONSOLE_STATE_CONNECTED: {
|
||||||
|
Log(Logs::Detail, Logs::World_Server,"TCP command: %s: \"%s\"",paccountname ,command);
|
||||||
|
Seperator sep(command);
|
||||||
|
if (strcasecmp(sep.arg[0], "help") == 0 || strcmp(sep.arg[0], "?") == 0) {
|
||||||
|
SendMessage(1, " whoami");
|
||||||
|
SendMessage(1, " who");
|
||||||
|
SendMessage(1, " zonestatus");
|
||||||
|
SendMessage(1, " uptime [zoneID#]");
|
||||||
|
SendMessage(1, " emote [zonename or charname or world] [type] [message]");
|
||||||
|
SendMessage(1, " echo [on/off]");
|
||||||
|
SendMessage(1, " acceptmessages [on/off]");
|
||||||
|
SendMessage(1, " tell [name] [message]");
|
||||||
|
SendMessage(1, " broadcast [message]");
|
||||||
|
SendMessage(1, " gmsay [message]");
|
||||||
|
SendMessage(1, " ooc [message]");
|
||||||
|
SendMessage(1, " auction [message]");
|
||||||
|
if (admin >= consoleKickStatus)
|
||||||
|
SendMessage(1, " kick [charname]");
|
||||||
|
if (admin >= consoleLockStatus)
|
||||||
|
SendMessage(1, " lock/unlock");
|
||||||
|
if (admin >= consoleZoneStatus) {
|
||||||
|
SendMessage(1, " zoneshutdown [zonename or ZoneServerID]");
|
||||||
|
SendMessage(1, " zonebootup [ZoneServerID] [zonename]");
|
||||||
|
SendMessage(1, " zonelock [list|lock|unlock] [zonename]");
|
||||||
|
}
|
||||||
|
if (admin >= consoleFlagStatus)
|
||||||
|
SendMessage(1, " flag [status] [accountname]");
|
||||||
|
if (admin >= consolePassStatus)
|
||||||
|
SendMessage(1, " setpass [accountname] [newpass]");
|
||||||
|
if (admin >= consoleWorldStatus) {
|
||||||
|
SendMessage(1, " version");
|
||||||
|
SendMessage(1, " worldshutdown");
|
||||||
|
}
|
||||||
|
if (admin >= 201) {
|
||||||
|
SendMessage(1, " IPLookup [name]");
|
||||||
|
}
|
||||||
|
if (admin >= 100) {
|
||||||
|
SendMessage(1, " LSReconnect");
|
||||||
|
SendMessage(1, " signalcharbyname charname ID");
|
||||||
|
SendMessage(1, " reloadworld");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "ping") == 0) {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "signalcharbyname") == 0) {
|
||||||
|
SendMessage(1, "Signal Sent to %s with ID %i", (char*) sep.arg[1], atoi(sep.arg[2]));
|
||||||
|
uint32 message_len = strlen((char*) sep.arg[1]) + 1;
|
||||||
|
auto pack = new ServerPacket(ServerOP_CZSignalClientByName,
|
||||||
|
sizeof(CZClientSignalByName_Struct) + message_len);
|
||||||
|
CZClientSignalByName_Struct* CZSC = (CZClientSignalByName_Struct*) pack->pBuffer;
|
||||||
|
strn0cpy(CZSC->Name, (char*) sep.arg[1], 64);
|
||||||
|
CZSC->data = atoi(sep.arg[2]);
|
||||||
|
zoneserver_list.SendPacket(pack);
|
||||||
|
safe_delete(pack);
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "setpass") == 0 && admin >= consolePassStatus) {
|
||||||
|
if (sep.argnum != 2)
|
||||||
|
SendMessage(1, "Format: setpass accountname password");
|
||||||
|
else {
|
||||||
|
|
||||||
|
int16 tmpstatus = 0;
|
||||||
|
uint32 tmpid = database.GetAccountIDByName(sep.arg[1], &tmpstatus);
|
||||||
|
if (!tmpid)
|
||||||
|
SendMessage(1, "Error: Account not found");
|
||||||
|
else if (tmpstatus > admin)
|
||||||
|
SendMessage(1, "Cannot change password: Account's status is higher than yours");
|
||||||
|
else if (database.SetLocalPassword(tmpid, sep.arg[2]))
|
||||||
|
SendMessage(1, "Password changed.");
|
||||||
|
else
|
||||||
|
SendMessage(1, "Error changing password.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "uptime") == 0) {
|
||||||
|
if (sep.IsNumber(1) && atoi(sep.arg[1]) > 0) {
|
||||||
|
auto pack = new ServerPacket(ServerOP_Uptime, sizeof(ServerUptime_Struct));
|
||||||
|
ServerUptime_Struct* sus = (ServerUptime_Struct*) pack->pBuffer;
|
||||||
|
snprintf(sus->adminname, sizeof(sus->adminname), "*%s", this->GetName());
|
||||||
|
sus->zoneserverid = atoi(sep.arg[1]);
|
||||||
|
ZoneServer* zs = zoneserver_list.FindByID(sus->zoneserverid);
|
||||||
|
if (zs)
|
||||||
|
zs->SendPacket(pack);
|
||||||
|
else
|
||||||
|
SendMessage(1, "Zoneserver not found.");
|
||||||
|
delete pack;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ZSList::ShowUpTime(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "md5") == 0) {
|
||||||
|
uint8 md5[16];
|
||||||
|
MD5::Generate((const uchar*) sep.argplus[1], strlen(sep.argplus[1]), md5);
|
||||||
|
SendMessage(1, "MD5: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", md5[0], md5[1], md5[2], md5[3], md5[4], md5[5], md5[6], md5[7], md5[8], md5[9], md5[10], md5[11], md5[12], md5[13], md5[14], md5[15]);
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "whoami") == 0) {
|
||||||
|
SendMessage(1, "You are logged in as '%s'", this->AccountName());
|
||||||
|
SendMessage(1, "You are known as '*%s'", this->AccountName());
|
||||||
|
SendMessage(1, "AccessLevel: %d", this->Admin());
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "echo") == 0) {
|
||||||
|
if (strcasecmp(sep.arg[1], "on") == 0)
|
||||||
|
tcpc->SetEcho(true);
|
||||||
|
else if (strcasecmp(sep.arg[1], "off") == 0) {
|
||||||
|
if (pAcceptMessages)
|
||||||
|
SendMessage(1, "Echo can not be turned off while acceptmessages is on");
|
||||||
|
else
|
||||||
|
tcpc->SetEcho(false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
SendMessage(1, "Usage: echo [on/off]");
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "acceptmessages") == 0) {
|
||||||
|
if (strcasecmp(sep.arg[1], "on") == 0)
|
||||||
|
if (tcpc->GetEcho())
|
||||||
|
SendMessage(1, "AcceptMessages can not be turned on while echo is on");
|
||||||
|
else
|
||||||
|
pAcceptMessages = true;
|
||||||
|
else if (strcasecmp(sep.arg[1], "off") == 0)
|
||||||
|
pAcceptMessages = false;
|
||||||
|
else
|
||||||
|
SendMessage(1, "Usage: acceptmessages [on/off]");
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "tell") == 0) {
|
||||||
|
char tmpname[64];
|
||||||
|
tmpname[0] = '*';
|
||||||
|
strcpy(&tmpname[1], paccountname);
|
||||||
|
zoneserver_list.SendChannelMessage(tmpname, sep.arg[1], 7, 0, sep.argplus[2]);
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "broadcast") == 0) {
|
||||||
|
char tmpname[64];
|
||||||
|
tmpname[0] = '*';
|
||||||
|
strcpy(&tmpname[1], paccountname);
|
||||||
|
zoneserver_list.SendChannelMessage(tmpname, 0, 6, 0, sep.argplus[1]);
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "ooc") == 0) {
|
||||||
|
char tmpname[64];
|
||||||
|
tmpname[0] = '*';
|
||||||
|
strcpy(&tmpname[1], paccountname);
|
||||||
|
zoneserver_list.SendChannelMessage(tmpname, 0, 5, 0, sep.argplus[1]);
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "auction") == 0) {
|
||||||
|
char tmpname[64];
|
||||||
|
tmpname[0] = '*';
|
||||||
|
strcpy(&tmpname[1], paccountname);
|
||||||
|
zoneserver_list.SendChannelMessage(tmpname, 0, 4, 0, sep.argplus[1]);
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "gmsay") == 0 || strcasecmp(sep.arg[0], "pr") == 0) {
|
||||||
|
char tmpname[64];
|
||||||
|
tmpname[0] = '*';
|
||||||
|
strcpy(&tmpname[1], paccountname);
|
||||||
|
zoneserver_list.SendChannelMessage(tmpname, 0, 11, 0, sep.argplus[1]);
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "emote") == 0) {
|
||||||
|
if (strcasecmp(sep.arg[1], "world") == 0)
|
||||||
|
zoneserver_list.SendEmoteMessageRaw(0, 0, 0, atoi(sep.arg[2]), sep.argplus[3]);
|
||||||
|
else {
|
||||||
|
ZoneServer* zs = zoneserver_list.FindByName(sep.arg[1]);
|
||||||
|
if (zs != 0)
|
||||||
|
zs->SendEmoteMessageRaw(0, 0, 0, atoi(sep.arg[2]), sep.argplus[3]);
|
||||||
|
else
|
||||||
|
zoneserver_list.SendEmoteMessageRaw(sep.arg[1], 0, 0, atoi(sep.arg[2]), sep.argplus[3]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "movechar") == 0) {
|
||||||
|
if(sep.arg[1][0]==0 || sep.arg[2][0] == 0)
|
||||||
|
SendMessage(1, "Usage: movechar [charactername] [zonename]");
|
||||||
|
else {
|
||||||
|
if (!database.GetZoneID(sep.arg[2]))
|
||||||
|
SendMessage(1, "Error: Zone '%s' not found", sep.arg[2]);
|
||||||
|
else if (!database.CheckUsedName((char*) sep.arg[1])) {
|
||||||
|
if (!database.MoveCharacterToZone((char*) sep.arg[1], (char*) sep.arg[2]))
|
||||||
|
SendMessage(1, "Character Move Failed!");
|
||||||
|
else
|
||||||
|
SendMessage(1, "Character has been moved.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
SendMessage(1, "Character Does Not Exist");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "flag") == 0 && this->Admin() >= consoleFlagStatus) {
|
||||||
|
// SCORPIOUS2K - reversed parameter order for flag
|
||||||
|
if(sep.arg[2][0]==0 || !sep.IsNumber(1))
|
||||||
|
SendMessage(1, "Usage: flag [status] [accountname]");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (atoi(sep.arg[1]) > this->Admin())
|
||||||
|
SendMessage(1, "You cannot set people's status to higher than your own");
|
||||||
|
else if (atoi(sep.arg[1]) < 0 && this->Admin() < consoleFlagStatus)
|
||||||
|
SendMessage(1, "You have too low of status to change flags");
|
||||||
|
else if (!database.SetAccountStatus(sep.arg[2], atoi(sep.arg[1])))
|
||||||
|
SendMessage(1, "Unable to flag account!");
|
||||||
|
else
|
||||||
|
SendMessage(1, "Account Flaged");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "kick") == 0 && admin >= consoleKickStatus) {
|
||||||
|
char tmpname[64];
|
||||||
|
tmpname[0] = '*';
|
||||||
|
strcpy(&tmpname[1], paccountname);
|
||||||
|
auto pack = new ServerPacket;
|
||||||
|
pack->opcode = ServerOP_KickPlayer;
|
||||||
|
pack->size = sizeof(ServerKickPlayer_Struct);
|
||||||
|
pack->pBuffer = new uchar[pack->size];
|
||||||
|
ServerKickPlayer_Struct* skp = (ServerKickPlayer_Struct*) pack->pBuffer;
|
||||||
|
strcpy(skp->adminname, tmpname);
|
||||||
|
strcpy(skp->name, sep.arg[1]);
|
||||||
|
skp->adminrank = this->Admin();
|
||||||
|
zoneserver_list.SendPacket(pack);
|
||||||
|
delete pack;
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "who") == 0) {
|
||||||
|
auto whom = new Who_All_Struct;
|
||||||
|
memset(whom, 0, sizeof(Who_All_Struct));
|
||||||
|
whom->lvllow = 0xFFFF;
|
||||||
|
whom->lvlhigh = 0xFFFF;
|
||||||
|
whom->wclass = 0xFFFF;
|
||||||
|
whom->wrace = 0xFFFF;
|
||||||
|
whom->gmlookup = 0xFFFF;
|
||||||
|
for (int i=1; i<=sep.argnum; i++) {
|
||||||
|
if (strcasecmp(sep.arg[i], "gm") == 0)
|
||||||
|
whom->gmlookup = 1;
|
||||||
|
else if (sep.IsNumber(i)) {
|
||||||
|
if (whom->lvllow == 0xFFFF) {
|
||||||
|
whom->lvllow = atoi(sep.arg[i]);
|
||||||
|
whom->lvlhigh = whom->lvllow;
|
||||||
|
}
|
||||||
|
else if (atoi(sep.arg[i]) > int(whom->lvllow))
|
||||||
|
whom->lvlhigh = atoi(sep.arg[i]);
|
||||||
|
else
|
||||||
|
whom->lvllow = atoi(sep.arg[i]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
strn0cpy(whom->whom, sep.arg[i], sizeof(whom->whom));
|
||||||
|
}
|
||||||
|
client_list.ConsoleSendWhoAll(0, admin, whom, this);
|
||||||
|
delete whom;
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "zonestatus") == 0) {
|
||||||
|
zoneserver_list.SendZoneStatus(0, admin, this);
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "exit") == 0 || strcasecmp(sep.arg[0], "quit") == 0) {
|
||||||
|
SendMessage(1, "Bye Bye.");
|
||||||
|
state = CONSOLE_STATE_CLOSED;
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "zoneshutdown") == 0 && admin >= consoleZoneStatus) {
|
||||||
|
if (sep.arg[1][0] == 0) {
|
||||||
|
SendMessage(1, "Usage: zoneshutdown zoneshortname");
|
||||||
|
} else {
|
||||||
|
char tmpname[64];
|
||||||
|
tmpname[0] = '*';
|
||||||
|
strcpy(&tmpname[1], paccountname);
|
||||||
|
|
||||||
|
auto pack = new ServerPacket;
|
||||||
|
pack->size = sizeof(ServerZoneStateChange_struct);
|
||||||
|
pack->pBuffer = new uchar[pack->size];
|
||||||
|
memset(pack->pBuffer, 0, sizeof(ServerZoneStateChange_struct));
|
||||||
|
ServerZoneStateChange_struct* s = (ServerZoneStateChange_struct *) pack->pBuffer;
|
||||||
|
pack->opcode = ServerOP_ZoneShutdown;
|
||||||
|
strcpy(s->adminname, tmpname);
|
||||||
|
if (sep.arg[1][0] >= '0' && sep.arg[1][0] <= '9')
|
||||||
|
s->ZoneServerID = atoi(sep.arg[1]);
|
||||||
|
else
|
||||||
|
s->zoneid = database.GetZoneID(sep.arg[1]);
|
||||||
|
|
||||||
|
ZoneServer* zs = 0;
|
||||||
|
if (s->ZoneServerID != 0)
|
||||||
|
zs = zoneserver_list.FindByID(s->ZoneServerID);
|
||||||
|
else if (s->zoneid != 0)
|
||||||
|
zs = zoneserver_list.FindByName(database.GetZoneName(s->zoneid));
|
||||||
|
else
|
||||||
|
SendMessage(1, "Error: ZoneShutdown: neither ID nor name specified");
|
||||||
|
|
||||||
|
if (zs == 0)
|
||||||
|
SendMessage(1, "Error: ZoneShutdown: zoneserver not found");
|
||||||
|
else
|
||||||
|
zs->SendPacket(pack);
|
||||||
|
|
||||||
|
delete pack;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "zonebootup") == 0 && admin >= consoleZoneStatus) {
|
||||||
|
if (sep.arg[2][0] == 0 || !sep.IsNumber(1)) {
|
||||||
|
SendMessage(1, "Usage: zonebootup ZoneServerID# zoneshortname");
|
||||||
|
} else {
|
||||||
|
char tmpname[64];
|
||||||
|
tmpname[0] = '*';
|
||||||
|
strcpy(&tmpname[1], paccountname);
|
||||||
|
|
||||||
|
Log(Logs::Detail, Logs::World_Server,"Console ZoneBootup: %s, %s, %s",tmpname,sep.arg[2],sep.arg[1]);
|
||||||
|
zoneserver_list.SOPZoneBootup(tmpname, atoi(sep.arg[1]), sep.arg[2], (bool) (strcasecmp(sep.arg[3], "static") == 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "worldshutdown") == 0 && admin >= consoleWorldStatus) {
|
||||||
|
int32 time, interval;
|
||||||
|
if(sep.IsNumber(1) && sep.IsNumber(2) && ((time=atoi(sep.arg[1]))>0) && ((interval=atoi(sep.arg[2]))>0)) {
|
||||||
|
zoneserver_list.WorldShutDown(time, interval);
|
||||||
|
}
|
||||||
|
else if(strcasecmp(sep.arg[1], "now") == 0) {
|
||||||
|
zoneserver_list.WorldShutDown(0, 0);
|
||||||
|
}
|
||||||
|
else if(strcasecmp(sep.arg[1], "disable") == 0) {
|
||||||
|
SendEmoteMessage(0,0,0,15,"<SYSTEMWIDE MESSAGE>:SYSTEM MSG:World shutdown aborted.");
|
||||||
|
zoneserver_list.SendEmoteMessage(0,0,0,15,"<SYSTEMWIDE MESSAGE>:SYSTEM MSG:World shutdown aborted.");
|
||||||
|
zoneserver_list.shutdowntimer->Disable();
|
||||||
|
zoneserver_list.reminder->Disable();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SendMessage(1, "Usage: worldshutdown [now] [disable] ([time] [interval])");
|
||||||
|
//Go ahead and shut down since that's what this used to do when invoked this way.
|
||||||
|
zoneserver_list.WorldShutDown(0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "lock") == 0 && admin >= consoleLockStatus) {
|
||||||
|
WorldConfig::LockWorld();
|
||||||
|
if (loginserverlist.Connected()) {
|
||||||
|
loginserverlist.SendStatus();
|
||||||
|
SendMessage(1, "World locked.");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SendMessage(1, "World locked, but login server not connected.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "unlock") == 0 && admin >= consoleLockStatus) {
|
||||||
|
WorldConfig::UnlockWorld();
|
||||||
|
if (loginserverlist.Connected()) {
|
||||||
|
loginserverlist.SendStatus();
|
||||||
|
SendMessage(1, "World unlocked.");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SendMessage(1, "World unlocked, but login server not connected.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "version") == 0 && admin >= consoleWorldStatus) {
|
||||||
|
SendMessage(1, "Current version information.");
|
||||||
|
SendMessage(1, " %s", CURRENT_VERSION);
|
||||||
|
SendMessage(1, " Compiled on: %s at %s", COMPILE_DATE, COMPILE_TIME);
|
||||||
|
SendMessage(1, " Last modified on: %s", LAST_MODIFIED);
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "serverinfo") == 0 && admin >= 200) {
|
||||||
|
if (strcasecmp(sep.arg[1], "os") == 0) {
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
GetOS();
|
||||||
|
char intbuffer [sizeof(unsigned long)];
|
||||||
|
SendMessage(1, "Operating system information.");
|
||||||
|
SendMessage(1, " %s", Ver_name);
|
||||||
|
SendMessage(1, " Build number: %s", ultoa(Ver_build, intbuffer, 10));
|
||||||
|
SendMessage(1, " Minor version: %s", ultoa(Ver_min, intbuffer, 10));
|
||||||
|
SendMessage(1, " Major version: %s", ultoa(Ver_maj, intbuffer, 10));
|
||||||
|
SendMessage(1, " Platform Id: %s", ultoa(Ver_pid, intbuffer, 10));
|
||||||
|
#else
|
||||||
|
char os_string[100];
|
||||||
|
SendMessage(1, "Operating system information.");
|
||||||
|
SendMessage(1, " %s", GetOS(os_string));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SendMessage(1, "Usage: Serverinfo [type]");
|
||||||
|
SendMessage(1, " OS - Operating system version information.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "IPLookup") == 0 && admin >= 201) {
|
||||||
|
client_list.SendCLEList(admin, 0, this, sep.argplus[1]);
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "LSReconnect") == 0 && admin >= 100) {
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
_beginthread(AutoInitLoginServer, 0, nullptr);
|
||||||
|
#else
|
||||||
|
pthread_t thread;
|
||||||
|
pthread_create(&thread, nullptr, &AutoInitLoginServer, nullptr);
|
||||||
|
#endif
|
||||||
|
RunLoops = true;
|
||||||
|
SendMessage(1, " Login Server Reconnect manually restarted by Console");
|
||||||
|
Log(Logs::Detail, Logs::World_Server,"Login Server Reconnect manually restarted by Console");
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "zonelock") == 0 && admin >= consoleZoneStatus) {
|
||||||
|
if (strcasecmp(sep.arg[1], "list") == 0) {
|
||||||
|
zoneserver_list.ListLockedZones(0, this);
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[1], "lock") == 0 && admin >= 101) {
|
||||||
|
uint16 tmp = database.GetZoneID(sep.arg[2]);
|
||||||
|
if (tmp) {
|
||||||
|
if (zoneserver_list.SetLockedZone(tmp, true))
|
||||||
|
zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone locked: %s", database.GetZoneName(tmp));
|
||||||
|
else
|
||||||
|
SendMessage(1, "Failed to change lock");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
SendMessage(1, "Usage: #zonelock lock [zonename]");
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[1], "unlock") == 0 && admin >= 101) {
|
||||||
|
uint16 tmp = database.GetZoneID(sep.arg[2]);
|
||||||
|
if (tmp) {
|
||||||
|
if (zoneserver_list.SetLockedZone(tmp, false))
|
||||||
|
zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone unlocked: %s", database.GetZoneName(tmp));
|
||||||
|
else
|
||||||
|
SendMessage(1, "Failed to change lock");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
SendMessage(1, "Usage: #zonelock unlock [zonename]");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SendMessage(1, "#zonelock sub-commands");
|
||||||
|
SendMessage(1, " list");
|
||||||
|
if (admin >= 101) {
|
||||||
|
SendMessage(1, " lock [zonename]");
|
||||||
|
SendMessage(1, " unlock [zonename]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "reloadworld") == 0 && admin > 101)
|
||||||
|
{
|
||||||
|
SendEmoteMessage(0,0,0,15,"Reloading World...");
|
||||||
|
auto pack = new ServerPacket(ServerOP_ReloadWorld, sizeof(ReloadWorld_Struct));
|
||||||
|
ReloadWorld_Struct* RW = (ReloadWorld_Struct*) pack->pBuffer;
|
||||||
|
RW->Option = 1;
|
||||||
|
zoneserver_list.SendPacket(pack);
|
||||||
|
safe_delete(pack);
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sep.arg[0], "") == 0){
|
||||||
|
/* Hit Enter with no command */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SendMessage(1, "Command unknown.");
|
||||||
|
}
|
||||||
|
if (state == CONSOLE_STATE_CONNECTED)
|
||||||
|
SendPrompt();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Console::SendPrompt() {
|
||||||
|
if (tcpc->GetEcho())
|
||||||
|
SendMessage(0, "%s> ", paccountname);
|
||||||
|
}
|
||||||
|
|
||||||
@ -41,8 +41,9 @@ void EQLConfig::LoadSettings() {
|
|||||||
|
|
||||||
std::string query = StringFormat("SELECT dynamics FROM launcher WHERE name = '%s'", namebuf);
|
std::string query = StringFormat("SELECT dynamics FROM launcher WHERE name = '%s'", namebuf);
|
||||||
auto results = database.QueryDatabase(query);
|
auto results = database.QueryDatabase(query);
|
||||||
if (!results.Success())
|
if (!results.Success()) {
|
||||||
Log.Out(Logs::General, Logs::Error, "EQLConfig::LoadSettings: %s", results.ErrorMessage().c_str());
|
Log(Logs::General, Logs::Error, "EQLConfig::LoadSettings: %s", results.ErrorMessage().c_str());
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
auto row = results.begin();
|
auto row = results.begin();
|
||||||
m_dynamics = atoi(row[0]);
|
m_dynamics = atoi(row[0]);
|
||||||
@ -51,7 +52,7 @@ void EQLConfig::LoadSettings() {
|
|||||||
query = StringFormat("SELECT zone, port FROM launcher_zones WHERE launcher = '%s'", namebuf);
|
query = StringFormat("SELECT zone, port FROM launcher_zones WHERE launcher = '%s'", namebuf);
|
||||||
results = database.QueryDatabase(query);
|
results = database.QueryDatabase(query);
|
||||||
if (!results.Success()) {
|
if (!results.Success()) {
|
||||||
Log.Out(Logs::General, Logs::Error, "EQLConfig::LoadSettings: %s", results.ErrorMessage().c_str());
|
Log(Logs::General, Logs::Error, "EQLConfig::LoadSettings: %s", results.ErrorMessage().c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -198,7 +199,7 @@ bool EQLConfig::ChangeStaticZone(Const_char *short_name, uint16 port) {
|
|||||||
res = m_zones.find(short_name);
|
res = m_zones.find(short_name);
|
||||||
if(res == m_zones.end()) {
|
if(res == m_zones.end()) {
|
||||||
//not found.
|
//not found.
|
||||||
Log.Out(Logs::General, Logs::Error, "Update for unknown zone %s", short_name);
|
Log(Logs::General, Logs::Error, "Update for unknown zone %s", short_name);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -234,7 +235,7 @@ bool EQLConfig::DeleteStaticZone(Const_char *short_name) {
|
|||||||
res = m_zones.find(short_name);
|
res = m_zones.find(short_name);
|
||||||
if(res == m_zones.end()) {
|
if(res == m_zones.end()) {
|
||||||
//not found.
|
//not found.
|
||||||
Log.Out(Logs::General, Logs::Error, "Update for unknown zone %s", short_name);
|
Log(Logs::General, Logs::Error, "Update for unknown zone %s", short_name);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
335
world/eqw_http_handler.cpp
Normal file
335
world/eqw_http_handler.cpp
Normal file
@ -0,0 +1,335 @@
|
|||||||
|
/* EQEMu: Everquest Server Emulator
|
||||||
|
Copyright (C) 2001-2006 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 "../common/global_define.h"
|
||||||
|
#include "eqw_http_handler.h"
|
||||||
|
#include "../common/SocketLib/Base64.h"
|
||||||
|
#include "eqw_parser.h"
|
||||||
|
#include "eqw.h"
|
||||||
|
#include "http_request.h"
|
||||||
|
|
||||||
|
#include "worlddb.h"
|
||||||
|
#include "console.h"
|
||||||
|
|
||||||
|
Mime EQWHTTPHandler::s_mime;
|
||||||
|
#ifdef EMBPERL
|
||||||
|
EQWParser *EQWHTTPHandler::s_parser = nullptr;
|
||||||
|
#endif
|
||||||
|
const int EQWHTTPHandler::READ_BUFFER_LEN = 1024; //for page IO, was a static const member, but VC6 got mad.
|
||||||
|
|
||||||
|
EQWHTTPHandler::EQWHTTPHandler(uint32 ID, SOCKET in_socket, uint32 irIP, uint16 irPort)
|
||||||
|
: HttpdSocket(ID,in_socket,irIP,irPort),
|
||||||
|
m_closeOnFinish(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
EQWHTTPHandler::~EQWHTTPHandler() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef EMBPERL
|
||||||
|
EQWParser *EQWHTTPHandler::GetParser() {
|
||||||
|
if(s_parser == nullptr) {
|
||||||
|
EQW::Singleton()->ClearOutput();
|
||||||
|
s_parser = new EQWParser();
|
||||||
|
const std::string &res = EQW::Singleton()->GetOutput();
|
||||||
|
if(!res.empty()) {
|
||||||
|
printf("EQWParser Init output:\n%s\n\n", res.c_str());
|
||||||
|
EQW::Singleton()->ClearOutput();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(s_parser);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*void EQWHTTPHandler::OnWrite() {
|
||||||
|
HttpdSocket::OnWrite();
|
||||||
|
if(m_closeOnFinish && GetOutputLength() == 0) {
|
||||||
|
// printf("CLOSING\n");
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
void EQWHTTPHandler::Exec() {
|
||||||
|
m_sentHeaders = false;
|
||||||
|
m_responseCode = "200";
|
||||||
|
// printf("Request: %s, %s, %s, %s.\n", GetMethod().c_str(), GetUrl().c_str(), GetUri().c_str(), GetQueryString().c_str());
|
||||||
|
|
||||||
|
SetHttpVersion("HTTP/1.0");
|
||||||
|
AddResponseHeader("Connection", "close");
|
||||||
|
|
||||||
|
if(GetUri().find("..") != std::string::npos) {
|
||||||
|
SendResponse("403", "Forbidden");
|
||||||
|
printf("%s is forbidden.\n", GetUri().c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!CheckAuth()) {
|
||||||
|
AddResponseHeader("Content-type", "text/plain");
|
||||||
|
AddResponseHeader("WWW-Authenticate", "Basic realm=\"EQEmulator\"");
|
||||||
|
SendResponse("401", "Authorization Required");
|
||||||
|
SendString("Gotta Authenticate.");
|
||||||
|
} else {
|
||||||
|
std::string::size_type start = GetUri().find_first_not_of('/');
|
||||||
|
std::string page;
|
||||||
|
if(start != std::string::npos)
|
||||||
|
page = GetUri().substr(start);
|
||||||
|
else
|
||||||
|
page = "index.html";
|
||||||
|
SendPage(page);
|
||||||
|
}
|
||||||
|
/* if (!Detach()) {
|
||||||
|
printf("Unable to detach...\n");
|
||||||
|
}
|
||||||
|
if(GetOutputLength() > 0) {
|
||||||
|
//we cannot close yet
|
||||||
|
m_closeOnFinish = true;
|
||||||
|
} else {
|
||||||
|
Close();
|
||||||
|
}*/
|
||||||
|
Free(); //the "app" side (us) is done with this connection too...
|
||||||
|
Disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
void EQWHTTPHandler::OnHeader(const std::string& key,const std::string& value) {
|
||||||
|
HttpdSocket::OnHeader(key, value);
|
||||||
|
|
||||||
|
if (!strcasecmp(key.c_str(),"Authorization")) {
|
||||||
|
if(strncasecmp(value.c_str(), "Basic ", 6)) {
|
||||||
|
printf("Invalid auth type. Expected Basic: %s\n", value.c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string dec;
|
||||||
|
Base64::decode(value.c_str() + 6, dec);
|
||||||
|
|
||||||
|
std::string::size_type cpos;
|
||||||
|
cpos = dec.find_first_of(':');
|
||||||
|
if(cpos == std::string::npos) {
|
||||||
|
printf("Invalid auth string: %s\n", dec.c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_username = dec.substr(0, cpos);
|
||||||
|
m_password = dec.substr(cpos+1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//we should prolly cache login info here... if we load a fresh page, we could be checking
|
||||||
|
//their auth dozens of times rather quickly...
|
||||||
|
bool EQWHTTPHandler::CheckAuth() const {
|
||||||
|
if(m_username.length() < 1)
|
||||||
|
return(false);
|
||||||
|
|
||||||
|
int16 status = 0;
|
||||||
|
uint32 acctid = database.CheckLogin(m_username.c_str(), m_password.c_str(), &status);
|
||||||
|
if(acctid == 0) {
|
||||||
|
Log(Logs::Detail, Logs::World_Server, "Login autentication failed for %s with '%s'", m_username.c_str(), m_password.c_str());
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
if(status < httpLoginStatus) {
|
||||||
|
Log(Logs::Detail, Logs::World_Server, "Login of %s failed: status too low.", m_username.c_str());
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EQWHTTPHandler::SendPage(const std::string &file) {
|
||||||
|
|
||||||
|
std::string path = "templates/";
|
||||||
|
path += file;
|
||||||
|
|
||||||
|
FILE *f = fopen(path.c_str(), "rb");
|
||||||
|
if(f == nullptr) {
|
||||||
|
SendResponse("404", "Not Found");
|
||||||
|
SendString("Not found.");
|
||||||
|
printf("%s not found.\n", file.c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string type = s_mime.GetMimeFromFilename(file);
|
||||||
|
AddResponseHeader("Content-type", type);
|
||||||
|
|
||||||
|
bool process = false;
|
||||||
|
#ifdef EMBPERL
|
||||||
|
if(type == "text/html")
|
||||||
|
process = true;
|
||||||
|
else {
|
||||||
|
//not processing, send headers right away
|
||||||
|
#endif
|
||||||
|
SendResponse("200", "OK");
|
||||||
|
#ifdef EMBPERL
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
auto buffer = new char[READ_BUFFER_LEN + 1];
|
||||||
|
size_t len;
|
||||||
|
std::string to_process;
|
||||||
|
while((len = fread(buffer, 1, READ_BUFFER_LEN, f)) > 0) {
|
||||||
|
buffer[len] = '\0';
|
||||||
|
if(process)
|
||||||
|
to_process += buffer;
|
||||||
|
else
|
||||||
|
SendBuf(buffer, len);
|
||||||
|
}
|
||||||
|
delete[] buffer;
|
||||||
|
fclose(f);
|
||||||
|
#ifdef EMBPERL
|
||||||
|
if(process) {
|
||||||
|
//convert the base form into a useful perl exportable form
|
||||||
|
HTTPRequest req(this, GetHttpForm());
|
||||||
|
GetParser()->SetHTTPRequest("testing", &req);
|
||||||
|
|
||||||
|
//parse out the page and potentially pass some stuff on to perl.
|
||||||
|
ProcessAndSend(to_process);
|
||||||
|
|
||||||
|
//clear out the form, just in case (since it gets destroyed next)
|
||||||
|
GetParser()->SetHTTPRequest("testing", nullptr);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EQWHTTPHandler::LoadMimeTypes(const char *filename) {
|
||||||
|
return(s_mime.LoadMimeFile(filename));
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef EMBPERL
|
||||||
|
void EQWHTTPHandler::ProcessAndSend(const std::string &str) {
|
||||||
|
std::string::size_type len = str.length();
|
||||||
|
std::string::size_type start = 0;
|
||||||
|
std::string::size_type pos, end;
|
||||||
|
|
||||||
|
while((pos = str.find("<?", start)) != std::string::npos) {
|
||||||
|
//send all the crap leading up to the script block
|
||||||
|
if(pos != start) {
|
||||||
|
ProcessText(str.c_str() + start, pos-start);
|
||||||
|
}
|
||||||
|
|
||||||
|
//look for the end of this script block...
|
||||||
|
end = str.find("?>", pos+2);
|
||||||
|
if(end == std::string::npos) {
|
||||||
|
//terminal ?> not found... should issue a warning or something...
|
||||||
|
std::string scriptBody = str.substr(pos+2);
|
||||||
|
ProcessScript(scriptBody);
|
||||||
|
start = len;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
//script only consumes some of this buffer...
|
||||||
|
std::string scriptBody = str.substr(pos+2, end-pos-2);
|
||||||
|
ProcessScript(scriptBody);
|
||||||
|
start = end + 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//send whatever is left over
|
||||||
|
if(start != len)
|
||||||
|
ProcessText(str.c_str() + start, len-start);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EQWHTTPHandler::ProcessScript(const std::string &script_body) {
|
||||||
|
const char *script = script_body.c_str();
|
||||||
|
if(strcmp("perl", script) == 0)
|
||||||
|
script += 4; //allow <?perl
|
||||||
|
|
||||||
|
// printf("Script: ''''%s''''\n\n", script_body.c_str());
|
||||||
|
|
||||||
|
GetParser()->EQW_eval("testing", script_body.c_str());
|
||||||
|
const std::string &res = EQW::Singleton()->GetOutput();
|
||||||
|
if(!res.empty()) {
|
||||||
|
ProcessText(res.c_str(), res.length());
|
||||||
|
EQW::Singleton()->ClearOutput();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EQWHTTPHandler::ProcessText(const char *txt, int len) {
|
||||||
|
if(!m_sentHeaders) {
|
||||||
|
SendResponse(m_responseCode, "OK");
|
||||||
|
m_sentHeaders = true;
|
||||||
|
}
|
||||||
|
SendBuf(txt, len);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
EQWHTTPServer::EQWHTTPServer()
|
||||||
|
: m_port(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void EQWHTTPServer::CreateNewConnection(uint32 ID, SOCKET in_socket, uint32 irIP, uint16 irPort) {
|
||||||
|
auto conn = new EQWHTTPHandler(ID, in_socket, irIP, irPort);
|
||||||
|
AddConnection(conn);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EQWHTTPServer::Stop() {
|
||||||
|
Log(Logs::Detail, Logs::World_Server, "Requesting that HTTP Service stop.");
|
||||||
|
m_running = false;
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EQWHTTPServer::Start(uint16 port, const char *mime_file) {
|
||||||
|
if(m_running) {
|
||||||
|
Log(Logs::Detail, Logs::World_Server, "HTTP Service is already running on port %d", m_port);
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
//load up our nice mime types
|
||||||
|
if(!EQWHTTPHandler::LoadMimeTypes(mime_file)) {
|
||||||
|
Log(Logs::Detail, Logs::World_Server, "Failed to load mime types from '%s'", mime_file);
|
||||||
|
return(false);
|
||||||
|
} else {
|
||||||
|
Log(Logs::Detail, Logs::World_Server, "Loaded mime types from %s", mime_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
//fire up the server thread
|
||||||
|
char errbuf[TCPServer_ErrorBufferSize];
|
||||||
|
if(!Open(port, errbuf)) {
|
||||||
|
Log(Logs::Detail, Logs::World_Server, "Unable to bind to port %d for HTTP service: %s", port, errbuf);
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_running = true;
|
||||||
|
m_port = port;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
_beginthread(ThreadProc, 0, this);
|
||||||
|
#else
|
||||||
|
pthread_create(&m_thread, nullptr, ThreadProc, this);
|
||||||
|
#endif*/
|
||||||
|
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
void EQWHTTPServer::Run() {
|
||||||
|
Log.LogDebugType(Logs::Detail, Logs::World_Server, "HTTP Processing thread started on port %d", m_port);
|
||||||
|
do {
|
||||||
|
#warning DELETE THIS IF YOU DONT USE IT
|
||||||
|
Sleep(10);
|
||||||
|
} while(m_running);
|
||||||
|
Log.LogDebugType(Logs::Detail, Logs::World_Server, "HTTP Processing thread terminating on port %d", m_port);
|
||||||
|
}
|
||||||
|
|
||||||
|
ThreadReturnType EQWHTTPServer::ThreadProc(void *data) {
|
||||||
|
((EQWHTTPServer *) data)->Run();
|
||||||
|
THREAD_RETURN(nullptr);
|
||||||
|
}*/
|
||||||
|
|
||||||
348
world/eqw_parser.cpp
Normal file
348
world/eqw_parser.cpp
Normal file
@ -0,0 +1,348 @@
|
|||||||
|
/* EQEMu: Everquest Server Emulator
|
||||||
|
Copyright (C) 2001-2006 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
//a lot of this is copied from embperl.cpp, but I didnt feel like factoring the common stuff out
|
||||||
|
|
||||||
|
#ifdef EMBPERL
|
||||||
|
|
||||||
|
#include "../common/global_define.h"
|
||||||
|
#include "eqw_parser.h"
|
||||||
|
#include "eqw.h"
|
||||||
|
#include "../common/eqdb.h"
|
||||||
|
|
||||||
|
#include "worlddb.h"
|
||||||
|
|
||||||
|
#ifndef GvCV_set
|
||||||
|
#define GvCV_set(gv,cv) (GvCV(gv) = (cv))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
XS(XS_EQWIO_PRINT);
|
||||||
|
|
||||||
|
//so embedded scripts can use xs extensions (ala 'use socket;')
|
||||||
|
EXTERN_C void boot_DynaLoader(pTHX_ CV* cv);
|
||||||
|
EXTERN_C XS(boot_EQW);
|
||||||
|
EXTERN_C XS(boot_EQDB);
|
||||||
|
EXTERN_C XS(boot_EQDBRes);
|
||||||
|
EXTERN_C XS(boot_HTTPRequest);
|
||||||
|
EXTERN_C XS(boot_EQLConfig);
|
||||||
|
|
||||||
|
EXTERN_C void xs_init(pTHX)
|
||||||
|
{
|
||||||
|
char file[256];
|
||||||
|
strncpy(file, __FILE__, 256);
|
||||||
|
file[255] = '\0';
|
||||||
|
|
||||||
|
char buf[128]; //shouldent have any function names longer than this.
|
||||||
|
|
||||||
|
//add the strcpy stuff to get rid of const warnings....
|
||||||
|
|
||||||
|
newXS(strcpy(buf, "DynaLoader::boot_DynaLoader"), boot_DynaLoader, file);
|
||||||
|
newXS(strcpy(buf, "EQW::boot_EQW"), boot_EQW, file);
|
||||||
|
newXS(strcpy(buf, "EQDB::boot_EQDB"), boot_EQDB, file);
|
||||||
|
newXS(strcpy(buf, "EQDBRes::boot_EQDBRes"), boot_EQDBRes, file);
|
||||||
|
newXS(strcpy(buf, "HTTPRequest::boot_HTTPRequest"), boot_HTTPRequest, file);
|
||||||
|
newXS(strcpy(buf, "EQLConfig::boot_EQLConfig"), boot_EQLConfig, file);
|
||||||
|
newXS(strcpy(buf, "EQWIO::PRINT"), XS_EQWIO_PRINT, file);
|
||||||
|
}
|
||||||
|
|
||||||
|
EQWParser::EQWParser() {
|
||||||
|
//setup perl...
|
||||||
|
my_perl = perl_alloc();
|
||||||
|
_empty_sv = newSV(0);
|
||||||
|
if (!my_perl) {
|
||||||
|
Log(Logs::Detail, Logs::World_Server, "Error: perl_alloc failed!");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
DoInit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EQWParser::DoInit() {
|
||||||
|
const char *argv_eqemu[] = { "",
|
||||||
|
"-w", "-W",
|
||||||
|
"-e", "0;", nullptr };
|
||||||
|
|
||||||
|
int argc = 5;
|
||||||
|
|
||||||
|
char **argv = (char **)argv_eqemu;
|
||||||
|
char **env = { nullptr };
|
||||||
|
|
||||||
|
PL_perl_destruct_level = 1;
|
||||||
|
|
||||||
|
perl_construct(my_perl);
|
||||||
|
|
||||||
|
PERL_SYS_INIT3(&argc, &argv, &env);
|
||||||
|
|
||||||
|
perl_parse(my_perl, xs_init, argc, argv, env);
|
||||||
|
|
||||||
|
perl_run(my_perl);
|
||||||
|
|
||||||
|
//a little routine we use a lot.
|
||||||
|
eval_pv("sub my_eval {eval $_[0];}", TRUE); //dies on error
|
||||||
|
|
||||||
|
//ruin the perl exit and command:
|
||||||
|
eval_pv("sub my_exit {}",TRUE);
|
||||||
|
eval_pv("sub my_sleep {}",TRUE);
|
||||||
|
if(gv_stashpv("CORE::GLOBAL", FALSE)) {
|
||||||
|
GV *exitgp = gv_fetchpv("CORE::GLOBAL::exit", TRUE, SVt_PVCV);
|
||||||
|
GvCV_set(exitgp, perl_get_cv("my_exit", TRUE)); //dies on error
|
||||||
|
GvIMPORTED_CV_on(exitgp);
|
||||||
|
GV *sleepgp = gv_fetchpv("CORE::GLOBAL::sleep", TRUE, SVt_PVCV);
|
||||||
|
GvCV_set(sleepgp, perl_get_cv("my_sleep", TRUE)); //dies on error
|
||||||
|
GvIMPORTED_CV_on(sleepgp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//setup eval_file
|
||||||
|
eval_pv(
|
||||||
|
"our %Cache;"
|
||||||
|
"use Symbol qw(delete_package);"
|
||||||
|
"sub eval_file {"
|
||||||
|
"my($package, $filename) = @_;"
|
||||||
|
"$filename=~s/\'//g;"
|
||||||
|
"if(! -r $filename) { print \"Unable to read perl file '$filename'\\n\"; return; }"
|
||||||
|
"my $mtime = -M $filename;"
|
||||||
|
"if(defined $Cache{$package}{mtime}&&$Cache{$package}{mtime} <= $mtime && !($package eq 'plugin')){"
|
||||||
|
" return;"
|
||||||
|
"} else {"
|
||||||
|
//we 'my' $filename,$mtime,$package,$sub to prevent them from changing our state up here.
|
||||||
|
" eval(\"package $package; my(\\$filename,\\$mtime,\\$package,\\$sub); \\$isloaded = 1; require '$filename'; \");"
|
||||||
|
"}"
|
||||||
|
"}"
|
||||||
|
,FALSE);
|
||||||
|
|
||||||
|
//make a tie-able class to capture IO and get it where it needs to go
|
||||||
|
eval_pv(
|
||||||
|
"package EQWIO; "
|
||||||
|
// "&boot_EQEmuIO;"
|
||||||
|
"sub TIEHANDLE { my $me = bless {}, $_[0]; $me->PRINT('Creating '.$me); return($me); } "
|
||||||
|
"sub WRITE { } "
|
||||||
|
"sub PRINTF { my $me = shift; my $fmt = shift; $me->PRINT(sprintf($fmt, @_)); } "
|
||||||
|
"sub CLOSE { my $me = shift; $me->PRINT('Closing '.$me); } "
|
||||||
|
"sub DESTROY { my $me = shift; $me->PRINT('Destroying '.$me); } "
|
||||||
|
//this ties us for all packages
|
||||||
|
"package MAIN;"
|
||||||
|
" if(tied *STDOUT) { untie(*STDOUT); }"
|
||||||
|
" if(tied *STDERR) { untie(*STDERR); }"
|
||||||
|
" tie *STDOUT, 'EQWIO';"
|
||||||
|
" tie *STDERR, 'EQWIO';"
|
||||||
|
,FALSE);
|
||||||
|
|
||||||
|
eval_pv(
|
||||||
|
"package world; "
|
||||||
|
,FALSE
|
||||||
|
);
|
||||||
|
|
||||||
|
//make sure the EQW pointer is set up in this package
|
||||||
|
EQW *curc = EQW::Singleton();
|
||||||
|
SV *l = get_sv("world::EQW", true);
|
||||||
|
if(curc != nullptr) {
|
||||||
|
sv_setref_pv(l, "EQW", curc);
|
||||||
|
} else {
|
||||||
|
//clear out the value, mainly to get rid of blessedness
|
||||||
|
sv_setsv(l, _empty_sv);
|
||||||
|
}
|
||||||
|
|
||||||
|
//make sure the EQDB pointer is set up in this package
|
||||||
|
EQDB::SetMySQL(database.getMySQL());
|
||||||
|
EQDB *curc_db = EQDB::Singleton();
|
||||||
|
SV *l_db = get_sv("world::EQDB", true);
|
||||||
|
if(curc_db != nullptr) {
|
||||||
|
sv_setref_pv(l_db, "EQDB", curc_db);
|
||||||
|
} else {
|
||||||
|
//clear out the value, mainly to get rid of blessedness
|
||||||
|
sv_setsv(l_db, _empty_sv);
|
||||||
|
}
|
||||||
|
|
||||||
|
//load up EQW
|
||||||
|
eval_pv(
|
||||||
|
"package EQW;"
|
||||||
|
"&boot_EQW;" //load our EQW XS
|
||||||
|
"package EQDB;"
|
||||||
|
"&boot_EQDB;" //load our EQW XS
|
||||||
|
"package EQDBRes;"
|
||||||
|
"&boot_EQDBRes;" //load our EQW XS
|
||||||
|
"package HTTPRequest;"
|
||||||
|
"&boot_HTTPRequest;" //load our HTTPRequest XS
|
||||||
|
"package EQLConfig;"
|
||||||
|
"&boot_EQLConfig;" //load our EQLConfig XS
|
||||||
|
, FALSE );
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef EMBPERL_PLUGIN
|
||||||
|
Log(Logs::Detail, Logs::World_Server, "Loading worldui perl plugins.");
|
||||||
|
std::string err;
|
||||||
|
if(!eval_file("world", "worldui.pl", err)) {
|
||||||
|
Log(Logs::Detail, Logs::World_Server, "Warning - world.pl: %s", err.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
eval_pv(
|
||||||
|
"package world; "
|
||||||
|
"if(opendir(D,'worldui')) { "
|
||||||
|
" my @d = readdir(D);"
|
||||||
|
" closedir(D);"
|
||||||
|
" foreach(@d){ "
|
||||||
|
" next unless(/\\.pl$); "
|
||||||
|
" require 'templates/'.$_;"
|
||||||
|
" }"
|
||||||
|
"}"
|
||||||
|
,FALSE);
|
||||||
|
#endif //EMBPERL_PLUGIN
|
||||||
|
}
|
||||||
|
|
||||||
|
EQWParser::~EQWParser() {
|
||||||
|
//removed to try to stop perl from exploding on reload, we'll see
|
||||||
|
/* eval_pv(
|
||||||
|
"package quest;"
|
||||||
|
" untie *STDOUT;"
|
||||||
|
" untie *STDERR;"
|
||||||
|
,FALSE);
|
||||||
|
*/
|
||||||
|
perl_free(my_perl);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EQWParser::eval_file(const char * packagename, const char * filename, std::string &error)
|
||||||
|
{
|
||||||
|
std::vector<std::string> args;
|
||||||
|
args.push_back(packagename);
|
||||||
|
args.push_back(filename);
|
||||||
|
return(dosub("eval_file", args, error));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EQWParser::dosub(const char * subname, const std::vector<std::string> &args, std::string &error, int mode) {
|
||||||
|
bool err = false;
|
||||||
|
dSP; // initialize stack pointer
|
||||||
|
ENTER; // everything created after here
|
||||||
|
SAVETMPS; // ...is a temporary variable
|
||||||
|
PUSHMARK(SP); // remember the stack pointer
|
||||||
|
if(!args.empty())
|
||||||
|
{
|
||||||
|
for (auto i = args.begin(); i != args.end(); ++i) { /* push the arguments onto the perl stack */
|
||||||
|
XPUSHs(sv_2mortal(newSVpv(i->c_str(), i->length())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PUTBACK; // make local stack pointer global
|
||||||
|
call_pv(subname, mode); /*eval our code*/
|
||||||
|
SPAGAIN; // refresh stack pointer
|
||||||
|
if(SvTRUE(ERRSV)) {
|
||||||
|
err = true;
|
||||||
|
}
|
||||||
|
FREETMPS; // free temp values
|
||||||
|
LEAVE; // ...and the XPUSHed "mortal" args.
|
||||||
|
|
||||||
|
if(err) {
|
||||||
|
error = "Perl runtime error: ";
|
||||||
|
error += SvPVX(ERRSV);
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EQWParser::eval(const char * code, std::string &error) {
|
||||||
|
std::vector<std::string> arg;
|
||||||
|
arg.push_back(code);
|
||||||
|
return(dosub("my_eval", arg, error, G_SCALAR|G_DISCARD|G_EVAL|G_KEEPERR));
|
||||||
|
}
|
||||||
|
|
||||||
|
void EQWParser::EQW_eval(const char *pkg, const char *code) {
|
||||||
|
char namebuf[64];
|
||||||
|
|
||||||
|
snprintf(namebuf, 64, "package %s;", pkg);
|
||||||
|
eval_pv(namebuf, FALSE);
|
||||||
|
|
||||||
|
//make sure the EQW pointer is set up
|
||||||
|
EQW *curc = EQW::Singleton();
|
||||||
|
snprintf(namebuf, 64, "EQW");
|
||||||
|
// snprintf(namebuf, 64, "%s::EQW", pkg);
|
||||||
|
SV *l = get_sv(namebuf, true);
|
||||||
|
if(curc != nullptr) {
|
||||||
|
sv_setref_pv(l, "EQW", curc);
|
||||||
|
} else {
|
||||||
|
//clear out the value, mainly to get rid of blessedness
|
||||||
|
sv_setsv(l, _empty_sv);
|
||||||
|
}
|
||||||
|
//make sure the EQDB pointer is set up
|
||||||
|
EQDB *curc_db = EQDB::Singleton();
|
||||||
|
snprintf(namebuf, 64, "EQDB");
|
||||||
|
// snprintf(namebuf, 64, "%s::EQW", pkg);
|
||||||
|
SV *l_db = get_sv(namebuf, true);
|
||||||
|
if(curc_db != nullptr) {
|
||||||
|
sv_setref_pv(l_db, "EQDB", curc_db);
|
||||||
|
} else {
|
||||||
|
//clear out the value, mainly to get rid of blessedness
|
||||||
|
sv_setsv(l_db, _empty_sv);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string err;
|
||||||
|
if(!eval(code, err)) {
|
||||||
|
EQW::Singleton()->AppendOutput(err.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EQWParser::SetHTTPRequest(const char *pkg, HTTPRequest *it) {
|
||||||
|
char namebuf[64];
|
||||||
|
|
||||||
|
snprintf(namebuf, 64, "package %s;", pkg);
|
||||||
|
eval_pv(namebuf, FALSE);
|
||||||
|
|
||||||
|
snprintf(namebuf, 64, "request");
|
||||||
|
// snprintf(namebuf, 64, "%s::EQW", pkg);
|
||||||
|
SV *l = get_sv(namebuf, true);
|
||||||
|
if(it != nullptr) {
|
||||||
|
sv_setref_pv(l, "HTTPRequest", it);
|
||||||
|
} else {
|
||||||
|
//clear out the value, mainly to get rid of blessedness
|
||||||
|
sv_setsv(l, _empty_sv);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
$editors = array();
|
||||||
|
$editors["merchant"] = new MerchantEditor();
|
||||||
|
#... for other editors
|
||||||
|
|
||||||
|
if(defined($editors[$editor])) {
|
||||||
|
$edit = $editors[$editor];
|
||||||
|
$edit->dispatch($action);
|
||||||
|
}
|
||||||
|
|
||||||
|
class MerchantEditor extends BaseEditor {
|
||||||
|
MerchantEditor() {
|
||||||
|
$this->RegisterAction(0, "get_merchantlist", "merchant/merchant.tmpl.php", "no");
|
||||||
|
$this->RegisterAction(1, "get_merchantlist", "merchant/merchant.edit.tmpl.php", "no");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function dispatch() {
|
||||||
|
my $dispatcher = $this->_dispatchers[$action];
|
||||||
|
$body = new Template($dispatcher["template"]);
|
||||||
|
my $proc = $dispatcher["proc"];
|
||||||
|
$vars = $this->$proc();
|
||||||
|
if($dispatcher["guestmode"] == "no") {
|
||||||
|
check_authorization();
|
||||||
|
}
|
||||||
|
if ($vars) {
|
||||||
|
foreach ($vars as $key=>$value) {
|
||||||
|
$body->set($key, $value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif //EMBPERL
|
||||||
|
|
||||||
@ -1,19 +1,19 @@
|
|||||||
/* EQEMu: Everquest Server Emulator
|
/* EQEMu: Everquest Server Emulator
|
||||||
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
|
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; version 2 of the License.
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
are required to give you total support for your newly bought product;
|
are required to give you total support for your newly bought product;
|
||||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
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"
|
||||||
@ -35,7 +35,7 @@
|
|||||||
extern LauncherList launcher_list;
|
extern LauncherList launcher_list;
|
||||||
|
|
||||||
LauncherLink::LauncherLink(int id, std::shared_ptr<EQ::Net::ServertalkServerConnection> c)
|
LauncherLink::LauncherLink(int id, std::shared_ptr<EQ::Net::ServertalkServerConnection> c)
|
||||||
: ID(id),
|
: ID(id),
|
||||||
tcpc(c),
|
tcpc(c),
|
||||||
authenticated(false),
|
authenticated(false),
|
||||||
m_name(""),
|
m_name(""),
|
||||||
@ -71,7 +71,7 @@ void LauncherLink::ProcessMessage(uint16 opcode, EQ::Net::Packet &p)
|
|||||||
ServerPacket tpack(opcode, p);
|
ServerPacket tpack(opcode, p);
|
||||||
ServerPacket *pack = &tpack;
|
ServerPacket *pack = &tpack;
|
||||||
|
|
||||||
switch(opcode) {
|
switch (opcode) {
|
||||||
case 0:
|
case 0:
|
||||||
break;
|
break;
|
||||||
case ServerOP_KeepAlive: {
|
case ServerOP_KeepAlive: {
|
||||||
@ -79,25 +79,25 @@ void LauncherLink::ProcessMessage(uint16 opcode, EQ::Net::Packet &p)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ServerOP_ZAAuth: {
|
case ServerOP_ZAAuth: {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Got authentication from %s when they are already authenticated.", m_name.c_str());
|
Log(Logs::Detail, Logs::World_Server, "Got authentication from %s when they are already authenticated.", m_name.c_str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ServerOP_LauncherConnectInfo: {
|
case ServerOP_LauncherConnectInfo: {
|
||||||
const LauncherConnectInfo *it = (const LauncherConnectInfo *) pack->pBuffer;
|
const LauncherConnectInfo *it = (const LauncherConnectInfo *)pack->pBuffer;
|
||||||
if(HasName()) {
|
if (HasName()) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Launcher '%s' received an additional connect packet with name '%s'. Ignoring.", m_name.c_str(), it->name);
|
Log(Logs::Detail, Logs::World_Server, "Launcher '%s' received an additional connect packet with name '%s'. Ignoring.", m_name.c_str(), it->name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
m_name = it->name;
|
m_name = it->name;
|
||||||
|
|
||||||
EQLConfig *config = launcher_list.GetConfig(m_name.c_str());
|
EQLConfig *config = launcher_list.GetConfig(m_name.c_str());
|
||||||
if(config == nullptr) {
|
if (config == nullptr) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Unknown launcher '%s' connected. Disconnecting.", it->name);
|
Log(Logs::Detail, Logs::World_Server, "Unknown launcher '%s' connected. Disconnecting.", it->name);
|
||||||
Disconnect();
|
Disconnect();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Launcher Identified itself as '%s'. Loading zone list.", it->name);
|
Log(Logs::Detail, Logs::World_Server, "Launcher Identified itself as '%s'. Loading zone list.", it->name);
|
||||||
|
|
||||||
std::vector<LauncherZone> result;
|
std::vector<LauncherZone> result;
|
||||||
//database.GetLauncherZones(it->name, result);
|
//database.GetLauncherZones(it->name, result);
|
||||||
@ -107,11 +107,11 @@ void LauncherLink::ProcessMessage(uint16 opcode, EQ::Net::Packet &p)
|
|||||||
cur = result.begin();
|
cur = result.begin();
|
||||||
end = result.end();
|
end = result.end();
|
||||||
ZoneState zs;
|
ZoneState zs;
|
||||||
for(; cur != end; cur++) {
|
for (; cur != end; cur++) {
|
||||||
zs.port = cur->port;
|
zs.port = cur->port;
|
||||||
zs.up = false;
|
zs.up = false;
|
||||||
zs.starts = 0;
|
zs.starts = 0;
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "%s: Loaded zone '%s' on port %d", m_name.c_str(), cur->name.c_str(), zs.port);
|
Log(Logs::Detail, Logs::World_Server, "%s: Loaded zone '%s' on port %d", m_name.c_str(), cur->name.c_str(), zs.port);
|
||||||
m_states[cur->name] = zs;
|
m_states[cur->name] = zs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -123,21 +123,21 @@ void LauncherLink::ProcessMessage(uint16 opcode, EQ::Net::Packet &p)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ServerOP_LauncherZoneStatus: {
|
case ServerOP_LauncherZoneStatus: {
|
||||||
const LauncherZoneStatus *it = (const LauncherZoneStatus *) pack->pBuffer;
|
const LauncherZoneStatus *it = (const LauncherZoneStatus *)pack->pBuffer;
|
||||||
std::map<std::string, ZoneState>::iterator res;
|
std::map<std::string, ZoneState>::iterator res;
|
||||||
res = m_states.find(it->short_name);
|
res = m_states.find(it->short_name);
|
||||||
if(res == m_states.end()) {
|
if (res == m_states.end()) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "%s: reported state for zone %s which it does not have.", m_name.c_str(), it->short_name);
|
Log(Logs::Detail, Logs::World_Server, "%s: reported state for zone %s which it does not have.", m_name.c_str(), it->short_name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "%s: %s reported state %s (%d starts)", m_name.c_str(), it->short_name, it->running?"STARTED":"STOPPED", it->start_count);
|
Log(Logs::Detail, Logs::World_Server, "%s: %s reported state %s (%d starts)", m_name.c_str(), it->short_name, it->running ? "STARTED" : "STOPPED", it->start_count);
|
||||||
res->second.up = it->running;
|
res->second.up = it->running;
|
||||||
res->second.starts = it->start_count;
|
res->second.starts = it->start_count;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Unknown ServerOPcode from launcher 0x%04x, size %d",pack->opcode,pack->size);
|
Log(Logs::Detail, Logs::World_Server, "Unknown ServerOPcode from launcher 0x%04x, size %d", pack->opcode, pack->size);
|
||||||
DumpPacket(pack->pBuffer, pack->size);
|
DumpPacket(pack->pBuffer, pack->size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -153,7 +153,7 @@ void LauncherLink::BootZone(const char *short_name, uint16 port) {
|
|||||||
zs.port = port;
|
zs.port = port;
|
||||||
zs.up = false;
|
zs.up = false;
|
||||||
zs.starts = 0;
|
zs.starts = 0;
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "%s: Loaded zone '%s' on port %d", m_name.c_str(), short_name, zs.port);
|
Log(Logs::Detail, Logs::World_Server, "%s: Loaded zone '%s' on port %d", m_name.c_str(), short_name, zs.port);
|
||||||
m_states[short_name] = zs;
|
m_states[short_name] = zs;
|
||||||
|
|
||||||
StartZone(short_name, port);
|
StartZone(short_name, port);
|
||||||
@ -165,7 +165,7 @@ void LauncherLink::StartZone(const char *short_name) {
|
|||||||
|
|
||||||
void LauncherLink::StartZone(const char *short_name, uint16 port) {
|
void LauncherLink::StartZone(const char *short_name, uint16 port) {
|
||||||
auto pack = new ServerPacket(ServerOP_LauncherZoneRequest, sizeof(LauncherZoneRequest));
|
auto pack = new ServerPacket(ServerOP_LauncherZoneRequest, sizeof(LauncherZoneRequest));
|
||||||
LauncherZoneRequest* s = (LauncherZoneRequest *) pack->pBuffer;
|
LauncherZoneRequest* s = (LauncherZoneRequest *)pack->pBuffer;
|
||||||
|
|
||||||
strn0cpy(s->short_name, short_name, 32);
|
strn0cpy(s->short_name, short_name, 32);
|
||||||
s->command = ZR_Start;
|
s->command = ZR_Start;
|
||||||
@ -177,7 +177,7 @@ void LauncherLink::StartZone(const char *short_name, uint16 port) {
|
|||||||
|
|
||||||
void LauncherLink::RestartZone(const char *short_name) {
|
void LauncherLink::RestartZone(const char *short_name) {
|
||||||
auto pack = new ServerPacket(ServerOP_LauncherZoneRequest, sizeof(LauncherZoneRequest));
|
auto pack = new ServerPacket(ServerOP_LauncherZoneRequest, sizeof(LauncherZoneRequest));
|
||||||
LauncherZoneRequest* s = (LauncherZoneRequest *) pack->pBuffer;
|
LauncherZoneRequest* s = (LauncherZoneRequest *)pack->pBuffer;
|
||||||
|
|
||||||
strn0cpy(s->short_name, short_name, 32);
|
strn0cpy(s->short_name, short_name, 32);
|
||||||
s->command = ZR_Restart;
|
s->command = ZR_Restart;
|
||||||
@ -189,7 +189,7 @@ void LauncherLink::RestartZone(const char *short_name) {
|
|||||||
|
|
||||||
void LauncherLink::StopZone(const char *short_name) {
|
void LauncherLink::StopZone(const char *short_name) {
|
||||||
auto pack = new ServerPacket(ServerOP_LauncherZoneRequest, sizeof(LauncherZoneRequest));
|
auto pack = new ServerPacket(ServerOP_LauncherZoneRequest, sizeof(LauncherZoneRequest));
|
||||||
LauncherZoneRequest* s = (LauncherZoneRequest *) pack->pBuffer;
|
LauncherZoneRequest* s = (LauncherZoneRequest *)pack->pBuffer;
|
||||||
|
|
||||||
strn0cpy(s->short_name, short_name, 32);
|
strn0cpy(s->short_name, short_name, 32);
|
||||||
s->command = ZR_Stop;
|
s->command = ZR_Stop;
|
||||||
@ -200,11 +200,11 @@ void LauncherLink::StopZone(const char *short_name) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void LauncherLink::BootDynamics(uint8 new_count) {
|
void LauncherLink::BootDynamics(uint8 new_count) {
|
||||||
if(m_dynamicCount == new_count)
|
if (m_dynamicCount == new_count)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ZoneState zs;
|
ZoneState zs;
|
||||||
if(m_dynamicCount < new_count) {
|
if (m_dynamicCount < new_count) {
|
||||||
//we are booting more dynamics.
|
//we are booting more dynamics.
|
||||||
|
|
||||||
zs.port = 0;
|
zs.port = 0;
|
||||||
@ -215,11 +215,11 @@ void LauncherLink::BootDynamics(uint8 new_count) {
|
|||||||
char nbuf[20];
|
char nbuf[20];
|
||||||
uint8 index;
|
uint8 index;
|
||||||
//"for each zone we need to boot"
|
//"for each zone we need to boot"
|
||||||
for(r = m_dynamicCount; r < new_count; r++) {
|
for (r = m_dynamicCount; r < new_count; r++) {
|
||||||
//find an idle ID
|
//find an idle ID
|
||||||
for(index = m_dynamicCount+1; index < 255; index++) {
|
for (index = m_dynamicCount + 1; index < 255; index++) {
|
||||||
sprintf(nbuf, "dynamic_%02d", index);
|
sprintf(nbuf, "dynamic_%02d", index);
|
||||||
if(m_states.find(nbuf) != m_states.end())
|
if (m_states.find(nbuf) != m_states.end())
|
||||||
continue;
|
continue;
|
||||||
m_states[nbuf] = zs;
|
m_states[nbuf] = zs;
|
||||||
StartZone(nbuf);
|
StartZone(nbuf);
|
||||||
@ -227,15 +227,17 @@ void LauncherLink::BootDynamics(uint8 new_count) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_dynamicCount = new_count;
|
m_dynamicCount = new_count;
|
||||||
} else if(new_count == 0) {
|
}
|
||||||
|
else if (new_count == 0) {
|
||||||
//kill all zones...
|
//kill all zones...
|
||||||
std::map<std::string, ZoneState>::iterator cur, end;
|
std::map<std::string, ZoneState>::iterator cur, end;
|
||||||
cur = m_states.begin();
|
cur = m_states.begin();
|
||||||
end = m_states.end();
|
end = m_states.end();
|
||||||
for(; cur != end; cur++) {
|
for (; cur != end; cur++) {
|
||||||
StopZone(cur->first.c_str());
|
StopZone(cur->first.c_str());
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
//need to get rid of some zones...
|
//need to get rid of some zones...
|
||||||
|
|
||||||
//quick and dirty way to do this.. should do better (like looking for idle zones)
|
//quick and dirty way to do this.. should do better (like looking for idle zones)
|
||||||
@ -243,12 +245,13 @@ void LauncherLink::BootDynamics(uint8 new_count) {
|
|||||||
std::map<std::string, ZoneState>::iterator cur, end;
|
std::map<std::string, ZoneState>::iterator cur, end;
|
||||||
cur = m_states.begin();
|
cur = m_states.begin();
|
||||||
end = m_states.end();
|
end = m_states.end();
|
||||||
for(; cur != end; cur++) {
|
for (; cur != end; cur++) {
|
||||||
if(cur->first.find("dynamic_") == 0) {
|
if (cur->first.find("dynamic_") == 0) {
|
||||||
if(found >= new_count) {
|
if (found >= new_count) {
|
||||||
//this zone exceeds the number of allowed booted zones.
|
//this zone exceeds the number of allowed booted zones.
|
||||||
StopZone(cur->first.c_str());
|
StopZone(cur->first.c_str());
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
found++;
|
found++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -264,25 +267,26 @@ void LauncherLink::GetZoneList(std::vector<std::string> &l) {
|
|||||||
std::map<std::string, ZoneState>::iterator cur, end;
|
std::map<std::string, ZoneState>::iterator cur, end;
|
||||||
cur = m_states.begin();
|
cur = m_states.begin();
|
||||||
end = m_states.end();
|
end = m_states.end();
|
||||||
for(; cur != end; cur++) {
|
for (; cur != end; cur++) {
|
||||||
l.push_back(cur->first.c_str());
|
l.push_back(cur->first.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LauncherLink::GetZoneDetails(const char *short_name, std::map<std::string,std::string> &res) {
|
void LauncherLink::GetZoneDetails(const char *short_name, std::map<std::string, std::string> &res) {
|
||||||
res.clear();
|
res.clear();
|
||||||
|
|
||||||
std::map<std::string, ZoneState>::iterator r;
|
std::map<std::string, ZoneState>::iterator r;
|
||||||
r = m_states.find(short_name);
|
r = m_states.find(short_name);
|
||||||
if(r == m_states.end()) {
|
if (r == m_states.end()) {
|
||||||
res["error"] = "Zone Not Found";
|
res["error"] = "Zone Not Found";
|
||||||
res["name"] = short_name;
|
res["name"] = short_name;
|
||||||
res["up"] = "0";
|
res["up"] = "0";
|
||||||
res["starts"] = "0";
|
res["starts"] = "0";
|
||||||
res["port"] = "0";
|
res["port"] = "0";
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
res["name"] = r->first;
|
res["name"] = r->first;
|
||||||
res["up"] = r->second.up?"1":"0";
|
res["up"] = r->second.up ? "1" : "0";
|
||||||
res["starts"] = itoa(r->second.starts);
|
res["starts"] = itoa(r->second.starts);
|
||||||
res["port"] = itoa(r->second.port);
|
res["port"] = itoa(r->second.port);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,19 +1,19 @@
|
|||||||
/* EQEMu: Everquest Server Emulator
|
/* EQEMu: Everquest Server Emulator
|
||||||
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
|
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; version 2 of the License.
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
are required to give you total support for your newly bought product;
|
are required to give you total support for your newly bought product;
|
||||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@ -24,7 +24,7 @@
|
|||||||
#include "eql_config.h"
|
#include "eql_config.h"
|
||||||
|
|
||||||
LauncherList::LauncherList()
|
LauncherList::LauncherList()
|
||||||
: nextID(1)
|
: nextID(1)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -32,21 +32,21 @@ LauncherList::~LauncherList() {
|
|||||||
std::vector<LauncherLink *>::iterator cur, end;
|
std::vector<LauncherLink *>::iterator cur, end;
|
||||||
cur = m_pendingLaunchers.begin();
|
cur = m_pendingLaunchers.begin();
|
||||||
end = m_pendingLaunchers.end();
|
end = m_pendingLaunchers.end();
|
||||||
for(; cur != end; ++cur) {
|
for (; cur != end; ++cur) {
|
||||||
delete *cur;
|
delete *cur;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<std::string, EQLConfig *>::iterator curc, endc;
|
std::map<std::string, EQLConfig *>::iterator curc, endc;
|
||||||
curc = m_configs.begin();
|
curc = m_configs.begin();
|
||||||
endc = m_configs.end();
|
endc = m_configs.end();
|
||||||
for(; curc != endc; ++curc) {
|
for (; curc != endc; ++curc) {
|
||||||
delete curc->second;
|
delete curc->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<std::string, LauncherLink *>::iterator curl, endl;
|
std::map<std::string, LauncherLink *>::iterator curl, endl;
|
||||||
curl = m_launchers.begin();
|
curl = m_launchers.begin();
|
||||||
endl = m_launchers.end();
|
endl = m_launchers.end();
|
||||||
for(; curl != endl; ++curl) {
|
for (; curl != endl; ++curl) {
|
||||||
delete curl->second;
|
delete curl->second;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -54,9 +54,9 @@ LauncherList::~LauncherList() {
|
|||||||
void LauncherList::Process() {
|
void LauncherList::Process() {
|
||||||
std::vector<LauncherLink *>::iterator cur;
|
std::vector<LauncherLink *>::iterator cur;
|
||||||
cur = m_pendingLaunchers.begin();
|
cur = m_pendingLaunchers.begin();
|
||||||
while(cur != m_pendingLaunchers.end()) {
|
while (cur != m_pendingLaunchers.end()) {
|
||||||
LauncherLink *l = *cur;
|
LauncherLink *l = *cur;
|
||||||
if(l->HasName()) {
|
if (l->HasName()) {
|
||||||
//launcher has identified itself now.
|
//launcher has identified itself now.
|
||||||
//remove ourself from the pending list
|
//remove ourself from the pending list
|
||||||
cur = m_pendingLaunchers.erase(cur);
|
cur = m_pendingLaunchers.erase(cur);
|
||||||
@ -64,14 +64,15 @@ void LauncherList::Process() {
|
|||||||
//kill off anybody else using our name.
|
//kill off anybody else using our name.
|
||||||
std::map<std::string, LauncherLink *>::iterator res;
|
std::map<std::string, LauncherLink *>::iterator res;
|
||||||
res = m_launchers.find(name);
|
res = m_launchers.find(name);
|
||||||
if(res != m_launchers.end()) {
|
if (res != m_launchers.end()) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Ghosting launcher %s", name.c_str());
|
Log(Logs::Detail, Logs::World_Server, "Ghosting launcher %s", name.c_str());
|
||||||
delete res->second;
|
delete res->second;
|
||||||
}
|
}
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Removing pending launcher %d. Adding %s to active list.", l->GetID(), name.c_str());
|
Log(Logs::Detail, Logs::World_Server, "Removing pending launcher %d. Adding %s to active list.", l->GetID(), name.c_str());
|
||||||
//put the launcher in the list.
|
//put the launcher in the list.
|
||||||
m_launchers[name] = l;
|
m_launchers[name] = l;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
++cur;
|
++cur;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -80,7 +81,7 @@ void LauncherList::Process() {
|
|||||||
LauncherLink *LauncherList::Get(const char *name) {
|
LauncherLink *LauncherList::Get(const char *name) {
|
||||||
std::map<std::string, LauncherLink *>::iterator res;
|
std::map<std::string, LauncherLink *>::iterator res;
|
||||||
res = m_launchers.find(name);
|
res = m_launchers.find(name);
|
||||||
if(res == m_launchers.end())
|
if (res == m_launchers.end())
|
||||||
return(nullptr);
|
return(nullptr);
|
||||||
return(res->second);
|
return(res->second);
|
||||||
}
|
}
|
||||||
@ -89,8 +90,8 @@ LauncherLink *LauncherList::FindByZone(const char *short_name) {
|
|||||||
std::map<std::string, LauncherLink *>::iterator cur, end;
|
std::map<std::string, LauncherLink *>::iterator cur, end;
|
||||||
cur = m_launchers.begin();
|
cur = m_launchers.begin();
|
||||||
end = m_launchers.end();
|
end = m_launchers.end();
|
||||||
for(; cur != end; ++cur) {
|
for (; cur != end; ++cur) {
|
||||||
if(cur->second->ContainsZone(short_name))
|
if (cur->second->ContainsZone(short_name))
|
||||||
return(cur->second);
|
return(cur->second);
|
||||||
}
|
}
|
||||||
return(nullptr);
|
return(nullptr);
|
||||||
@ -98,7 +99,7 @@ LauncherLink *LauncherList::FindByZone(const char *short_name) {
|
|||||||
|
|
||||||
void LauncherList::Add(std::shared_ptr<EQ::Net::ServertalkServerConnection> conn) {
|
void LauncherList::Add(std::shared_ptr<EQ::Net::ServertalkServerConnection> conn) {
|
||||||
auto it = new LauncherLink(nextID++, conn);
|
auto it = new LauncherLink(nextID++, conn);
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Adding pending launcher %d", it->GetID());
|
Log(Logs::Detail, Logs::World_Server, "Adding pending launcher %d", it->GetID());
|
||||||
m_pendingLaunchers.push_back(it);
|
m_pendingLaunchers.push_back(it);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,7 +133,7 @@ void LauncherList::GetLauncherNameList(std::vector<std::string> &res) {
|
|||||||
std::map<std::string, EQLConfig *>::iterator cur, end;
|
std::map<std::string, EQLConfig *>::iterator cur, end;
|
||||||
cur = m_configs.begin();
|
cur = m_configs.begin();
|
||||||
end = m_configs.end();
|
end = m_configs.end();
|
||||||
for(; cur != end; ++cur) {
|
for (; cur != end; ++cur) {
|
||||||
res.push_back(cur->first);
|
res.push_back(cur->first);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -145,7 +146,7 @@ void LauncherList::LoadList() {
|
|||||||
std::vector<std::string>::iterator cur, end;
|
std::vector<std::string>::iterator cur, end;
|
||||||
cur = launchers.begin();
|
cur = launchers.begin();
|
||||||
end = launchers.end();
|
end = launchers.end();
|
||||||
for(; cur != end; ++cur) {
|
for (; cur != end; ++cur) {
|
||||||
m_configs[*cur] = new EQLConfig(cur->c_str());
|
m_configs[*cur] = new EQLConfig(cur->c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -153,7 +154,7 @@ void LauncherList::LoadList() {
|
|||||||
EQLConfig *LauncherList::GetConfig(const char *name) {
|
EQLConfig *LauncherList::GetConfig(const char *name) {
|
||||||
std::map<std::string, EQLConfig *>::iterator res;
|
std::map<std::string, EQLConfig *>::iterator res;
|
||||||
res = m_configs.find(name);
|
res = m_configs.find(name);
|
||||||
if(res == m_configs.end()) {
|
if (res == m_configs.end()) {
|
||||||
return(nullptr);
|
return(nullptr);
|
||||||
}
|
}
|
||||||
return(res->second);
|
return(res->second);
|
||||||
@ -166,15 +167,14 @@ void LauncherList::CreateLauncher(const char *name, uint8 dynamic_count) {
|
|||||||
void LauncherList::Remove(const char *name) {
|
void LauncherList::Remove(const char *name) {
|
||||||
std::map<std::string, EQLConfig *>::iterator resc;
|
std::map<std::string, EQLConfig *>::iterator resc;
|
||||||
resc = m_configs.find(name);
|
resc = m_configs.find(name);
|
||||||
if(resc != m_configs.end()) {
|
if (resc != m_configs.end()) {
|
||||||
delete resc->second;
|
delete resc->second;
|
||||||
m_configs.erase(resc);
|
m_configs.erase(resc);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<std::string, LauncherLink *>::iterator resl;
|
std::map<std::string, LauncherLink *>::iterator resl;
|
||||||
resl = m_launchers.find(name);
|
resl = m_launchers.find(name);
|
||||||
if(resl != m_launchers.end()) {
|
if (resl != m_launchers.end()) {
|
||||||
resl->second->Disconnect();
|
resl->second->Disconnect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,19 +1,19 @@
|
|||||||
/* EQEMu: Everquest Server Emulator
|
/* EQEMu: Everquest Server Emulator
|
||||||
Copyright (C) 2001-2002 EQEMu Development Team (http://eqemu.org)
|
Copyright (C) 2001-2002 EQEMu Development Team (http://eqemu.org)
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; version 2 of the License.
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
are required to give you total support for your newly bought product;
|
are required to give you total support for your newly bought product;
|
||||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
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 <iostream>
|
#include <iostream>
|
||||||
@ -43,10 +43,10 @@ extern volatile bool RunLoops;
|
|||||||
|
|
||||||
LoginServer::LoginServer(const char* iAddress, uint16 iPort, const char* Account, const char* Password, bool legacy)
|
LoginServer::LoginServer(const char* iAddress, uint16 iPort, const char* Account, const char* Password, bool legacy)
|
||||||
{
|
{
|
||||||
strn0cpy(LoginServerAddress,iAddress,256);
|
strn0cpy(LoginServerAddress, iAddress, 256);
|
||||||
LoginServerPort = iPort;
|
LoginServerPort = iPort;
|
||||||
strn0cpy(LoginAccount,Account,31);
|
strn0cpy(LoginAccount, Account, 31);
|
||||||
strn0cpy(LoginPassword,Password,31);
|
strn0cpy(LoginPassword, Password, 31);
|
||||||
CanAccountUpdate = false;
|
CanAccountUpdate = false;
|
||||||
IsLegacy = legacy;
|
IsLegacy = legacy;
|
||||||
Connect();
|
Connect();
|
||||||
@ -57,7 +57,7 @@ LoginServer::~LoginServer() {
|
|||||||
|
|
||||||
void LoginServer::ProcessUsertoWorldReq(uint16_t opcode, EQ::Net::Packet &p) {
|
void LoginServer::ProcessUsertoWorldReq(uint16_t opcode, EQ::Net::Packet &p) {
|
||||||
const WorldConfig *Config = WorldConfig::get();
|
const WorldConfig *Config = WorldConfig::get();
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Recevied ServerPacket from LS OpCode 0x04x", opcode);
|
Log(Logs::Detail, Logs::World_Server, "Recevied ServerPacket from LS OpCode 0x04x", opcode);
|
||||||
|
|
||||||
UsertoWorldRequest_Struct* utwr = (UsertoWorldRequest_Struct*)p.Data();
|
UsertoWorldRequest_Struct* utwr = (UsertoWorldRequest_Struct*)p.Data();
|
||||||
uint32 id = database.GetAccountIDFromLSID(utwr->lsaccountid);
|
uint32 id = database.GetAccountIDFromLSID(utwr->lsaccountid);
|
||||||
@ -99,7 +99,7 @@ void LoginServer::ProcessUsertoWorldReq(uint16_t opcode, EQ::Net::Packet &p) {
|
|||||||
|
|
||||||
void LoginServer::ProcessLSClientAuth(uint16_t opcode, EQ::Net::Packet &p) {
|
void LoginServer::ProcessLSClientAuth(uint16_t opcode, EQ::Net::Packet &p) {
|
||||||
const WorldConfig *Config = WorldConfig::get();
|
const WorldConfig *Config = WorldConfig::get();
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Recevied ServerPacket from LS OpCode 0x04x", opcode);
|
Log(Logs::Detail, Logs::World_Server, "Recevied ServerPacket from LS OpCode 0x04x", opcode);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
auto slsca = p.GetSerialize<ClientAuth_Struct>(0);
|
auto slsca = p.GetSerialize<ClientAuth_Struct>(0);
|
||||||
@ -113,23 +113,23 @@ void LoginServer::ProcessLSClientAuth(uint16_t opcode, EQ::Net::Packet &p) {
|
|||||||
client_list.CLEAdd(slsca.lsaccount_id, slsca.name, slsca.key, slsca.worldadmin, slsca.ip, slsca.local);
|
client_list.CLEAdd(slsca.lsaccount_id, slsca.name, slsca.key, slsca.worldadmin, slsca.ip, slsca.local);
|
||||||
}
|
}
|
||||||
catch (std::exception &ex) {
|
catch (std::exception &ex) {
|
||||||
Log.OutF(Logs::General, Logs::Error, "Error parsing LSClientAuth packet from world.\n{0}", ex.what());
|
LogF(Logs::General, Logs::Error, "Error parsing LSClientAuth packet from world.\n{0}", ex.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoginServer::ProcessLSFatalError(uint16_t opcode, EQ::Net::Packet &p) {
|
void LoginServer::ProcessLSFatalError(uint16_t opcode, EQ::Net::Packet &p) {
|
||||||
const WorldConfig *Config = WorldConfig::get();
|
const WorldConfig *Config = WorldConfig::get();
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Recevied ServerPacket from LS OpCode 0x04x", opcode);
|
Log(Logs::Detail, Logs::World_Server, "Recevied ServerPacket from LS OpCode 0x04x", opcode);
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Login server responded with FatalError.");
|
Log(Logs::Detail, Logs::World_Server, "Login server responded with FatalError.");
|
||||||
if (p.Length() > 1) {
|
if (p.Length() > 1) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, " %s", (const char*)p.Data());
|
Log(Logs::Detail, Logs::World_Server, " %s", (const char*)p.Data());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoginServer::ProcessSystemwideMessage(uint16_t opcode, EQ::Net::Packet &p) {
|
void LoginServer::ProcessSystemwideMessage(uint16_t opcode, EQ::Net::Packet &p) {
|
||||||
const WorldConfig *Config = WorldConfig::get();
|
const WorldConfig *Config = WorldConfig::get();
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Recevied ServerPacket from LS OpCode 0x04x", opcode);
|
Log(Logs::Detail, Logs::World_Server, "Recevied ServerPacket from LS OpCode 0x04x", opcode);
|
||||||
|
|
||||||
ServerSystemwideMessage* swm = (ServerSystemwideMessage*)p.Data();
|
ServerSystemwideMessage* swm = (ServerSystemwideMessage*)p.Data();
|
||||||
zoneserver_list.SendEmoteMessageRaw(0, 0, 0, swm->type, swm->message);
|
zoneserver_list.SendEmoteMessageRaw(0, 0, 0, swm->type, swm->message);
|
||||||
@ -137,44 +137,44 @@ void LoginServer::ProcessSystemwideMessage(uint16_t opcode, EQ::Net::Packet &p)
|
|||||||
|
|
||||||
void LoginServer::ProcessLSRemoteAddr(uint16_t opcode, EQ::Net::Packet &p) {
|
void LoginServer::ProcessLSRemoteAddr(uint16_t opcode, EQ::Net::Packet &p) {
|
||||||
const WorldConfig *Config = WorldConfig::get();
|
const WorldConfig *Config = WorldConfig::get();
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Recevied ServerPacket from LS OpCode 0x04x", opcode);
|
Log(Logs::Detail, Logs::World_Server, "Recevied ServerPacket from LS OpCode 0x04x", opcode);
|
||||||
|
|
||||||
if (!Config->WorldAddress.length()) {
|
if (!Config->WorldAddress.length()) {
|
||||||
WorldConfig::SetWorldAddress((char *)p.Data());
|
WorldConfig::SetWorldAddress((char *)p.Data());
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Loginserver provided %s as world address", (const char*)p.Data());
|
Log(Logs::Detail, Logs::World_Server, "Loginserver provided %s as world address", (const char*)p.Data());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoginServer::ProcessLSAccountUpdate(uint16_t opcode, EQ::Net::Packet &p) {
|
void LoginServer::ProcessLSAccountUpdate(uint16_t opcode, EQ::Net::Packet &p) {
|
||||||
const WorldConfig *Config = WorldConfig::get();
|
const WorldConfig *Config = WorldConfig::get();
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Recevied ServerPacket from LS OpCode 0x04x", opcode);
|
Log(Logs::Detail, Logs::World_Server, "Recevied ServerPacket from LS OpCode 0x04x", opcode);
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Received ServerOP_LSAccountUpdate packet from loginserver");
|
Log(Logs::Detail, Logs::World_Server, "Received ServerOP_LSAccountUpdate packet from loginserver");
|
||||||
CanAccountUpdate = true;
|
CanAccountUpdate = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LoginServer::Connect() {
|
bool LoginServer::Connect() {
|
||||||
std::string tmp;
|
std::string tmp;
|
||||||
if(database.GetVariable("loginType", tmp) && strcasecmp(tmp.c_str(), "MinILogin") == 0) {
|
if (database.GetVariable("loginType", tmp) && strcasecmp(tmp.c_str(), "MinILogin") == 0) {
|
||||||
minilogin = true;
|
minilogin = true;
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Setting World to MiniLogin Server type");
|
Log(Logs::Detail, Logs::World_Server, "Setting World to MiniLogin Server type");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
minilogin = false;
|
minilogin = false;
|
||||||
|
|
||||||
if (minilogin && WorldConfig::get()->WorldAddress.length()==0) {
|
if (minilogin && WorldConfig::get()->WorldAddress.length() == 0) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "**** For minilogin to work, you need to set the <address> element in the <world> section.");
|
Log(Logs::Detail, Logs::World_Server, "**** For minilogin to work, you need to set the <address> element in the <world> section.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
char errbuf[1024];
|
char errbuf[1024];
|
||||||
if ((LoginServerIP = ResolveIP(LoginServerAddress, errbuf)) == 0) {
|
if ((LoginServerIP = ResolveIP(LoginServerAddress, errbuf)) == 0) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Unable to resolve '%s' to an IP.",LoginServerAddress);
|
Log(Logs::Detail, Logs::World_Server, "Unable to resolve '%s' to an IP.", LoginServerAddress);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (LoginServerIP == 0 || LoginServerPort == 0) {
|
if (LoginServerIP == 0 || LoginServerPort == 0) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Connect info incomplete, cannot connect: %s:%d",LoginServerAddress,LoginServerPort);
|
Log(Logs::Detail, Logs::World_Server, "Connect info incomplete, cannot connect: %s:%d", LoginServerAddress, LoginServerPort);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -182,7 +182,7 @@ bool LoginServer::Connect() {
|
|||||||
legacy_client.reset(new EQ::Net::ServertalkLegacyClient(LoginServerAddress, LoginServerPort, false));
|
legacy_client.reset(new EQ::Net::ServertalkLegacyClient(LoginServerAddress, LoginServerPort, false));
|
||||||
legacy_client->OnConnect([this](EQ::Net::ServertalkLegacyClient *client) {
|
legacy_client->OnConnect([this](EQ::Net::ServertalkLegacyClient *client) {
|
||||||
if (client) {
|
if (client) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Connected to Legacy Loginserver: %s:%d", LoginServerAddress, LoginServerPort);
|
Log(Logs::Detail, Logs::World_Server, "Connected to Legacy Loginserver: %s:%d", LoginServerAddress, LoginServerPort);
|
||||||
if (minilogin)
|
if (minilogin)
|
||||||
SendInfo();
|
SendInfo();
|
||||||
else
|
else
|
||||||
@ -195,7 +195,7 @@ bool LoginServer::Connect() {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Could not connect to Legacy Loginserver: %s:%d", LoginServerAddress, LoginServerPort);
|
Log(Logs::Detail, Logs::World_Server, "Could not connect to Legacy Loginserver: %s:%d", LoginServerAddress, LoginServerPort);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -211,7 +211,7 @@ bool LoginServer::Connect() {
|
|||||||
client.reset(new EQ::Net::ServertalkClient(LoginServerAddress, LoginServerPort, false, "World", ""));
|
client.reset(new EQ::Net::ServertalkClient(LoginServerAddress, LoginServerPort, false, "World", ""));
|
||||||
client->OnConnect([this](EQ::Net::ServertalkClient *client) {
|
client->OnConnect([this](EQ::Net::ServertalkClient *client) {
|
||||||
if (client) {
|
if (client) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Connected to Loginserver: %s:%d", LoginServerAddress, LoginServerPort);
|
Log(Logs::Detail, Logs::World_Server, "Connected to Loginserver: %s:%d", LoginServerAddress, LoginServerPort);
|
||||||
if (minilogin)
|
if (minilogin)
|
||||||
SendInfo();
|
SendInfo();
|
||||||
else
|
else
|
||||||
@ -224,7 +224,7 @@ bool LoginServer::Connect() {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Could not connect to Loginserver: %s:%d", LoginServerAddress, LoginServerPort);
|
Log(Logs::Detail, Logs::World_Server, "Could not connect to Loginserver: %s:%d", LoginServerAddress, LoginServerPort);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -239,14 +239,14 @@ bool LoginServer::Connect() {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
void LoginServer::SendInfo() {
|
void LoginServer::SendInfo() {
|
||||||
const WorldConfig *Config=WorldConfig::get();
|
const WorldConfig *Config = WorldConfig::get();
|
||||||
|
|
||||||
auto pack = new ServerPacket;
|
auto pack = new ServerPacket;
|
||||||
pack->opcode = ServerOP_LSInfo;
|
pack->opcode = ServerOP_LSInfo;
|
||||||
pack->size = sizeof(ServerLSInfo_Struct);
|
pack->size = sizeof(ServerLSInfo_Struct);
|
||||||
pack->pBuffer = new uchar[pack->size];
|
pack->pBuffer = new uchar[pack->size];
|
||||||
memset(pack->pBuffer, 0, pack->size);
|
memset(pack->pBuffer, 0, pack->size);
|
||||||
ServerLSInfo_Struct* lsi = (ServerLSInfo_Struct*) pack->pBuffer;
|
ServerLSInfo_Struct* lsi = (ServerLSInfo_Struct*)pack->pBuffer;
|
||||||
strcpy(lsi->protocolversion, EQEMU_PROTOCOL_VERSION);
|
strcpy(lsi->protocolversion, EQEMU_PROTOCOL_VERSION);
|
||||||
strcpy(lsi->serverversion, LOGIN_VERSION);
|
strcpy(lsi->serverversion, LOGIN_VERSION);
|
||||||
strcpy(lsi->name, Config->LongName.c_str());
|
strcpy(lsi->name, Config->LongName.c_str());
|
||||||
@ -258,14 +258,14 @@ void LoginServer::SendInfo() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void LoginServer::SendNewInfo() {
|
void LoginServer::SendNewInfo() {
|
||||||
const WorldConfig *Config=WorldConfig::get();
|
const WorldConfig *Config = WorldConfig::get();
|
||||||
|
|
||||||
auto pack = new ServerPacket;
|
auto pack = new ServerPacket;
|
||||||
pack->opcode = ServerOP_NewLSInfo;
|
pack->opcode = ServerOP_NewLSInfo;
|
||||||
pack->size = sizeof(ServerNewLSInfo_Struct);
|
pack->size = sizeof(ServerNewLSInfo_Struct);
|
||||||
pack->pBuffer = new uchar[pack->size];
|
pack->pBuffer = new uchar[pack->size];
|
||||||
memset(pack->pBuffer, 0, pack->size);
|
memset(pack->pBuffer, 0, pack->size);
|
||||||
ServerNewLSInfo_Struct* lsi = (ServerNewLSInfo_Struct*) pack->pBuffer;
|
ServerNewLSInfo_Struct* lsi = (ServerNewLSInfo_Struct*)pack->pBuffer;
|
||||||
strcpy(lsi->protocolversion, EQEMU_PROTOCOL_VERSION);
|
strcpy(lsi->protocolversion, EQEMU_PROTOCOL_VERSION);
|
||||||
strcpy(lsi->serverversion, LOGIN_VERSION);
|
strcpy(lsi->serverversion, LOGIN_VERSION);
|
||||||
strcpy(lsi->name, Config->LongName.c_str());
|
strcpy(lsi->name, Config->LongName.c_str());
|
||||||
@ -291,7 +291,7 @@ void LoginServer::SendStatus() {
|
|||||||
pack->size = sizeof(ServerLSStatus_Struct);
|
pack->size = sizeof(ServerLSStatus_Struct);
|
||||||
pack->pBuffer = new uchar[pack->size];
|
pack->pBuffer = new uchar[pack->size];
|
||||||
memset(pack->pBuffer, 0, pack->size);
|
memset(pack->pBuffer, 0, pack->size);
|
||||||
ServerLSStatus_Struct* lss = (ServerLSStatus_Struct*) pack->pBuffer;
|
ServerLSStatus_Struct* lss = (ServerLSStatus_Struct*)pack->pBuffer;
|
||||||
|
|
||||||
if (WorldConfig::get()->Locked)
|
if (WorldConfig::get()->Locked)
|
||||||
lss->status = -2;
|
lss->status = -2;
|
||||||
@ -307,12 +307,11 @@ void LoginServer::SendStatus() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void LoginServer::SendAccountUpdate(ServerPacket* pack) {
|
void LoginServer::SendAccountUpdate(ServerPacket* pack) {
|
||||||
ServerLSAccountUpdate_Struct* s = (ServerLSAccountUpdate_Struct *) pack->pBuffer;
|
ServerLSAccountUpdate_Struct* s = (ServerLSAccountUpdate_Struct *)pack->pBuffer;
|
||||||
if(CanUpdate()) {
|
if (CanUpdate()) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Sending ServerOP_LSAccountUpdate packet to loginserver: %s:%d",LoginServerAddress,LoginServerPort);
|
Log(Logs::Detail, Logs::World_Server, "Sending ServerOP_LSAccountUpdate packet to loginserver: %s:%d", LoginServerAddress, LoginServerPort);
|
||||||
strn0cpy(s->worldaccount, LoginAccount, 30);
|
strn0cpy(s->worldaccount, LoginAccount, 30);
|
||||||
strn0cpy(s->worldpassword, LoginPassword, 30);
|
strn0cpy(s->worldpassword, LoginPassword, 30);
|
||||||
SendPacket(pack);
|
SendPacket(pack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,19 +1,19 @@
|
|||||||
/* EQEMu: Everquest Server Emulator
|
/* EQEMu: Everquest Server Emulator
|
||||||
Copyright (C) 2001-2002 EQEMu Development Team (http://eqemu.org)
|
Copyright (C) 2001-2002 EQEMu Development Team (http://eqemu.org)
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; version 2 of the License.
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
are required to give you total support for your newly bought product;
|
are required to give you total support for your newly bought product;
|
||||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
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 <iostream>
|
#include <iostream>
|
||||||
@ -88,7 +88,7 @@ bool LoginServerList::SendPacket(ServerPacket* pack) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool LoginServerList::SendAccountUpdate(ServerPacket* pack) {
|
bool LoginServerList::SendAccountUpdate(ServerPacket* pack) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Requested to send ServerOP_LSAccountUpdate packet to all loginservers");
|
Log(Logs::Detail, Logs::World_Server, "Requested to send ServerOP_LSAccountUpdate packet to all loginservers");
|
||||||
for (auto &iter : m_list) {
|
for (auto &iter : m_list) {
|
||||||
if ((*iter).CanUpdate()) {
|
if ((*iter).CanUpdate()) {
|
||||||
(*iter).SendAccountUpdate(pack);
|
(*iter).SendAccountUpdate(pack);
|
||||||
@ -137,4 +137,3 @@ bool LoginServerList::CanUpdate() {
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
239
world/net.cpp
239
world/net.cpp
@ -1,19 +1,19 @@
|
|||||||
/* EQEMu: Everquest Server Emulator
|
/* EQEMu: Everquest Server Emulator
|
||||||
Copyright (C) 2001-2002 EQEMu Development Team (http://eqemu.org)
|
Copyright (C) 2001-2002 EQEMu Development Team (http://eqemu.org)
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; version 2 of the License.
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
are required to give you total support for your newly bought product;
|
are required to give you total support for your newly bought product;
|
||||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
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"
|
||||||
|
|
||||||
@ -41,27 +41,27 @@
|
|||||||
#include "client.h"
|
#include "client.h"
|
||||||
#include "worlddb.h"
|
#include "worlddb.h"
|
||||||
#ifdef _WINDOWS
|
#ifdef _WINDOWS
|
||||||
#include <process.h>
|
#include <process.h>
|
||||||
#define snprintf _snprintf
|
#define snprintf _snprintf
|
||||||
#define strncasecmp _strnicmp
|
#define strncasecmp _strnicmp
|
||||||
#define strcasecmp _stricmp
|
#define strcasecmp _stricmp
|
||||||
#include <conio.h>
|
#include <conio.h>
|
||||||
#else
|
#else
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include "../common/unix.h"
|
#include "../common/unix.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/ipc.h>
|
#include <sys/ipc.h>
|
||||||
#include <sys/sem.h>
|
#include <sys/sem.h>
|
||||||
#include <sys/shm.h>
|
#include <sys/shm.h>
|
||||||
#if not defined (FREEBSD) && not defined (DARWIN)
|
#if not defined (FREEBSD) && not defined (DARWIN)
|
||||||
union semun {
|
union semun {
|
||||||
int val;
|
int val;
|
||||||
struct semid_ds *buf;
|
struct semid_ds *buf;
|
||||||
ushort *array;
|
ushort *array;
|
||||||
struct seminfo *__buf;
|
struct seminfo *__buf;
|
||||||
void *__pad;
|
void *__pad;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -99,14 +99,14 @@ uint32 numclients = 0;
|
|||||||
uint32 numzones = 0;
|
uint32 numzones = 0;
|
||||||
bool holdzones = false;
|
bool holdzones = false;
|
||||||
const WorldConfig *Config;
|
const WorldConfig *Config;
|
||||||
EQEmuLogSys Log;
|
EQEmuLogSys LogSys;
|
||||||
WebInterfaceList web_interface;
|
WebInterfaceList web_interface;
|
||||||
|
|
||||||
void CatchSignal(int sig_num);
|
void CatchSignal(int sig_num);
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
RegisterExecutablePlatform(ExePlatformWorld);
|
RegisterExecutablePlatform(ExePlatformWorld);
|
||||||
Log.LoadLogSettingsDefaults();
|
LogSys.LoadLogSettingsDefaults();
|
||||||
set_exception_handler();
|
set_exception_handler();
|
||||||
|
|
||||||
/* Database Version Check */
|
/* Database Version Check */
|
||||||
@ -120,66 +120,67 @@ int main(int argc, char** argv) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Load server configuration
|
// Load server configuration
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Loading server configuration..");
|
Log(Logs::General, Logs::World_Server, "Loading server configuration..");
|
||||||
if (!WorldConfig::LoadConfig()) {
|
if (!WorldConfig::LoadConfig()) {
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Loading server configuration failed.");
|
Log(Logs::General, Logs::World_Server, "Loading server configuration failed.");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Config = WorldConfig::get();
|
Config = WorldConfig::get();
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::World_Server, "CURRENT_VERSION: %s", CURRENT_VERSION);
|
Log(Logs::General, Logs::World_Server, "CURRENT_VERSION: %s", CURRENT_VERSION);
|
||||||
|
|
||||||
if (signal(SIGINT, CatchSignal) == SIG_ERR) {
|
if (signal(SIGINT, CatchSignal) == SIG_ERR) {
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Could not set signal handler");
|
Log(Logs::General, Logs::World_Server, "Could not set signal handler");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (signal(SIGTERM, CatchSignal) == SIG_ERR) {
|
if (signal(SIGTERM, CatchSignal) == SIG_ERR) {
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Could not set signal handler");
|
Log(Logs::General, Logs::World_Server, "Could not set signal handler");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
|
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Could not set signal handler");
|
Log(Logs::General, Logs::World_Server, "Could not set signal handler");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// add login server config to list
|
// add login server config to list
|
||||||
if (Config->LoginCount == 0) {
|
if (Config->LoginCount == 0) {
|
||||||
if (Config->LoginHost.length()) {
|
if (Config->LoginHost.length()) {
|
||||||
loginserverlist.Add(Config->LoginHost.c_str(), Config->LoginPort, Config->LoginAccount.c_str(), Config->LoginPassword.c_str(), Config->LoginLegacy);
|
loginserverlist.Add(Config->LoginHost.c_str(), Config->LoginPort, Config->LoginAccount.c_str(), Config->LoginPassword.c_str(), Config->LoginLegacy);
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Added loginserver %s:%i", Config->LoginHost.c_str(), Config->LoginPort);
|
Log(Logs::General, Logs::World_Server, "Added loginserver %s:%i", Config->LoginHost.c_str(), Config->LoginPort);
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
LinkedList<LoginConfig*> loginlist=Config->loginlist;
|
else {
|
||||||
|
LinkedList<LoginConfig*> loginlist = Config->loginlist;
|
||||||
LinkedListIterator<LoginConfig*> iterator(loginlist);
|
LinkedListIterator<LoginConfig*> iterator(loginlist);
|
||||||
iterator.Reset();
|
iterator.Reset();
|
||||||
while(iterator.MoreElements()) {
|
while (iterator.MoreElements()) {
|
||||||
loginserverlist.Add(iterator.GetData()->LoginHost.c_str(), iterator.GetData()->LoginPort, iterator.GetData()->LoginAccount.c_str(), iterator.GetData()->LoginPassword.c_str(),
|
loginserverlist.Add(iterator.GetData()->LoginHost.c_str(), iterator.GetData()->LoginPort, iterator.GetData()->LoginAccount.c_str(), iterator.GetData()->LoginPassword.c_str(),
|
||||||
iterator.GetData()->LoginLegacy);
|
iterator.GetData()->LoginLegacy);
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Added loginserver %s:%i", iterator.GetData()->LoginHost.c_str(), iterator.GetData()->LoginPort);
|
Log(Logs::General, Logs::World_Server, "Added loginserver %s:%i", iterator.GetData()->LoginHost.c_str(), iterator.GetData()->LoginPort);
|
||||||
iterator.Advance();
|
iterator.Advance();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Connecting to MySQL...");
|
Log(Logs::General, Logs::World_Server, "Connecting to MySQL...");
|
||||||
if (!database.Connect(
|
if (!database.Connect(
|
||||||
Config->DatabaseHost.c_str(),
|
Config->DatabaseHost.c_str(),
|
||||||
Config->DatabaseUsername.c_str(),
|
Config->DatabaseUsername.c_str(),
|
||||||
Config->DatabasePassword.c_str(),
|
Config->DatabasePassword.c_str(),
|
||||||
Config->DatabaseDB.c_str(),
|
Config->DatabaseDB.c_str(),
|
||||||
Config->DatabasePort)) {
|
Config->DatabasePort)) {
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Cannot continue without a database connection.");
|
Log(Logs::General, Logs::World_Server, "Cannot continue without a database connection.");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
guild_mgr.SetDatabase(&database);
|
guild_mgr.SetDatabase(&database);
|
||||||
|
|
||||||
/* Register Log System and Settings */
|
/* Register Log System and Settings */
|
||||||
database.LoadLogSettings(Log.log_settings);
|
database.LoadLogSettings(LogSys.log_settings);
|
||||||
Log.StartFileLogs();
|
LogSys.StartFileLogs();
|
||||||
|
|
||||||
bool ignore_db = false;
|
bool ignore_db = false;
|
||||||
if (argc >= 2) {
|
if (argc >= 2) {
|
||||||
@ -227,7 +228,7 @@ int main(int argc, char** argv) {
|
|||||||
if (argc == 4) {
|
if (argc == 4) {
|
||||||
if (Seperator::IsNumber(argv[3])) {
|
if (Seperator::IsNumber(argv[3])) {
|
||||||
if (atoi(argv[3]) >= 0 && atoi(argv[3]) <= 255) {
|
if (atoi(argv[3]) >= 0 && atoi(argv[3]) <= 255) {
|
||||||
if (database.SetAccountStatus(argv[2], atoi(argv[3]))){
|
if (database.SetAccountStatus(argv[2], atoi(argv[3]))) {
|
||||||
std::cout << "Account flagged: Username='" << argv[2] << "', status=" << argv[3] << std::endl;
|
std::cout << "Account flagged: Username='" << argv[2] << "', status=" << argv[3] << std::endl;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -266,7 +267,7 @@ int main(int argc, char** argv) {
|
|||||||
std::cout << "Usage: world startzone zoneshortname" << std::endl;
|
std::cout << "Usage: world startzone zoneshortname" << std::endl;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else if(strcasecmp(argv[1], "ignore_db") == 0) {
|
else if (strcasecmp(argv[1], "ignore_db") == 0) {
|
||||||
ignore_db = true;
|
ignore_db = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -275,61 +276,63 @@ int main(int argc, char** argv) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!ignore_db) {
|
if (!ignore_db) {
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Checking Database Conversions..");
|
Log(Logs::General, Logs::World_Server, "Checking Database Conversions..");
|
||||||
database.CheckDatabaseConversions();
|
database.CheckDatabaseConversions();
|
||||||
}
|
}
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Loading variables..");
|
Log(Logs::General, Logs::World_Server, "Loading variables..");
|
||||||
database.LoadVariables();
|
database.LoadVariables();
|
||||||
|
|
||||||
std::string hotfix_name;
|
std::string hotfix_name;
|
||||||
if(database.GetVariable("hotfix_name", hotfix_name)) {
|
if (database.GetVariable("hotfix_name", hotfix_name)) {
|
||||||
if (!hotfix_name.empty()) {
|
if (!hotfix_name.empty()) {
|
||||||
Log.Out(Logs::General, Logs::Zone_Server, "Current hotfix in use: '%s'", hotfix_name.c_str());
|
Log(Logs::General, Logs::Zone_Server, "Current hotfix in use: '%s'", hotfix_name.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Loading zones..");
|
Log(Logs::General, Logs::World_Server, "Loading zones..");
|
||||||
database.LoadZoneNames();
|
database.LoadZoneNames();
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Clearing groups..");
|
Log(Logs::General, Logs::World_Server, "Clearing groups..");
|
||||||
database.ClearGroup();
|
database.ClearGroup();
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Clearing raids..");
|
Log(Logs::General, Logs::World_Server, "Clearing raids..");
|
||||||
database.ClearRaid();
|
database.ClearRaid();
|
||||||
database.ClearRaidDetails();
|
database.ClearRaidDetails();
|
||||||
database.ClearRaidLeader();
|
database.ClearRaidLeader();
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Clearing inventory snapshots..");
|
Log(Logs::General, Logs::World_Server, "Clearing inventory snapshots..");
|
||||||
database.ClearInvSnapshots();
|
database.ClearInvSnapshots();
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Loading items..");
|
Log(Logs::General, Logs::World_Server, "Loading items..");
|
||||||
if(!database.LoadItems(hotfix_name))
|
if (!database.LoadItems(hotfix_name))
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Error: Could not load item data. But ignoring");
|
Log(Logs::General, Logs::World_Server, "Error: Could not load item data. But ignoring");
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Loading skill caps..");
|
Log(Logs::General, Logs::World_Server, "Loading skill caps..");
|
||||||
if(!database.LoadSkillCaps(std::string(hotfix_name)))
|
if (!database.LoadSkillCaps(std::string(hotfix_name)))
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Error: Could not load skill cap data. But ignoring");
|
Log(Logs::General, Logs::World_Server, "Error: Could not load skill cap data. But ignoring");
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Loading guilds..");
|
Log(Logs::General, Logs::World_Server, "Loading guilds..");
|
||||||
guild_mgr.LoadGuilds();
|
guild_mgr.LoadGuilds();
|
||||||
//rules:
|
//rules:
|
||||||
{
|
{
|
||||||
std::string tmp;
|
std::string tmp;
|
||||||
if (database.GetVariable("RuleSet", tmp)) {
|
if (database.GetVariable("RuleSet", tmp)) {
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Loading rule set '%s'", tmp.c_str());
|
Log(Logs::General, Logs::World_Server, "Loading rule set '%s'", tmp.c_str());
|
||||||
if(!RuleManager::Instance()->LoadRules(&database, tmp.c_str())) {
|
if (!RuleManager::Instance()->LoadRules(&database, tmp.c_str())) {
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Failed to load ruleset '%s', falling back to defaults.", tmp.c_str());
|
Log(Logs::General, Logs::World_Server, "Failed to load ruleset '%s', falling back to defaults.", tmp.c_str());
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
if(!RuleManager::Instance()->LoadRules(&database, "default")) {
|
else {
|
||||||
Log.Out(Logs::General, Logs::World_Server, "No rule set configured, using default rules");
|
if (!RuleManager::Instance()->LoadRules(&database, "default")) {
|
||||||
} else {
|
Log(Logs::General, Logs::World_Server, "No rule set configured, using default rules");
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Loaded default rule set 'default'", tmp.c_str());
|
}
|
||||||
|
else {
|
||||||
|
Log(Logs::General, Logs::World_Server, "Loaded default rule set 'default'", tmp.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(RuleB(World, ClearTempMerchantlist)){
|
if (RuleB(World, ClearTempMerchantlist)) {
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Clearing temporary merchant lists..");
|
Log(Logs::General, Logs::World_Server, "Clearing temporary merchant lists..");
|
||||||
database.ClearMerchantTemp();
|
database.ClearMerchantTemp();
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Loading EQ time of day..");
|
Log(Logs::General, Logs::World_Server, "Loading EQ time of day..");
|
||||||
TimeOfDay_Struct eqTime;
|
TimeOfDay_Struct eqTime;
|
||||||
time_t realtime;
|
time_t realtime;
|
||||||
eqTime = database.LoadTime(realtime);
|
eqTime = database.LoadTime(realtime);
|
||||||
@ -337,38 +340,38 @@ int main(int argc, char** argv) {
|
|||||||
Timer EQTimeTimer(600000);
|
Timer EQTimeTimer(600000);
|
||||||
EQTimeTimer.Start(600000);
|
EQTimeTimer.Start(600000);
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Loading launcher list..");
|
Log(Logs::General, Logs::World_Server, "Loading launcher list..");
|
||||||
launcher_list.LoadList();
|
launcher_list.LoadList();
|
||||||
|
|
||||||
std::string tmp;
|
std::string tmp;
|
||||||
database.GetVariable("holdzones",tmp);
|
database.GetVariable("holdzones", tmp);
|
||||||
if (tmp.length() == 1 && tmp[0] == '1') {
|
if (tmp.length() == 1 && tmp[0] == '1') {
|
||||||
holdzones = true;
|
holdzones = true;
|
||||||
}
|
}
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Reboot zone modes %s",holdzones ? "ON" : "OFF");
|
Log(Logs::General, Logs::World_Server, "Reboot zone modes %s", holdzones ? "ON" : "OFF");
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Deleted %i stale player corpses from database", database.DeleteStalePlayerCorpses());
|
Log(Logs::General, Logs::World_Server, "Deleted %i stale player corpses from database", database.DeleteStalePlayerCorpses());
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Loading adventures...");
|
Log(Logs::General, Logs::World_Server, "Loading adventures...");
|
||||||
if(!adventure_manager.LoadAdventureTemplates())
|
if (!adventure_manager.LoadAdventureTemplates())
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Unable to load adventure templates.");
|
Log(Logs::General, Logs::World_Server, "Unable to load adventure templates.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!adventure_manager.LoadAdventureEntries())
|
if (!adventure_manager.LoadAdventureEntries())
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Unable to load adventure templates.");
|
Log(Logs::General, Logs::World_Server, "Unable to load adventure templates.");
|
||||||
}
|
}
|
||||||
|
|
||||||
adventure_manager.Load();
|
adventure_manager.Load();
|
||||||
adventure_manager.LoadLeaderboardInfo();
|
adventure_manager.LoadLeaderboardInfo();
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Purging expired instances");
|
Log(Logs::General, Logs::World_Server, "Purging expired instances");
|
||||||
database.PurgeExpiredInstances();
|
database.PurgeExpiredInstances();
|
||||||
Timer PurgeInstanceTimer(450000);
|
Timer PurgeInstanceTimer(450000);
|
||||||
PurgeInstanceTimer.Start(450000);
|
PurgeInstanceTimer.Start(450000);
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Loading char create info...");
|
Log(Logs::General, Logs::World_Server, "Loading char create info...");
|
||||||
database.LoadCharacterCreateAllocations();
|
database.LoadCharacterCreateAllocations();
|
||||||
database.LoadCharacterCreateCombos();
|
database.LoadCharacterCreateCombos();
|
||||||
|
|
||||||
@ -380,10 +383,10 @@ int main(int argc, char** argv) {
|
|||||||
server_opts.ipv6 = false;
|
server_opts.ipv6 = false;
|
||||||
server_opts.credentials = Config->SharedKey;
|
server_opts.credentials = Config->SharedKey;
|
||||||
server_connection->Listen(server_opts);
|
server_connection->Listen(server_opts);
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Server (TCP) listener started.");
|
Log(Logs::General, Logs::World_Server, "Server (TCP) listener started.");
|
||||||
|
|
||||||
server_connection->OnConnectionIdentified("Zone", [](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
|
server_connection->OnConnectionIdentified("Zone", [](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
|
||||||
Log.OutF(Logs::General, Logs::World_Server, "New Zone Server connection from {2} at {0}:{1}",
|
LogF(Logs::General, Logs::World_Server, "New Zone Server connection from {2} at {0}:{1}",
|
||||||
connection->Handle()->RemoteIP(), connection->Handle()->RemotePort(), connection->GetUUID());
|
connection->Handle()->RemoteIP(), connection->Handle()->RemotePort(), connection->GetUUID());
|
||||||
|
|
||||||
numzones++;
|
numzones++;
|
||||||
@ -391,7 +394,7 @@ int main(int argc, char** argv) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
server_connection->OnConnectionRemoved("Zone", [](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
|
server_connection->OnConnectionRemoved("Zone", [](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
|
||||||
Log.OutF(Logs::General, Logs::World_Server, "Removed Zone Server connection from {0}",
|
LogF(Logs::General, Logs::World_Server, "Removed Zone Server connection from {0}",
|
||||||
connection->GetUUID());
|
connection->GetUUID());
|
||||||
|
|
||||||
numzones--;
|
numzones--;
|
||||||
@ -399,56 +402,56 @@ int main(int argc, char** argv) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
server_connection->OnConnectionIdentified("Launcher", [](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
|
server_connection->OnConnectionIdentified("Launcher", [](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
|
||||||
Log.OutF(Logs::General, Logs::World_Server, "New Launcher connection from {2} at {0}:{1}",
|
LogF(Logs::General, Logs::World_Server, "New Launcher connection from {2} at {0}:{1}",
|
||||||
connection->Handle()->RemoteIP(), connection->Handle()->RemotePort(), connection->GetUUID());
|
connection->Handle()->RemoteIP(), connection->Handle()->RemotePort(), connection->GetUUID());
|
||||||
|
|
||||||
launcher_list.Add(connection);
|
launcher_list.Add(connection);
|
||||||
});
|
});
|
||||||
|
|
||||||
server_connection->OnConnectionRemoved("Launcher", [](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
|
server_connection->OnConnectionRemoved("Launcher", [](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
|
||||||
Log.OutF(Logs::General, Logs::World_Server, "Removed Launcher connection from {0}",
|
LogF(Logs::General, Logs::World_Server, "Removed Launcher connection from {0}",
|
||||||
connection->GetUUID());
|
connection->GetUUID());
|
||||||
|
|
||||||
launcher_list.Remove(connection);
|
launcher_list.Remove(connection);
|
||||||
});
|
});
|
||||||
|
|
||||||
server_connection->OnConnectionIdentified("QueryServ", [](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
|
server_connection->OnConnectionIdentified("QueryServ", [](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
|
||||||
Log.OutF(Logs::General, Logs::World_Server, "New Query Server connection from {2} at {0}:{1}",
|
LogF(Logs::General, Logs::World_Server, "New Query Server connection from {2} at {0}:{1}",
|
||||||
connection->Handle()->RemoteIP(), connection->Handle()->RemotePort(), connection->GetUUID());
|
connection->Handle()->RemoteIP(), connection->Handle()->RemotePort(), connection->GetUUID());
|
||||||
|
|
||||||
QSLink.AddConnection(connection);
|
QSLink.AddConnection(connection);
|
||||||
});
|
});
|
||||||
|
|
||||||
server_connection->OnConnectionRemoved("QueryServ", [](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
|
server_connection->OnConnectionRemoved("QueryServ", [](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
|
||||||
Log.OutF(Logs::General, Logs::World_Server, "Removed Query Server connection from {0}",
|
LogF(Logs::General, Logs::World_Server, "Removed Query Server connection from {0}",
|
||||||
connection->GetUUID());
|
connection->GetUUID());
|
||||||
|
|
||||||
QSLink.RemoveConnection(connection);
|
QSLink.RemoveConnection(connection);
|
||||||
});
|
});
|
||||||
|
|
||||||
server_connection->OnConnectionIdentified("UCS", [](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
|
server_connection->OnConnectionIdentified("UCS", [](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
|
||||||
Log.OutF(Logs::General, Logs::World_Server, "New UCS Server connection from {2} at {0}:{1}",
|
LogF(Logs::General, Logs::World_Server, "New UCS Server connection from {2} at {0}:{1}",
|
||||||
connection->Handle()->RemoteIP(), connection->Handle()->RemotePort(), connection->GetUUID());
|
connection->Handle()->RemoteIP(), connection->Handle()->RemotePort(), connection->GetUUID());
|
||||||
|
|
||||||
UCSLink.SetConnection(connection);
|
UCSLink.SetConnection(connection);
|
||||||
});
|
});
|
||||||
|
|
||||||
server_connection->OnConnectionRemoved("UCS", [](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
|
server_connection->OnConnectionRemoved("UCS", [](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
|
||||||
Log.OutF(Logs::General, Logs::World_Server, "Removed Query Server connection from {0}",
|
LogF(Logs::General, Logs::World_Server, "Removed Query Server connection from {0}",
|
||||||
connection->GetUUID());
|
connection->GetUUID());
|
||||||
|
|
||||||
UCSLink.SetConnection(nullptr);
|
UCSLink.SetConnection(nullptr);
|
||||||
});
|
});
|
||||||
|
|
||||||
server_connection->OnConnectionIdentified("WebInterface", [](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
|
server_connection->OnConnectionIdentified("WebInterface", [](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
|
||||||
Log.OutF(Logs::General, Logs::World_Server, "New WebInterface Server connection from {2} at {0}:{1}",
|
LogF(Logs::General, Logs::World_Server, "New WebInterface Server connection from {2} at {0}:{1}",
|
||||||
connection->Handle()->RemoteIP(), connection->Handle()->RemotePort(), connection->GetUUID());
|
connection->Handle()->RemoteIP(), connection->Handle()->RemotePort(), connection->GetUUID());
|
||||||
|
|
||||||
web_interface.AddConnection(connection);
|
web_interface.AddConnection(connection);
|
||||||
});
|
});
|
||||||
|
|
||||||
server_connection->OnConnectionRemoved("WebInterface", [](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
|
server_connection->OnConnectionRemoved("WebInterface", [](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
|
||||||
Log.OutF(Logs::General, Logs::World_Server, "Removed WebInterface Server connection from {0}",
|
LogF(Logs::General, Logs::World_Server, "Removed WebInterface Server connection from {0}",
|
||||||
connection->GetUUID());
|
connection->GetUUID());
|
||||||
|
|
||||||
web_interface.RemoveConnection(connection);
|
web_interface.RemoveConnection(connection);
|
||||||
@ -472,10 +475,10 @@ int main(int argc, char** argv) {
|
|||||||
|
|
||||||
eqsm.OnNewConnection([&stream_identifier](std::shared_ptr<EQ::Net::EQStream> stream) {
|
eqsm.OnNewConnection([&stream_identifier](std::shared_ptr<EQ::Net::EQStream> stream) {
|
||||||
stream_identifier.AddStream(stream);
|
stream_identifier.AddStream(stream);
|
||||||
Log.OutF(Logs::Detail, Logs::World_Server, "New connection from IP {0}:{1}", stream->RemoteEndpoint(), ntohs(stream->GetRemotePort()));
|
LogF(Logs::Detail, Logs::World_Server, "New connection from IP {0}:{1}", stream->RemoteEndpoint(), ntohs(stream->GetRemotePort()));
|
||||||
});
|
});
|
||||||
|
|
||||||
while(RunLoops) {
|
while (RunLoops) {
|
||||||
Timer::SetCurrentTime();
|
Timer::SetCurrentTime();
|
||||||
eqs = nullptr;
|
eqs = nullptr;
|
||||||
|
|
||||||
@ -483,24 +486,25 @@ int main(int argc, char** argv) {
|
|||||||
stream_identifier.Process();
|
stream_identifier.Process();
|
||||||
|
|
||||||
//check the stream identifier for any now-identified streams
|
//check the stream identifier for any now-identified streams
|
||||||
while((eqsi = stream_identifier.PopIdentified())) {
|
while ((eqsi = stream_identifier.PopIdentified())) {
|
||||||
//now that we know what patch they are running, start up their client object
|
//now that we know what patch they are running, start up their client object
|
||||||
struct in_addr in;
|
struct in_addr in;
|
||||||
in.s_addr = eqsi->GetRemoteIP();
|
in.s_addr = eqsi->GetRemoteIP();
|
||||||
if (RuleB(World, UseBannedIPsTable)){ //Lieka: Check to see if we have the responsibility for blocking IPs.
|
if (RuleB(World, UseBannedIPsTable)) { //Lieka: Check to see if we have the responsibility for blocking IPs.
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Checking inbound connection %s against BannedIPs table", inet_ntoa(in));
|
Log(Logs::Detail, Logs::World_Server, "Checking inbound connection %s against BannedIPs table", inet_ntoa(in));
|
||||||
if (!database.CheckBannedIPs(inet_ntoa(in))){ //Lieka: Check inbound IP against banned IP table.
|
if (!database.CheckBannedIPs(inet_ntoa(in))) { //Lieka: Check inbound IP against banned IP table.
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Connection %s PASSED banned IPs check. Processing connection.", inet_ntoa(in));
|
Log(Logs::Detail, Logs::World_Server, "Connection %s PASSED banned IPs check. Processing connection.", inet_ntoa(in));
|
||||||
auto client = new Client(eqsi);
|
auto client = new Client(eqsi);
|
||||||
// @merth: client->zoneattempt=0;
|
// @merth: client->zoneattempt=0;
|
||||||
client_list.Add(client);
|
client_list.Add(client);
|
||||||
} else {
|
}
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Connection from %s FAILED banned IPs check. Closing connection.", inet_ntoa(in));
|
else {
|
||||||
|
Log(Logs::General, Logs::World_Server, "Connection from %s FAILED banned IPs check. Closing connection.", inet_ntoa(in));
|
||||||
eqsi->Close(); //Lieka: If the inbound IP is on the banned table, close the EQStream.
|
eqsi->Close(); //Lieka: If the inbound IP is on the banned table, close the EQStream.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!RuleB(World, UseBannedIPsTable)){
|
if (!RuleB(World, UseBannedIPsTable)) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "New connection from %s:%d, processing connection", inet_ntoa(in), ntohs(eqsi->GetRemotePort()));
|
Log(Logs::Detail, Logs::World_Server, "New connection from %s:%d, processing connection", inet_ntoa(in), ntohs(eqsi->GetRemotePort()));
|
||||||
auto client = new Client(eqsi);
|
auto client = new Client(eqsi);
|
||||||
// @merth: client->zoneattempt=0;
|
// @merth: client->zoneattempt=0;
|
||||||
client_list.Add(client);
|
client_list.Add(client);
|
||||||
@ -509,7 +513,7 @@ int main(int argc, char** argv) {
|
|||||||
|
|
||||||
client_list.Process();
|
client_list.Process();
|
||||||
|
|
||||||
if(PurgeInstanceTimer.Check())
|
if (PurgeInstanceTimer.Check())
|
||||||
{
|
{
|
||||||
database.PurgeExpiredInstances();
|
database.PurgeExpiredInstances();
|
||||||
}
|
}
|
||||||
@ -519,9 +523,9 @@ int main(int argc, char** argv) {
|
|||||||
TimeOfDay_Struct tod;
|
TimeOfDay_Struct tod;
|
||||||
zoneserver_list.worldclock.GetCurrentEQTimeOfDay(time(0), &tod);
|
zoneserver_list.worldclock.GetCurrentEQTimeOfDay(time(0), &tod);
|
||||||
if (!database.SaveTime(tod.minute, tod.hour, tod.day, tod.month, tod.year))
|
if (!database.SaveTime(tod.minute, tod.hour, tod.day, tod.month, tod.year))
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Failed to save eqtime.");
|
Log(Logs::General, Logs::World_Server, "Failed to save eqtime.");
|
||||||
else
|
else
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "EQTime successfully saved.");
|
Log(Logs::Detail, Logs::World_Server, "EQTime successfully saved.");
|
||||||
}
|
}
|
||||||
|
|
||||||
zoneserver_list.Process();
|
zoneserver_list.Process();
|
||||||
@ -537,18 +541,18 @@ int main(int argc, char** argv) {
|
|||||||
EQ::EventLoop::Get().Process();
|
EQ::EventLoop::Get().Process();
|
||||||
Sleep(5);
|
Sleep(5);
|
||||||
}
|
}
|
||||||
Log.Out(Logs::General, Logs::World_Server, "World main loop completed.");
|
Log(Logs::General, Logs::World_Server, "World main loop completed.");
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Shutting down zone connections (if any).");
|
Log(Logs::General, Logs::World_Server, "Shutting down zone connections (if any).");
|
||||||
zoneserver_list.KillAll();
|
zoneserver_list.KillAll();
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Zone (TCP) listener stopped.");
|
Log(Logs::General, Logs::World_Server, "Zone (TCP) listener stopped.");
|
||||||
Log.Out(Logs::General, Logs::World_Server, "Signaling HTTP service to stop...");
|
Log(Logs::General, Logs::World_Server, "Signaling HTTP service to stop...");
|
||||||
Log.CloseFileLogs();
|
LogSys.CloseFileLogs();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CatchSignal(int sig_num) {
|
void CatchSignal(int sig_num) {
|
||||||
Log.Out(Logs::General, Logs::World_Server,"Caught signal %d",sig_num);
|
Log(Logs::General, Logs::World_Server, "Caught signal %d", sig_num);
|
||||||
RunLoops = false;
|
RunLoops = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -564,4 +568,3 @@ void UpdateWindowTitle(char* iNewTitle) {
|
|||||||
SetConsoleTitle(tmp);
|
SetConsoleTitle(tmp);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -14,9 +14,9 @@ UCSConnection::UCSConnection()
|
|||||||
|
|
||||||
void UCSConnection::SetConnection(std::shared_ptr<EQ::Net::ServertalkServerConnection> inStream)
|
void UCSConnection::SetConnection(std::shared_ptr<EQ::Net::ServertalkServerConnection> inStream)
|
||||||
{
|
{
|
||||||
if(Stream && Stream->Handle())
|
if (Stream && Stream->Handle())
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Incoming UCS Connection while we were already connected to a UCS.");
|
Log(Logs::Detail, Logs::UCS_Server, "Incoming UCS Connection while we were already connected to a UCS.");
|
||||||
Stream->Handle()->Disconnect();
|
Stream->Handle()->Disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ void UCSConnection::ProcessPacket(uint16 opcode, EQ::Net::Packet &p)
|
|||||||
ServerPacket tpack(opcode, p);
|
ServerPacket tpack(opcode, p);
|
||||||
ServerPacket *pack = &tpack;
|
ServerPacket *pack = &tpack;
|
||||||
|
|
||||||
switch(opcode)
|
switch (opcode)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
break;
|
break;
|
||||||
@ -46,12 +46,12 @@ void UCSConnection::ProcessPacket(uint16 opcode, EQ::Net::Packet &p)
|
|||||||
}
|
}
|
||||||
case ServerOP_ZAAuth:
|
case ServerOP_ZAAuth:
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Got authentication from UCS when they are already authenticated.");
|
Log(Logs::Detail, Logs::UCS_Server, "Got authentication from UCS when they are already authenticated.");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::UCS_Server, "Unknown ServerOPcode from UCS 0x%04x, size %d", opcode, pack->size);
|
Log(Logs::Detail, Logs::UCS_Server, "Unknown ServerOPcode from UCS 0x%04x, size %d", opcode, pack->size);
|
||||||
DumpPacket(pack->pBuffer, pack->size);
|
DumpPacket(pack->pBuffer, pack->size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -60,7 +60,7 @@ void UCSConnection::ProcessPacket(uint16 opcode, EQ::Net::Packet &p)
|
|||||||
|
|
||||||
void UCSConnection::SendPacket(ServerPacket* pack)
|
void UCSConnection::SendPacket(ServerPacket* pack)
|
||||||
{
|
{
|
||||||
if(!Stream)
|
if (!Stream)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Stream->SendPacket(pack);
|
Stream->SendPacket(pack);
|
||||||
@ -78,4 +78,3 @@ void UCSConnection::SendMessage(const char *From, const char *Message)
|
|||||||
SendPacket(pack);
|
SendPacket(pack);
|
||||||
safe_delete(pack);
|
safe_delete(pack);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -34,7 +34,7 @@ WorldGuildManager guild_mgr;
|
|||||||
|
|
||||||
|
|
||||||
void WorldGuildManager::SendGuildRefresh(uint32 guild_id, bool name, bool motd, bool rank, bool relation) {
|
void WorldGuildManager::SendGuildRefresh(uint32 guild_id, bool name, bool motd, bool rank, bool relation) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Broadcasting guild refresh for %d, changes: name=%d, motd=%d, rank=d, relation=%d", guild_id, name, motd, rank, relation);
|
Log(Logs::Detail, Logs::Guilds, "Broadcasting guild refresh for %d, changes: name=%d, motd=%d, rank=d, relation=%d", guild_id, name, motd, rank, relation);
|
||||||
auto pack = new ServerPacket(ServerOP_RefreshGuild, sizeof(ServerGuildRefresh_Struct));
|
auto pack = new ServerPacket(ServerOP_RefreshGuild, sizeof(ServerGuildRefresh_Struct));
|
||||||
ServerGuildRefresh_Struct *s = (ServerGuildRefresh_Struct *) pack->pBuffer;
|
ServerGuildRefresh_Struct *s = (ServerGuildRefresh_Struct *) pack->pBuffer;
|
||||||
s->guild_id = guild_id;
|
s->guild_id = guild_id;
|
||||||
@ -47,7 +47,7 @@ void WorldGuildManager::SendGuildRefresh(uint32 guild_id, bool name, bool motd,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WorldGuildManager::SendCharRefresh(uint32 old_guild_id, uint32 guild_id, uint32 charid) {
|
void WorldGuildManager::SendCharRefresh(uint32 old_guild_id, uint32 guild_id, uint32 charid) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Broadcasting char refresh for %d from guild %d to world", charid, guild_id);
|
Log(Logs::Detail, Logs::Guilds, "Broadcasting char refresh for %d from guild %d to world", charid, guild_id);
|
||||||
auto pack = new ServerPacket(ServerOP_GuildCharRefresh, sizeof(ServerGuildCharRefresh_Struct));
|
auto pack = new ServerPacket(ServerOP_GuildCharRefresh, sizeof(ServerGuildCharRefresh_Struct));
|
||||||
ServerGuildCharRefresh_Struct *s = (ServerGuildCharRefresh_Struct *) pack->pBuffer;
|
ServerGuildCharRefresh_Struct *s = (ServerGuildCharRefresh_Struct *) pack->pBuffer;
|
||||||
s->guild_id = guild_id;
|
s->guild_id = guild_id;
|
||||||
@ -58,7 +58,7 @@ void WorldGuildManager::SendCharRefresh(uint32 old_guild_id, uint32 guild_id, ui
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WorldGuildManager::SendGuildDelete(uint32 guild_id) {
|
void WorldGuildManager::SendGuildDelete(uint32 guild_id) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Broadcasting guild delete for guild %d to world", guild_id);
|
Log(Logs::Detail, Logs::Guilds, "Broadcasting guild delete for guild %d to world", guild_id);
|
||||||
auto pack = new ServerPacket(ServerOP_DeleteGuild, sizeof(ServerGuildID_Struct));
|
auto pack = new ServerPacket(ServerOP_DeleteGuild, sizeof(ServerGuildID_Struct));
|
||||||
ServerGuildID_Struct *s = (ServerGuildID_Struct *) pack->pBuffer;
|
ServerGuildID_Struct *s = (ServerGuildID_Struct *) pack->pBuffer;
|
||||||
s->guild_id = guild_id;
|
s->guild_id = guild_id;
|
||||||
@ -71,18 +71,18 @@ void WorldGuildManager::ProcessZonePacket(ServerPacket *pack) {
|
|||||||
|
|
||||||
case ServerOP_RefreshGuild: {
|
case ServerOP_RefreshGuild: {
|
||||||
if(pack->size != sizeof(ServerGuildRefresh_Struct)) {
|
if(pack->size != sizeof(ServerGuildRefresh_Struct)) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Received ServerOP_RefreshGuild of incorrect size %d, expected %d", pack->size, sizeof(ServerGuildRefresh_Struct));
|
Log(Logs::Detail, Logs::Guilds, "Received ServerOP_RefreshGuild of incorrect size %d, expected %d", pack->size, sizeof(ServerGuildRefresh_Struct));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ServerGuildRefresh_Struct *s = (ServerGuildRefresh_Struct *) pack->pBuffer;
|
ServerGuildRefresh_Struct *s = (ServerGuildRefresh_Struct *) pack->pBuffer;
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Received and broadcasting guild refresh for %d, changes: name=%d, motd=%d, rank=d, relation=%d", s->guild_id, s->name_change, s->motd_change, s->rank_change, s->relation_change);
|
Log(Logs::Detail, Logs::Guilds, "Received and broadcasting guild refresh for %d, changes: name=%d, motd=%d, rank=d, relation=%d", s->guild_id, s->name_change, s->motd_change, s->rank_change, s->relation_change);
|
||||||
|
|
||||||
//broadcast this packet to all zones.
|
//broadcast this packet to all zones.
|
||||||
zoneserver_list.SendPacket(pack);
|
zoneserver_list.SendPacket(pack);
|
||||||
|
|
||||||
//preform a local refresh.
|
//preform a local refresh.
|
||||||
if(!RefreshGuild(s->guild_id)) {
|
if(!RefreshGuild(s->guild_id)) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Unable to preform local refresh on guild %d", s->guild_id);
|
Log(Logs::Detail, Logs::Guilds, "Unable to preform local refresh on guild %d", s->guild_id);
|
||||||
//can we do anything?
|
//can we do anything?
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,11 +91,11 @@ void WorldGuildManager::ProcessZonePacket(ServerPacket *pack) {
|
|||||||
|
|
||||||
case ServerOP_GuildCharRefresh: {
|
case ServerOP_GuildCharRefresh: {
|
||||||
if(pack->size != sizeof(ServerGuildCharRefresh_Struct)) {
|
if(pack->size != sizeof(ServerGuildCharRefresh_Struct)) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Received ServerOP_RefreshGuild of incorrect size %d, expected %d", pack->size, sizeof(ServerGuildCharRefresh_Struct));
|
Log(Logs::Detail, Logs::Guilds, "Received ServerOP_RefreshGuild of incorrect size %d, expected %d", pack->size, sizeof(ServerGuildCharRefresh_Struct));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ServerGuildCharRefresh_Struct *s = (ServerGuildCharRefresh_Struct *) pack->pBuffer;
|
ServerGuildCharRefresh_Struct *s = (ServerGuildCharRefresh_Struct *) pack->pBuffer;
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Received and broadcasting guild member refresh for char %d to all zones with members of guild %d", s->char_id, s->guild_id);
|
Log(Logs::Detail, Logs::Guilds, "Received and broadcasting guild member refresh for char %d to all zones with members of guild %d", s->char_id, s->guild_id);
|
||||||
|
|
||||||
//preform the local update
|
//preform the local update
|
||||||
client_list.UpdateClientGuild(s->char_id, s->guild_id);
|
client_list.UpdateClientGuild(s->char_id, s->guild_id);
|
||||||
@ -110,18 +110,18 @@ void WorldGuildManager::ProcessZonePacket(ServerPacket *pack) {
|
|||||||
|
|
||||||
case ServerOP_DeleteGuild: {
|
case ServerOP_DeleteGuild: {
|
||||||
if(pack->size != sizeof(ServerGuildID_Struct)) {
|
if(pack->size != sizeof(ServerGuildID_Struct)) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Received ServerOP_DeleteGuild of incorrect size %d, expected %d", pack->size, sizeof(ServerGuildID_Struct));
|
Log(Logs::Detail, Logs::Guilds, "Received ServerOP_DeleteGuild of incorrect size %d, expected %d", pack->size, sizeof(ServerGuildID_Struct));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ServerGuildID_Struct *s = (ServerGuildID_Struct *) pack->pBuffer;
|
ServerGuildID_Struct *s = (ServerGuildID_Struct *) pack->pBuffer;
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Received and broadcasting guild delete for guild %d", s->guild_id);
|
Log(Logs::Detail, Logs::Guilds, "Received and broadcasting guild delete for guild %d", s->guild_id);
|
||||||
|
|
||||||
//broadcast this packet to all zones.
|
//broadcast this packet to all zones.
|
||||||
zoneserver_list.SendPacket(pack);
|
zoneserver_list.SendPacket(pack);
|
||||||
|
|
||||||
//preform a local refresh.
|
//preform a local refresh.
|
||||||
if(!LocalDeleteGuild(s->guild_id)) {
|
if(!LocalDeleteGuild(s->guild_id)) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Unable to preform local delete on guild %d", s->guild_id);
|
Log(Logs::Detail, Logs::Guilds, "Unable to preform local delete on guild %d", s->guild_id);
|
||||||
//can we do anything?
|
//can we do anything?
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,7 +131,7 @@ void WorldGuildManager::ProcessZonePacket(ServerPacket *pack) {
|
|||||||
case ServerOP_GuildMemberUpdate: {
|
case ServerOP_GuildMemberUpdate: {
|
||||||
if(pack->size != sizeof(ServerGuildMemberUpdate_Struct))
|
if(pack->size != sizeof(ServerGuildMemberUpdate_Struct))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Received ServerOP_GuildMemberUpdate of incorrect size %d, expected %d", pack->size, sizeof(ServerGuildMemberUpdate_Struct));
|
Log(Logs::Detail, Logs::Guilds, "Received ServerOP_GuildMemberUpdate of incorrect size %d, expected %d", pack->size, sizeof(ServerGuildMemberUpdate_Struct));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,7 +141,7 @@ void WorldGuildManager::ProcessZonePacket(ServerPacket *pack) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "Unknown packet 0x%x received from zone??", pack->opcode);
|
Log(Logs::Detail, Logs::Guilds, "Unknown packet 0x%x received from zone??", pack->opcode);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -361,14 +361,14 @@ bool WorldDatabase::GetStartZone(PlayerProfile_Struct* in_pp, CharCreate_Struct*
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Status, "SoF Start zone query: %s\n", query.c_str());
|
Log(Logs::General, Logs::Status, "SoF Start zone query: %s\n", query.c_str());
|
||||||
|
|
||||||
if (results.RowCount() == 0) {
|
if (results.RowCount() == 0) {
|
||||||
printf("No start_zones entry in database, using defaults\n");
|
printf("No start_zones entry in database, using defaults\n");
|
||||||
isTitanium ? SetTitaniumDefaultStartZone(in_pp, in_cc) : SetSoFDefaultStartZone(in_pp, in_cc);
|
isTitanium ? SetTitaniumDefaultStartZone(in_pp, in_cc) : SetSoFDefaultStartZone(in_pp, in_cc);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Log.Out(Logs::General, Logs::Status, "Found starting location in start_zones");
|
Log(Logs::General, Logs::Status, "Found starting location in start_zones");
|
||||||
auto row = results.begin();
|
auto row = results.begin();
|
||||||
in_pp->x = atof(row[0]);
|
in_pp->x = atof(row[0]);
|
||||||
in_pp->y = atof(row[1]);
|
in_pp->y = atof(row[1]);
|
||||||
@ -507,7 +507,7 @@ void WorldDatabase::GetLauncherList(std::vector<std::string> &rl) {
|
|||||||
const std::string query = "SELECT name FROM launcher";
|
const std::string query = "SELECT name FROM launcher";
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
if (!results.Success()) {
|
if (!results.Success()) {
|
||||||
Log.Out(Logs::General, Logs::Error, "WorldDatabase::GetLauncherList: %s", results.ErrorMessage().c_str());
|
Log(Logs::General, Logs::Error, "WorldDatabase::GetLauncherList: %s", results.ErrorMessage().c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -529,7 +529,7 @@ void WorldDatabase::SetMailKey(int CharID, int IPAddress, int MailKey)
|
|||||||
MailKeyString, CharID);
|
MailKeyString, CharID);
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
if (!results.Success())
|
if (!results.Success())
|
||||||
Log.Out(Logs::General, Logs::Error, "WorldDatabase::SetMailKey(%i, %s) : %s", CharID, MailKeyString, results.ErrorMessage().c_str());
|
Log(Logs::General, Logs::Error, "WorldDatabase::SetMailKey(%i, %s) : %s", CharID, MailKeyString, results.ErrorMessage().c_str());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -538,7 +538,7 @@ bool WorldDatabase::GetCharacterLevel(const char *name, int &level)
|
|||||||
std::string query = StringFormat("SELECT level FROM character_data WHERE name = '%s'", name);
|
std::string query = StringFormat("SELECT level FROM character_data WHERE name = '%s'", name);
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
if (!results.Success()) {
|
if (!results.Success()) {
|
||||||
Log.Out(Logs::General, Logs::Error, "WorldDatabase::GetCharacterLevel: %s", results.ErrorMessage().c_str());
|
Log(Logs::General, Logs::Error, "WorldDatabase::GetCharacterLevel: %s", results.ErrorMessage().c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,19 +1,19 @@
|
|||||||
/* EQEMu: Everquest Server Emulator
|
/* EQEMu: Everquest Server Emulator
|
||||||
Copyright (C) 2001-2005 EQEMu Development Team (http://eqemulator.net)
|
Copyright (C) 2001-2005 EQEMu Development Team (http://eqemulator.net)
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; version 2 of the License.
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
are required to give you total support for your newly bought product;
|
are required to give you total support for your newly bought product;
|
||||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
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 "zonelist.h"
|
#include "zonelist.h"
|
||||||
@ -38,7 +38,7 @@ ZSList::ZSList()
|
|||||||
{
|
{
|
||||||
NextID = 1;
|
NextID = 1;
|
||||||
CurGroupID = 1;
|
CurGroupID = 1;
|
||||||
LastAllocatedPort=0;
|
LastAllocatedPort = 0;
|
||||||
memset(pLockedZones, 0, sizeof(pLockedZones));
|
memset(pLockedZones, 0, sizeof(pLockedZones));
|
||||||
|
|
||||||
m_tick.reset(new EQ::Timer(5000, true, std::bind(&ZSList::OnTick, this, std::placeholders::_1)));
|
m_tick.reset(new EQ::Timer(5000, true, std::bind(&ZSList::OnTick, this, std::placeholders::_1)));
|
||||||
@ -83,7 +83,7 @@ void ZSList::Remove(const std::string &uuid)
|
|||||||
|
|
||||||
void ZSList::KillAll() {
|
void ZSList::KillAll() {
|
||||||
auto iterator = list.begin();
|
auto iterator = list.begin();
|
||||||
while(iterator != list.end()) {
|
while (iterator != list.end()) {
|
||||||
(*iterator)->Disconnect();
|
(*iterator)->Disconnect();
|
||||||
iterator = list.erase(iterator);
|
iterator = list.erase(iterator);
|
||||||
}
|
}
|
||||||
@ -91,19 +91,19 @@ void ZSList::KillAll() {
|
|||||||
|
|
||||||
void ZSList::Process() {
|
void ZSList::Process() {
|
||||||
|
|
||||||
if(shutdowntimer && shutdowntimer->Check()){
|
if (shutdowntimer && shutdowntimer->Check()) {
|
||||||
Log.Out(Logs::Detail, Logs::World_Server, "Shutdown timer has expired. Telling all zones to shut down and exiting. (fake sigint)");
|
Log(Logs::Detail, Logs::World_Server, "Shutdown timer has expired. Telling all zones to shut down and exiting. (fake sigint)");
|
||||||
auto pack2 = new ServerPacket;
|
auto pack2 = new ServerPacket;
|
||||||
pack2->opcode = ServerOP_ShutdownAll;
|
pack2->opcode = ServerOP_ShutdownAll;
|
||||||
pack2->size=0;
|
pack2->size = 0;
|
||||||
SendPacket(pack2);
|
SendPacket(pack2);
|
||||||
safe_delete(pack2);
|
safe_delete(pack2);
|
||||||
Process();
|
Process();
|
||||||
CatchSignal(2);
|
CatchSignal(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(reminder && reminder->Check() && shutdowntimer){
|
if (reminder && reminder->Check() && shutdowntimer) {
|
||||||
SendEmoteMessage(0,0,0,15,"<SYSTEMWIDE MESSAGE>:SYSTEM MSG:World coming down, everyone log out now. World will shut down in %i minutes...", ((shutdowntimer->GetRemainingTime()/1000) / 60));
|
SendEmoteMessage(0, 0, 0, 15, "<SYSTEMWIDE MESSAGE>:SYSTEM MSG:World coming down, everyone log out now. World will shut down in %i minutes...", ((shutdowntimer->GetRemainingTime() / 1000) / 60));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,11 +130,11 @@ bool ZSList::SendPacket(uint32 ZoneID, ServerPacket* pack) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool ZSList::SendPacket(uint32 ZoneID, uint16 instanceID, ServerPacket* pack) {
|
bool ZSList::SendPacket(uint32 ZoneID, uint16 instanceID, ServerPacket* pack) {
|
||||||
if(instanceID != 0)
|
if (instanceID != 0)
|
||||||
{
|
{
|
||||||
auto iterator = list.begin();
|
auto iterator = list.begin();
|
||||||
while (iterator != list.end()) {
|
while (iterator != list.end()) {
|
||||||
if((*iterator)->GetInstanceID() == instanceID) {
|
if ((*iterator)->GetInstanceID() == instanceID) {
|
||||||
ZoneServer* tmp = (*iterator).get();
|
ZoneServer* tmp = (*iterator).get();
|
||||||
tmp->SendPacket(pack);
|
tmp->SendPacket(pack);
|
||||||
return true;
|
return true;
|
||||||
@ -258,7 +258,7 @@ void ZSList::ListLockedZones(const char* to, WorldTCPConnection* connection) {
|
|||||||
|
|
||||||
void ZSList::SendZoneStatus(const char* to, int16 admin, WorldTCPConnection* connection) {
|
void ZSList::SendZoneStatus(const char* to, int16 admin, WorldTCPConnection* connection) {
|
||||||
char locked[4];
|
char locked[4];
|
||||||
if (WorldConfig::get()->Locked == true){
|
if (WorldConfig::get()->Locked == true) {
|
||||||
strcpy(locked, "Yes");
|
strcpy(locked, "Yes");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -268,16 +268,16 @@ void ZSList::SendZoneStatus(const char* to, int16 admin, WorldTCPConnection* con
|
|||||||
char* output = 0;
|
char* output = 0;
|
||||||
uint32 outsize = 0, outlen = 0;
|
uint32 outsize = 0, outlen = 0;
|
||||||
|
|
||||||
if (connection->IsConsole()){
|
if (connection->IsConsole()) {
|
||||||
AppendAnyLenString(&output, &outsize, &outlen, "World Locked: %s\r\n", locked);
|
AppendAnyLenString(&output, &outsize, &outlen, "World Locked: %s\r\n", locked);
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
AppendAnyLenString(&output, &outsize, &outlen, "World Locked: %s^", locked);
|
AppendAnyLenString(&output, &outsize, &outlen, "World Locked: %s^", locked);
|
||||||
}
|
}
|
||||||
if (connection->IsConsole()){
|
if (connection->IsConsole()) {
|
||||||
AppendAnyLenString(&output, &outsize, &outlen, "Zoneservers online:\r\n");
|
AppendAnyLenString(&output, &outsize, &outlen, "Zoneservers online:\r\n");
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
AppendAnyLenString(&output, &outsize, &outlen, "Zoneservers online:^");
|
AppendAnyLenString(&output, &outsize, &outlen, "Zoneservers online:^");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -292,13 +292,13 @@ void ZSList::SendZoneStatus(const char* to, int16 admin, WorldTCPConnection* con
|
|||||||
zone_server_data = (*iterator).get();
|
zone_server_data = (*iterator).get();
|
||||||
auto addr = zone_server_data->GetIP();
|
auto addr = zone_server_data->GetIP();
|
||||||
|
|
||||||
if (zone_server_data->IsStaticZone()){
|
if (zone_server_data->IsStaticZone()) {
|
||||||
z++;
|
z++;
|
||||||
}
|
}
|
||||||
else if (zone_server_data->GetZoneID() != 0){
|
else if (zone_server_data->GetZoneID() != 0) {
|
||||||
w++;
|
w++;
|
||||||
}
|
}
|
||||||
else if (zone_server_data->GetZoneID() == 0 && !zone_server_data->IsBootingUp()){
|
else if (zone_server_data->GetZoneID() == 0 && !zone_server_data->IsBootingUp()) {
|
||||||
v++;
|
v++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -308,13 +308,13 @@ void ZSList::SendZoneStatus(const char* to, int16 admin, WorldTCPConnection* con
|
|||||||
is_static_string[0] = 'D';
|
is_static_string[0] = 'D';
|
||||||
|
|
||||||
if (admin >= 150) {
|
if (admin >= 150) {
|
||||||
if (zone_server_data->GetZoneID()){
|
if (zone_server_data->GetZoneID()) {
|
||||||
snprintf(zone_data_string, sizeof(zone_data_string), "%s (%i)", zone_server_data->GetZoneName(), zone_server_data->GetZoneID());
|
snprintf(zone_data_string, sizeof(zone_data_string), "%s (%i)", zone_server_data->GetZoneName(), zone_server_data->GetZoneID());
|
||||||
}
|
}
|
||||||
else if (zone_server_data->IsBootingUp()){
|
else if (zone_server_data->IsBootingUp()) {
|
||||||
strcpy(zone_data_string, "...");
|
strcpy(zone_data_string, "...");
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
zone_data_string[0] = 0;
|
zone_data_string[0] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -358,10 +358,10 @@ void ZSList::SendZoneStatus(const char* to, int16 admin, WorldTCPConnection* con
|
|||||||
outlen = 0;
|
outlen = 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (connection->IsConsole()){
|
if (connection->IsConsole()) {
|
||||||
AppendAnyLenString(&output, &outsize, &outlen, "\r\n");
|
AppendAnyLenString(&output, &outsize, &outlen, "\r\n");
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
AppendAnyLenString(&output, &outsize, &outlen, "^");
|
AppendAnyLenString(&output, &outsize, &outlen, "^");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -371,7 +371,7 @@ void ZSList::SendZoneStatus(const char* to, int16 admin, WorldTCPConnection* con
|
|||||||
iterator++;
|
iterator++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (connection->IsConsole()){
|
if (connection->IsConsole()) {
|
||||||
AppendAnyLenString(&output, &outsize, &outlen, "%i servers listed. %i servers online.\r\n", x, y);
|
AppendAnyLenString(&output, &outsize, &outlen, "%i servers listed. %i servers online.\r\n", x, y);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -380,7 +380,7 @@ void ZSList::SendZoneStatus(const char* to, int16 admin, WorldTCPConnection* con
|
|||||||
|
|
||||||
AppendAnyLenString(&output, &outsize, &outlen, "%i zones are static zones, %i zones are booted zones, %i zones available.", z, w, v);
|
AppendAnyLenString(&output, &outsize, &outlen, "%i zones are static zones, %i zones are booted zones, %i zones available.", z, w, v);
|
||||||
|
|
||||||
if (output){
|
if (output) {
|
||||||
connection->SendEmoteMessageRaw(to, 0, 0, 10, output);
|
connection->SendEmoteMessageRaw(to, 0, 0, 10, output);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -406,10 +406,10 @@ void ZSList::SendChannelMessageRaw(const char* from, const char* to, uint8 chan_
|
|||||||
auto pack = new ServerPacket;
|
auto pack = new ServerPacket;
|
||||||
|
|
||||||
pack->opcode = ServerOP_ChannelMessage;
|
pack->opcode = ServerOP_ChannelMessage;
|
||||||
pack->size = sizeof(ServerChannelMessage_Struct)+strlen(message)+1;
|
pack->size = sizeof(ServerChannelMessage_Struct) + strlen(message) + 1;
|
||||||
pack->pBuffer = new uchar[pack->size];
|
pack->pBuffer = new uchar[pack->size];
|
||||||
memset(pack->pBuffer, 0, pack->size);
|
memset(pack->pBuffer, 0, pack->size);
|
||||||
ServerChannelMessage_Struct* scm = (ServerChannelMessage_Struct*) pack->pBuffer;
|
ServerChannelMessage_Struct* scm = (ServerChannelMessage_Struct*)pack->pBuffer;
|
||||||
if (from == 0) {
|
if (from == 0) {
|
||||||
strcpy(scm->from, "WServer");
|
strcpy(scm->from, "WServer");
|
||||||
scm->noreply = true;
|
scm->noreply = true;
|
||||||
@ -421,8 +421,8 @@ void ZSList::SendChannelMessageRaw(const char* from, const char* to, uint8 chan_
|
|||||||
else
|
else
|
||||||
strcpy(scm->from, from);
|
strcpy(scm->from, from);
|
||||||
if (to != 0) {
|
if (to != 0) {
|
||||||
strcpy((char *) scm->to, to);
|
strcpy((char *)scm->to, to);
|
||||||
strcpy((char *) scm->deliverto, to);
|
strcpy((char *)scm->deliverto, to);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
scm->to[0] = 0;
|
scm->to[0] = 0;
|
||||||
@ -457,13 +457,13 @@ void ZSList::SendEmoteMessageRaw(const char* to, uint32 to_guilddbid, int16 to_m
|
|||||||
auto pack = new ServerPacket;
|
auto pack = new ServerPacket;
|
||||||
|
|
||||||
pack->opcode = ServerOP_EmoteMessage;
|
pack->opcode = ServerOP_EmoteMessage;
|
||||||
pack->size = sizeof(ServerEmoteMessage_Struct)+strlen(message)+1;
|
pack->size = sizeof(ServerEmoteMessage_Struct) + strlen(message) + 1;
|
||||||
pack->pBuffer = new uchar[pack->size];
|
pack->pBuffer = new uchar[pack->size];
|
||||||
memset(pack->pBuffer, 0, pack->size);
|
memset(pack->pBuffer, 0, pack->size);
|
||||||
ServerEmoteMessage_Struct* sem = (ServerEmoteMessage_Struct*) pack->pBuffer;
|
ServerEmoteMessage_Struct* sem = (ServerEmoteMessage_Struct*)pack->pBuffer;
|
||||||
|
|
||||||
if (to) {
|
if (to) {
|
||||||
strcpy((char *) sem->to, to);
|
strcpy((char *)sem->to, to);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sem->to[0] = 0;
|
sem->to[0] = 0;
|
||||||
@ -473,9 +473,9 @@ void ZSList::SendEmoteMessageRaw(const char* to, uint32 to_guilddbid, int16 to_m
|
|||||||
sem->minstatus = to_minstatus;
|
sem->minstatus = to_minstatus;
|
||||||
sem->type = type;
|
sem->type = type;
|
||||||
strcpy(&sem->message[0], message);
|
strcpy(&sem->message[0], message);
|
||||||
char tempto[64]={0};
|
char tempto[64] = { 0 };
|
||||||
if(to)
|
if (to)
|
||||||
strn0cpy(tempto,to,64);
|
strn0cpy(tempto, to, 64);
|
||||||
|
|
||||||
if (tempto[0] == 0) {
|
if (tempto[0] == 0) {
|
||||||
SendPacket(pack);
|
SendPacket(pack);
|
||||||
@ -493,9 +493,9 @@ void ZSList::SendEmoteMessageRaw(const char* to, uint32 to_guilddbid, int16 to_m
|
|||||||
|
|
||||||
void ZSList::SendTimeSync() {
|
void ZSList::SendTimeSync() {
|
||||||
auto pack = new ServerPacket(ServerOP_SyncWorldTime, sizeof(eqTimeOfDay));
|
auto pack = new ServerPacket(ServerOP_SyncWorldTime, sizeof(eqTimeOfDay));
|
||||||
eqTimeOfDay* tod = (eqTimeOfDay*) pack->pBuffer;
|
eqTimeOfDay* tod = (eqTimeOfDay*)pack->pBuffer;
|
||||||
tod->start_eqtime=worldclock.getStartEQTime();
|
tod->start_eqtime = worldclock.getStartEQTime();
|
||||||
tod->start_realtime=worldclock.getStartRealTime();
|
tod->start_realtime = worldclock.getStartRealTime();
|
||||||
SendPacket(pack);
|
SendPacket(pack);
|
||||||
delete pack;
|
delete pack;
|
||||||
}
|
}
|
||||||
@ -503,7 +503,7 @@ void ZSList::SendTimeSync() {
|
|||||||
void ZSList::NextGroupIDs(uint32 &start, uint32 &end) {
|
void ZSList::NextGroupIDs(uint32 &start, uint32 &end) {
|
||||||
start = CurGroupID;
|
start = CurGroupID;
|
||||||
CurGroupID += 1000; //hand them out 1000 at a time...
|
CurGroupID += 1000; //hand them out 1000 at a time...
|
||||||
if(CurGroupID < start) { //handle overflow
|
if (CurGroupID < start) { //handle overflow
|
||||||
start = 1;
|
start = 1;
|
||||||
CurGroupID = 1001;
|
CurGroupID = 1001;
|
||||||
}
|
}
|
||||||
@ -535,7 +535,7 @@ void ZSList::SOPZoneBootup(const char* adminname, uint32 ZoneServerID, const cha
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ZSList::RebootZone(const char* ip1,uint16 port,const char* ip2, uint32 skipid, uint32 zoneid){
|
void ZSList::RebootZone(const char* ip1, uint16 port, const char* ip2, uint32 skipid, uint32 zoneid) {
|
||||||
// get random zone
|
// get random zone
|
||||||
uint32 x = 0;
|
uint32 x = 0;
|
||||||
auto iterator = list.begin();
|
auto iterator = list.begin();
|
||||||
@ -550,7 +550,7 @@ void ZSList::RebootZone(const char* ip1,uint16 port,const char* ip2, uint32 skip
|
|||||||
|
|
||||||
iterator = list.begin();
|
iterator = list.begin();
|
||||||
while (iterator != list.end()) {
|
while (iterator != list.end()) {
|
||||||
if (!strcmp((*iterator)->GetCAddress(),ip2) && !(*iterator)->IsBootingUp() && (*iterator)->GetID() != skipid) {
|
if (!strcmp((*iterator)->GetCAddress(), ip2) && !(*iterator)->IsBootingUp() && (*iterator)->GetID() != skipid) {
|
||||||
tmp[y++] = (*iterator).get();
|
tmp[y++] = (*iterator).get();
|
||||||
}
|
}
|
||||||
iterator++;
|
iterator++;
|
||||||
@ -559,16 +559,16 @@ void ZSList::RebootZone(const char* ip1,uint16 port,const char* ip2, uint32 skip
|
|||||||
safe_delete_array(tmp);
|
safe_delete_array(tmp);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
uint32 z = emu_random.Int(0, y-1);
|
uint32 z = emu_random.Int(0, y - 1);
|
||||||
|
|
||||||
auto pack = new ServerPacket(ServerOP_ZoneReboot, sizeof(ServerZoneReboot_Struct));
|
auto pack = new ServerPacket(ServerOP_ZoneReboot, sizeof(ServerZoneReboot_Struct));
|
||||||
ServerZoneReboot_Struct* s = (ServerZoneReboot_Struct*) pack->pBuffer;
|
ServerZoneReboot_Struct* s = (ServerZoneReboot_Struct*)pack->pBuffer;
|
||||||
// strcpy(s->ip1,ip1);
|
// strcpy(s->ip1,ip1);
|
||||||
strcpy(s->ip2,ip2);
|
strcpy(s->ip2, ip2);
|
||||||
s->port = port;
|
s->port = port;
|
||||||
s->zoneid = zoneid;
|
s->zoneid = zoneid;
|
||||||
if(zoneid != 0)
|
if (zoneid != 0)
|
||||||
Log.Out(Logs::Detail, Logs::World_Server,"Rebooting static zone with the ID of: %i",zoneid);
|
Log(Logs::Detail, Logs::World_Server, "Rebooting static zone with the ID of: %i", zoneid);
|
||||||
tmp[z]->SendPacket(pack);
|
tmp[z]->SendPacket(pack);
|
||||||
delete pack;
|
delete pack;
|
||||||
safe_delete_array(tmp);
|
safe_delete_array(tmp);
|
||||||
@ -576,36 +576,36 @@ void ZSList::RebootZone(const char* ip1,uint16 port,const char* ip2, uint32 skip
|
|||||||
|
|
||||||
uint16 ZSList::GetAvailableZonePort()
|
uint16 ZSList::GetAvailableZonePort()
|
||||||
{
|
{
|
||||||
const WorldConfig *Config=WorldConfig::get();
|
const WorldConfig *Config = WorldConfig::get();
|
||||||
int i;
|
int i;
|
||||||
uint16 port=0;
|
uint16 port = 0;
|
||||||
|
|
||||||
if (LastAllocatedPort==0)
|
if (LastAllocatedPort == 0)
|
||||||
i=Config->ZonePortLow;
|
i = Config->ZonePortLow;
|
||||||
else
|
else
|
||||||
i=LastAllocatedPort+1;
|
i = LastAllocatedPort + 1;
|
||||||
|
|
||||||
while(i!=LastAllocatedPort && port==0) {
|
while (i != LastAllocatedPort && port == 0) {
|
||||||
if (i>Config->ZonePortHigh)
|
if (i>Config->ZonePortHigh)
|
||||||
i=Config->ZonePortLow;
|
i = Config->ZonePortLow;
|
||||||
|
|
||||||
if (!FindByPort(i)) {
|
if (!FindByPort(i)) {
|
||||||
port=i;
|
port = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
LastAllocatedPort=port;
|
LastAllocatedPort = port;
|
||||||
|
|
||||||
return port;
|
return port;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 ZSList::TriggerBootup(uint32 iZoneID, uint32 iInstanceID) {
|
uint32 ZSList::TriggerBootup(uint32 iZoneID, uint32 iInstanceID) {
|
||||||
if(iInstanceID > 0)
|
if (iInstanceID > 0)
|
||||||
{
|
{
|
||||||
auto iterator = list.begin();
|
auto iterator = list.begin();
|
||||||
while (iterator != list.end()) {
|
while (iterator != list.end()) {
|
||||||
if((*iterator)->GetInstanceID() == iInstanceID)
|
if ((*iterator)->GetInstanceID() == iInstanceID)
|
||||||
{
|
{
|
||||||
return (*iterator)->GetID();
|
return (*iterator)->GetID();
|
||||||
}
|
}
|
||||||
@ -615,7 +615,7 @@ uint32 ZSList::TriggerBootup(uint32 iZoneID, uint32 iInstanceID) {
|
|||||||
iterator = list.begin();
|
iterator = list.begin();
|
||||||
while (iterator != list.end()) {
|
while (iterator != list.end()) {
|
||||||
if ((*iterator)->GetZoneID() == 0 && !(*iterator)->IsBootingUp()) {
|
if ((*iterator)->GetZoneID() == 0 && !(*iterator)->IsBootingUp()) {
|
||||||
ZoneServer* zone=(*iterator).get();
|
ZoneServer* zone = (*iterator).get();
|
||||||
zone->TriggerBootup(iZoneID, iInstanceID);
|
zone->TriggerBootup(iZoneID, iInstanceID);
|
||||||
return zone->GetID();
|
return zone->GetID();
|
||||||
}
|
}
|
||||||
@ -627,7 +627,7 @@ uint32 ZSList::TriggerBootup(uint32 iZoneID, uint32 iInstanceID) {
|
|||||||
{
|
{
|
||||||
auto iterator = list.begin();
|
auto iterator = list.begin();
|
||||||
while (iterator != list.end()) {
|
while (iterator != list.end()) {
|
||||||
if((*iterator)->GetZoneID() == iZoneID && (*iterator)->GetInstanceID() == 0)
|
if ((*iterator)->GetZoneID() == iZoneID && (*iterator)->GetInstanceID() == 0)
|
||||||
{
|
{
|
||||||
return (*iterator)->GetID();
|
return (*iterator)->GetID();
|
||||||
}
|
}
|
||||||
@ -647,11 +647,11 @@ uint32 ZSList::TriggerBootup(uint32 iZoneID, uint32 iInstanceID) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ZSList::SendLSZones(){
|
void ZSList::SendLSZones() {
|
||||||
auto iterator = list.begin();
|
auto iterator = list.begin();
|
||||||
while(iterator != list.end()) {
|
while (iterator != list.end()) {
|
||||||
ZoneServer* zs = (*iterator).get();
|
ZoneServer* zs = (*iterator).get();
|
||||||
zs->LSBootUpdate(zs->GetZoneID(),true);
|
zs->LSBootUpdate(zs->GetZoneID(), true);
|
||||||
iterator++;
|
iterator++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -671,24 +671,24 @@ void ZSList::GetZoneIDList(std::vector<uint32> &zones) {
|
|||||||
|
|
||||||
void ZSList::WorldShutDown(uint32 time, uint32 interval)
|
void ZSList::WorldShutDown(uint32 time, uint32 interval)
|
||||||
{
|
{
|
||||||
if( time > 0 ) {
|
if (time > 0) {
|
||||||
SendEmoteMessage(0,0,0,15,"<SYSTEMWIDE MESSAGE>:SYSTEM MSG:World coming down in %i minutes, everyone log out before this time.", (time / 60));
|
SendEmoteMessage(0, 0, 0, 15, "<SYSTEMWIDE MESSAGE>:SYSTEM MSG:World coming down in %i minutes, everyone log out before this time.", (time / 60));
|
||||||
|
|
||||||
time *= 1000;
|
time *= 1000;
|
||||||
interval *= 1000;
|
interval *= 1000;
|
||||||
if(interval < 5000) { interval = 5000; }
|
if (interval < 5000) { interval = 5000; }
|
||||||
|
|
||||||
shutdowntimer->SetTimer(time);
|
shutdowntimer->SetTimer(time);
|
||||||
reminder->SetTimer(interval-1000);
|
reminder->SetTimer(interval - 1000);
|
||||||
reminder->SetAtTrigger(interval);
|
reminder->SetAtTrigger(interval);
|
||||||
shutdowntimer->Start();
|
shutdowntimer->Start();
|
||||||
reminder->Start();
|
reminder->Start();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
SendEmoteMessage(0,0,0,15,"<SYSTEMWIDE MESSAGE>:SYSTEM MSG:World coming down, everyone log out now.");
|
SendEmoteMessage(0, 0, 0, 15, "<SYSTEMWIDE MESSAGE>:SYSTEM MSG:World coming down, everyone log out now.");
|
||||||
auto pack = new ServerPacket;
|
auto pack = new ServerPacket;
|
||||||
pack->opcode = ServerOP_ShutdownAll;
|
pack->opcode = ServerOP_ShutdownAll;
|
||||||
pack->size=0;
|
pack->size = 0;
|
||||||
SendPacket(pack);
|
SendPacket(pack);
|
||||||
safe_delete(pack);
|
safe_delete(pack);
|
||||||
Process();
|
Process();
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
138
zone/aa.cpp
138
zone/aa.cpp
@ -47,20 +47,20 @@ void Mob::TemporaryPets(uint16 spell_id, Mob *targ, const char *name_override, u
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
PetRecord record;
|
PetRecord record;
|
||||||
if(!database.GetPetEntry(spells[spell_id].teleport_zone, &record))
|
if (!database.GetPetEntry(spells[spell_id].teleport_zone, &record))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Unknown swarm pet spell id: %d, check pets table", spell_id);
|
Log(Logs::General, Logs::Error, "Unknown swarm pet spell id: %d, check pets table", spell_id);
|
||||||
Message(13, "Unable to find data for pet %s", spells[spell_id].teleport_zone);
|
Message(13, "Unable to find data for pet %s", spells[spell_id].teleport_zone);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
AA_SwarmPet pet;
|
SwarmPet_Struct pet;
|
||||||
pet.count = 1;
|
pet.count = 1;
|
||||||
pet.duration = 1;
|
pet.duration = 1;
|
||||||
|
|
||||||
for(int x = 0; x < MAX_SWARM_PETS; x++)
|
for (int x = 0; x < MAX_SWARM_PETS; x++)
|
||||||
{
|
{
|
||||||
if(spells[spell_id].effectid[x] == SE_TemporaryPets)
|
if (spells[spell_id].effectid[x] == SE_TemporaryPets)
|
||||||
{
|
{
|
||||||
pet.count = spells[spell_id].base[x];
|
pet.count = spells[spell_id].base[x];
|
||||||
pet.duration = spells[spell_id].max[x];
|
pet.duration = spells[spell_id].max[x];
|
||||||
@ -74,14 +74,14 @@ void Mob::TemporaryPets(uint16 spell_id, Mob *targ, const char *name_override, u
|
|||||||
NPCType *made_npc = nullptr;
|
NPCType *made_npc = nullptr;
|
||||||
|
|
||||||
const NPCType *npc_type = database.LoadNPCTypesData(pet.npc_id);
|
const NPCType *npc_type = database.LoadNPCTypesData(pet.npc_id);
|
||||||
if(npc_type == nullptr) {
|
if (npc_type == nullptr) {
|
||||||
//log write
|
//log write
|
||||||
Log.Out(Logs::General, Logs::Error, "Unknown npc type for swarm pet spell id: %d", spell_id);
|
Log(Logs::General, Logs::Error, "Unknown npc type for swarm pet spell id: %d", spell_id);
|
||||||
Message(0,"Unable to find pet!");
|
Message(0, "Unable to find pet!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(name_override != nullptr) {
|
if (name_override != nullptr) {
|
||||||
//we have to make a custom NPC type for this name change
|
//we have to make a custom NPC type for this name change
|
||||||
made_npc = new NPCType;
|
made_npc = new NPCType;
|
||||||
memcpy(made_npc, npc_type, sizeof(NPCType));
|
memcpy(made_npc, npc_type, sizeof(NPCType));
|
||||||
@ -92,7 +92,7 @@ void Mob::TemporaryPets(uint16 spell_id, Mob *targ, const char *name_override, u
|
|||||||
int summon_count = 0;
|
int summon_count = 0;
|
||||||
summon_count = pet.count;
|
summon_count = pet.count;
|
||||||
|
|
||||||
if(summon_count > MAX_SWARM_PETS)
|
if (summon_count > MAX_SWARM_PETS)
|
||||||
summon_count = MAX_SWARM_PETS;
|
summon_count = MAX_SWARM_PETS;
|
||||||
|
|
||||||
static const glm::vec2 swarmPetLocations[MAX_SWARM_PETS] = {
|
static const glm::vec2 swarmPetLocations[MAX_SWARM_PETS] = {
|
||||||
@ -101,59 +101,61 @@ void Mob::TemporaryPets(uint16 spell_id, Mob *targ, const char *name_override, u
|
|||||||
glm::vec2(8, 8), glm::vec2(-8, 8), glm::vec2(8, -8), glm::vec2(-8, -8)
|
glm::vec2(8, 8), glm::vec2(-8, 8), glm::vec2(8, -8), glm::vec2(-8, -8)
|
||||||
};
|
};
|
||||||
|
|
||||||
while(summon_count > 0) {
|
while (summon_count > 0) {
|
||||||
int pet_duration = pet.duration;
|
int pet_duration = pet.duration;
|
||||||
if(duration_override > 0)
|
if (duration_override > 0)
|
||||||
pet_duration = duration_override;
|
pet_duration = duration_override;
|
||||||
|
|
||||||
//this is a little messy, but the only way to do it right
|
//this is a little messy, but the only way to do it right
|
||||||
//it would be possible to optimize out this copy for the last pet, but oh well
|
//it would be possible to optimize out this copy for the last pet, but oh well
|
||||||
NPCType *npc_dup = nullptr;
|
NPCType *npc_dup = nullptr;
|
||||||
if(made_npc != nullptr) {
|
if (made_npc != nullptr) {
|
||||||
npc_dup = new NPCType;
|
npc_dup = new NPCType;
|
||||||
memcpy(npc_dup, made_npc, sizeof(NPCType));
|
memcpy(npc_dup, made_npc, sizeof(NPCType));
|
||||||
}
|
}
|
||||||
|
|
||||||
NPC* npca = new NPC(
|
NPC* swarm_pet_npc = new NPC(
|
||||||
(npc_dup!=nullptr)?npc_dup:npc_type, //make sure we give the NPC the correct data pointer
|
(npc_dup != nullptr) ? npc_dup : npc_type, //make sure we give the NPC the correct data pointer
|
||||||
0,
|
0,
|
||||||
GetPosition() + glm::vec4(swarmPetLocations[summon_count], 0.0f, 0.0f),
|
GetPosition() + glm::vec4(swarmPetLocations[summon_count], 0.0f, 0.0f),
|
||||||
FlyMode3);
|
FlyMode3);
|
||||||
|
|
||||||
if (followme)
|
if (followme)
|
||||||
npca->SetFollowID(GetID());
|
swarm_pet_npc->SetFollowID(GetID());
|
||||||
|
|
||||||
if(!npca->GetSwarmInfo()){
|
if (!swarm_pet_npc->GetSwarmInfo()) {
|
||||||
auto nSI = new AA_SwarmPetInfo;
|
auto nSI = new SwarmPet;
|
||||||
npca->SetSwarmInfo(nSI);
|
swarm_pet_npc->SetSwarmInfo(nSI);
|
||||||
npca->GetSwarmInfo()->duration = new Timer(pet_duration*1000);
|
swarm_pet_npc->GetSwarmInfo()->duration = new Timer(pet_duration * 1000);
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
npca->GetSwarmInfo()->duration->Start(pet_duration*1000);
|
swarm_pet_npc->GetSwarmInfo()->duration->Start(pet_duration * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
swarm_pet_npc->StartSwarmTimer(pet_duration * 1000);
|
||||||
|
|
||||||
//removing this prevents the pet from attacking
|
//removing this prevents the pet from attacking
|
||||||
npca->GetSwarmInfo()->owner_id = GetID();
|
swarm_pet_npc->GetSwarmInfo()->owner_id = GetID();
|
||||||
|
|
||||||
//give the pets somebody to "love"
|
//give the pets somebody to "love"
|
||||||
if(targ != nullptr){
|
if (targ != nullptr) {
|
||||||
npca->AddToHateList(targ, 1000, 1000);
|
swarm_pet_npc->AddToHateList(targ, 1000, 1000);
|
||||||
if (RuleB(Spells, SwarmPetTargetLock) || sticktarg)
|
if (RuleB(Spells, SwarmPetTargetLock) || sticktarg)
|
||||||
npca->GetSwarmInfo()->target = targ->GetID();
|
swarm_pet_npc->GetSwarmInfo()->target = targ->GetID();
|
||||||
else
|
else
|
||||||
npca->GetSwarmInfo()->target = 0;
|
swarm_pet_npc->GetSwarmInfo()->target = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//we allocated a new NPC type object, give the NPC ownership of that memory
|
//we allocated a new NPC type object, give the NPC ownership of that memory
|
||||||
if(npc_dup != nullptr)
|
if (npc_dup != nullptr)
|
||||||
npca->GiveNPCTypeData(npc_dup);
|
swarm_pet_npc->GiveNPCTypeData(npc_dup);
|
||||||
|
|
||||||
entity_list.AddNPC(npca, true, true);
|
entity_list.AddNPC(swarm_pet_npc, true, true);
|
||||||
summon_count--;
|
summon_count--;
|
||||||
}
|
}
|
||||||
|
|
||||||
//the target of these swarm pets will take offense to being cast on...
|
//the target of these swarm pets will take offense to being cast on...
|
||||||
if(targ != nullptr)
|
if (targ != nullptr)
|
||||||
targ->AddToHateList(this, 1, 0);
|
targ->AddToHateList(this, 1, 0);
|
||||||
|
|
||||||
// The other pointers we make are handled elsewhere.
|
// The other pointers we make are handled elsewhere.
|
||||||
@ -162,7 +164,7 @@ void Mob::TemporaryPets(uint16 spell_id, Mob *targ, const char *name_override, u
|
|||||||
|
|
||||||
void Mob::TypesTemporaryPets(uint32 typesid, Mob *targ, const char *name_override, uint32 duration_override, bool followme, bool sticktarg) {
|
void Mob::TypesTemporaryPets(uint32 typesid, Mob *targ, const char *name_override, uint32 duration_override, bool followme, bool sticktarg) {
|
||||||
|
|
||||||
AA_SwarmPet pet;
|
SwarmPet_Struct pet;
|
||||||
pet.count = 1;
|
pet.count = 1;
|
||||||
pet.duration = 1;
|
pet.duration = 1;
|
||||||
|
|
||||||
@ -173,7 +175,7 @@ void Mob::TypesTemporaryPets(uint32 typesid, Mob *targ, const char *name_overrid
|
|||||||
const NPCType *npc_type = database.LoadNPCTypesData(typesid);
|
const NPCType *npc_type = database.LoadNPCTypesData(typesid);
|
||||||
if(npc_type == nullptr) {
|
if(npc_type == nullptr) {
|
||||||
//log write
|
//log write
|
||||||
Log.Out(Logs::General, Logs::Error, "Unknown npc type for swarm pet type id: %d", typesid);
|
Log(Logs::General, Logs::Error, "Unknown npc type for swarm pet type id: %d", typesid);
|
||||||
Message(0,"Unable to find pet!");
|
Message(0,"Unable to find pet!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -211,42 +213,44 @@ void Mob::TypesTemporaryPets(uint32 typesid, Mob *targ, const char *name_overrid
|
|||||||
memcpy(npc_dup, made_npc, sizeof(NPCType));
|
memcpy(npc_dup, made_npc, sizeof(NPCType));
|
||||||
}
|
}
|
||||||
|
|
||||||
NPC* npca = new NPC(
|
NPC* swarm_pet_npc = new NPC(
|
||||||
(npc_dup!=nullptr)?npc_dup:npc_type, //make sure we give the NPC the correct data pointer
|
(npc_dup!=nullptr)?npc_dup:npc_type, //make sure we give the NPC the correct data pointer
|
||||||
0,
|
0,
|
||||||
GetPosition() + glm::vec4(swarmPetLocations[summon_count], 0.0f, 0.0f),
|
GetPosition() + glm::vec4(swarmPetLocations[summon_count], 0.0f, 0.0f),
|
||||||
FlyMode3);
|
FlyMode3);
|
||||||
|
|
||||||
if (followme)
|
if (followme)
|
||||||
npca->SetFollowID(GetID());
|
swarm_pet_npc->SetFollowID(GetID());
|
||||||
|
|
||||||
if(!npca->GetSwarmInfo()){
|
if(!swarm_pet_npc->GetSwarmInfo()){
|
||||||
auto nSI = new AA_SwarmPetInfo;
|
auto nSI = new SwarmPet;
|
||||||
npca->SetSwarmInfo(nSI);
|
swarm_pet_npc->SetSwarmInfo(nSI);
|
||||||
npca->GetSwarmInfo()->duration = new Timer(pet_duration*1000);
|
swarm_pet_npc->GetSwarmInfo()->duration = new Timer(pet_duration*1000);
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
npca->GetSwarmInfo()->duration->Start(pet_duration*1000);
|
swarm_pet_npc->GetSwarmInfo()->duration->Start(pet_duration*1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
swarm_pet_npc->StartSwarmTimer(pet_duration * 1000);
|
||||||
|
|
||||||
//removing this prevents the pet from attacking
|
//removing this prevents the pet from attacking
|
||||||
npca->GetSwarmInfo()->owner_id = GetID();
|
swarm_pet_npc->GetSwarmInfo()->owner_id = GetID();
|
||||||
|
|
||||||
//give the pets somebody to "love"
|
//give the pets somebody to "love"
|
||||||
if(targ != nullptr){
|
if(targ != nullptr){
|
||||||
npca->AddToHateList(targ, 1000, 1000);
|
swarm_pet_npc->AddToHateList(targ, 1000, 1000);
|
||||||
|
|
||||||
if (RuleB(Spells, SwarmPetTargetLock) || sticktarg)
|
if (RuleB(Spells, SwarmPetTargetLock) || sticktarg)
|
||||||
npca->GetSwarmInfo()->target = targ->GetID();
|
swarm_pet_npc->GetSwarmInfo()->target = targ->GetID();
|
||||||
else
|
else
|
||||||
npca->GetSwarmInfo()->target = 0;
|
swarm_pet_npc->GetSwarmInfo()->target = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//we allocated a new NPC type object, give the NPC ownership of that memory
|
//we allocated a new NPC type object, give the NPC ownership of that memory
|
||||||
if(npc_dup != nullptr)
|
if(npc_dup != nullptr)
|
||||||
npca->GiveNPCTypeData(npc_dup);
|
swarm_pet_npc->GiveNPCTypeData(npc_dup);
|
||||||
|
|
||||||
entity_list.AddNPC(npca, true, true);
|
entity_list.AddNPC(swarm_pet_npc, true, true);
|
||||||
summon_count--;
|
summon_count--;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -404,7 +408,7 @@ void Mob::WakeTheDead(uint16 spell_id, Mob *target, uint32 duration)
|
|||||||
auto npca = new NPC(make_npc, 0, GetPosition(), FlyMode3);
|
auto npca = new NPC(make_npc, 0, GetPosition(), FlyMode3);
|
||||||
|
|
||||||
if(!npca->GetSwarmInfo()){
|
if(!npca->GetSwarmInfo()){
|
||||||
auto nSI = new AA_SwarmPetInfo;
|
auto nSI = new SwarmPet;
|
||||||
npca->SetSwarmInfo(nSI);
|
npca->SetSwarmInfo(nSI);
|
||||||
npca->GetSwarmInfo()->duration = new Timer(duration*1000);
|
npca->GetSwarmInfo()->duration = new Timer(duration*1000);
|
||||||
}
|
}
|
||||||
@ -793,21 +797,21 @@ void Client::RefundAA() {
|
|||||||
SendAlternateAdvancementStats();
|
SendAlternateAdvancementStats();
|
||||||
}
|
}
|
||||||
|
|
||||||
AA_SwarmPetInfo::AA_SwarmPetInfo()
|
SwarmPet::SwarmPet()
|
||||||
{
|
{
|
||||||
target = 0;
|
target = 0;
|
||||||
owner_id = 0;
|
owner_id = 0;
|
||||||
duration = nullptr;
|
duration = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
AA_SwarmPetInfo::~AA_SwarmPetInfo()
|
SwarmPet::~SwarmPet()
|
||||||
{
|
{
|
||||||
target = 0;
|
target = 0;
|
||||||
owner_id = 0;
|
owner_id = 0;
|
||||||
safe_delete(duration);
|
safe_delete(duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
Mob *AA_SwarmPetInfo::GetOwner()
|
Mob *SwarmPet::GetOwner()
|
||||||
{
|
{
|
||||||
return entity_list.GetMobID(owner_id);
|
return entity_list.GetMobID(owner_id);
|
||||||
}
|
}
|
||||||
@ -1533,17 +1537,17 @@ bool Mob::CanPurchaseAlternateAdvancementRank(AA::Rank *rank, bool check_price,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Zone::LoadAlternateAdvancement() {
|
void Zone::LoadAlternateAdvancement() {
|
||||||
Log.Out(Logs::General, Logs::Status, "Loading Alternate Advancement Data...");
|
Log(Logs::General, Logs::Status, "Loading Alternate Advancement Data...");
|
||||||
if(!database.LoadAlternateAdvancementAbilities(aa_abilities,
|
if(!database.LoadAlternateAdvancementAbilities(aa_abilities,
|
||||||
aa_ranks))
|
aa_ranks))
|
||||||
{
|
{
|
||||||
aa_abilities.clear();
|
aa_abilities.clear();
|
||||||
aa_ranks.clear();
|
aa_ranks.clear();
|
||||||
Log.Out(Logs::General, Logs::Status, "Failed to load Alternate Advancement Data");
|
Log(Logs::General, Logs::Status, "Failed to load Alternate Advancement Data");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Status, "Processing Alternate Advancement Data...");
|
Log(Logs::General, Logs::Status, "Processing Alternate Advancement Data...");
|
||||||
for(const auto &ability : aa_abilities) {
|
for(const auto &ability : aa_abilities) {
|
||||||
ability.second->first = GetAlternateAdvancementRank(ability.second->first_rank_id);
|
ability.second->first = GetAlternateAdvancementRank(ability.second->first_rank_id);
|
||||||
|
|
||||||
@ -1594,13 +1598,13 @@ void Zone::LoadAlternateAdvancement() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Status, "Loaded Alternate Advancement Data");
|
Log(Logs::General, Logs::Status, "Loaded Alternate Advancement Data");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_map<int, std::unique_ptr<AA::Ability>> &abilities,
|
bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_map<int, std::unique_ptr<AA::Ability>> &abilities,
|
||||||
std::unordered_map<int, std::unique_ptr<AA::Rank>> &ranks)
|
std::unordered_map<int, std::unique_ptr<AA::Rank>> &ranks)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Status, "Loading Alternate Advancement Abilities...");
|
Log(Logs::General, Logs::Status, "Loading Alternate Advancement Abilities...");
|
||||||
abilities.clear();
|
abilities.clear();
|
||||||
std::string query = "SELECT id, name, category, classes, races, deities, drakkin_heritage, status, type, charges, "
|
std::string query = "SELECT id, name, category, classes, races, deities, drakkin_heritage, status, type, charges, "
|
||||||
"grant_only, first_rank_id FROM aa_ability WHERE enabled = 1";
|
"grant_only, first_rank_id FROM aa_ability WHERE enabled = 1";
|
||||||
@ -1626,13 +1630,13 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_map<int, std
|
|||||||
abilities[ability->id] = std::unique_ptr<AA::Ability>(ability);
|
abilities[ability->id] = std::unique_ptr<AA::Ability>(ability);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Log.Out(Logs::General, Logs::Error, "Failed to load Alternate Advancement Abilities");
|
Log(Logs::General, Logs::Error, "Failed to load Alternate Advancement Abilities");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Status, "Loaded %d Alternate Advancement Abilities", (int)abilities.size());
|
Log(Logs::General, Logs::Status, "Loaded %d Alternate Advancement Abilities", (int)abilities.size());
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Status, "Loading Alternate Advancement Ability Ranks...");
|
Log(Logs::General, Logs::Status, "Loading Alternate Advancement Ability Ranks...");
|
||||||
ranks.clear();
|
ranks.clear();
|
||||||
query = "SELECT id, upper_hotkey_sid, lower_hotkey_sid, title_sid, desc_sid, cost, level_req, spell, spell_type, recast_time, "
|
query = "SELECT id, upper_hotkey_sid, lower_hotkey_sid, title_sid, desc_sid, cost, level_req, spell, spell_type, recast_time, "
|
||||||
"next_id, expansion FROM aa_ranks";
|
"next_id, expansion FROM aa_ranks";
|
||||||
@ -1661,13 +1665,13 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_map<int, std
|
|||||||
ranks[rank->id] = std::unique_ptr<AA::Rank>(rank);
|
ranks[rank->id] = std::unique_ptr<AA::Rank>(rank);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Log.Out(Logs::General, Logs::Error, "Failed to load Alternate Advancement Ability Ranks");
|
Log(Logs::General, Logs::Error, "Failed to load Alternate Advancement Ability Ranks");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Status, "Loaded %d Alternate Advancement Ability Ranks", (int)ranks.size());
|
Log(Logs::General, Logs::Status, "Loaded %d Alternate Advancement Ability Ranks", (int)ranks.size());
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Status, "Loading Alternate Advancement Ability Rank Effects...");
|
Log(Logs::General, Logs::Status, "Loading Alternate Advancement Ability Rank Effects...");
|
||||||
query = "SELECT rank_id, slot, effect_id, base1, base2 FROM aa_rank_effects";
|
query = "SELECT rank_id, slot, effect_id, base1, base2 FROM aa_rank_effects";
|
||||||
results = QueryDatabase(query);
|
results = QueryDatabase(query);
|
||||||
if(results.Success()) {
|
if(results.Success()) {
|
||||||
@ -1688,13 +1692,13 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_map<int, std
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Log.Out(Logs::General, Logs::Error, "Failed to load Alternate Advancement Ability Rank Effects");
|
Log(Logs::General, Logs::Error, "Failed to load Alternate Advancement Ability Rank Effects");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Status, "Loaded Alternate Advancement Ability Rank Effects");
|
Log(Logs::General, Logs::Status, "Loaded Alternate Advancement Ability Rank Effects");
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Status, "Loading Alternate Advancement Ability Rank Prereqs...");
|
Log(Logs::General, Logs::Status, "Loading Alternate Advancement Ability Rank Prereqs...");
|
||||||
query = "SELECT rank_id, aa_id, points FROM aa_rank_prereqs";
|
query = "SELECT rank_id, aa_id, points FROM aa_rank_prereqs";
|
||||||
results = QueryDatabase(query);
|
results = QueryDatabase(query);
|
||||||
if(results.Success()) {
|
if(results.Success()) {
|
||||||
@ -1713,11 +1717,11 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_map<int, std
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Log.Out(Logs::General, Logs::Error, "Failed to load Alternate Advancement Ability Rank Prereqs");
|
Log(Logs::General, Logs::Error, "Failed to load Alternate Advancement Ability Rank Prereqs");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Status, "Loaded Alternate Advancement Ability Rank Prereqs");
|
Log(Logs::General, Logs::Status, "Loaded Alternate Advancement Ability Rank Prereqs");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1511,7 +1511,7 @@ typedef enum { //AA IDs
|
|||||||
} aaID;
|
} aaID;
|
||||||
|
|
||||||
//Structure representing the database's swarm pet configs
|
//Structure representing the database's swarm pet configs
|
||||||
struct AA_SwarmPet {
|
struct SwarmPet_Struct {
|
||||||
uint8 count; //number to summon
|
uint8 count; //number to summon
|
||||||
uint32 npc_id; //id from npc_types to represent it.
|
uint32 npc_id; //id from npc_types to represent it.
|
||||||
uint16 duration; //how long they last, in seconds
|
uint16 duration; //how long they last, in seconds
|
||||||
@ -1526,10 +1526,10 @@ enum { //values of AA_Action.action
|
|||||||
|
|
||||||
class Timer;
|
class Timer;
|
||||||
class Mob;
|
class Mob;
|
||||||
class AA_SwarmPetInfo {
|
class SwarmPet {
|
||||||
public:
|
public:
|
||||||
AA_SwarmPetInfo();
|
SwarmPet();
|
||||||
~AA_SwarmPetInfo();
|
~SwarmPet();
|
||||||
Mob * GetOwner();
|
Mob * GetOwner();
|
||||||
Timer *duration;
|
Timer *duration;
|
||||||
uint32 target; //the target ID
|
uint32 target; //the target ID
|
||||||
|
|||||||
@ -284,7 +284,7 @@ bool Mob::CheckWillAggro(Mob *mob) {
|
|||||||
if(( t1 > iAggroRange)
|
if(( t1 > iAggroRange)
|
||||||
|| ( t2 > iAggroRange)
|
|| ( t2 > iAggroRange)
|
||||||
|| ( t3 > iAggroRange)
|
|| ( t3 > iAggroRange)
|
||||||
||(mob->IsInvisible(this))
|
|| (mob->IsInvisible(this))
|
||||||
|| (mob->IsClient() &&
|
|| (mob->IsClient() &&
|
||||||
(!mob->CastToClient()->Connected()
|
(!mob->CastToClient()->Connected()
|
||||||
|| mob->CastToClient()->IsLD()
|
|| mob->CastToClient()->IsLD()
|
||||||
@ -298,7 +298,7 @@ bool Mob::CheckWillAggro(Mob *mob) {
|
|||||||
|
|
||||||
// Don't aggro new clients if we are already engaged unless PROX_AGGRO is set
|
// Don't aggro new clients if we are already engaged unless PROX_AGGRO is set
|
||||||
if (IsEngaged() && (!GetSpecialAbility(PROX_AGGRO) || (GetSpecialAbility(PROX_AGGRO) && !CombatRange(mob)))) {
|
if (IsEngaged() && (!GetSpecialAbility(PROX_AGGRO) || (GetSpecialAbility(PROX_AGGRO) && !CombatRange(mob)))) {
|
||||||
Log.Out(Logs::Moderate, Logs::Aggro,
|
Log(Logs::Moderate, Logs::Aggro,
|
||||||
"%s is in combat, and does not have prox_aggro, or does and is out of combat range with %s",
|
"%s is in combat, and does not have prox_aggro, or does and is out of combat range with %s",
|
||||||
GetName(), mob->GetName());
|
GetName(), mob->GetName());
|
||||||
return false;
|
return false;
|
||||||
@ -360,7 +360,7 @@ bool Mob::CheckWillAggro(Mob *mob) {
|
|||||||
{
|
{
|
||||||
//FatherNiwtit: make sure we can see them. last since it is very expensive
|
//FatherNiwtit: make sure we can see them. last since it is very expensive
|
||||||
if(CheckLosFN(mob)) {
|
if(CheckLosFN(mob)) {
|
||||||
Log.Out(Logs::Detail, Logs::Aggro, "Check aggro for %s target %s.", GetName(), mob->GetName());
|
Log(Logs::Detail, Logs::Aggro, "Check aggro for %s target %s.", GetName(), mob->GetName());
|
||||||
return( mod_will_aggro(mob, this) );
|
return( mod_will_aggro(mob, this) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -392,18 +392,18 @@ bool Mob::CheckWillAggro(Mob *mob) {
|
|||||||
{
|
{
|
||||||
//FatherNiwtit: make sure we can see them. last since it is very expensive
|
//FatherNiwtit: make sure we can see them. last since it is very expensive
|
||||||
if(CheckLosFN(mob)) {
|
if(CheckLosFN(mob)) {
|
||||||
Log.Out(Logs::Detail, Logs::Aggro, "Check aggro for %s target %s.", GetName(), mob->GetName());
|
Log(Logs::Detail, Logs::Aggro, "Check aggro for %s target %s.", GetName(), mob->GetName());
|
||||||
return( mod_will_aggro(mob, this) );
|
return( mod_will_aggro(mob, this) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Aggro, "Is In zone?:%d\n", mob->InZone());
|
Log(Logs::Detail, Logs::Aggro, "Is In zone?:%d\n", mob->InZone());
|
||||||
Log.Out(Logs::Detail, Logs::Aggro, "Dist^2: %f\n", dist2);
|
Log(Logs::Detail, Logs::Aggro, "Dist^2: %f\n", dist2);
|
||||||
Log.Out(Logs::Detail, Logs::Aggro, "Range^2: %f\n", iAggroRange2);
|
Log(Logs::Detail, Logs::Aggro, "Range^2: %f\n", iAggroRange2);
|
||||||
Log.Out(Logs::Detail, Logs::Aggro, "Faction: %d\n", fv);
|
Log(Logs::Detail, Logs::Aggro, "Faction: %d\n", fv);
|
||||||
Log.Out(Logs::Detail, Logs::Aggro, "Int: %d\n", GetINT());
|
Log(Logs::Detail, Logs::Aggro, "Int: %d\n", GetINT());
|
||||||
Log.Out(Logs::Detail, Logs::Aggro, "Con: %d\n", GetLevelCon(mob->GetLevel()));
|
Log(Logs::Detail, Logs::Aggro, "Con: %d\n", GetLevelCon(mob->GetLevel()));
|
||||||
|
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
@ -526,7 +526,7 @@ void EntityList::AIYellForHelp(Mob* sender, Mob* attacker) {
|
|||||||
//Father Nitwit: make sure we can see them.
|
//Father Nitwit: make sure we can see them.
|
||||||
if(mob->CheckLosFN(sender)) {
|
if(mob->CheckLosFN(sender)) {
|
||||||
#if (EQDEBUG>=5)
|
#if (EQDEBUG>=5)
|
||||||
Log.Out(Logs::General, Logs::None, "AIYellForHelp(\"%s\",\"%s\") %s attacking %s Dist %f Z %f",
|
Log(Logs::General, Logs::None, "AIYellForHelp(\"%s\",\"%s\") %s attacking %s Dist %f Z %f",
|
||||||
sender->GetName(), attacker->GetName(), mob->GetName(),
|
sender->GetName(), attacker->GetName(), mob->GetName(),
|
||||||
attacker->GetName(), DistanceSquared(mob->GetPosition(),
|
attacker->GetName(), DistanceSquared(mob->GetPosition(),
|
||||||
sender->GetPosition()), fabs(sender->GetZ()+mob->GetZ()));
|
sender->GetPosition()), fabs(sender->GetZ()+mob->GetZ()));
|
||||||
@ -756,7 +756,7 @@ type', in which case, the answer is yes.
|
|||||||
}
|
}
|
||||||
while( reverse++ == 0 );
|
while( reverse++ == 0 );
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::None, "Mob::IsAttackAllowed: don't have a rule for this - %s vs %s\n", this->GetName(), target->GetName());
|
Log(Logs::General, Logs::None, "Mob::IsAttackAllowed: don't have a rule for this - %s vs %s\n", this->GetName(), target->GetName());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -896,7 +896,7 @@ bool Mob::IsBeneficialAllowed(Mob *target)
|
|||||||
}
|
}
|
||||||
while( reverse++ == 0 );
|
while( reverse++ == 0 );
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::None, "Mob::IsBeneficialAllowed: don't have a rule for this - %s to %s\n", this->GetName(), target->GetName());
|
Log(Logs::General, Logs::None, "Mob::IsBeneficialAllowed: don't have a rule for this - %s to %s\n", this->GetName(), target->GetName());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1008,7 +1008,7 @@ bool Mob::CheckLosFN(float posX, float posY, float posZ, float mobSize) {
|
|||||||
oloc.z = posZ + (mobSize==0.0?LOS_DEFAULT_HEIGHT:mobSize)/2 * SEE_POSITION;
|
oloc.z = posZ + (mobSize==0.0?LOS_DEFAULT_HEIGHT:mobSize)/2 * SEE_POSITION;
|
||||||
|
|
||||||
#if LOSDEBUG>=5
|
#if LOSDEBUG>=5
|
||||||
Log.Out(Logs::General, Logs::None, "LOS from (%.2f, %.2f, %.2f) to (%.2f, %.2f, %.2f) sizes: (%.2f, %.2f)", myloc.x, myloc.y, myloc.z, oloc.x, oloc.y, oloc.z, GetSize(), mobSize);
|
Log(Logs::General, Logs::None, "LOS from (%.2f, %.2f, %.2f) to (%.2f, %.2f, %.2f) sizes: (%.2f, %.2f)", myloc.x, myloc.y, myloc.z, oloc.x, oloc.y, oloc.z, GetSize(), mobSize);
|
||||||
#endif
|
#endif
|
||||||
return zone->zonemap->CheckLoS(myloc, oloc);
|
return zone->zonemap->CheckLoS(myloc, oloc);
|
||||||
}
|
}
|
||||||
|
|||||||
1259
zone/attack.cpp
1259
zone/attack.cpp
File diff suppressed because it is too large
Load Diff
@ -660,7 +660,7 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon)
|
|||||||
effect == SE_StackingCommand_Overwrite)
|
effect == SE_StackingCommand_Overwrite)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::AA, "Applying Effect %d from AA %u in slot %d (base1: %d, base2: %d) on %s",
|
Log(Logs::Detail, Logs::AA, "Applying Effect %d from AA %u in slot %d (base1: %d, base2: %d) on %s",
|
||||||
effect, rank.id, slot, base1, base2, GetCleanName());
|
effect, rank.id, slot, base1, base2, GetCleanName());
|
||||||
|
|
||||||
uint8 focus = IsFocusEffect(0, 0, true, effect);
|
uint8 focus = IsFocusEffect(0, 0, true, effect);
|
||||||
@ -1498,7 +1498,7 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Log.Out(Logs::Detail, Logs::AA, "SPA %d not accounted for in AA %s (%d)", effect, rank.base_ability->name.c_str(), rank.id);
|
Log(Logs::Detail, Logs::AA, "SPA %d not accounted for in AA %s (%d)", effect, rank.base_ability->name.c_str(), rank.id);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
84
zone/bot.cpp
84
zone/bot.cpp
@ -1150,7 +1150,7 @@ int32 Bot::acmod() {
|
|||||||
else
|
else
|
||||||
return (65 + ((agility - 300) / 21));
|
return (65 + ((agility - 300) / 21));
|
||||||
#if EQDEBUG >= 11
|
#if EQDEBUG >= 11
|
||||||
Log.Out(Logs::General, Logs::Error, "Error in Bot::acmod(): Agility: %i, Level: %i",agility,level);
|
Log(Logs::General, Logs::Error, "Error in Bot::acmod(): Agility: %i, Level: %i",agility,level);
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1890,7 +1890,7 @@ void Bot::BotRangedAttack(Mob* other) {
|
|||||||
//make sure the attack and ranged timers are up
|
//make sure the attack and ranged timers are up
|
||||||
//if the ranged timer is disabled, then they have no ranged weapon and shouldent be attacking anyhow
|
//if the ranged timer is disabled, then they have no ranged weapon and shouldent be attacking anyhow
|
||||||
if((attack_timer.Enabled() && !attack_timer.Check(false)) || (ranged_timer.Enabled() && !ranged_timer.Check())) {
|
if((attack_timer.Enabled() && !attack_timer.Check(false)) || (ranged_timer.Enabled() && !ranged_timer.Check())) {
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "Bot Archery attack canceled. Timer not up. Attack %d, ranged %d", attack_timer.GetRemainingTime(), ranged_timer.GetRemainingTime());
|
Log(Logs::Detail, Logs::Combat, "Bot Archery attack canceled. Timer not up. Attack %d, ranged %d", attack_timer.GetRemainingTime(), ranged_timer.GetRemainingTime());
|
||||||
Message(0, "Error: Timer not up. Attack %d, ranged %d", attack_timer.GetRemainingTime(), ranged_timer.GetRemainingTime());
|
Message(0, "Error: Timer not up. Attack %d, ranged %d", attack_timer.GetRemainingTime(), ranged_timer.GetRemainingTime());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1908,7 +1908,7 @@ void Bot::BotRangedAttack(Mob* other) {
|
|||||||
if(!RangeWeapon || !Ammo)
|
if(!RangeWeapon || !Ammo)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "Shooting %s with bow %s (%d) and arrow %s (%d)", other->GetCleanName(), RangeWeapon->Name, RangeWeapon->ID, Ammo->Name, Ammo->ID);
|
Log(Logs::Detail, Logs::Combat, "Shooting %s with bow %s (%d) and arrow %s (%d)", other->GetCleanName(), RangeWeapon->Name, RangeWeapon->ID, Ammo->Name, Ammo->ID);
|
||||||
if(!IsAttackAllowed(other) || IsCasting() || DivineAura() || IsStunned() || IsMezzed() || (GetAppearance() == eaDead))
|
if(!IsAttackAllowed(other) || IsCasting() || DivineAura() || IsStunned() || IsMezzed() || (GetAppearance() == eaDead))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -1918,21 +1918,21 @@ void Bot::BotRangedAttack(Mob* other) {
|
|||||||
|
|
||||||
//break invis when you attack
|
//break invis when you attack
|
||||||
if(invisible) {
|
if(invisible) {
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "Removing invisibility due to melee attack.");
|
Log(Logs::Detail, Logs::Combat, "Removing invisibility due to melee attack.");
|
||||||
BuffFadeByEffect(SE_Invisibility);
|
BuffFadeByEffect(SE_Invisibility);
|
||||||
BuffFadeByEffect(SE_Invisibility2);
|
BuffFadeByEffect(SE_Invisibility2);
|
||||||
invisible = false;
|
invisible = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(invisible_undead) {
|
if(invisible_undead) {
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "Removing invisibility vs. undead due to melee attack.");
|
Log(Logs::Detail, Logs::Combat, "Removing invisibility vs. undead due to melee attack.");
|
||||||
BuffFadeByEffect(SE_InvisVsUndead);
|
BuffFadeByEffect(SE_InvisVsUndead);
|
||||||
BuffFadeByEffect(SE_InvisVsUndead2);
|
BuffFadeByEffect(SE_InvisVsUndead2);
|
||||||
invisible_undead = false;
|
invisible_undead = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(invisible_animals) {
|
if(invisible_animals) {
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "Removing invisibility vs. animals due to melee attack.");
|
Log(Logs::Detail, Logs::Combat, "Removing invisibility vs. animals due to melee attack.");
|
||||||
BuffFadeByEffect(SE_InvisVsAnimals);
|
BuffFadeByEffect(SE_InvisVsAnimals);
|
||||||
invisible_animals = false;
|
invisible_animals = false;
|
||||||
}
|
}
|
||||||
@ -2138,7 +2138,7 @@ void Bot::AI_Process() {
|
|||||||
Mob* delete_me = HealRotationTarget();
|
Mob* delete_me = HealRotationTarget();
|
||||||
if (AIHealRotation(HealRotationTarget(), UseHealRotationFastHeals())) {
|
if (AIHealRotation(HealRotationTarget(), UseHealRotationFastHeals())) {
|
||||||
#if (EQDEBUG >= 12)
|
#if (EQDEBUG >= 12)
|
||||||
Log.Out(Logs::General, Logs::Error, "Bot::AI_Process() - Casting succeeded (m: %s, t: %s) : AdvHR(true)", GetCleanName(), ((delete_me) ? (delete_me->GetCleanName()) : ("nullptr")));
|
Log(Logs::General, Logs::Error, "Bot::AI_Process() - Casting succeeded (m: %s, t: %s) : AdvHR(true)", GetCleanName(), ((delete_me) ? (delete_me->GetCleanName()) : ("nullptr")));
|
||||||
#endif
|
#endif
|
||||||
m_member_of_heal_rotation->SetMemberIsCasting(this);
|
m_member_of_heal_rotation->SetMemberIsCasting(this);
|
||||||
m_member_of_heal_rotation->UpdateTargetHealingStats(HealRotationTarget());
|
m_member_of_heal_rotation->UpdateTargetHealingStats(HealRotationTarget());
|
||||||
@ -2146,7 +2146,7 @@ void Bot::AI_Process() {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
#if (EQDEBUG >= 12)
|
#if (EQDEBUG >= 12)
|
||||||
Log.Out(Logs::General, Logs::Error, "Bot::AI_Process() - Casting failed (m: %s, t: %s) : AdvHR(false)", GetCleanName(), ((delete_me) ? (delete_me->GetCleanName()) : ("nullptr")));
|
Log(Logs::General, Logs::Error, "Bot::AI_Process() - Casting failed (m: %s, t: %s) : AdvHR(false)", GetCleanName(), ((delete_me) ? (delete_me->GetCleanName()) : ("nullptr")));
|
||||||
#endif
|
#endif
|
||||||
m_member_of_heal_rotation->SetMemberIsCasting(this, false);
|
m_member_of_heal_rotation->SetMemberIsCasting(this, false);
|
||||||
AdvanceHealRotation(false);
|
AdvanceHealRotation(false);
|
||||||
@ -2163,7 +2163,7 @@ void Bot::AI_Process() {
|
|||||||
SetHasBeenSummoned(false);
|
SetHasBeenSummoned(false);
|
||||||
} else if(!IsRooted()) {
|
} else if(!IsRooted()) {
|
||||||
if(GetTarget() && GetTarget()->GetHateTop() && GetTarget()->GetHateTop() != this) {
|
if(GetTarget() && GetTarget()->GetHateTop() && GetTarget()->GetHateTop() != this) {
|
||||||
Log.Out(Logs::Detail, Logs::AI, "Returning to location prior to being summoned.");
|
Log(Logs::Detail, Logs::AI, "Returning to location prior to being summoned.");
|
||||||
CalculateNewPosition2(m_PreSummonLocation.x, m_PreSummonLocation.y, m_PreSummonLocation.z, GetBotRunspeed());
|
CalculateNewPosition2(m_PreSummonLocation.x, m_PreSummonLocation.y, m_PreSummonLocation.z, GetBotRunspeed());
|
||||||
SetHeading(CalculateHeadingToTarget(m_PreSummonLocation.x, m_PreSummonLocation.y));
|
SetHeading(CalculateHeadingToTarget(m_PreSummonLocation.x, m_PreSummonLocation.y));
|
||||||
return;
|
return;
|
||||||
@ -2498,7 +2498,7 @@ void Bot::AI_Process() {
|
|||||||
|
|
||||||
if (AI_movement_timer->Check()) {
|
if (AI_movement_timer->Check()) {
|
||||||
if(!IsRooted()) {
|
if(!IsRooted()) {
|
||||||
Log.Out(Logs::Detail, Logs::AI, "Pursuing %s while engaged.", GetTarget()->GetCleanName());
|
Log(Logs::Detail, Logs::AI, "Pursuing %s while engaged.", GetTarget()->GetCleanName());
|
||||||
CalculateNewPosition2(GetTarget()->GetX(), GetTarget()->GetY(), GetTarget()->GetZ(), GetBotRunspeed());
|
CalculateNewPosition2(GetTarget()->GetX(), GetTarget()->GetY(), GetTarget()->GetZ(), GetBotRunspeed());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2746,7 +2746,7 @@ void Bot::PetAIProcess() {
|
|||||||
else if (botPet->GetTarget() && botPet->GetAIMovementTimer()->Check()) {
|
else if (botPet->GetTarget() && botPet->GetAIMovementTimer()->Check()) {
|
||||||
botPet->SetRunAnimSpeed(0);
|
botPet->SetRunAnimSpeed(0);
|
||||||
if(!botPet->IsRooted()) {
|
if(!botPet->IsRooted()) {
|
||||||
Log.Out(Logs::Detail, Logs::AI, "Pursuing %s while engaged.", botPet->GetTarget()->GetCleanName());
|
Log(Logs::Detail, Logs::AI, "Pursuing %s while engaged.", botPet->GetTarget()->GetCleanName());
|
||||||
botPet->CalculateNewPosition2(botPet->GetTarget()->GetX(), botPet->GetTarget()->GetY(), botPet->GetTarget()->GetZ(), botPet->GetOwner()->GetRunspeed());
|
botPet->CalculateNewPosition2(botPet->GetTarget()->GetX(), botPet->GetTarget()->GetY(), botPet->GetTarget()->GetZ(), botPet->GetOwner()->GetRunspeed());
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
@ -3813,7 +3813,7 @@ void Bot::Damage(Mob *from, int32 damage, uint16 spell_id, EQEmu::skills::SkillT
|
|||||||
|
|
||||||
//handle EVENT_ATTACK. Resets after we have not been attacked for 12 seconds
|
//handle EVENT_ATTACK. Resets after we have not been attacked for 12 seconds
|
||||||
if(attacked_timer.Check()) {
|
if(attacked_timer.Check()) {
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "Triggering EVENT_ATTACK due to attack by %s", from->GetName());
|
Log(Logs::Detail, Logs::Combat, "Triggering EVENT_ATTACK due to attack by %s", from->GetName());
|
||||||
parse->EventNPC(EVENT_ATTACK, this, from, "", 0);
|
parse->EventNPC(EVENT_ATTACK, this, from, "", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3821,7 +3821,7 @@ void Bot::Damage(Mob *from, int32 damage, uint16 spell_id, EQEmu::skills::SkillT
|
|||||||
// if spell is lifetap add hp to the caster
|
// if spell is lifetap add hp to the caster
|
||||||
if (spell_id != SPELL_UNKNOWN && IsLifetapSpell(spell_id)) {
|
if (spell_id != SPELL_UNKNOWN && IsLifetapSpell(spell_id)) {
|
||||||
int healed = GetActSpellHealing(spell_id, damage);
|
int healed = GetActSpellHealing(spell_id, damage);
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "Applying lifetap heal of %d to %s", healed, GetCleanName());
|
Log(Logs::Detail, Logs::Combat, "Applying lifetap heal of %d to %s", healed, GetCleanName());
|
||||||
HealDamage(healed);
|
HealDamage(healed);
|
||||||
entity_list.MessageClose(this, true, 300, MT_Spells, "%s beams a smile at %s", GetCleanName(), from->GetCleanName() );
|
entity_list.MessageClose(this, true, 300, MT_Spells, "%s beams a smile at %s", GetCleanName(), from->GetCleanName() );
|
||||||
}
|
}
|
||||||
@ -3857,13 +3857,13 @@ void Bot::AddToHateList(Mob* other, uint32 hate, int32 damage, bool iYellForHelp
|
|||||||
bool Bot::Attack(Mob* other, int Hand, bool FromRiposte, bool IsStrikethrough, bool IsFromSpell, ExtraAttackOptions *opts) {
|
bool Bot::Attack(Mob* other, int Hand, bool FromRiposte, bool IsStrikethrough, bool IsFromSpell, ExtraAttackOptions *opts) {
|
||||||
if (!other) {
|
if (!other) {
|
||||||
SetTarget(nullptr);
|
SetTarget(nullptr);
|
||||||
Log.Out(Logs::General, Logs::Error, "A null Mob object was passed to Bot::Attack for evaluation!");
|
Log(Logs::General, Logs::Error, "A null Mob object was passed to Bot::Attack for evaluation!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((GetHP() <= 0) || (GetAppearance() == eaDead)) {
|
if ((GetHP() <= 0) || (GetAppearance() == eaDead)) {
|
||||||
SetTarget(nullptr);
|
SetTarget(nullptr);
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "Attempted to attack %s while unconscious or, otherwise, appearing dead", other->GetCleanName());
|
Log(Logs::Detail, Logs::Combat, "Attempted to attack %s while unconscious or, otherwise, appearing dead", other->GetCleanName());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3875,20 +3875,20 @@ bool Bot::Attack(Mob* other, int Hand, bool FromRiposte, bool IsStrikethrough, b
|
|||||||
// takes more to compare a call result, load for a call, load a compare to address and compare, and finally
|
// takes more to compare a call result, load for a call, load a compare to address and compare, and finally
|
||||||
// push a value to an address than to just load for a call and push a value to an address.
|
// push a value to an address than to just load for a call and push a value to an address.
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "Attacking %s with hand %d %s", other->GetCleanName(), Hand, (FromRiposte ? "(this is a riposte)" : ""));
|
Log(Logs::Detail, Logs::Combat, "Attacking %s with hand %d %s", other->GetCleanName(), Hand, (FromRiposte ? "(this is a riposte)" : ""));
|
||||||
if ((IsCasting() && (GetClass() != BARD) && !IsFromSpell) || (!IsAttackAllowed(other))) {
|
if ((IsCasting() && (GetClass() != BARD) && !IsFromSpell) || (!IsAttackAllowed(other))) {
|
||||||
if(this->GetOwnerID())
|
if(this->GetOwnerID())
|
||||||
entity_list.MessageClose(this, 1, 200, 10, "%s says, '%s is not a legal target master.'", this->GetCleanName(), this->GetTarget()->GetCleanName());
|
entity_list.MessageClose(this, 1, 200, 10, "%s says, '%s is not a legal target master.'", this->GetCleanName(), this->GetTarget()->GetCleanName());
|
||||||
|
|
||||||
if(other) {
|
if(other) {
|
||||||
RemoveFromHateList(other);
|
RemoveFromHateList(other);
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "I am not allowed to attack %s", other->GetCleanName());
|
Log(Logs::Detail, Logs::Combat, "I am not allowed to attack %s", other->GetCleanName());
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(DivineAura()) {//cant attack while invulnerable
|
if(DivineAura()) {//cant attack while invulnerable
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "Attack canceled, Divine Aura is in effect.");
|
Log(Logs::Detail, Logs::Combat, "Attack canceled, Divine Aura is in effect.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3906,19 +3906,19 @@ bool Bot::Attack(Mob* other, int Hand, bool FromRiposte, bool IsStrikethrough, b
|
|||||||
|
|
||||||
if(weapon != nullptr) {
|
if(weapon != nullptr) {
|
||||||
if (!weapon->IsWeapon()) {
|
if (!weapon->IsWeapon()) {
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "Attack canceled, Item %s (%d) is not a weapon.", weapon->GetItem()->Name, weapon->GetID());
|
Log(Logs::Detail, Logs::Combat, "Attack canceled, Item %s (%d) is not a weapon.", weapon->GetItem()->Name, weapon->GetID());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "Attacking with weapon: %s (%d)", weapon->GetItem()->Name, weapon->GetID());
|
Log(Logs::Detail, Logs::Combat, "Attacking with weapon: %s (%d)", weapon->GetItem()->Name, weapon->GetID());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "Attacking without a weapon.");
|
Log(Logs::Detail, Logs::Combat, "Attacking without a weapon.");
|
||||||
|
|
||||||
// calculate attack_skill and skillinuse depending on hand and weapon
|
// calculate attack_skill and skillinuse depending on hand and weapon
|
||||||
// also send Packet to near clients
|
// also send Packet to near clients
|
||||||
DamageHitInfo my_hit;
|
DamageHitInfo my_hit;
|
||||||
AttackAnimation(my_hit.skill, Hand, weapon);
|
AttackAnimation(my_hit.skill, Hand, weapon);
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "Attacking with %s in slot %d using skill %d", weapon?weapon->GetItem()->Name:"Fist", Hand, my_hit.skill);
|
Log(Logs::Detail, Logs::Combat, "Attacking with %s in slot %d using skill %d", weapon?weapon->GetItem()->Name:"Fist", Hand, my_hit.skill);
|
||||||
|
|
||||||
// Now figure out damage
|
// Now figure out damage
|
||||||
my_hit.damage_done = 1;
|
my_hit.damage_done = 1;
|
||||||
@ -3966,7 +3966,7 @@ bool Bot::Attack(Mob* other, int Hand, bool FromRiposte, bool IsStrikethrough, b
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "Damage calculated: base %d min damage %d skill %d", my_hit.base_damage, my_hit.min_damage, my_hit.skill);
|
Log(Logs::Detail, Logs::Combat, "Damage calculated: base %d min damage %d skill %d", my_hit.base_damage, my_hit.min_damage, my_hit.skill);
|
||||||
|
|
||||||
int hit_chance_bonus = 0;
|
int hit_chance_bonus = 0;
|
||||||
my_hit.offense = offense(my_hit.skill);
|
my_hit.offense = offense(my_hit.skill);
|
||||||
@ -3984,7 +3984,7 @@ bool Bot::Attack(Mob* other, int Hand, bool FromRiposte, bool IsStrikethrough, b
|
|||||||
|
|
||||||
DoAttack(other, my_hit, opts);
|
DoAttack(other, my_hit, opts);
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "Final damage after all reductions: %d", my_hit.damage_done);
|
Log(Logs::Detail, Logs::Combat, "Final damage after all reductions: %d", my_hit.damage_done);
|
||||||
} else {
|
} else {
|
||||||
my_hit.damage_done = DMG_INVULNERABLE;
|
my_hit.damage_done = DMG_INVULNERABLE;
|
||||||
}
|
}
|
||||||
@ -4595,7 +4595,7 @@ int32 Bot::CalcBotFocusEffect(BotfocusType bottype, uint16 focus_id, uint16 spel
|
|||||||
return 0;
|
return 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Log.Out(Logs::General, Logs::Normal, "CalcFocusEffect: unknown limit spelltype %d", focus_spell.base[i]);
|
Log(Logs::General, Logs::Normal, "CalcFocusEffect: unknown limit spelltype %d", focus_spell.base[i]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -4809,7 +4809,7 @@ int32 Bot::CalcBotFocusEffect(BotfocusType bottype, uint16 focus_id, uint16 spel
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
Log.Out(Logs::General, Logs::Spells, "CalcFocusEffect: unknown effectid %d", focus_spell.effectid[i]);
|
Log(Logs::General, Logs::Spells, "CalcFocusEffect: unknown effectid %d", focus_spell.effectid[i]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4849,7 +4849,7 @@ float Bot::GetProcChances(float ProcBonus, uint16 hand) {
|
|||||||
ProcChance += (ProcChance * ProcBonus / 100.0f);
|
ProcChance += (ProcChance * ProcBonus / 100.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "Proc chance %.2f (%.2f from bonuses)", ProcChance, ProcBonus);
|
Log(Logs::Detail, Logs::Combat, "Proc chance %.2f (%.2f from bonuses)", ProcChance, ProcBonus);
|
||||||
return ProcChance;
|
return ProcChance;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4903,13 +4903,13 @@ bool Bot::TryFinishingBlow(Mob *defender, int &damage)
|
|||||||
int fb_damage = aabonuses.FinishingBlow[1];
|
int fb_damage = aabonuses.FinishingBlow[1];
|
||||||
int levelreq = aabonuses.FinishingBlowLvl[0];
|
int levelreq = aabonuses.FinishingBlowLvl[0];
|
||||||
if (defender->GetLevel() <= levelreq && (chance >= zone->random.Int(1, 1000))) {
|
if (defender->GetLevel() <= levelreq && (chance >= zone->random.Int(1, 1000))) {
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "Landed a finishing blow: levelreq at %d, other level %d",
|
Log(Logs::Detail, Logs::Combat, "Landed a finishing blow: levelreq at %d, other level %d",
|
||||||
levelreq, defender->GetLevel());
|
levelreq, defender->GetLevel());
|
||||||
entity_list.MessageClose_StringID(this, false, 200, MT_CritMelee, FINISHING_BLOW, GetName());
|
entity_list.MessageClose_StringID(this, false, 200, MT_CritMelee, FINISHING_BLOW, GetName());
|
||||||
damage = fb_damage;
|
damage = fb_damage;
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "FAILED a finishing blow: levelreq at %d, other level %d",
|
Log(Logs::Detail, Logs::Combat, "FAILED a finishing blow: levelreq at %d, other level %d",
|
||||||
levelreq, defender->GetLevel());
|
levelreq, defender->GetLevel());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -4918,14 +4918,14 @@ bool Bot::TryFinishingBlow(Mob *defender, int &damage)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Bot::DoRiposte(Mob* defender) {
|
void Bot::DoRiposte(Mob* defender) {
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "Preforming a riposte");
|
Log(Logs::Detail, Logs::Combat, "Preforming a riposte");
|
||||||
if (!defender)
|
if (!defender)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
defender->Attack(this, EQEmu::inventory::slotPrimary, true);
|
defender->Attack(this, EQEmu::inventory::slotPrimary, true);
|
||||||
int32 DoubleRipChance = (defender->GetAABonuses().GiveDoubleRiposte[0] + defender->GetSpellBonuses().GiveDoubleRiposte[0] + defender->GetItemBonuses().GiveDoubleRiposte[0]);
|
int32 DoubleRipChance = (defender->GetAABonuses().GiveDoubleRiposte[0] + defender->GetSpellBonuses().GiveDoubleRiposte[0] + defender->GetItemBonuses().GiveDoubleRiposte[0]);
|
||||||
if(DoubleRipChance && (DoubleRipChance >= zone->random.Int(0, 100))) {
|
if(DoubleRipChance && (DoubleRipChance >= zone->random.Int(0, 100))) {
|
||||||
Log.Out(Logs::Detail, Logs::Combat, "Preforming a double riposte (%d percent chance)", DoubleRipChance);
|
Log(Logs::Detail, Logs::Combat, "Preforming a double riposte (%d percent chance)", DoubleRipChance);
|
||||||
defender->Attack(this, EQEmu::inventory::slotPrimary, true);
|
defender->Attack(this, EQEmu::inventory::slotPrimary, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5548,7 +5548,7 @@ int32 Bot::CalcMaxMana() {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
Log.Out(Logs::General, Logs::None, "Invalid Class '%c' in CalcMaxMana", GetCasterClass());
|
Log(Logs::General, Logs::None, "Invalid Class '%c' in CalcMaxMana", GetCasterClass());
|
||||||
max_mana = 0;
|
max_mana = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -5976,14 +5976,14 @@ bool Bot::CastSpell(uint16 spell_id, uint16 target_id, EQEmu::CastingSlot slot,
|
|||||||
uint32* oSpellWillFinish, uint32 item_slot, int16 *resist_adjust, uint32 aa_id) {
|
uint32* oSpellWillFinish, uint32 item_slot, int16 *resist_adjust, uint32 aa_id) {
|
||||||
bool Result = false;
|
bool Result = false;
|
||||||
if(zone && !zone->IsSpellBlocked(spell_id, glm::vec3(GetPosition()))) {
|
if(zone && !zone->IsSpellBlocked(spell_id, glm::vec3(GetPosition()))) {
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "CastSpell called for spell %s (%d) on entity %d, slot %d, time %d, mana %d, from item slot %d", spells[spell_id].name, spell_id, target_id, slot, cast_time, mana_cost, (item_slot==0xFFFFFFFF)?999:item_slot);
|
Log(Logs::Detail, Logs::Spells, "CastSpell called for spell %s (%d) on entity %d, slot %d, time %d, mana %d, from item slot %d", spells[spell_id].name, spell_id, target_id, slot, cast_time, mana_cost, (item_slot==0xFFFFFFFF)?999:item_slot);
|
||||||
|
|
||||||
if(casting_spell_id == spell_id)
|
if(casting_spell_id == spell_id)
|
||||||
ZeroCastingVars();
|
ZeroCastingVars();
|
||||||
|
|
||||||
if(GetClass() != BARD) {
|
if(GetClass() != BARD) {
|
||||||
if(!IsValidSpell(spell_id) || casting_spell_id || delaytimer || spellend_timer.Enabled() || IsStunned() || IsFeared() || IsMezzed() || (IsSilenced() && !IsDiscipline(spell_id)) || (IsAmnesiad() && IsDiscipline(spell_id))) {
|
if(!IsValidSpell(spell_id) || casting_spell_id || delaytimer || spellend_timer.Enabled() || IsStunned() || IsFeared() || IsMezzed() || (IsSilenced() && !IsDiscipline(spell_id)) || (IsAmnesiad() && IsDiscipline(spell_id))) {
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "Spell casting canceled: not able to cast now. Valid? %d, casting %d, waiting? %d, spellend? %d, stunned? %d, feared? %d, mezed? %d, silenced? %d", IsValidSpell(spell_id), casting_spell_id, delaytimer, spellend_timer.Enabled(), IsStunned(), IsFeared(), IsMezzed(), IsSilenced() );
|
Log(Logs::Detail, Logs::Spells, "Spell casting canceled: not able to cast now. Valid? %d, casting %d, waiting? %d, spellend? %d, stunned? %d, feared? %d, mezed? %d, silenced? %d", IsValidSpell(spell_id), casting_spell_id, delaytimer, spellend_timer.Enabled(), IsStunned(), IsFeared(), IsMezzed(), IsSilenced() );
|
||||||
if(IsSilenced() && !IsDiscipline(spell_id))
|
if(IsSilenced() && !IsDiscipline(spell_id))
|
||||||
Message_StringID(13, SILENCED_STRING);
|
Message_StringID(13, SILENCED_STRING);
|
||||||
|
|
||||||
@ -6007,7 +6007,7 @@ bool Bot::CastSpell(uint16 spell_id, uint16 target_id, EQEmu::CastingSlot slot,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(DivineAura()) {
|
if(DivineAura()) {
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "Spell casting canceled: cannot cast while Divine Aura is in effect.");
|
Log(Logs::Detail, Logs::Spells, "Spell casting canceled: cannot cast while Divine Aura is in effect.");
|
||||||
InterruptSpell(173, 0x121, false);
|
InterruptSpell(173, 0x121, false);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -6017,13 +6017,13 @@ bool Bot::CastSpell(uint16 spell_id, uint16 target_id, EQEmu::CastingSlot slot,
|
|||||||
InterruptSpell(fizzle_msg, 0x121, spell_id);
|
InterruptSpell(fizzle_msg, 0x121, spell_id);
|
||||||
|
|
||||||
uint32 use_mana = ((spells[spell_id].mana) / 4);
|
uint32 use_mana = ((spells[spell_id].mana) / 4);
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "Spell casting canceled: fizzled. %d mana has been consumed", use_mana);
|
Log(Logs::Detail, Logs::Spells, "Spell casting canceled: fizzled. %d mana has been consumed", use_mana);
|
||||||
SetMana(GetMana() - use_mana);
|
SetMana(GetMana() - use_mana);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HasActiveSong()) {
|
if (HasActiveSong()) {
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "Casting a new spell/song while singing a song. Killing old song %d.", bardsong);
|
Log(Logs::Detail, Logs::Spells, "Casting a new spell/song while singing a song. Killing old song %d.", bardsong);
|
||||||
bardsong = 0;
|
bardsong = 0;
|
||||||
bardsong_target_id = 0;
|
bardsong_target_id = 0;
|
||||||
bardsong_slot = EQEmu::CastingSlot::Gem1;
|
bardsong_slot = EQEmu::CastingSlot::Gem1;
|
||||||
@ -6137,19 +6137,19 @@ bool Bot::IsImmuneToSpell(uint16 spell_id, Mob *caster) {
|
|||||||
if(caster->IsBot()) {
|
if(caster->IsBot()) {
|
||||||
if(spells[spell_id].targettype == ST_Undead) {
|
if(spells[spell_id].targettype == ST_Undead) {
|
||||||
if((GetBodyType() != BT_SummonedUndead) && (GetBodyType() != BT_Undead) && (GetBodyType() != BT_Vampire)) {
|
if((GetBodyType() != BT_SummonedUndead) && (GetBodyType() != BT_Undead) && (GetBodyType() != BT_Vampire)) {
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "Bot's target is not an undead.");
|
Log(Logs::Detail, Logs::Spells, "Bot's target is not an undead.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(spells[spell_id].targettype == ST_Summoned) {
|
if(spells[spell_id].targettype == ST_Summoned) {
|
||||||
if((GetBodyType() != BT_SummonedUndead) && (GetBodyType() != BT_Summoned) && (GetBodyType() != BT_Summoned2) && (GetBodyType() != BT_Summoned3)) {
|
if((GetBodyType() != BT_SummonedUndead) && (GetBodyType() != BT_Summoned) && (GetBodyType() != BT_Summoned2) && (GetBodyType() != BT_Summoned3)) {
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "Bot's target is not a summoned creature.");
|
Log(Logs::Detail, Logs::Spells, "Bot's target is not a summoned creature.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "No bot immunities to spell %d found.", spell_id);
|
Log(Logs::Detail, Logs::Spells, "No bot immunities to spell %d found.", spell_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6300,7 +6300,7 @@ bool Bot::DoFinishedSpellSingleTarget(uint16 spell_id, Mob* spellTarget, EQEmu::
|
|||||||
if((spelltypeequal || spelltypetargetequal) || spelltypeclassequal || slotequal) {
|
if((spelltypeequal || spelltypetargetequal) || spelltypeclassequal || slotequal) {
|
||||||
if(((spells[thespell].effectid[0] == 0) && (spells[thespell].base[0] < 0)) &&
|
if(((spells[thespell].effectid[0] == 0) && (spells[thespell].base[0] < 0)) &&
|
||||||
(spellTarget->GetHP() < ((spells[thespell].base[0] * (-1)) + 100))) {
|
(spellTarget->GetHP() < ((spells[thespell].base[0] * (-1)) + 100))) {
|
||||||
Log.Out(Logs::General, Logs::Spells, "Bot::DoFinishedSpellSingleTarget - GroupBuffing failure");
|
Log(Logs::General, Logs::Spells, "Bot::DoFinishedSpellSingleTarget - GroupBuffing failure");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7807,7 +7807,7 @@ bool Bot::CheckLoreConflict(const EQEmu::ItemData* item) {
|
|||||||
|
|
||||||
bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, float iRange, uint32 iSpellTypes) {
|
bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, float iRange, uint32 iSpellTypes) {
|
||||||
if((iSpellTypes&SpellTypes_Detrimental) != 0) {
|
if((iSpellTypes&SpellTypes_Detrimental) != 0) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Error: detrimental spells requested from AICheckCloseBeneficialSpells!!");
|
Log(Logs::General, Logs::Error, "Error: detrimental spells requested from AICheckCloseBeneficialSpells!!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -454,7 +454,7 @@ public:
|
|||||||
|
|
||||||
if (target_type == BCEnum::TT_Self && (entry_prototype->BCST() != BCEnum::SpT_Stance && entry_prototype->BCST() != BCEnum::SpT_SummonCorpse)) {
|
if (target_type == BCEnum::TT_Self && (entry_prototype->BCST() != BCEnum::SpT_Stance && entry_prototype->BCST() != BCEnum::SpT_SummonCorpse)) {
|
||||||
#ifdef BCSTSPELLDUMP
|
#ifdef BCSTSPELLDUMP
|
||||||
Log.Out(Logs::General, Logs::Error, "DELETING entry_prototype (primary clause) - name: %s, target_type: %s, BCST: %s",
|
Log(Logs::General, Logs::Error, "DELETING entry_prototype (primary clause) - name: %s, target_type: %s, BCST: %s",
|
||||||
spells[spell_id].name, BCEnum::TargetTypeEnumToString(target_type).c_str(), BCEnum::SpellTypeEnumToString(entry_prototype->BCST()).c_str());
|
spells[spell_id].name, BCEnum::TargetTypeEnumToString(target_type).c_str(), BCEnum::SpellTypeEnumToString(entry_prototype->BCST()).c_str());
|
||||||
#endif
|
#endif
|
||||||
safe_delete(entry_prototype);
|
safe_delete(entry_prototype);
|
||||||
@ -462,7 +462,7 @@ public:
|
|||||||
}
|
}
|
||||||
if (entry_prototype->BCST() == BCEnum::SpT_Stance && target_type != BCEnum::TT_Self) {
|
if (entry_prototype->BCST() == BCEnum::SpT_Stance && target_type != BCEnum::TT_Self) {
|
||||||
#ifdef BCSTSPELLDUMP
|
#ifdef BCSTSPELLDUMP
|
||||||
Log.Out(Logs::General, Logs::Error, "DELETING entry_prototype (secondary clause) - name: %s, BCST: %s, target_type: %s",
|
Log(Logs::General, Logs::Error, "DELETING entry_prototype (secondary clause) - name: %s, BCST: %s, target_type: %s",
|
||||||
spells[spell_id].name, BCEnum::SpellTypeEnumToString(entry_prototype->BCST()).c_str(), BCEnum::TargetTypeEnumToString(target_type).c_str());
|
spells[spell_id].name, BCEnum::SpellTypeEnumToString(entry_prototype->BCST()).c_str(), BCEnum::TargetTypeEnumToString(target_type).c_str());
|
||||||
#endif
|
#endif
|
||||||
safe_delete(entry_prototype);
|
safe_delete(entry_prototype);
|
||||||
@ -1061,7 +1061,7 @@ private:
|
|||||||
std::string query = "SELECT `short_name`, `long_name` FROM `zone` WHERE '' NOT IN (`short_name`, `long_name`)";
|
std::string query = "SELECT `short_name`, `long_name` FROM `zone` WHERE '' NOT IN (`short_name`, `long_name`)";
|
||||||
auto results = database.QueryDatabase(query);
|
auto results = database.QueryDatabase(query);
|
||||||
if (!results.Success()) {
|
if (!results.Success()) {
|
||||||
Log.Out(Logs::General, Logs::Error, "load_teleport_zone_names() - Error in zone names query: %s", results.ErrorMessage().c_str());
|
Log(Logs::General, Logs::Error, "load_teleport_zone_names() - Error in zone names query: %s", results.ErrorMessage().c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1088,14 +1088,14 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void status_report() {
|
static void status_report() {
|
||||||
Log.Out(Logs::General, Logs::Commands, "load_bot_command_spells(): - 'RuleI(Bots, CommandSpellRank)' set to %i.", RuleI(Bots, CommandSpellRank));
|
Log(Logs::General, Logs::Commands, "load_bot_command_spells(): - 'RuleI(Bots, CommandSpellRank)' set to %i.", RuleI(Bots, CommandSpellRank));
|
||||||
if (bot_command_spells.empty()) {
|
if (bot_command_spells.empty()) {
|
||||||
Log.Out(Logs::General, Logs::Error, "load_bot_command_spells() - 'bot_command_spells' is empty.");
|
Log(Logs::General, Logs::Error, "load_bot_command_spells() - 'bot_command_spells' is empty.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = BCEnum::SpellTypeFirst; i <= BCEnum::SpellTypeLast; ++i)
|
for (int i = BCEnum::SpellTypeFirst; i <= BCEnum::SpellTypeLast; ++i)
|
||||||
Log.Out(Logs::General, Logs::Commands, "load_bot_command_spells(): - '%s' returned %u spell entries.",
|
Log(Logs::General, Logs::Commands, "load_bot_command_spells(): - '%s' returned %u spell entries.",
|
||||||
BCEnum::SpellTypeEnumToString(static_cast<BCEnum::SpType>(i)).c_str(), bot_command_spells[static_cast<BCEnum::SpType>(i)].size());
|
BCEnum::SpellTypeEnumToString(static_cast<BCEnum::SpType>(i)).c_str(), bot_command_spells[static_cast<BCEnum::SpType>(i)].size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1428,12 +1428,12 @@ int bot_command_init(void)
|
|||||||
auto bot_command_settings_iter = bot_command_settings.find(working_bcl_iter.first);
|
auto bot_command_settings_iter = bot_command_settings.find(working_bcl_iter.first);
|
||||||
if (bot_command_settings_iter == bot_command_settings.end()) {
|
if (bot_command_settings_iter == bot_command_settings.end()) {
|
||||||
if (working_bcl_iter.second->access == 0)
|
if (working_bcl_iter.second->access == 0)
|
||||||
Log.Out(Logs::General, Logs::Commands, "bot_command_init(): Warning: Bot Command '%s' defaulting to access level 0!", working_bcl_iter.first.c_str());
|
Log(Logs::General, Logs::Commands, "bot_command_init(): Warning: Bot Command '%s' defaulting to access level 0!", working_bcl_iter.first.c_str());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
working_bcl_iter.second->access = bot_command_settings_iter->second.first;
|
working_bcl_iter.second->access = bot_command_settings_iter->second.first;
|
||||||
Log.Out(Logs::General, Logs::Commands, "bot_command_init(): - Bot Command '%s' set to access level %d.", working_bcl_iter.first.c_str(), bot_command_settings_iter->second.first);
|
Log(Logs::General, Logs::Commands, "bot_command_init(): - Bot Command '%s' set to access level %d.", working_bcl_iter.first.c_str(), bot_command_settings_iter->second.first);
|
||||||
if (bot_command_settings_iter->second.second.empty())
|
if (bot_command_settings_iter->second.second.empty())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -1441,14 +1441,14 @@ int bot_command_init(void)
|
|||||||
if (alias_iter.empty())
|
if (alias_iter.empty())
|
||||||
continue;
|
continue;
|
||||||
if (bot_command_list.find(alias_iter) != bot_command_list.end()) {
|
if (bot_command_list.find(alias_iter) != bot_command_list.end()) {
|
||||||
Log.Out(Logs::General, Logs::Commands, "bot_command_init(): Warning: Alias '%s' already exists as a bot command - skipping!", alias_iter.c_str());
|
Log(Logs::General, Logs::Commands, "bot_command_init(): Warning: Alias '%s' already exists as a bot command - skipping!", alias_iter.c_str());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
bot_command_list[alias_iter] = working_bcl_iter.second;
|
bot_command_list[alias_iter] = working_bcl_iter.second;
|
||||||
bot_command_aliases[alias_iter] = working_bcl_iter.first;
|
bot_command_aliases[alias_iter] = working_bcl_iter.first;
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Commands, "bot_command_init(): - Alias '%s' added to bot command '%s'.", alias_iter.c_str(), bot_command_aliases[alias_iter].c_str());
|
Log(Logs::General, Logs::Commands, "bot_command_init(): - Alias '%s' added to bot command '%s'.", alias_iter.c_str(), bot_command_aliases[alias_iter].c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1494,21 +1494,21 @@ void bot_command_deinit(void)
|
|||||||
int bot_command_add(std::string bot_command_name, const char *desc, int access, BotCmdFuncPtr function)
|
int bot_command_add(std::string bot_command_name, const char *desc, int access, BotCmdFuncPtr function)
|
||||||
{
|
{
|
||||||
if (bot_command_name.empty()) {
|
if (bot_command_name.empty()) {
|
||||||
Log.Out(Logs::General, Logs::Error, "bot_command_add() - Bot command added with empty name string - check bot_command.cpp.");
|
Log(Logs::General, Logs::Error, "bot_command_add() - Bot command added with empty name string - check bot_command.cpp.");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (function == nullptr) {
|
if (function == nullptr) {
|
||||||
Log.Out(Logs::General, Logs::Error, "bot_command_add() - Bot command '%s' added without a valid function pointer - check bot_command.cpp.", bot_command_name.c_str());
|
Log(Logs::General, Logs::Error, "bot_command_add() - Bot command '%s' added without a valid function pointer - check bot_command.cpp.", bot_command_name.c_str());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (bot_command_list.count(bot_command_name) != 0) {
|
if (bot_command_list.count(bot_command_name) != 0) {
|
||||||
Log.Out(Logs::General, Logs::Error, "bot_command_add() - Bot command '%s' is a duplicate bot command name - check bot_command.cpp.", bot_command_name.c_str());
|
Log(Logs::General, Logs::Error, "bot_command_add() - Bot command '%s' is a duplicate bot command name - check bot_command.cpp.", bot_command_name.c_str());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
for (auto iter : bot_command_list) {
|
for (auto iter : bot_command_list) {
|
||||||
if (iter.second->function != function)
|
if (iter.second->function != function)
|
||||||
continue;
|
continue;
|
||||||
Log.Out(Logs::General, Logs::Error, "bot_command_add() - Bot command '%s' equates to an alias of '%s' - check bot_command.cpp.", bot_command_name.c_str(), iter.first.c_str());
|
Log(Logs::General, Logs::Error, "bot_command_add() - Bot command '%s' equates to an alias of '%s' - check bot_command.cpp.", bot_command_name.c_str(), iter.first.c_str());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1563,11 +1563,11 @@ int bot_command_real_dispatch(Client *c, const char *message)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(cur->access >= COMMANDS_LOGGING_MIN_STATUS) {
|
if(cur->access >= COMMANDS_LOGGING_MIN_STATUS) {
|
||||||
Log.Out(Logs::General, Logs::Commands, "%s (%s) used bot command: %s (target=%s)", c->GetName(), c->AccountName(), message, c->GetTarget()?c->GetTarget()->GetName():"NONE");
|
Log(Logs::General, Logs::Commands, "%s (%s) used bot command: %s (target=%s)", c->GetName(), c->AccountName(), message, c->GetTarget()?c->GetTarget()->GetName():"NONE");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(cur->function == nullptr) {
|
if(cur->function == nullptr) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Bot command '%s' has a null function\n", cstr.c_str());
|
Log(Logs::General, Logs::Error, "Bot command '%s' has a null function\n", cstr.c_str());
|
||||||
return(-1);
|
return(-1);
|
||||||
} else {
|
} else {
|
||||||
//dispatch C++ bot command
|
//dispatch C++ bot command
|
||||||
@ -3500,7 +3500,7 @@ void bot_command_pick_lock(Client *c, const Seperator *sep)
|
|||||||
float curelev = (diff.z * diff.z);
|
float curelev = (diff.z * diff.z);
|
||||||
#if (EQDEBUG >= 11)
|
#if (EQDEBUG >= 11)
|
||||||
if (curdist <= 130 && curelev <= 65 && curelev >= 25) // 2D limit is '130' (x^2 + y^2), 1D theoretically should be '65' (z^2)
|
if (curdist <= 130 && curelev <= 65 && curelev >= 25) // 2D limit is '130' (x^2 + y^2), 1D theoretically should be '65' (z^2)
|
||||||
Log.Out(Logs::Detail, Logs::Doors, "bot_command_pick_lock(): DoorID: %i - Elevation difference failure within theoretical limit (%f <= 65.0)", door_iter->GetDoorID(), curelev);
|
Log(Logs::Detail, Logs::Doors, "bot_command_pick_lock(): DoorID: %i - Elevation difference failure within theoretical limit (%f <= 65.0)", door_iter->GetDoorID(), curelev);
|
||||||
#endif
|
#endif
|
||||||
if (curelev >= 25 || curdist > 130) // changed curelev from '10' to '25' - requiring diff.z to be less than '5'
|
if (curelev >= 25 || curdist > 130) // changed curelev from '10' to '25' - requiring diff.z to be less than '5'
|
||||||
continue;
|
continue;
|
||||||
@ -4188,7 +4188,7 @@ void bot_subcommand_bot_clone(Client *c, const Seperator *sep)
|
|||||||
}
|
}
|
||||||
if (!my_bot->GetBotID()) {
|
if (!my_bot->GetBotID()) {
|
||||||
c->Message(m_unknown, "An unknown error has occured - BotName: %s, BotID: %u", my_bot->GetCleanName(), my_bot->GetBotID());
|
c->Message(m_unknown, "An unknown error has occured - BotName: %s, BotID: %u", my_bot->GetCleanName(), my_bot->GetBotID());
|
||||||
Log.Out(Logs::General, Logs::Commands, "bot_command_clone(): - Error: Active bot reported invalid ID (BotName: %s, BotID: %u, OwnerName: %s, OwnerID: %u, AcctName: %s, AcctID: %u)",
|
Log(Logs::General, Logs::Commands, "bot_command_clone(): - Error: Active bot reported invalid ID (BotName: %s, BotID: %u, OwnerName: %s, OwnerID: %u, AcctName: %s, AcctID: %u)",
|
||||||
my_bot->GetCleanName(), my_bot->GetBotID(), c->GetCleanName(), c->CharacterID(), c->AccountName(), c->AccountID());
|
my_bot->GetCleanName(), my_bot->GetBotID(), c->GetCleanName(), c->CharacterID(), c->AccountName(), c->AccountID());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -49,11 +49,11 @@ bool BotDatabase::Connect(const char* host, const char* user, const char* passwd
|
|||||||
uint32 errnum = 0;
|
uint32 errnum = 0;
|
||||||
char errbuf[MYSQL_ERRMSG_SIZE];
|
char errbuf[MYSQL_ERRMSG_SIZE];
|
||||||
if (!Open(host, user, passwd, database, port, &errnum, errbuf)) {
|
if (!Open(host, user, passwd, database, port, &errnum, errbuf)) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Failed to connect to bot database: Error: %s", errbuf);
|
Log(Logs::General, Logs::Error, "Failed to connect to bot database: Error: %s", errbuf);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Log.Out(Logs::General, Logs::Status, "Using bot database '%s' at %s:%d", database, host, port);
|
Log(Logs::General, Logs::Status, "Using bot database '%s' at %s:%d", database, host, port);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1143,7 +1143,7 @@ bool BotDatabase::LoadItems(const uint32 bot_id, EQEmu::InventoryProfile& invent
|
|||||||
(uint32)atoul(row[14])
|
(uint32)atoul(row[14])
|
||||||
);
|
);
|
||||||
if (!item_inst) {
|
if (!item_inst) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Warning: bot_id '%i' has an invalid item_id '%i' in inventory slot '%i'", bot_id, item_id, slot_id);
|
Log(Logs::General, Logs::Error, "Warning: bot_id '%i' has an invalid item_id '%i' in inventory slot '%i'", bot_id, item_id, slot_id);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1196,7 +1196,7 @@ bool BotDatabase::LoadItems(const uint32 bot_id, EQEmu::InventoryProfile& invent
|
|||||||
item_inst->SetOrnamentHeroModel((uint32)atoul(row[8]));
|
item_inst->SetOrnamentHeroModel((uint32)atoul(row[8]));
|
||||||
|
|
||||||
if (inventory_inst.PutItem(slot_id, *item_inst) == INVALID_INDEX)
|
if (inventory_inst.PutItem(slot_id, *item_inst) == INVALID_INDEX)
|
||||||
Log.Out(Logs::General, Logs::Error, "Warning: Invalid slot_id for item in inventory: bot_id = '%i', item_id = '%i', slot_id = '%i'", bot_id, item_id, slot_id);
|
Log(Logs::General, Logs::Error, "Warning: Invalid slot_id for item in inventory: bot_id = '%i', item_id = '%i', slot_id = '%i'", bot_id, item_id, slot_id);
|
||||||
|
|
||||||
safe_delete(item_inst);
|
safe_delete(item_inst);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1137,7 +1137,7 @@ bool Bot::AI_PursueCastCheck() {
|
|||||||
|
|
||||||
AIautocastspell_timer->Disable(); //prevent the timer from going off AGAIN while we are casting.
|
AIautocastspell_timer->Disable(); //prevent the timer from going off AGAIN while we are casting.
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::AI, "Bot Engaged (pursuing) autocast check triggered. Trying to cast offensive spells.");
|
Log(Logs::Detail, Logs::AI, "Bot Engaged (pursuing) autocast check triggered. Trying to cast offensive spells.");
|
||||||
|
|
||||||
if(!AICastSpell(GetTarget(), 100, SpellType_Snare)) {
|
if(!AICastSpell(GetTarget(), 100, SpellType_Snare)) {
|
||||||
if(!AICastSpell(GetTarget(), 100, SpellType_Lifetap)) {
|
if(!AICastSpell(GetTarget(), 100, SpellType_Lifetap)) {
|
||||||
@ -1165,7 +1165,7 @@ bool Bot::AI_IdleCastCheck() {
|
|||||||
|
|
||||||
if (AIautocastspell_timer->Check(false)) {
|
if (AIautocastspell_timer->Check(false)) {
|
||||||
#if BotAI_DEBUG_Spells >= 25
|
#if BotAI_DEBUG_Spells >= 25
|
||||||
Log.Out(Logs::Detail, Logs::AI, "Bot Non-Engaged autocast check triggered: %s", this->GetCleanName());
|
Log(Logs::Detail, Logs::AI, "Bot Non-Engaged autocast check triggered: %s", this->GetCleanName());
|
||||||
#endif
|
#endif
|
||||||
AIautocastspell_timer->Disable(); //prevent the timer from going off AGAIN while we are casting.
|
AIautocastspell_timer->Disable(); //prevent the timer from going off AGAIN while we are casting.
|
||||||
|
|
||||||
@ -1313,7 +1313,7 @@ bool Bot::AI_EngagedCastCheck() {
|
|||||||
BotStanceType botStance = GetBotStance();
|
BotStanceType botStance = GetBotStance();
|
||||||
bool mayGetAggro = HasOrMayGetAggro();
|
bool mayGetAggro = HasOrMayGetAggro();
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::AI, "Engaged autocast check triggered (BOTS). Trying to cast healing spells then maybe offensive spells.");
|
Log(Logs::Detail, Logs::AI, "Engaged autocast check triggered (BOTS). Trying to cast healing spells then maybe offensive spells.");
|
||||||
|
|
||||||
if(botClass == CLERIC) {
|
if(botClass == CLERIC) {
|
||||||
if(!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) {
|
if(!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) {
|
||||||
@ -1563,11 +1563,11 @@ bool Bot::AIHealRotation(Mob* tar, bool useFastHeals) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if BotAI_DEBUG_Spells >= 10
|
#if BotAI_DEBUG_Spells >= 10
|
||||||
Log.Out(Logs::Detail, Logs::AI, "Bot::AIHealRotation: heal spellid = %u, fastheals = %c, casterlevel = %u",
|
Log(Logs::Detail, Logs::AI, "Bot::AIHealRotation: heal spellid = %u, fastheals = %c, casterlevel = %u",
|
||||||
botSpell.SpellId, ((useFastHeals) ? ('T') : ('F')), GetLevel());
|
botSpell.SpellId, ((useFastHeals) ? ('T') : ('F')), GetLevel());
|
||||||
#endif
|
#endif
|
||||||
#if BotAI_DEBUG_Spells >= 25
|
#if BotAI_DEBUG_Spells >= 25
|
||||||
Log.Out(Logs::Detail, Logs::AI, "Bot::AIHealRotation: target = %s, current_time = %u, donthealmebefore = %u", tar->GetCleanName(), Timer::GetCurrentTime(), tar->DontHealMeBefore());
|
Log(Logs::Detail, Logs::AI, "Bot::AIHealRotation: target = %s, current_time = %u, donthealmebefore = %u", tar->GetCleanName(), Timer::GetCurrentTime(), tar->DontHealMeBefore());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// If there is still no spell id, then there isn't going to be one so we are done
|
// If there is still no spell id, then there isn't going to be one so we are done
|
||||||
|
|||||||
104
zone/client.cpp
104
zone/client.cpp
@ -135,7 +135,7 @@ Client::Client(EQStreamInterface* ieqs)
|
|||||||
forget_timer(0),
|
forget_timer(0),
|
||||||
autosave_timer(RuleI(Character, AutosaveIntervalS) * 1000),
|
autosave_timer(RuleI(Character, AutosaveIntervalS) * 1000),
|
||||||
#ifdef REVERSE_AGGRO
|
#ifdef REVERSE_AGGRO
|
||||||
scanarea_timer(RuleI(Aggro, ClientAggroCheckInterval) * 1000),
|
client_scan_npc_aggro_timer(RuleI(Aggro, ClientAggroCheckInterval) * 1000),
|
||||||
#endif
|
#endif
|
||||||
tribute_timer(Tribute_duration),
|
tribute_timer(Tribute_duration),
|
||||||
proximity_timer(ClientProximity_interval),
|
proximity_timer(ClientProximity_interval),
|
||||||
@ -153,14 +153,14 @@ Client::Client(EQStreamInterface* ieqs)
|
|||||||
anon_toggle_timer(250),
|
anon_toggle_timer(250),
|
||||||
afk_toggle_timer(250),
|
afk_toggle_timer(250),
|
||||||
helm_toggle_timer(250),
|
helm_toggle_timer(250),
|
||||||
light_update_timer(600),
|
|
||||||
aggro_meter_timer(AGGRO_METER_UPDATE_MS),
|
aggro_meter_timer(AGGRO_METER_UPDATE_MS),
|
||||||
m_Proximity(FLT_MAX, FLT_MAX, FLT_MAX), //arbitrary large number
|
m_Proximity(FLT_MAX, FLT_MAX, FLT_MAX), //arbitrary large number
|
||||||
m_ZoneSummonLocation(-2.0f,-2.0f,-2.0f),
|
m_ZoneSummonLocation(-2.0f,-2.0f,-2.0f),
|
||||||
m_AutoAttackPosition(0.0f, 0.0f, 0.0f, 0.0f),
|
m_AutoAttackPosition(0.0f, 0.0f, 0.0f, 0.0f),
|
||||||
m_AutoAttackTargetLocation(0.0f, 0.0f, 0.0f),
|
m_AutoAttackTargetLocation(0.0f, 0.0f, 0.0f),
|
||||||
last_region_type(RegionTypeUnsupported),
|
last_region_type(RegionTypeUnsupported),
|
||||||
m_dirtyautohaters(false)
|
m_dirtyautohaters(false),
|
||||||
|
npc_close_scan_timer(6000)
|
||||||
{
|
{
|
||||||
for(int cf=0; cf < _FilterCount; cf++)
|
for(int cf=0; cf < _FilterCount; cf++)
|
||||||
ClientFilters[cf] = FilterShow;
|
ClientFilters[cf] = FilterShow;
|
||||||
@ -176,6 +176,7 @@ Client::Client(EQStreamInterface* ieqs)
|
|||||||
client_state = CLIENT_CONNECTING;
|
client_state = CLIENT_CONNECTING;
|
||||||
Trader=false;
|
Trader=false;
|
||||||
Buyer = false;
|
Buyer = false;
|
||||||
|
Haste = 0;
|
||||||
CustomerID = 0;
|
CustomerID = 0;
|
||||||
TraderID = 0;
|
TraderID = 0;
|
||||||
TrackingID = 0;
|
TrackingID = 0;
|
||||||
@ -349,7 +350,7 @@ Client::~Client() {
|
|||||||
ToggleBuyerMode(false);
|
ToggleBuyerMode(false);
|
||||||
|
|
||||||
if(conn_state != ClientConnectFinished) {
|
if(conn_state != ClientConnectFinished) {
|
||||||
Log.Out(Logs::General, Logs::None, "Client '%s' was destroyed before reaching the connected state:", GetName());
|
Log(Logs::General, Logs::None, "Client '%s' was destroyed before reaching the connected state:", GetName());
|
||||||
ReportConnectingState();
|
ReportConnectingState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -358,6 +359,8 @@ Client::~Client() {
|
|||||||
m_tradeskill_object = nullptr;
|
m_tradeskill_object = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
close_npcs.clear();
|
||||||
|
|
||||||
if(IsDueling() && GetDuelTarget() != 0) {
|
if(IsDueling() && GetDuelTarget() != 0) {
|
||||||
Entity* entity = entity_list.GetID(GetDuelTarget());
|
Entity* entity = entity_list.GetID(GetDuelTarget());
|
||||||
if(entity != nullptr && entity->IsClient()) {
|
if(entity != nullptr && entity->IsClient()) {
|
||||||
@ -508,31 +511,31 @@ void Client::SendLogoutPackets() {
|
|||||||
void Client::ReportConnectingState() {
|
void Client::ReportConnectingState() {
|
||||||
switch(conn_state) {
|
switch(conn_state) {
|
||||||
case NoPacketsReceived: //havent gotten anything
|
case NoPacketsReceived: //havent gotten anything
|
||||||
Log.Out(Logs::General, Logs::None, "Client has not sent us an initial zone entry packet.");
|
Log(Logs::General, Logs::None, "Client has not sent us an initial zone entry packet.");
|
||||||
break;
|
break;
|
||||||
case ReceivedZoneEntry: //got the first packet, loading up PP
|
case ReceivedZoneEntry: //got the first packet, loading up PP
|
||||||
Log.Out(Logs::General, Logs::None, "Client sent initial zone packet, but we never got their player info from the database.");
|
Log(Logs::General, Logs::None, "Client sent initial zone packet, but we never got their player info from the database.");
|
||||||
break;
|
break;
|
||||||
case PlayerProfileLoaded: //our DB work is done, sending it
|
case PlayerProfileLoaded: //our DB work is done, sending it
|
||||||
Log.Out(Logs::General, Logs::None, "We were sending the player profile, tributes, tasks, spawns, time and weather, but never finished.");
|
Log(Logs::General, Logs::None, "We were sending the player profile, tributes, tasks, spawns, time and weather, but never finished.");
|
||||||
break;
|
break;
|
||||||
case ZoneInfoSent: //includes PP, tributes, tasks, spawns, time and weather
|
case ZoneInfoSent: //includes PP, tributes, tasks, spawns, time and weather
|
||||||
Log.Out(Logs::General, Logs::None, "We successfully sent player info and spawns, waiting for client to request new zone.");
|
Log(Logs::General, Logs::None, "We successfully sent player info and spawns, waiting for client to request new zone.");
|
||||||
break;
|
break;
|
||||||
case NewZoneRequested: //received and sent new zone request
|
case NewZoneRequested: //received and sent new zone request
|
||||||
Log.Out(Logs::General, Logs::None, "We received client's new zone request, waiting for client spawn request.");
|
Log(Logs::General, Logs::None, "We received client's new zone request, waiting for client spawn request.");
|
||||||
break;
|
break;
|
||||||
case ClientSpawnRequested: //client sent ReqClientSpawn
|
case ClientSpawnRequested: //client sent ReqClientSpawn
|
||||||
Log.Out(Logs::General, Logs::None, "We received the client spawn request, and were sending objects, doors, zone points and some other stuff, but never finished.");
|
Log(Logs::General, Logs::None, "We received the client spawn request, and were sending objects, doors, zone points and some other stuff, but never finished.");
|
||||||
break;
|
break;
|
||||||
case ZoneContentsSent: //objects, doors, zone points
|
case ZoneContentsSent: //objects, doors, zone points
|
||||||
Log.Out(Logs::General, Logs::None, "The rest of the zone contents were successfully sent, waiting for client ready notification.");
|
Log(Logs::General, Logs::None, "The rest of the zone contents were successfully sent, waiting for client ready notification.");
|
||||||
break;
|
break;
|
||||||
case ClientReadyReceived: //client told us its ready, send them a bunch of crap like guild MOTD, etc
|
case ClientReadyReceived: //client told us its ready, send them a bunch of crap like guild MOTD, etc
|
||||||
Log.Out(Logs::General, Logs::None, "We received client ready notification, but never finished Client::CompleteConnect");
|
Log(Logs::General, Logs::None, "We received client ready notification, but never finished Client::CompleteConnect");
|
||||||
break;
|
break;
|
||||||
case ClientConnectFinished: //client finally moved to finished state, were done here
|
case ClientConnectFinished: //client finally moved to finished state, were done here
|
||||||
Log.Out(Logs::General, Logs::None, "Client is successfully connected.");
|
Log(Logs::General, Logs::None, "Client is successfully connected.");
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -733,7 +736,7 @@ bool Client::SendAllPackets() {
|
|||||||
if(eqs)
|
if(eqs)
|
||||||
eqs->FastQueuePacket((EQApplicationPacket **)&cp->app, cp->ack_req);
|
eqs->FastQueuePacket((EQApplicationPacket **)&cp->app, cp->ack_req);
|
||||||
iterator.RemoveCurrent();
|
iterator.RemoveCurrent();
|
||||||
Log.Out(Logs::Moderate, Logs::Client_Server_Packet, "Transmitting a packet");
|
Log(Logs::Moderate, Logs::Client_Server_Packet, "Transmitting a packet");
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -781,7 +784,7 @@ void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_s
|
|||||||
char message[4096];
|
char message[4096];
|
||||||
strn0cpy(message, orig_message, sizeof(message));
|
strn0cpy(message, orig_message, sizeof(message));
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Zone_Server, "Client::ChannelMessageReceived() Channel:%i message:'%s'", chan_num, message);
|
Log(Logs::Detail, Logs::Zone_Server, "Client::ChannelMessageReceived() Channel:%i message:'%s'", chan_num, message);
|
||||||
|
|
||||||
if (targetname == nullptr) {
|
if (targetname == nullptr) {
|
||||||
targetname = (!GetTarget()) ? "" : GetTarget()->GetName();
|
targetname = (!GetTarget()) ? "" : GetTarget()->GetName();
|
||||||
@ -1216,7 +1219,7 @@ void Client::ChannelMessageSend(const char* from, const char* to, uint8 chan_num
|
|||||||
QueuePacket(&app);
|
QueuePacket(&app);
|
||||||
|
|
||||||
if ((chan_num == 2) && (ListenerSkill < 100)) { // group message in unmastered language, check for skill up
|
if ((chan_num == 2) && (ListenerSkill < 100)) { // group message in unmastered language, check for skill up
|
||||||
if ((m_pp.languages[language] <= lang_skill) && (from != this->GetName()))
|
if (m_pp.languages[language] <= lang_skill)
|
||||||
CheckLanguageSkillIncrease(language, lang_skill);
|
CheckLanguageSkillIncrease(language, lang_skill);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1607,7 +1610,7 @@ void Client::UpdateAdmin(bool iFromDB) {
|
|||||||
|
|
||||||
if(m_pp.gm)
|
if(m_pp.gm)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Moderate, Logs::Zone_Server, "%s - %s is a GM", __FUNCTION__ , GetName());
|
Log(Logs::Moderate, Logs::Zone_Server, "%s - %s is a GM", __FUNCTION__ , GetName());
|
||||||
// no need for this, having it set in pp you already start as gm
|
// no need for this, having it set in pp you already start as gm
|
||||||
// and it's also set in your spawn packet so other people see it too
|
// and it's also set in your spawn packet so other people see it too
|
||||||
// SendAppearancePacket(AT_GM, 1, false);
|
// SendAppearancePacket(AT_GM, 1, false);
|
||||||
@ -2015,7 +2018,7 @@ void Client::ReadBook(BookRequest_Struct *book) {
|
|||||||
|
|
||||||
if (booktxt2[0] != '\0') {
|
if (booktxt2[0] != '\0') {
|
||||||
#if EQDEBUG >= 6
|
#if EQDEBUG >= 6
|
||||||
Log.Out(Logs::General, Logs::Normal, "Client::ReadBook() textfile:%s Text:%s", txtfile, booktxt2.c_str());
|
Log(Logs::General, Logs::Normal, "Client::ReadBook() textfile:%s Text:%s", txtfile, booktxt2.c_str());
|
||||||
#endif
|
#endif
|
||||||
auto outapp = new EQApplicationPacket(OP_ReadBook, length + sizeof(BookText_Struct));
|
auto outapp = new EQApplicationPacket(OP_ReadBook, length + sizeof(BookText_Struct));
|
||||||
|
|
||||||
@ -2235,7 +2238,7 @@ void Client::AddMoneyToPP(uint64 copper, bool updateclient){
|
|||||||
|
|
||||||
SaveCurrency();
|
SaveCurrency();
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::None, "Client::AddMoneyToPP() %s should have: plat:%i gold:%i silver:%i copper:%i", GetName(), m_pp.platinum, m_pp.gold, m_pp.silver, m_pp.copper);
|
Log(Logs::General, Logs::None, "Client::AddMoneyToPP() %s should have: plat:%i gold:%i silver:%i copper:%i", GetName(), m_pp.platinum, m_pp.gold, m_pp.silver, m_pp.copper);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::EVENT_ITEM_ScriptStopReturn(){
|
void Client::EVENT_ITEM_ScriptStopReturn(){
|
||||||
@ -2275,7 +2278,7 @@ void Client::AddMoneyToPP(uint32 copper, uint32 silver, uint32 gold, uint32 plat
|
|||||||
SaveCurrency();
|
SaveCurrency();
|
||||||
|
|
||||||
#if (EQDEBUG>=5)
|
#if (EQDEBUG>=5)
|
||||||
Log.Out(Logs::General, Logs::None, "Client::AddMoneyToPP() %s should have: plat:%i gold:%i silver:%i copper:%i",
|
Log(Logs::General, Logs::None, "Client::AddMoneyToPP() %s should have: plat:%i gold:%i silver:%i copper:%i",
|
||||||
GetName(), m_pp.platinum, m_pp.gold, m_pp.silver, m_pp.copper);
|
GetName(), m_pp.platinum, m_pp.gold, m_pp.silver, m_pp.copper);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -2365,13 +2368,13 @@ bool Client::CheckIncreaseSkill(EQEmu::skills::SkillType skillid, Mob *against_w
|
|||||||
if(zone->random.Real(0, 99) < Chance)
|
if(zone->random.Real(0, 99) < Chance)
|
||||||
{
|
{
|
||||||
SetSkill(skillid, GetRawSkill(skillid) + 1);
|
SetSkill(skillid, GetRawSkill(skillid) + 1);
|
||||||
Log.Out(Logs::Detail, Logs::Skills, "Skill %d at value %d successfully gain with %d%%chance (mod %d)", skillid, skillval, Chance, chancemodi);
|
Log(Logs::Detail, Logs::Skills, "Skill %d at value %d successfully gain with %d%%chance (mod %d)", skillid, skillval, Chance, chancemodi);
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
Log.Out(Logs::Detail, Logs::Skills, "Skill %d at value %d failed to gain with %d%%chance (mod %d)", skillid, skillval, Chance, chancemodi);
|
Log(Logs::Detail, Logs::Skills, "Skill %d at value %d failed to gain with %d%%chance (mod %d)", skillid, skillval, Chance, chancemodi);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Log.Out(Logs::Detail, Logs::Skills, "Skill %d at value %d cannot increase due to maxmum %d", skillid, skillval, maxskill);
|
Log(Logs::Detail, Logs::Skills, "Skill %d at value %d cannot increase due to maxmum %d", skillid, skillval, maxskill);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -2392,10 +2395,10 @@ void Client::CheckLanguageSkillIncrease(uint8 langid, uint8 TeacherSkill) {
|
|||||||
|
|
||||||
if(zone->random.Real(0,100) < Chance) { // if they make the roll
|
if(zone->random.Real(0,100) < Chance) { // if they make the roll
|
||||||
IncreaseLanguageSkill(langid); // increase the language skill by 1
|
IncreaseLanguageSkill(langid); // increase the language skill by 1
|
||||||
Log.Out(Logs::Detail, Logs::Skills, "Language %d at value %d successfully gain with %.4f%%chance", langid, LangSkill, Chance);
|
Log(Logs::Detail, Logs::Skills, "Language %d at value %d successfully gain with %.4f%%chance", langid, LangSkill, Chance);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Log.Out(Logs::Detail, Logs::Skills, "Language %d at value %d failed to gain with %.4f%%chance", langid, LangSkill, Chance);
|
Log(Logs::Detail, Logs::Skills, "Language %d at value %d failed to gain with %.4f%%chance", langid, LangSkill, Chance);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2504,7 +2507,7 @@ uint16 Client::GetMaxSkillAfterSpecializationRules(EQEmu::skills::SkillType skil
|
|||||||
|
|
||||||
Save();
|
Save();
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Normal, "Reset %s's caster specialization skills to 1. "
|
Log(Logs::General, Logs::Normal, "Reset %s's caster specialization skills to 1. "
|
||||||
"Too many specializations skills were above 50.", GetCleanName());
|
"Too many specializations skills were above 50.", GetCleanName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4702,14 +4705,14 @@ void Client::HandleLDoNOpen(NPC *target)
|
|||||||
{
|
{
|
||||||
if(target->GetClass() != LDON_TREASURE)
|
if(target->GetClass() != LDON_TREASURE)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::None, "%s tried to open %s but %s was not a treasure chest.",
|
Log(Logs::General, Logs::None, "%s tried to open %s but %s was not a treasure chest.",
|
||||||
GetName(), target->GetName(), target->GetName());
|
GetName(), target->GetName(), target->GetName());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(DistanceSquaredNoZ(m_Position, target->GetPosition()) > RuleI(Adventure, LDoNTrapDistanceUse))
|
if(DistanceSquaredNoZ(m_Position, target->GetPosition()) > RuleI(Adventure, LDoNTrapDistanceUse))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::None, "%s tried to open %s but %s was out of range",
|
Log(Logs::General, Logs::None, "%s tried to open %s but %s was out of range",
|
||||||
GetName(), target->GetName(), target->GetName());
|
GetName(), target->GetName(), target->GetName());
|
||||||
Message(13, "Treasure chest out of range.");
|
Message(13, "Treasure chest out of range.");
|
||||||
return;
|
return;
|
||||||
@ -6346,12 +6349,12 @@ void Client::Doppelganger(uint16 spell_id, Mob *target, const char *name_overrid
|
|||||||
PetRecord record;
|
PetRecord record;
|
||||||
if(!database.GetPetEntry(spells[spell_id].teleport_zone, &record))
|
if(!database.GetPetEntry(spells[spell_id].teleport_zone, &record))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Unknown doppelganger spell id: %d, check pets table", spell_id);
|
Log(Logs::General, Logs::Error, "Unknown doppelganger spell id: %d, check pets table", spell_id);
|
||||||
Message(13, "Unable to find data for pet %s", spells[spell_id].teleport_zone);
|
Message(13, "Unable to find data for pet %s", spells[spell_id].teleport_zone);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
AA_SwarmPet pet;
|
SwarmPet_Struct pet;
|
||||||
pet.count = pet_count;
|
pet.count = pet_count;
|
||||||
pet.duration = pet_duration;
|
pet.duration = pet_duration;
|
||||||
pet.npc_id = record.npc_type;
|
pet.npc_id = record.npc_type;
|
||||||
@ -6360,7 +6363,7 @@ void Client::Doppelganger(uint16 spell_id, Mob *target, const char *name_overrid
|
|||||||
|
|
||||||
const NPCType *npc_type = database.LoadNPCTypesData(pet.npc_id);
|
const NPCType *npc_type = database.LoadNPCTypesData(pet.npc_id);
|
||||||
if(npc_type == nullptr) {
|
if(npc_type == nullptr) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Unknown npc type for doppelganger spell id: %d", spell_id);
|
Log(Logs::General, Logs::Error, "Unknown npc type for doppelganger spell id: %d", spell_id);
|
||||||
Message(0,"Unable to find pet!");
|
Message(0,"Unable to find pet!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -6426,33 +6429,35 @@ void Client::Doppelganger(uint16 spell_id, Mob *target, const char *name_overrid
|
|||||||
memcpy(npc_dup, made_npc, sizeof(NPCType));
|
memcpy(npc_dup, made_npc, sizeof(NPCType));
|
||||||
}
|
}
|
||||||
|
|
||||||
NPC* npca = new NPC(
|
NPC* swarm_pet_npc = new NPC(
|
||||||
(npc_dup!=nullptr)?npc_dup:npc_type, //make sure we give the NPC the correct data pointer
|
(npc_dup!=nullptr)?npc_dup:npc_type, //make sure we give the NPC the correct data pointer
|
||||||
0,
|
0,
|
||||||
GetPosition() + glm::vec4(swarmPetLocations[summon_count], 0.0f, 0.0f),
|
GetPosition() + glm::vec4(swarmPetLocations[summon_count], 0.0f, 0.0f),
|
||||||
FlyMode3);
|
FlyMode3);
|
||||||
|
|
||||||
if(!npca->GetSwarmInfo()){
|
if(!swarm_pet_npc->GetSwarmInfo()){
|
||||||
auto nSI = new AA_SwarmPetInfo;
|
auto nSI = new SwarmPet;
|
||||||
npca->SetSwarmInfo(nSI);
|
swarm_pet_npc->SetSwarmInfo(nSI);
|
||||||
npca->GetSwarmInfo()->duration = new Timer(pet_duration*1000);
|
swarm_pet_npc->GetSwarmInfo()->duration = new Timer(pet_duration*1000);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
npca->GetSwarmInfo()->duration->Start(pet_duration*1000);
|
swarm_pet_npc->GetSwarmInfo()->duration->Start(pet_duration*1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
npca->GetSwarmInfo()->owner_id = GetID();
|
swarm_pet_npc->StartSwarmTimer(pet_duration * 1000);
|
||||||
|
|
||||||
|
swarm_pet_npc->GetSwarmInfo()->owner_id = GetID();
|
||||||
|
|
||||||
// Give the pets alittle more agro than the caster and then agro them on the target
|
// Give the pets alittle more agro than the caster and then agro them on the target
|
||||||
target->AddToHateList(npca, (target->GetHateAmount(this) + 100), (target->GetDamageAmount(this) + 100));
|
target->AddToHateList(swarm_pet_npc, (target->GetHateAmount(this) + 100), (target->GetDamageAmount(this) + 100));
|
||||||
npca->AddToHateList(target, 1000, 1000);
|
swarm_pet_npc->AddToHateList(target, 1000, 1000);
|
||||||
npca->GetSwarmInfo()->target = target->GetID();
|
swarm_pet_npc->GetSwarmInfo()->target = target->GetID();
|
||||||
|
|
||||||
//we allocated a new NPC type object, give the NPC ownership of that memory
|
//we allocated a new NPC type object, give the NPC ownership of that memory
|
||||||
if(npc_dup != nullptr)
|
if(npc_dup != nullptr)
|
||||||
npca->GiveNPCTypeData(npc_dup);
|
swarm_pet_npc->GiveNPCTypeData(npc_dup);
|
||||||
|
|
||||||
entity_list.AddNPC(npca);
|
entity_list.AddNPC(swarm_pet_npc);
|
||||||
summon_count--;
|
summon_count--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -7628,7 +7633,7 @@ void Client::SendMercPersonalInfo()
|
|||||||
stancecount += zone->merc_stance_list[GetMercInfo().MercTemplateID].size();
|
stancecount += zone->merc_stance_list[GetMercInfo().MercTemplateID].size();
|
||||||
if(stancecount > MAX_MERC_STANCES || mercCount > MAX_MERC || mercTypeCount > MAX_MERC_GRADES)
|
if(stancecount > MAX_MERC_STANCES || mercCount > MAX_MERC || mercTypeCount > MAX_MERC_GRADES)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Mercenaries, "SendMercPersonalInfo canceled: (%i) (%i) (%i) for %s", stancecount, mercCount, mercTypeCount, GetName());
|
Log(Logs::General, Logs::Mercenaries, "SendMercPersonalInfo canceled: (%i) (%i) (%i) for %s", stancecount, mercCount, mercTypeCount, GetName());
|
||||||
SendMercMerchantResponsePacket(0);
|
SendMercMerchantResponsePacket(0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -7724,13 +7729,13 @@ void Client::SendMercPersonalInfo()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Log.Out(Logs::General, Logs::Mercenaries, "SendMercPersonalInfo Send Successful for %s.", GetName());
|
Log(Logs::General, Logs::Mercenaries, "SendMercPersonalInfo Send Successful for %s.", GetName());
|
||||||
|
|
||||||
SendMercMerchantResponsePacket(0);
|
SendMercMerchantResponsePacket(0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Mercenaries, "SendMercPersonalInfo Send Failed Due to no MercData (%i) for %s", GetMercInfo().MercTemplateID, GetName());
|
Log(Logs::General, Logs::Mercenaries, "SendMercPersonalInfo Send Failed Due to no MercData (%i) for %s", GetMercInfo().MercTemplateID, GetName());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -8498,7 +8503,7 @@ void Client::Consume(const EQEmu::ItemData *item, uint8 type, int16 slot, bool a
|
|||||||
entity_list.MessageClose_StringID(this, true, 50, 0, EATING_MESSAGE, GetName(), item->Name);
|
entity_list.MessageClose_StringID(this, true, 50, 0, EATING_MESSAGE, GetName(), item->Name);
|
||||||
|
|
||||||
#if EQDEBUG >= 5
|
#if EQDEBUG >= 5
|
||||||
Log.Out(Logs::General, Logs::None, "Eating from slot:%i", (int)slot);
|
Log(Logs::General, Logs::None, "Eating from slot:%i", (int)slot);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -8515,7 +8520,7 @@ void Client::Consume(const EQEmu::ItemData *item, uint8 type, int16 slot, bool a
|
|||||||
entity_list.MessageClose_StringID(this, true, 50, 0, DRINKING_MESSAGE, GetName(), item->Name);
|
entity_list.MessageClose_StringID(this, true, 50, 0, DRINKING_MESSAGE, GetName(), item->Name);
|
||||||
|
|
||||||
#if EQDEBUG >= 5
|
#if EQDEBUG >= 5
|
||||||
Log.Out(Logs::General, Logs::None, "Drinking from slot:%i", (int)slot);
|
Log(Logs::General, Logs::None, "Drinking from slot:%i", (int)slot);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -8653,9 +8658,6 @@ void Client::QuestReward(Mob* target, uint32 copper, uint32 silver, uint32 gold,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Client::SendHPUpdateMarquee(){
|
void Client::SendHPUpdateMarquee(){
|
||||||
if (!RuleB(Character, MarqueeHPUpdates))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!this || !this->IsClient() || !this->cur_hp || !this->max_hp)
|
if (!this || !this->IsClient() || !this->cur_hp || !this->max_hp)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
@ -221,6 +221,9 @@ public:
|
|||||||
Client(EQStreamInterface * ieqs);
|
Client(EQStreamInterface * ieqs);
|
||||||
~Client();
|
~Client();
|
||||||
|
|
||||||
|
std::unordered_map<NPC *, float> close_npcs;
|
||||||
|
bool is_client_moving;
|
||||||
|
|
||||||
//abstract virtual function implementations required by base abstract class
|
//abstract virtual function implementations required by base abstract class
|
||||||
virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill);
|
virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill);
|
||||||
virtual void Damage(Mob* from, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false, eSpecialAttacks special = eSpecialAttacks::None);
|
virtual void Damage(Mob* from, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false, eSpecialAttacks special = eSpecialAttacks::None);
|
||||||
@ -1458,7 +1461,7 @@ private:
|
|||||||
Timer forget_timer; // our 2 min everybody forgets you timer
|
Timer forget_timer; // our 2 min everybody forgets you timer
|
||||||
Timer autosave_timer;
|
Timer autosave_timer;
|
||||||
#ifdef REVERSE_AGGRO
|
#ifdef REVERSE_AGGRO
|
||||||
Timer scanarea_timer;
|
Timer client_scan_npc_aggro_timer;
|
||||||
#endif
|
#endif
|
||||||
Timer tribute_timer;
|
Timer tribute_timer;
|
||||||
|
|
||||||
@ -1475,8 +1478,8 @@ private:
|
|||||||
Timer anon_toggle_timer;
|
Timer anon_toggle_timer;
|
||||||
Timer afk_toggle_timer;
|
Timer afk_toggle_timer;
|
||||||
Timer helm_toggle_timer;
|
Timer helm_toggle_timer;
|
||||||
Timer light_update_timer;
|
|
||||||
Timer aggro_meter_timer;
|
Timer aggro_meter_timer;
|
||||||
|
Timer npc_close_scan_timer;
|
||||||
|
|
||||||
glm::vec3 m_Proximity;
|
glm::vec3 m_Proximity;
|
||||||
|
|
||||||
|
|||||||
@ -1021,7 +1021,7 @@ int32 Client::acmod()
|
|||||||
//seems about 21 agil per extra AC pt over 300...
|
//seems about 21 agil per extra AC pt over 300...
|
||||||
return (65 + ((agility - 300) / 21));
|
return (65 + ((agility - 300) / 21));
|
||||||
}
|
}
|
||||||
Log.Out(Logs::Detail, Logs::Error, "Error in Client::acmod(): Agility: %i, Level: %i", agility, level);
|
Log(Logs::Detail, Logs::Error, "Error in Client::acmod(): Agility: %i, Level: %i", agility, level);
|
||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1038,7 +1038,7 @@ int32 Client::CalcMaxMana()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "Invalid Class '%c' in CalcMaxMana", GetCasterClass());
|
Log(Logs::Detail, Logs::Spells, "Invalid Class '%c' in CalcMaxMana", GetCasterClass());
|
||||||
max_mana = 0;
|
max_mana = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1056,7 +1056,7 @@ int32 Client::CalcMaxMana()
|
|||||||
cur_mana = curMana_cap;
|
cur_mana = curMana_cap;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "Client::CalcMaxMana() called for %s - returning %d", GetName(), max_mana);
|
Log(Logs::Detail, Logs::Spells, "Client::CalcMaxMana() called for %s - returning %d", GetName(), max_mana);
|
||||||
return max_mana;
|
return max_mana;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1140,13 +1140,13 @@ int32 Client::CalcBaseMana()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
Log.Out(Logs::General, Logs::None, "Invalid Class '%c' in CalcMaxMana", GetCasterClass());
|
Log(Logs::General, Logs::None, "Invalid Class '%c' in CalcMaxMana", GetCasterClass());
|
||||||
max_m = 0;
|
max_m = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if EQDEBUG >= 11
|
#if EQDEBUG >= 11
|
||||||
Log.Out(Logs::General, Logs::None, "Client::CalcBaseMana() called for %s - returning %d", GetName(), max_m);
|
Log(Logs::General, Logs::None, "Client::CalcBaseMana() called for %s - returning %d", GetName(), max_m);
|
||||||
#endif
|
#endif
|
||||||
return max_m;
|
return max_m;
|
||||||
}
|
}
|
||||||
@ -2023,7 +2023,7 @@ uint32 Mob::GetInstrumentMod(uint16 spell_id) const
|
|||||||
effectmod = 10;
|
effectmod = 10;
|
||||||
if (!nocap && effectmod > effectmodcap) // if the cap is calculated to be 0 using new rules, no cap.
|
if (!nocap && effectmod > effectmodcap) // if the cap is calculated to be 0 using new rules, no cap.
|
||||||
effectmod = effectmodcap;
|
effectmod = effectmodcap;
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "%s::GetInstrumentMod() spell=%d mod=%d modcap=%d\n", GetName(), spell_id,
|
Log(Logs::Detail, Logs::Spells, "%s::GetInstrumentMod() spell=%d mod=%d modcap=%d\n", GetName(), spell_id,
|
||||||
effectmod, effectmodcap);
|
effectmod, effectmodcap);
|
||||||
return effectmod;
|
return effectmod;
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -63,7 +63,7 @@ extern EntityList entity_list;
|
|||||||
bool Client::Process() {
|
bool Client::Process() {
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
|
|
||||||
if(Connected() || IsLD())
|
if (Connected() || IsLD())
|
||||||
{
|
{
|
||||||
// try to send all packets that weren't sent before
|
// try to send all packets that weren't sent before
|
||||||
if (!IsLD() && zoneinpacket_timer.Check())
|
if (!IsLD() && zoneinpacket_timer.Check())
|
||||||
@ -71,58 +71,58 @@ bool Client::Process() {
|
|||||||
SendAllPackets();
|
SendAllPackets();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(adventure_request_timer)
|
if (adventure_request_timer)
|
||||||
{
|
{
|
||||||
if(adventure_request_timer->Check())
|
if (adventure_request_timer->Check())
|
||||||
{
|
{
|
||||||
safe_delete(adventure_request_timer);
|
safe_delete(adventure_request_timer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(adventure_create_timer)
|
if (adventure_create_timer)
|
||||||
{
|
{
|
||||||
if(adventure_create_timer->Check())
|
if (adventure_create_timer->Check())
|
||||||
{
|
{
|
||||||
safe_delete(adventure_create_timer);
|
safe_delete(adventure_create_timer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(adventure_leave_timer)
|
if (adventure_leave_timer)
|
||||||
{
|
{
|
||||||
if(adventure_leave_timer->Check())
|
if (adventure_leave_timer->Check())
|
||||||
{
|
{
|
||||||
safe_delete(adventure_leave_timer);
|
safe_delete(adventure_leave_timer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(adventure_door_timer)
|
if (adventure_door_timer)
|
||||||
{
|
{
|
||||||
if(adventure_door_timer->Check())
|
if (adventure_door_timer->Check())
|
||||||
{
|
{
|
||||||
safe_delete(adventure_door_timer);
|
safe_delete(adventure_door_timer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(adventure_stats_timer)
|
if (adventure_stats_timer)
|
||||||
{
|
{
|
||||||
if(adventure_stats_timer->Check())
|
if (adventure_stats_timer->Check())
|
||||||
{
|
{
|
||||||
safe_delete(adventure_stats_timer);
|
safe_delete(adventure_stats_timer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(adventure_leaderboard_timer)
|
if (adventure_leaderboard_timer)
|
||||||
{
|
{
|
||||||
if(adventure_leaderboard_timer->Check())
|
if (adventure_leaderboard_timer->Check())
|
||||||
{
|
{
|
||||||
safe_delete(adventure_leaderboard_timer);
|
safe_delete(adventure_leaderboard_timer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(dead)
|
if (dead)
|
||||||
{
|
{
|
||||||
SetHP(-100);
|
SetHP(-100);
|
||||||
if(RespawnFromHoverTimer.Check())
|
if (RespawnFromHoverTimer.Check())
|
||||||
HandleRespawnFromHover(0);
|
HandleRespawnFromHover(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,13 +131,13 @@ bool Client::Process() {
|
|||||||
|
|
||||||
// SendHPUpdate calls hpupdate_timer.Start so it can delay this timer, so lets not reset with the check
|
// SendHPUpdate calls hpupdate_timer.Start so it can delay this timer, so lets not reset with the check
|
||||||
// since the function will anyways
|
// since the function will anyways
|
||||||
if(hpupdate_timer.Check(false))
|
if (hpupdate_timer.Check(false))
|
||||||
SendHPUpdate();
|
SendHPUpdate();
|
||||||
|
|
||||||
if(mana_timer.Check())
|
if (mana_timer.Check())
|
||||||
SendManaUpdatePacket();
|
SendManaUpdatePacket();
|
||||||
|
|
||||||
if(dead && dead_timer.Check()) {
|
if (dead && dead_timer.Check()) {
|
||||||
database.MoveCharacterToZone(GetName(), database.GetZoneName(m_pp.binds[0].zoneId));
|
database.MoveCharacterToZone(GetName(), database.GetZoneName(m_pp.binds[0].zoneId));
|
||||||
|
|
||||||
m_pp.zone_id = m_pp.binds[0].zoneId;
|
m_pp.zone_id = m_pp.binds[0].zoneId;
|
||||||
@ -150,7 +150,7 @@ bool Client::Process() {
|
|||||||
Group *mygroup = GetGroup();
|
Group *mygroup = GetGroup();
|
||||||
if (mygroup)
|
if (mygroup)
|
||||||
{
|
{
|
||||||
entity_list.MessageGroup(this,true,15,"%s died.", GetName());
|
entity_list.MessageGroup(this, true, 15, "%s died.", GetName());
|
||||||
mygroup->MemberZoned(this);
|
mygroup->MemberZoned(this);
|
||||||
}
|
}
|
||||||
Raid *myraid = entity_list.GetRaidByClient(this);
|
Raid *myraid = entity_list.GetRaidByClient(this);
|
||||||
@ -161,34 +161,29 @@ bool Client::Process() {
|
|||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(charm_update_timer.Check())
|
if (charm_update_timer.Check()) {
|
||||||
{
|
|
||||||
CalcItemScale();
|
CalcItemScale();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(TaskPeriodic_Timer.Check() && taskstate)
|
if (TaskPeriodic_Timer.Check() && taskstate)
|
||||||
taskstate->TaskPeriodicChecks(this);
|
taskstate->TaskPeriodicChecks(this);
|
||||||
|
|
||||||
if(linkdead_timer.Check())
|
if (linkdead_timer.Check()) {
|
||||||
{
|
|
||||||
LeaveGroup();
|
LeaveGroup();
|
||||||
Save();
|
Save();
|
||||||
if (GetMerc())
|
if (GetMerc()) {
|
||||||
{
|
|
||||||
GetMerc()->Save();
|
GetMerc()->Save();
|
||||||
GetMerc()->Depop();
|
GetMerc()->Depop();
|
||||||
}
|
}
|
||||||
|
|
||||||
Raid *myraid = entity_list.GetRaidByClient(this);
|
Raid *myraid = entity_list.GetRaidByClient(this);
|
||||||
if (myraid)
|
if (myraid) {
|
||||||
{
|
|
||||||
myraid->MemberZoned(this);
|
myraid->MemberZoned(this);
|
||||||
}
|
}
|
||||||
return false; //delete client
|
return false; //delete client
|
||||||
}
|
}
|
||||||
|
|
||||||
if (camp_timer.Check())
|
if (camp_timer.Check()) {
|
||||||
{
|
|
||||||
LeaveGroup();
|
LeaveGroup();
|
||||||
Save();
|
Save();
|
||||||
if (GetMerc())
|
if (GetMerc())
|
||||||
@ -202,8 +197,7 @@ bool Client::Process() {
|
|||||||
if (IsStunned() && stunned_timer.Check())
|
if (IsStunned() && stunned_timer.Check())
|
||||||
Mob::UnStun();
|
Mob::UnStun();
|
||||||
|
|
||||||
if(!m_CheatDetectMoved)
|
if (!m_CheatDetectMoved) {
|
||||||
{
|
|
||||||
m_TimeSinceLastPositionCheck = Timer::GetCurrentTime();
|
m_TimeSinceLastPositionCheck = Timer::GetCurrentTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -211,32 +205,32 @@ bool Client::Process() {
|
|||||||
//NOTE: this is kinda a heavy-handed check to make sure the mob still exists before
|
//NOTE: this is kinda a heavy-handed check to make sure the mob still exists before
|
||||||
//doing the next pulse on them...
|
//doing the next pulse on them...
|
||||||
Mob *song_target = nullptr;
|
Mob *song_target = nullptr;
|
||||||
if(bardsong_target_id == GetID()) {
|
if (bardsong_target_id == GetID()) {
|
||||||
song_target = this;
|
song_target = this;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
song_target = entity_list.GetMob(bardsong_target_id);
|
song_target = entity_list.GetMob(bardsong_target_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (song_target == nullptr) {
|
if (song_target == nullptr) {
|
||||||
InterruptSpell(SONG_ENDS_ABRUPTLY, 0x121, bardsong);
|
InterruptSpell(SONG_ENDS_ABRUPTLY, 0x121, bardsong);
|
||||||
} else {
|
}
|
||||||
if(!ApplyNextBardPulse(bardsong, song_target, bardsong_slot))
|
else {
|
||||||
|
if (!ApplyNextBardPulse(bardsong, song_target, bardsong_slot))
|
||||||
InterruptSpell(SONG_ENDS_ABRUPTLY, 0x121, bardsong);
|
InterruptSpell(SONG_ENDS_ABRUPTLY, 0x121, bardsong);
|
||||||
//SpellFinished(bardsong, bardsong_target, bardsong_slot, spells[bardsong].mana);
|
//SpellFinished(bardsong, bardsong_target, bardsong_slot, spells[bardsong].mana);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(GetMerc())
|
if (GetMerc()) {
|
||||||
{
|
|
||||||
UpdateMercTimer();
|
UpdateMercTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(GetMercInfo().MercTemplateID != 0 && GetMercInfo().IsSuspended)
|
if (GetMercInfo().MercTemplateID != 0 && GetMercInfo().IsSuspended) {
|
||||||
{
|
|
||||||
CheckMercSuspendTimer();
|
CheckMercSuspendTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(IsAIControlled())
|
if (IsAIControlled())
|
||||||
AI_Process();
|
AI_Process();
|
||||||
|
|
||||||
// Don't reset the bindwound timer so we can check it in BindWound as well.
|
// Don't reset the bindwound timer so we can check it in BindWound as well.
|
||||||
@ -244,28 +238,36 @@ bool Client::Process() {
|
|||||||
BindWound(bindwound_target, false);
|
BindWound(bindwound_target, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(KarmaUpdateTimer)
|
if (KarmaUpdateTimer) {
|
||||||
{
|
if (KarmaUpdateTimer->Check(false)) {
|
||||||
if(KarmaUpdateTimer->Check(false))
|
|
||||||
{
|
|
||||||
KarmaUpdateTimer->Start(RuleI(Chat, KarmaUpdateIntervalMS));
|
KarmaUpdateTimer->Start(RuleI(Chat, KarmaUpdateIntervalMS));
|
||||||
database.UpdateKarma(AccountID(), ++TotalKarma);
|
database.UpdateKarma(AccountID(), ++TotalKarma);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(qGlobals)
|
if (qGlobals) {
|
||||||
{
|
if (qglobal_purge_timer.Check()) {
|
||||||
if(qglobal_purge_timer.Check())
|
|
||||||
{
|
|
||||||
qGlobals->PurgeExpiredGlobals();
|
qGlobals->PurgeExpiredGlobals();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(light_update_timer.Check()) {
|
/* Build a close range list of NPC's */
|
||||||
|
if (npc_close_scan_timer.Check()) {
|
||||||
|
|
||||||
UpdateEquipmentLight();
|
close_npcs.clear();
|
||||||
if(UpdateActiveLight()) {
|
|
||||||
SendAppearancePacket(AT_Light, GetActiveLightType());
|
auto &npc_list = entity_list.GetNPCList();
|
||||||
|
|
||||||
|
float scan_range = RuleI(Range, ClientNPCScan);
|
||||||
|
for (auto itr = npc_list.begin(); itr != npc_list.end(); ++itr) {
|
||||||
|
NPC* npc = itr->second;
|
||||||
|
float distance = DistanceNoZ(m_Position, npc->GetPosition());
|
||||||
|
if(distance <= scan_range) {
|
||||||
|
close_npcs.insert(std::pair<NPC *, float>(npc, distance));
|
||||||
|
}
|
||||||
|
else if (npc->GetAggroRange() > scan_range) {
|
||||||
|
close_npcs.insert(std::pair<NPC *, float>(npc, distance));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -279,31 +281,31 @@ bool Client::Process() {
|
|||||||
- being stunned or mezzed
|
- being stunned or mezzed
|
||||||
- having used a ranged weapon recently
|
- having used a ranged weapon recently
|
||||||
*/
|
*/
|
||||||
if(auto_attack) {
|
if (auto_attack) {
|
||||||
if(!IsAIControlled() && !dead
|
if (!IsAIControlled() && !dead
|
||||||
&& !(spellend_timer.Enabled() && casting_spell_id && !IsBardSong(casting_spell_id))
|
&& !(spellend_timer.Enabled() && casting_spell_id && !IsBardSong(casting_spell_id))
|
||||||
&& !IsStunned() && !IsFeared() && !IsMezzed() && GetAppearance() != eaDead && !IsMeleeDisabled()
|
&& !IsStunned() && !IsFeared() && !IsMezzed() && GetAppearance() != eaDead && !IsMeleeDisabled()
|
||||||
)
|
)
|
||||||
may_use_attacks = true;
|
may_use_attacks = true;
|
||||||
|
|
||||||
if(may_use_attacks && ranged_timer.Enabled()) {
|
if (may_use_attacks && ranged_timer.Enabled()) {
|
||||||
//if the range timer is enabled, we need to consider it
|
//if the range timer is enabled, we need to consider it
|
||||||
if(!ranged_timer.Check(false)) {
|
if (!ranged_timer.Check(false)) {
|
||||||
//the ranged timer has not elapsed, cannot attack.
|
//the ranged timer has not elapsed, cannot attack.
|
||||||
may_use_attacks = false;
|
may_use_attacks = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(AutoFireEnabled()){
|
if (AutoFireEnabled()) {
|
||||||
EQEmu::ItemInstance *ranged = GetInv().GetItem(EQEmu::inventory::slotRange);
|
EQEmu::ItemInstance *ranged = GetInv().GetItem(EQEmu::inventory::slotRange);
|
||||||
if(ranged)
|
if (ranged)
|
||||||
{
|
{
|
||||||
if (ranged->GetItem() && ranged->GetItem()->ItemType == EQEmu::item::ItemTypeBow){
|
if (ranged->GetItem() && ranged->GetItem()->ItemType == EQEmu::item::ItemTypeBow) {
|
||||||
if(ranged_timer.Check(false)){
|
if (ranged_timer.Check(false)) {
|
||||||
if(GetTarget() && (GetTarget()->IsNPC() || GetTarget()->IsClient())){
|
if (GetTarget() && (GetTarget()->IsNPC() || GetTarget()->IsClient())) {
|
||||||
if(GetTarget()->InFrontMob(this, GetTarget()->GetX(), GetTarget()->GetY())){
|
if (GetTarget()->InFrontMob(this, GetTarget()->GetX(), GetTarget()->GetY())) {
|
||||||
if(CheckLosFN(GetTarget())){
|
if (CheckLosFN(GetTarget())) {
|
||||||
//client has built in los check, but auto fire does not.. done last.
|
//client has built in los check, but auto fire does not.. done last.
|
||||||
RangedAttack(GetTarget());
|
RangedAttack(GetTarget());
|
||||||
if (CheckDoubleRangedAttack())
|
if (CheckDoubleRangedAttack())
|
||||||
@ -319,11 +321,11 @@ bool Client::Process() {
|
|||||||
ranged_timer.Start();
|
ranged_timer.Start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (ranged->GetItem() && (ranged->GetItem()->ItemType == EQEmu::item::ItemTypeLargeThrowing || ranged->GetItem()->ItemType == EQEmu::item::ItemTypeSmallThrowing)){
|
else if (ranged->GetItem() && (ranged->GetItem()->ItemType == EQEmu::item::ItemTypeLargeThrowing || ranged->GetItem()->ItemType == EQEmu::item::ItemTypeSmallThrowing)) {
|
||||||
if(ranged_timer.Check(false)){
|
if (ranged_timer.Check(false)) {
|
||||||
if(GetTarget() && (GetTarget()->IsNPC() || GetTarget()->IsClient())){
|
if (GetTarget() && (GetTarget()->IsNPC() || GetTarget()->IsClient())) {
|
||||||
if(GetTarget()->InFrontMob(this, GetTarget()->GetX(), GetTarget()->GetY())){
|
if (GetTarget()->InFrontMob(this, GetTarget()->GetX(), GetTarget()->GetY())) {
|
||||||
if(CheckLosFN(GetTarget())){
|
if (CheckLosFN(GetTarget())) {
|
||||||
//client has built in los check, but auto fire does not.. done last.
|
//client has built in los check, but auto fire does not.. done last.
|
||||||
ThrowingAttack(GetTarget());
|
ThrowingAttack(GetTarget());
|
||||||
}
|
}
|
||||||
@ -345,9 +347,9 @@ bool Client::Process() {
|
|||||||
{
|
{
|
||||||
//check if change
|
//check if change
|
||||||
//only check on primary attack.. sorry offhand you gotta wait!
|
//only check on primary attack.. sorry offhand you gotta wait!
|
||||||
if(aa_los_them_mob)
|
if (aa_los_them_mob)
|
||||||
{
|
{
|
||||||
if(auto_attack_target != aa_los_them_mob ||
|
if (auto_attack_target != aa_los_them_mob ||
|
||||||
m_AutoAttackPosition.x != GetX() ||
|
m_AutoAttackPosition.x != GetX() ||
|
||||||
m_AutoAttackPosition.y != GetY() ||
|
m_AutoAttackPosition.y != GetY() ||
|
||||||
m_AutoAttackPosition.z != GetZ() ||
|
m_AutoAttackPosition.z != GetZ() ||
|
||||||
@ -379,11 +381,11 @@ bool Client::Process() {
|
|||||||
|
|
||||||
if (!CombatRange(auto_attack_target))
|
if (!CombatRange(auto_attack_target))
|
||||||
{
|
{
|
||||||
Message_StringID(MT_TooFarAway,TARGET_TOO_FAR);
|
Message_StringID(MT_TooFarAway, TARGET_TOO_FAR);
|
||||||
}
|
}
|
||||||
else if (auto_attack_target == this)
|
else if (auto_attack_target == this)
|
||||||
{
|
{
|
||||||
Message_StringID(MT_TooFarAway,TRY_ATTACKING_SOMEONE);
|
Message_StringID(MT_TooFarAway, TRY_ATTACKING_SOMEONE);
|
||||||
}
|
}
|
||||||
else if (!los_status || !los_status_facing)
|
else if (!los_status || !los_status_facing)
|
||||||
{
|
{
|
||||||
@ -412,23 +414,23 @@ bool Client::Process() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(auto_attack && may_use_attacks && auto_attack_target != nullptr
|
if (auto_attack && may_use_attacks && auto_attack_target != nullptr
|
||||||
&& CanThisClassDualWield() && attack_dw_timer.Check())
|
&& CanThisClassDualWield() && attack_dw_timer.Check())
|
||||||
{
|
{
|
||||||
// Range check
|
// Range check
|
||||||
if(!CombatRange(auto_attack_target)) {
|
if (!CombatRange(auto_attack_target)) {
|
||||||
// this is a duplicate message don't use it.
|
// this is a duplicate message don't use it.
|
||||||
//Message_StringID(MT_TooFarAway,TARGET_TOO_FAR);
|
//Message_StringID(MT_TooFarAway,TARGET_TOO_FAR);
|
||||||
}
|
}
|
||||||
// Don't attack yourself
|
// Don't attack yourself
|
||||||
else if(auto_attack_target == this) {
|
else if (auto_attack_target == this) {
|
||||||
//Message_StringID(MT_TooFarAway,TRY_ATTACKING_SOMEONE);
|
//Message_StringID(MT_TooFarAway,TRY_ATTACKING_SOMEONE);
|
||||||
}
|
}
|
||||||
else if (!los_status || !los_status_facing)
|
else if (!los_status || !los_status_facing)
|
||||||
{
|
{
|
||||||
//you can't see your target
|
//you can't see your target
|
||||||
}
|
}
|
||||||
else if(auto_attack_target->GetHP() > -10) {
|
else if (auto_attack_target->GetHP() > -10) {
|
||||||
CheckIncreaseSkill(EQEmu::skills::SkillDualWield, auto_attack_target, -10);
|
CheckIncreaseSkill(EQEmu::skills::SkillDualWield, auto_attack_target, -10);
|
||||||
if (CheckDualWield()) {
|
if (CheckDualWield()) {
|
||||||
EQEmu::ItemInstance *wpn = GetInv().GetItem(EQEmu::inventory::slotSecondary);
|
EQEmu::ItemInstance *wpn = GetInv().GetItem(EQEmu::inventory::slotSecondary);
|
||||||
@ -442,7 +444,7 @@ bool Client::Process() {
|
|||||||
if (position_timer.Check()) {
|
if (position_timer.Check()) {
|
||||||
if (IsAIControlled())
|
if (IsAIControlled())
|
||||||
{
|
{
|
||||||
if(!IsMoving())
|
if (!IsMoving())
|
||||||
{
|
{
|
||||||
animation = 0;
|
animation = 0;
|
||||||
m_Delta = glm::vec4(0.0f, 0.0f, 0.0f, m_Delta.w);
|
m_Delta = glm::vec4(0.0f, 0.0f, 0.0f, m_Delta.w);
|
||||||
@ -464,25 +466,25 @@ bool Client::Process() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(HasVirus()) {
|
if (HasVirus()) {
|
||||||
if(viral_timer.Check()) {
|
if (viral_timer.Check()) {
|
||||||
viral_timer_counter++;
|
viral_timer_counter++;
|
||||||
for(int i = 0; i < MAX_SPELL_TRIGGER*2; i+=2) {
|
for (int i = 0; i < MAX_SPELL_TRIGGER * 2; i += 2) {
|
||||||
if(viral_spells[i]) {
|
if (viral_spells[i]) {
|
||||||
if(viral_timer_counter % spells[viral_spells[i]].viral_timer == 0) {
|
if (viral_timer_counter % spells[viral_spells[i]].viral_timer == 0) {
|
||||||
SpreadVirus(viral_spells[i], viral_spells[i+1]);
|
SpreadVirus(viral_spells[i], viral_spells[i + 1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(viral_timer_counter > 999)
|
if (viral_timer_counter > 999)
|
||||||
viral_timer_counter = 0;
|
viral_timer_counter = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ProjectileAttack();
|
ProjectileAttack();
|
||||||
|
|
||||||
if(spellbonuses.GravityEffect == 1) {
|
if (spellbonuses.GravityEffect == 1) {
|
||||||
if(gravity_timer.Check())
|
if (gravity_timer.Check())
|
||||||
DoGravityEffect();
|
DoGravityEffect();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -514,7 +516,7 @@ bool Client::Process() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SpellProcess();
|
SpellProcess();
|
||||||
if (endupkeep_timer.Check() && !dead){
|
if (endupkeep_timer.Check() && !dead) {
|
||||||
DoEnduranceUpkeep();
|
DoEnduranceUpkeep();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -530,7 +532,7 @@ bool Client::Process() {
|
|||||||
BuffProcess();
|
BuffProcess();
|
||||||
DoStaminaUpdate();
|
DoStaminaUpdate();
|
||||||
|
|
||||||
if(tribute_timer.Check()) {
|
if (tribute_timer.Check()) {
|
||||||
ToggleTribute(true); //re-activate the tribute.
|
ToggleTribute(true); //re-activate the tribute.
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -542,18 +544,18 @@ bool Client::Process() {
|
|||||||
Save(0);
|
Save(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(m_pp.intoxication > 0)
|
if (m_pp.intoxication > 0)
|
||||||
{
|
{
|
||||||
--m_pp.intoxication;
|
--m_pp.intoxication;
|
||||||
CalcBonuses();
|
CalcBonuses();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ItemTickTimer.Check())
|
if (ItemTickTimer.Check())
|
||||||
{
|
{
|
||||||
TickItemCheck();
|
TickItemCheck();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ItemQuestTimer.Check())
|
if (ItemQuestTimer.Check())
|
||||||
{
|
{
|
||||||
ItemTimerCheck();
|
ItemTimerCheck();
|
||||||
}
|
}
|
||||||
@ -582,7 +584,7 @@ bool Client::Process() {
|
|||||||
|
|
||||||
if (client_state != CLIENT_LINKDEAD && !eqs->CheckState(ESTABLISHED)) {
|
if (client_state != CLIENT_LINKDEAD && !eqs->CheckState(ESTABLISHED)) {
|
||||||
OnDisconnect(true);
|
OnDisconnect(true);
|
||||||
Log.Out(Logs::General, Logs::Zone_Server, "Client linkdead: %s", name);
|
Log(Logs::General, Logs::Zone_Server, "Client linkdead: %s", name);
|
||||||
|
|
||||||
if (GetGM()) {
|
if (GetGM()) {
|
||||||
if (GetMerc())
|
if (GetMerc())
|
||||||
@ -592,8 +594,8 @@ bool Client::Process() {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if(!linkdead_timer.Enabled()){
|
else if (!linkdead_timer.Enabled()) {
|
||||||
linkdead_timer.Start(RuleI(Zone,ClientLinkdeadMS));
|
linkdead_timer.Start(RuleI(Zone, ClientLinkdeadMS));
|
||||||
client_state = CLIENT_LINKDEAD;
|
client_state = CLIENT_LINKDEAD;
|
||||||
AI_Start(CLIENT_LD_TIMEOUT);
|
AI_Start(CLIENT_LD_TIMEOUT);
|
||||||
SendAppearancePacket(AT_Linkdead, 1);
|
SendAppearancePacket(AT_Linkdead, 1);
|
||||||
@ -603,10 +605,10 @@ bool Client::Process() {
|
|||||||
|
|
||||||
/************ Get all packets from packet manager out queue and process them ************/
|
/************ Get all packets from packet manager out queue and process them ************/
|
||||||
EQApplicationPacket *app = nullptr;
|
EQApplicationPacket *app = nullptr;
|
||||||
if(!eqs->CheckState(CLOSING))
|
if (!eqs->CheckState(CLOSING))
|
||||||
{
|
{
|
||||||
while(ret && (app = (EQApplicationPacket *)eqs->PopPacket())) {
|
while (ret && (app = (EQApplicationPacket *)eqs->PopPacket())) {
|
||||||
if(app)
|
if (app)
|
||||||
ret = HandlePacket(app);
|
ret = HandlePacket(app);
|
||||||
safe_delete(app);
|
safe_delete(app);
|
||||||
}
|
}
|
||||||
@ -616,8 +618,17 @@ bool Client::Process() {
|
|||||||
//At this point, we are still connected, everything important has taken
|
//At this point, we are still connected, everything important has taken
|
||||||
//place, now check to see if anybody wants to aggro us.
|
//place, now check to see if anybody wants to aggro us.
|
||||||
// only if client is not feigned
|
// only if client is not feigned
|
||||||
if(zone->CanDoCombat() && ret && !GetFeigned() && scanarea_timer.Check()) {
|
if (zone->CanDoCombat() && ret && !GetFeigned() && client_scan_npc_aggro_timer.Check()) {
|
||||||
entity_list.CheckClientAggro(this);
|
int npc_scan_count = 0;
|
||||||
|
for (auto it = close_npcs.begin(); it != close_npcs.end(); ++it) {
|
||||||
|
NPC *npc = it->first;
|
||||||
|
|
||||||
|
if (npc->CheckWillAggro(this) && !npc->CheckAggro(this)) {
|
||||||
|
npc->AddToHateList(this, 25);
|
||||||
|
}
|
||||||
|
npc_scan_count++;
|
||||||
|
}
|
||||||
|
Log(Logs::General, Logs::Aggro, "Checking Reverse Aggro (client->npc) scanned_npcs (%i)", npc_scan_count);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -718,7 +729,7 @@ void Client::OnDisconnect(bool hard_disconnect) {
|
|||||||
Mob *Other = trade->With();
|
Mob *Other = trade->With();
|
||||||
if(Other)
|
if(Other)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::Trading, "Client disconnected during a trade. Returning their items.");
|
Log(Logs::Detail, Logs::Trading, "Client disconnected during a trade. Returning their items.");
|
||||||
FinishTrade(this);
|
FinishTrade(this);
|
||||||
|
|
||||||
if(Other->IsClient())
|
if(Other->IsClient())
|
||||||
@ -750,7 +761,7 @@ void Client::BulkSendInventoryItems()
|
|||||||
if(inst) {
|
if(inst) {
|
||||||
bool is_arrow = (inst->GetItem()->ItemType == EQEmu::item::ItemTypeArrow) ? true : false;
|
bool is_arrow = (inst->GetItem()->ItemType == EQEmu::item::ItemTypeArrow) ? true : false;
|
||||||
int16 free_slot_id = m_inv.FindFreeSlot(inst->IsClassBag(), true, inst->GetItem()->Size, is_arrow);
|
int16 free_slot_id = m_inv.FindFreeSlot(inst->IsClassBag(), true, inst->GetItem()->Size, is_arrow);
|
||||||
Log.Out(Logs::Detail, Logs::Inventory, "Incomplete Trade Transaction: Moving %s from slot %i to %i", inst->GetItem()->Name, slot_id, free_slot_id);
|
Log(Logs::Detail, Logs::Inventory, "Incomplete Trade Transaction: Moving %s from slot %i to %i", inst->GetItem()->Name, slot_id, free_slot_id);
|
||||||
PutItemInInventory(free_slot_id, *inst, false);
|
PutItemInInventory(free_slot_id, *inst, false);
|
||||||
database.SaveInventory(character_id, nullptr, slot_id);
|
database.SaveInventory(character_id, nullptr, slot_id);
|
||||||
safe_delete(inst);
|
safe_delete(inst);
|
||||||
@ -779,7 +790,7 @@ void Client::BulkSendInventoryItems()
|
|||||||
inst->Serialize(ob, slot_id);
|
inst->Serialize(ob, slot_id);
|
||||||
|
|
||||||
if (ob.tellp() == last_pos)
|
if (ob.tellp() == last_pos)
|
||||||
Log.Out(Logs::General, Logs::Inventory, "Serialization failed on item slot %d during BulkSendInventoryItems. Item skipped.", slot_id);
|
Log(Logs::General, Logs::Inventory, "Serialization failed on item slot %d during BulkSendInventoryItems. Item skipped.", slot_id);
|
||||||
|
|
||||||
last_pos = ob.tellp();
|
last_pos = ob.tellp();
|
||||||
}
|
}
|
||||||
@ -791,7 +802,7 @@ void Client::BulkSendInventoryItems()
|
|||||||
inst->Serialize(ob, EQEmu::inventory::slotPowerSource);
|
inst->Serialize(ob, EQEmu::inventory::slotPowerSource);
|
||||||
|
|
||||||
if (ob.tellp() == last_pos)
|
if (ob.tellp() == last_pos)
|
||||||
Log.Out(Logs::General, Logs::Inventory, "Serialization failed on item slot %d during BulkSendInventoryItems. Item skipped.", EQEmu::inventory::slotPowerSource);
|
Log(Logs::General, Logs::Inventory, "Serialization failed on item slot %d during BulkSendInventoryItems. Item skipped.", EQEmu::inventory::slotPowerSource);
|
||||||
|
|
||||||
last_pos = ob.tellp();
|
last_pos = ob.tellp();
|
||||||
}
|
}
|
||||||
@ -806,7 +817,7 @@ void Client::BulkSendInventoryItems()
|
|||||||
inst->Serialize(ob, slot_id);
|
inst->Serialize(ob, slot_id);
|
||||||
|
|
||||||
if (ob.tellp() == last_pos)
|
if (ob.tellp() == last_pos)
|
||||||
Log.Out(Logs::General, Logs::Inventory, "Serialization failed on item slot %d during BulkSendInventoryItems. Item skipped.", slot_id);
|
Log(Logs::General, Logs::Inventory, "Serialization failed on item slot %d during BulkSendInventoryItems. Item skipped.", slot_id);
|
||||||
|
|
||||||
last_pos = ob.tellp();
|
last_pos = ob.tellp();
|
||||||
}
|
}
|
||||||
@ -820,7 +831,7 @@ void Client::BulkSendInventoryItems()
|
|||||||
inst->Serialize(ob, slot_id);
|
inst->Serialize(ob, slot_id);
|
||||||
|
|
||||||
if (ob.tellp() == last_pos)
|
if (ob.tellp() == last_pos)
|
||||||
Log.Out(Logs::General, Logs::Inventory, "Serialization failed on item slot %d during BulkSendInventoryItems. Item skipped.", slot_id);
|
Log(Logs::General, Logs::Inventory, "Serialization failed on item slot %d during BulkSendInventoryItems. Item skipped.", slot_id);
|
||||||
|
|
||||||
last_pos = ob.tellp();
|
last_pos = ob.tellp();
|
||||||
}
|
}
|
||||||
@ -908,7 +919,7 @@ void Client::BulkSendMerchantInventory(int merchant_id, int npcid) {
|
|||||||
// Account for merchant lists with gaps.
|
// Account for merchant lists with gaps.
|
||||||
if (ml.slot >= i) {
|
if (ml.slot >= i) {
|
||||||
if (ml.slot > i)
|
if (ml.slot > i)
|
||||||
Log.Out(Logs::General, Logs::None, "(WARNING) Merchantlist contains gap at slot %d. Merchant: %d, NPC: %d", i, merchant_id, npcid);
|
Log(Logs::General, Logs::None, "(WARNING) Merchantlist contains gap at slot %d. Merchant: %d, NPC: %d", i, merchant_id, npcid);
|
||||||
i = ml.slot + 1;
|
i = ml.slot + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1000,7 +1011,7 @@ uint8 Client::WithCustomer(uint16 NewCustomer){
|
|||||||
Client* c = entity_list.GetClientByID(CustomerID);
|
Client* c = entity_list.GetClientByID(CustomerID);
|
||||||
|
|
||||||
if(!c) {
|
if(!c) {
|
||||||
Log.Out(Logs::Detail, Logs::Trading, "Previous customer has gone away.");
|
Log(Logs::Detail, Logs::Trading, "Previous customer has gone away.");
|
||||||
CustomerID = NewCustomer;
|
CustomerID = NewCustomer;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1012,7 +1023,7 @@ void Client::OPRezzAnswer(uint32 Action, uint32 SpellID, uint16 ZoneID, uint16 I
|
|||||||
{
|
{
|
||||||
if(PendingRezzXP < 0) {
|
if(PendingRezzXP < 0) {
|
||||||
// pendingrezexp is set to -1 if we are not expecting an OP_RezzAnswer
|
// pendingrezexp is set to -1 if we are not expecting an OP_RezzAnswer
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "Unexpected OP_RezzAnswer. Ignoring it.");
|
Log(Logs::Detail, Logs::Spells, "Unexpected OP_RezzAnswer. Ignoring it.");
|
||||||
Message(13, "You have already been resurrected.\n");
|
Message(13, "You have already been resurrected.\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1022,7 +1033,7 @@ void Client::OPRezzAnswer(uint32 Action, uint32 SpellID, uint16 ZoneID, uint16 I
|
|||||||
// Mark the corpse as rezzed in the database, just in case the corpse has buried, or the zone the
|
// Mark the corpse as rezzed in the database, just in case the corpse has buried, or the zone the
|
||||||
// corpse is in has shutdown since the rez spell was cast.
|
// corpse is in has shutdown since the rez spell was cast.
|
||||||
database.MarkCorpseAsRezzed(PendingRezzDBID);
|
database.MarkCorpseAsRezzed(PendingRezzDBID);
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "Player %s got a %i Rezz, spellid %i in zone%i, instance id %i",
|
Log(Logs::Detail, Logs::Spells, "Player %s got a %i Rezz, spellid %i in zone%i, instance id %i",
|
||||||
this->name, (uint16)spells[SpellID].base[0],
|
this->name, (uint16)spells[SpellID].base[0],
|
||||||
SpellID, ZoneID, InstanceID);
|
SpellID, ZoneID, InstanceID);
|
||||||
|
|
||||||
@ -1075,7 +1086,7 @@ void Client::OPMemorizeSpell(const EQApplicationPacket* app)
|
|||||||
{
|
{
|
||||||
if(app->size != sizeof(MemorizeSpell_Struct))
|
if(app->size != sizeof(MemorizeSpell_Struct))
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "Wrong size on OP_MemorizeSpell. Got: %i, Expected: %i", app->size, sizeof(MemorizeSpell_Struct));
|
Log(Logs::General, Logs::Error, "Wrong size on OP_MemorizeSpell. Got: %i, Expected: %i", app->size, sizeof(MemorizeSpell_Struct));
|
||||||
DumpPacket(app);
|
DumpPacket(app);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1628,12 +1639,12 @@ void Client::OPGMTrainSkill(const EQApplicationPacket *app)
|
|||||||
EQEmu::skills::SkillType skill = (EQEmu::skills::SkillType)gmskill->skill_id;
|
EQEmu::skills::SkillType skill = (EQEmu::skills::SkillType)gmskill->skill_id;
|
||||||
|
|
||||||
if(!CanHaveSkill(skill)) {
|
if(!CanHaveSkill(skill)) {
|
||||||
Log.Out(Logs::Detail, Logs::Skills, "Tried to train skill %d, which is not allowed.", skill);
|
Log(Logs::Detail, Logs::Skills, "Tried to train skill %d, which is not allowed.", skill);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(MaxSkill(skill) == 0) {
|
if(MaxSkill(skill) == 0) {
|
||||||
Log.Out(Logs::Detail, Logs::Skills, "Tried to train skill %d, but training is not allowed at this level.", skill);
|
Log(Logs::Detail, Logs::Skills, "Tried to train skill %d, but training is not allowed at this level.", skill);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2027,7 +2038,7 @@ void Client::HandleRespawnFromHover(uint32 Option)
|
|||||||
{
|
{
|
||||||
if (PendingRezzXP < 0 || PendingRezzSpellID == 0)
|
if (PendingRezzXP < 0 || PendingRezzSpellID == 0)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "Unexpected Rezz from hover request.");
|
Log(Logs::Detail, Logs::Spells, "Unexpected Rezz from hover request.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
SetHP(GetMaxHP() / 5);
|
SetHP(GetMaxHP() / 5);
|
||||||
@ -2061,10 +2072,10 @@ void Client::HandleRespawnFromHover(uint32 Option)
|
|||||||
|
|
||||||
if (corpse && corpse->IsCorpse())
|
if (corpse && corpse->IsCorpse())
|
||||||
{
|
{
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "Hover Rez in zone %s for corpse %s",
|
Log(Logs::Detail, Logs::Spells, "Hover Rez in zone %s for corpse %s",
|
||||||
zone->GetShortName(), PendingRezzCorpseName.c_str());
|
zone->GetShortName(), PendingRezzCorpseName.c_str());
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Spells, "Found corpse. Marking corpse as rezzed.");
|
Log(Logs::Detail, Logs::Spells, "Found corpse. Marking corpse as rezzed.");
|
||||||
|
|
||||||
corpse->IsRezzed(true);
|
corpse->IsRezzed(true);
|
||||||
corpse->CompleteResurrection();
|
corpse->CompleteResurrection();
|
||||||
|
|||||||
@ -430,12 +430,12 @@ int command_init(void)
|
|||||||
auto iter_cs = command_settings.find(iter_cl->first);
|
auto iter_cs = command_settings.find(iter_cl->first);
|
||||||
if (iter_cs == command_settings.end()) {
|
if (iter_cs == command_settings.end()) {
|
||||||
if (iter_cl->second->access == 0)
|
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());
|
Log(Logs::General, Logs::Commands, "command_init(): Warning: Command '%s' defaulting to access level 0!", iter_cl->first.c_str());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
iter_cl->second->access = iter_cs->second.first;
|
iter_cl->second->access = iter_cs->second.first;
|
||||||
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(Logs::General, Logs::Commands, "command_init(): - Command '%s' set to access level %d.", iter_cl->first.c_str(), iter_cs->second.first);
|
||||||
if (iter_cs->second.second.empty())
|
if (iter_cs->second.second.empty())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -444,14 +444,14 @@ int command_init(void)
|
|||||||
if (iter_aka->empty())
|
if (iter_aka->empty())
|
||||||
continue;
|
continue;
|
||||||
if (commandlist.find(*iter_aka) != commandlist.end()) {
|
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());
|
Log(Logs::General, Logs::Commands, "command_init(): Warning: Alias '%s' already exists as a command - skipping!", iter_aka->c_str());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
commandlist[*iter_aka] = iter_cl->second;
|
commandlist[*iter_aka] = iter_cl->second;
|
||||||
commandaliases[*iter_aka] = iter_cl->first;
|
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());
|
Log(Logs::General, Logs::Commands, "command_init(): - Alias '%s' added to command '%s'.", iter_aka->c_str(), commandaliases[*iter_aka].c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -491,21 +491,21 @@ void command_deinit(void)
|
|||||||
int command_add(std::string command_name, const char *desc, int access, CmdFuncPtr function)
|
int command_add(std::string command_name, const char *desc, int access, CmdFuncPtr function)
|
||||||
{
|
{
|
||||||
if (command_name.empty()) {
|
if (command_name.empty()) {
|
||||||
Log.Out(Logs::General, Logs::Error, "command_add() - Command added with empty name string - check command.cpp.");
|
Log(Logs::General, Logs::Error, "command_add() - Command added with empty name string - check command.cpp.");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (function == nullptr) {
|
if (function == nullptr) {
|
||||||
Log.Out(Logs::General, Logs::Error, "command_add() - Command '%s' added without a valid function pointer - check command.cpp.", command_name.c_str());
|
Log(Logs::General, Logs::Error, "command_add() - Command '%s' added without a valid function pointer - check command.cpp.", command_name.c_str());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (commandlist.count(command_name) != 0) {
|
if (commandlist.count(command_name) != 0) {
|
||||||
Log.Out(Logs::General, Logs::Error, "command_add() - Command '%s' is a duplicate command name - check command.cpp.", command_name.c_str());
|
Log(Logs::General, Logs::Error, "command_add() - Command '%s' is a duplicate command name - check command.cpp.", command_name.c_str());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
for (auto iter = commandlist.begin(); iter != commandlist.end(); ++iter) {
|
for (auto iter = commandlist.begin(); iter != commandlist.end(); ++iter) {
|
||||||
if (iter->second->function != function)
|
if (iter->second->function != function)
|
||||||
continue;
|
continue;
|
||||||
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());
|
Log(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;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -559,11 +559,11 @@ int command_realdispatch(Client *c, const char *message)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(cur->access >= COMMANDS_LOGGING_MIN_STATUS) {
|
if(cur->access >= COMMANDS_LOGGING_MIN_STATUS) {
|
||||||
Log.Out(Logs::General, Logs::Commands, "%s (%s) used command: %s (target=%s)", c->GetName(), c->AccountName(), message, c->GetTarget()?c->GetTarget()->GetName():"NONE");
|
Log(Logs::General, Logs::Commands, "%s (%s) used command: %s (target=%s)", c->GetName(), c->AccountName(), message, c->GetTarget()?c->GetTarget()->GetName():"NONE");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(cur->function == nullptr) {
|
if(cur->function == nullptr) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Command '%s' has a null function\n", cstr.c_str());
|
Log(Logs::General, Logs::Error, "Command '%s' has a null function\n", cstr.c_str());
|
||||||
return(-1);
|
return(-1);
|
||||||
} else {
|
} else {
|
||||||
//dispatch C++ command
|
//dispatch C++ command
|
||||||
@ -1262,7 +1262,7 @@ void command_viewpetition(Client *c, const Seperator *sep)
|
|||||||
if (!results.Success())
|
if (!results.Success())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Normal, "View petition request from %s, petition number: %i", c->GetName(), atoi(sep->argplus[1]) );
|
Log(Logs::General, Logs::Normal, "View petition request from %s, petition number: %i", c->GetName(), atoi(sep->argplus[1]) );
|
||||||
|
|
||||||
if (results.RowCount() == 0) {
|
if (results.RowCount() == 0) {
|
||||||
c->Message(13,"There was an error in your request: ID not found! Please check the Id and try again.");
|
c->Message(13,"There was an error in your request: ID not found! Please check the Id and try again.");
|
||||||
@ -1287,7 +1287,7 @@ void command_petitioninfo(Client *c, const Seperator *sep)
|
|||||||
if (!results.Success())
|
if (!results.Success())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Normal, "Petition information request from %s, petition number:", c->GetName(), atoi(sep->argplus[1]) );
|
Log(Logs::General, Logs::Normal, "Petition information request from %s, petition number:", c->GetName(), atoi(sep->argplus[1]) );
|
||||||
|
|
||||||
if (results.RowCount() == 0) {
|
if (results.RowCount() == 0) {
|
||||||
c->Message(13,"There was an error in your request: ID not found! Please check the Id and try again.");
|
c->Message(13,"There was an error in your request: ID not found! Please check the Id and try again.");
|
||||||
@ -1313,7 +1313,7 @@ void command_delpetition(Client *c, const Seperator *sep)
|
|||||||
if (!results.Success())
|
if (!results.Success())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Normal, "Delete petition request from %s, petition number:", c->GetName(), atoi(sep->argplus[1]) );
|
Log(Logs::General, Logs::Normal, "Delete petition request from %s, petition number:", c->GetName(), atoi(sep->argplus[1]) );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1549,7 +1549,7 @@ void command_permaclass(Client *c, const Seperator *sep)
|
|||||||
c->Message(0,"Target is not a client.");
|
c->Message(0,"Target is not a client.");
|
||||||
else {
|
else {
|
||||||
c->Message(0, "Setting %s's class...Sending to char select.", t->GetName());
|
c->Message(0, "Setting %s's class...Sending to char select.", t->GetName());
|
||||||
Log.Out(Logs::General, Logs::Normal, "Class change request from %s for %s, requested class:%i", c->GetName(), t->GetName(), atoi(sep->arg[1]) );
|
Log(Logs::General, Logs::Normal, "Class change request from %s for %s, requested class:%i", c->GetName(), t->GetName(), atoi(sep->arg[1]) );
|
||||||
t->SetBaseClass(atoi(sep->arg[1]));
|
t->SetBaseClass(atoi(sep->arg[1]));
|
||||||
t->Save();
|
t->Save();
|
||||||
t->Kick();
|
t->Kick();
|
||||||
@ -1571,7 +1571,7 @@ void command_permarace(Client *c, const Seperator *sep)
|
|||||||
c->Message(0,"Target is not a client.");
|
c->Message(0,"Target is not a client.");
|
||||||
else {
|
else {
|
||||||
c->Message(0, "Setting %s's race - zone to take effect", t->GetName());
|
c->Message(0, "Setting %s's race - zone to take effect", t->GetName());
|
||||||
Log.Out(Logs::General, Logs::Normal, "Permanant race change request from %s for %s, requested race:%i", c->GetName(), t->GetName(), atoi(sep->arg[1]) );
|
Log(Logs::General, Logs::Normal, "Permanant race change request from %s for %s, requested race:%i", c->GetName(), t->GetName(), atoi(sep->arg[1]) );
|
||||||
uint32 tmp = Mob::GetDefaultGender(atoi(sep->arg[1]), t->GetBaseGender());
|
uint32 tmp = Mob::GetDefaultGender(atoi(sep->arg[1]), t->GetBaseGender());
|
||||||
t->SetBaseRace(atoi(sep->arg[1]));
|
t->SetBaseRace(atoi(sep->arg[1]));
|
||||||
t->SetBaseGender(tmp);
|
t->SetBaseGender(tmp);
|
||||||
@ -1595,7 +1595,7 @@ void command_permagender(Client *c, const Seperator *sep)
|
|||||||
c->Message(0,"Target is not a client.");
|
c->Message(0,"Target is not a client.");
|
||||||
else {
|
else {
|
||||||
c->Message(0, "Setting %s's gender - zone to take effect", t->GetName());
|
c->Message(0, "Setting %s's gender - zone to take effect", t->GetName());
|
||||||
Log.Out(Logs::General, Logs::Normal, "Permanant gender change request from %s for %s, requested gender:%i", c->GetName(), t->GetName(), atoi(sep->arg[1]) );
|
Log(Logs::General, Logs::Normal, "Permanant gender change request from %s for %s, requested gender:%i", c->GetName(), t->GetName(), atoi(sep->arg[1]) );
|
||||||
t->SetBaseGender(atoi(sep->arg[1]));
|
t->SetBaseGender(atoi(sep->arg[1]));
|
||||||
t->Save();
|
t->Save();
|
||||||
t->SendIllusionPacket(atoi(sep->arg[1]));
|
t->SendIllusionPacket(atoi(sep->arg[1]));
|
||||||
@ -1932,7 +1932,7 @@ void command_dbspawn2(Client *c, const Seperator *sep)
|
|||||||
{
|
{
|
||||||
|
|
||||||
if (sep->IsNumber(1) && sep->IsNumber(2) && sep->IsNumber(3)) {
|
if (sep->IsNumber(1) && sep->IsNumber(2) && sep->IsNumber(3)) {
|
||||||
Log.Out(Logs::General, Logs::Normal, "Spawning database spawn");
|
Log(Logs::General, Logs::Normal, "Spawning database spawn");
|
||||||
uint16 cond = 0;
|
uint16 cond = 0;
|
||||||
int16 cond_min = 0;
|
int16 cond_min = 0;
|
||||||
if(sep->IsNumber(4)) {
|
if(sep->IsNumber(4)) {
|
||||||
@ -2255,7 +2255,7 @@ void command_setlanguage(Client *c, const Seperator *sep)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Normal, "Set language request from %s, target:%s lang_id:%i value:%i", c->GetName(), c->GetTarget()->GetName(), atoi(sep->arg[1]), atoi(sep->arg[2]) );
|
Log(Logs::General, Logs::Normal, "Set language request from %s, target:%s lang_id:%i value:%i", c->GetName(), c->GetTarget()->GetName(), atoi(sep->arg[1]), atoi(sep->arg[2]) );
|
||||||
uint8 langid = (uint8)atoi(sep->arg[1]);
|
uint8 langid = (uint8)atoi(sep->arg[1]);
|
||||||
uint8 value = (uint8)atoi(sep->arg[2]);
|
uint8 value = (uint8)atoi(sep->arg[2]);
|
||||||
c->GetTarget()->CastToClient()->SetLanguageSkill( langid, value );
|
c->GetTarget()->CastToClient()->SetLanguageSkill( langid, value );
|
||||||
@ -2280,7 +2280,7 @@ void command_setskill(Client *c, const Seperator *sep)
|
|||||||
c->Message(0, " x = 0 to %d", HIGHEST_CAN_SET_SKILL);
|
c->Message(0, " x = 0 to %d", HIGHEST_CAN_SET_SKILL);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Log.Out(Logs::General, Logs::Normal, "Set skill request from %s, target:%s skill_id:%i value:%i", c->GetName(), c->GetTarget()->GetName(), atoi(sep->arg[1]), atoi(sep->arg[2]) );
|
Log(Logs::General, Logs::Normal, "Set skill request from %s, target:%s skill_id:%i value:%i", c->GetName(), c->GetTarget()->GetName(), atoi(sep->arg[1]), atoi(sep->arg[2]) );
|
||||||
int skill_num = atoi(sep->arg[1]);
|
int skill_num = atoi(sep->arg[1]);
|
||||||
uint16 skill_value = atoi(sep->arg[2]);
|
uint16 skill_value = atoi(sep->arg[2]);
|
||||||
if (skill_num <= EQEmu::skills::HIGHEST_SKILL)
|
if (skill_num <= EQEmu::skills::HIGHEST_SKILL)
|
||||||
@ -2300,7 +2300,7 @@ void command_setskillall(Client *c, const Seperator *sep)
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (c->Admin() >= commandSetSkillsOther || c->GetTarget()==c || c->GetTarget()==0) {
|
if (c->Admin() >= commandSetSkillsOther || c->GetTarget()==c || c->GetTarget()==0) {
|
||||||
Log.Out(Logs::General, Logs::Normal, "Set ALL skill request from %s, target:%s", c->GetName(), c->GetTarget()->GetName());
|
Log(Logs::General, Logs::Normal, "Set ALL skill request from %s, target:%s", c->GetName(), c->GetTarget()->GetName());
|
||||||
uint16 level = atoi(sep->arg[1]);
|
uint16 level = atoi(sep->arg[1]);
|
||||||
for (EQEmu::skills::SkillType skill_num = EQEmu::skills::Skill1HBlunt; skill_num <= EQEmu::skills::HIGHEST_SKILL; skill_num = (EQEmu::skills::SkillType)(skill_num + 1)) {
|
for (EQEmu::skills::SkillType skill_num = EQEmu::skills::Skill1HBlunt; skill_num <= EQEmu::skills::HIGHEST_SKILL; skill_num = (EQEmu::skills::SkillType)(skill_num + 1)) {
|
||||||
c->GetTarget()->CastToClient()->SetSkill(skill_num, level);
|
c->GetTarget()->CastToClient()->SetSkill(skill_num, level);
|
||||||
@ -3123,7 +3123,7 @@ void command_listpetition(Client *c, const Seperator *sep)
|
|||||||
if (!results.Success())
|
if (!results.Success())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Normal, "Petition list requested by %s", c->GetName());
|
Log(Logs::General, Logs::Normal, "Petition list requested by %s", c->GetName());
|
||||||
|
|
||||||
if (results.RowCount() == 0)
|
if (results.RowCount() == 0)
|
||||||
return;
|
return;
|
||||||
@ -3781,7 +3781,7 @@ void command_lastname(Client *c, const Seperator *sep)
|
|||||||
|
|
||||||
if(c->GetTarget() && c->GetTarget()->IsClient())
|
if(c->GetTarget() && c->GetTarget()->IsClient())
|
||||||
t=c->GetTarget()->CastToClient();
|
t=c->GetTarget()->CastToClient();
|
||||||
Log.Out(Logs::General, Logs::Normal, "#lastname request from %s for %s", c->GetName(), t->GetName());
|
Log(Logs::General, Logs::Normal, "#lastname request from %s for %s", c->GetName(), t->GetName());
|
||||||
|
|
||||||
if(strlen(sep->arg[1]) <= 70)
|
if(strlen(sep->arg[1]) <= 70)
|
||||||
t->ChangeLastName(sep->arg[1]);
|
t->ChangeLastName(sep->arg[1]);
|
||||||
@ -4338,7 +4338,7 @@ void command_iteminfo(Client *c, const Seperator *sep)
|
|||||||
}
|
}
|
||||||
auto item = inst->GetItem();
|
auto item = inst->GetItem();
|
||||||
if (!item) {
|
if (!item) {
|
||||||
Log.Out(Logs::General, Logs::Inventory, "(%s) Command #iteminfo processed an item with no data pointer");
|
Log(Logs::General, Logs::Inventory, "(%s) Command #iteminfo processed an item with no data pointer");
|
||||||
c->Message(13, "Error: This item has no data reference");
|
c->Message(13, "Error: This item has no data reference");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -4445,7 +4445,7 @@ void command_time(Client *c, const Seperator *sep)
|
|||||||
}
|
}
|
||||||
c->Message(13, "Setting world time to %s:%i (Timezone: 0)...", sep->arg[1], minutes);
|
c->Message(13, "Setting world time to %s:%i (Timezone: 0)...", sep->arg[1], minutes);
|
||||||
zone->SetTime(atoi(sep->arg[1])+1, minutes);
|
zone->SetTime(atoi(sep->arg[1])+1, minutes);
|
||||||
Log.Out(Logs::General, Logs::Zone_Server, "%s :: Setting world time to %s:%i (Timezone: 0)...", c->GetCleanName(), sep->arg[1], minutes);
|
Log(Logs::General, Logs::Zone_Server, "%s :: Setting world time to %s:%i (Timezone: 0)...", c->GetCleanName(), sep->arg[1], minutes);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
c->Message(13, "To set the Time: #time HH [MM]");
|
c->Message(13, "To set the Time: #time HH [MM]");
|
||||||
@ -4460,7 +4460,7 @@ void command_time(Client *c, const Seperator *sep)
|
|||||||
zone->zone_time.getEQTimeZoneMin()
|
zone->zone_time.getEQTimeZoneMin()
|
||||||
);
|
);
|
||||||
c->Message(13, "It is now %s.", timeMessage);
|
c->Message(13, "It is now %s.", timeMessage);
|
||||||
Log.Out(Logs::General, Logs::Zone_Server, "Current Time is: %s", timeMessage);
|
Log(Logs::General, Logs::Zone_Server, "Current Time is: %s", timeMessage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4594,10 +4594,10 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(guild_id == GUILD_NONE) {
|
if(guild_id == GUILD_NONE) {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "%s: Removing %s (%d) from guild with GM command.", c->GetName(),
|
Log(Logs::Detail, Logs::Guilds, "%s: Removing %s (%d) from guild with GM command.", c->GetName(),
|
||||||
sep->arg[2], charid);
|
sep->arg[2], charid);
|
||||||
} else {
|
} else {
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "%s: Putting %s (%d) into guild %s (%d) with GM command.", c->GetName(),
|
Log(Logs::Detail, Logs::Guilds, "%s: Putting %s (%d) into guild %s (%d) with GM command.", c->GetName(),
|
||||||
sep->arg[2], charid,
|
sep->arg[2], charid,
|
||||||
guild_mgr.GetGuildName(guild_id), guild_id);
|
guild_mgr.GetGuildName(guild_id), guild_id);
|
||||||
}
|
}
|
||||||
@ -4646,7 +4646,7 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "%s: Setting %s (%d)'s guild rank to %d with GM command.", c->GetName(),
|
Log(Logs::Detail, Logs::Guilds, "%s: Setting %s (%d)'s guild rank to %d with GM command.", c->GetName(),
|
||||||
sep->arg[2], charid, rank);
|
sep->arg[2], charid, rank);
|
||||||
|
|
||||||
if(!guild_mgr.SetGuildRank(charid, rank))
|
if(!guild_mgr.SetGuildRank(charid, rank))
|
||||||
@ -4688,7 +4688,7 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
|
|
||||||
uint32 id = guild_mgr.CreateGuild(sep->argplus[3], leader);
|
uint32 id = guild_mgr.CreateGuild(sep->argplus[3], leader);
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "%s: Creating guild %s with leader %d with GM command. It was given id %lu.", c->GetName(),
|
Log(Logs::Detail, Logs::Guilds, "%s: Creating guild %s with leader %d with GM command. It was given id %lu.", c->GetName(),
|
||||||
sep->argplus[3], leader, (unsigned long)id);
|
sep->argplus[3], leader, (unsigned long)id);
|
||||||
|
|
||||||
if (id == GUILD_NONE)
|
if (id == GUILD_NONE)
|
||||||
@ -4727,7 +4727,7 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "%s: Deleting guild %s (%d) with GM command.", c->GetName(),
|
Log(Logs::Detail, Logs::Guilds, "%s: Deleting guild %s (%d) with GM command.", c->GetName(),
|
||||||
guild_mgr.GetGuildName(id), id);
|
guild_mgr.GetGuildName(id), id);
|
||||||
|
|
||||||
if (!guild_mgr.DeleteGuild(id))
|
if (!guild_mgr.DeleteGuild(id))
|
||||||
@ -4761,7 +4761,7 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "%s: Renaming guild %s (%d) to '%s' with GM command.", c->GetName(),
|
Log(Logs::Detail, Logs::Guilds, "%s: Renaming guild %s (%d) to '%s' with GM command.", c->GetName(),
|
||||||
guild_mgr.GetGuildName(id), id, sep->argplus[3]);
|
guild_mgr.GetGuildName(id), id, sep->argplus[3]);
|
||||||
|
|
||||||
if (!guild_mgr.RenameGuild(id, sep->argplus[3]))
|
if (!guild_mgr.RenameGuild(id, sep->argplus[3]))
|
||||||
@ -4812,7 +4812,7 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Guilds, "%s: Setting leader of guild %s (%d) to %d with GM command.", c->GetName(),
|
Log(Logs::Detail, Logs::Guilds, "%s: Setting leader of guild %s (%d) to %d with GM command.", c->GetName(),
|
||||||
guild_mgr.GetGuildName(id), id, leader);
|
guild_mgr.GetGuildName(id), id, leader);
|
||||||
|
|
||||||
if(!guild_mgr.SetGuildLeader(id, leader))
|
if(!guild_mgr.SetGuildLeader(id, leader))
|
||||||
@ -5272,7 +5272,7 @@ void command_scribespells(Client *c, const Seperator *sep)
|
|||||||
t->Message(0, "Scribing spells to spellbook.");
|
t->Message(0, "Scribing spells to spellbook.");
|
||||||
if(t != c)
|
if(t != c)
|
||||||
c->Message(0, "Scribing spells for %s.", t->GetName());
|
c->Message(0, "Scribing spells for %s.", t->GetName());
|
||||||
Log.Out(Logs::General, Logs::Normal, "Scribe spells request for %s from %s, levels: %u -> %u", t->GetName(), c->GetName(), min_level, max_level);
|
Log(Logs::General, Logs::Normal, "Scribe spells request for %s from %s, levels: %u -> %u", t->GetName(), c->GetName(), min_level, max_level);
|
||||||
|
|
||||||
for(curspell = 0, book_slot = t->GetNextAvailableSpellBookSlot(), count = 0; curspell < SPDAT_RECORDS && book_slot < MAX_PP_SPELLBOOK; curspell++, book_slot = t->GetNextAvailableSpellBookSlot(book_slot))
|
for(curspell = 0, book_slot = t->GetNextAvailableSpellBookSlot(), count = 0; curspell < SPDAT_RECORDS && book_slot < MAX_PP_SPELLBOOK; curspell++, book_slot = t->GetNextAvailableSpellBookSlot(book_slot))
|
||||||
{
|
{
|
||||||
@ -5329,7 +5329,7 @@ void command_scribespell(Client *c, const Seperator *sep) {
|
|||||||
if(t != c)
|
if(t != c)
|
||||||
c->Message(0, "Scribing spell: %s (%i) for %s.", spells[spell_id].name, spell_id, t->GetName());
|
c->Message(0, "Scribing spell: %s (%i) for %s.", spells[spell_id].name, spell_id, t->GetName());
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Normal, "Scribe spell: %s (%i) request for %s from %s.", spells[spell_id].name, spell_id, t->GetName(), c->GetName());
|
Log(Logs::General, Logs::Normal, "Scribe spell: %s (%i) request for %s from %s.", spells[spell_id].name, spell_id, t->GetName(), c->GetName());
|
||||||
|
|
||||||
if (spells[spell_id].classes[WARRIOR] != 0 && spells[spell_id].skill != 52 && spells[spell_id].classes[t->GetPP().class_ - 1] > 0 && !IsDiscipline(spell_id)) {
|
if (spells[spell_id].classes[WARRIOR] != 0 && spells[spell_id].skill != 52 && spells[spell_id].classes[t->GetPP().class_ - 1] > 0 && !IsDiscipline(spell_id)) {
|
||||||
book_slot = t->GetNextAvailableSpellBookSlot();
|
book_slot = t->GetNextAvailableSpellBookSlot();
|
||||||
@ -5376,7 +5376,7 @@ void command_unscribespell(Client *c, const Seperator *sep) {
|
|||||||
if(t != c)
|
if(t != c)
|
||||||
c->Message(0, "Unscribing spell: %s (%i) for %s.", spells[spell_id].name, spell_id, t->GetName());
|
c->Message(0, "Unscribing spell: %s (%i) for %s.", spells[spell_id].name, spell_id, t->GetName());
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Normal, "Unscribe spell: %s (%i) request for %s from %s.", spells[spell_id].name, spell_id, t->GetName(), c->GetName());
|
Log(Logs::General, Logs::Normal, "Unscribe spell: %s (%i) request for %s from %s.", spells[spell_id].name, spell_id, t->GetName(), c->GetName());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
t->Message(13, "Unable to unscribe spell: %s (%i) from your spellbook. This spell is not scribed.", spells[spell_id].name, spell_id);
|
t->Message(13, "Unable to unscribe spell: %s (%i) from your spellbook. This spell is not scribed.", spells[spell_id].name, spell_id);
|
||||||
@ -7816,7 +7816,7 @@ void command_traindisc(Client *c, const Seperator *sep)
|
|||||||
t->Message(0, "Training disciplines");
|
t->Message(0, "Training disciplines");
|
||||||
if(t != c)
|
if(t != c)
|
||||||
c->Message(0, "Training disciplines for %s.", t->GetName());
|
c->Message(0, "Training disciplines for %s.", t->GetName());
|
||||||
Log.Out(Logs::General, Logs::Normal, "Train disciplines request for %s from %s, levels: %u -> %u", t->GetName(), c->GetName(), min_level, max_level);
|
Log(Logs::General, Logs::Normal, "Train disciplines request for %s from %s, levels: %u -> %u", t->GetName(), c->GetName(), min_level, max_level);
|
||||||
|
|
||||||
for(curspell = 0, count = 0; curspell < SPDAT_RECORDS; curspell++)
|
for(curspell = 0, count = 0; curspell < SPDAT_RECORDS; curspell++)
|
||||||
{
|
{
|
||||||
@ -10613,7 +10613,7 @@ void command_logtest(Client *c, const Seperator *sep){
|
|||||||
uint32 i = 0;
|
uint32 i = 0;
|
||||||
t = std::clock();
|
t = std::clock();
|
||||||
for (i = 0; i < atoi(sep->arg[1]); i++){
|
for (i = 0; i < atoi(sep->arg[1]); i++){
|
||||||
Log.Out(Logs::General, Logs::Debug, "[%u] Test #2... Took %f seconds", i, ((float)(std::clock() - t)) / CLOCKS_PER_SEC);
|
Log(Logs::General, Logs::Debug, "[%u] Test #2... Took %f seconds", i, ((float)(std::clock() - t)) / CLOCKS_PER_SEC);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -10645,22 +10645,22 @@ void command_logs(Client *c, const Seperator *sep){
|
|||||||
c->Message(0, "[Category ID | console | file | gmsay | Category Description]");
|
c->Message(0, "[Category ID | console | file | gmsay | Category Description]");
|
||||||
redisplay_columns = 0;
|
redisplay_columns = 0;
|
||||||
}
|
}
|
||||||
c->Message(0, StringFormat("--- %i | %u | %u | %u | %s", i, Log.log_settings[i].log_to_console, Log.log_settings[i].log_to_file, Log.log_settings[i].log_to_gmsay, Logs::LogCategoryName[i]).c_str());
|
c->Message(0, StringFormat("--- %i | %u | %u | %u | %s", i, LogSys.log_settings[i].log_to_console, LogSys.log_settings[i].log_to_file, LogSys.log_settings[i].log_to_gmsay, Logs::LogCategoryName[i]).c_str());
|
||||||
redisplay_columns++;
|
redisplay_columns++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* #logs set */
|
/* #logs set */
|
||||||
if (strcasecmp(sep->arg[1], "set") == 0){
|
if (strcasecmp(sep->arg[1], "set") == 0){
|
||||||
if (strcasecmp(sep->arg[2], "console") == 0){
|
if (strcasecmp(sep->arg[2], "console") == 0){
|
||||||
Log.log_settings[atoi(sep->arg[3])].log_to_console = atoi(sep->arg[4]);
|
LogSys.log_settings[atoi(sep->arg[3])].log_to_console = atoi(sep->arg[4]);
|
||||||
logs_set = 1;
|
logs_set = 1;
|
||||||
}
|
}
|
||||||
else if (strcasecmp(sep->arg[2], "file") == 0){
|
else if (strcasecmp(sep->arg[2], "file") == 0){
|
||||||
Log.log_settings[atoi(sep->arg[3])].log_to_file = atoi(sep->arg[4]);
|
LogSys.log_settings[atoi(sep->arg[3])].log_to_file = atoi(sep->arg[4]);
|
||||||
logs_set = 1;
|
logs_set = 1;
|
||||||
}
|
}
|
||||||
else if (strcasecmp(sep->arg[2], "gmsay") == 0){
|
else if (strcasecmp(sep->arg[2], "gmsay") == 0){
|
||||||
Log.log_settings[atoi(sep->arg[3])].log_to_gmsay = atoi(sep->arg[4]);
|
LogSys.log_settings[atoi(sep->arg[3])].log_to_gmsay = atoi(sep->arg[4]);
|
||||||
logs_set = 1;
|
logs_set = 1;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@ -10675,10 +10675,10 @@ void command_logs(Client *c, const Seperator *sep){
|
|||||||
This is used in hot places of code to check if its enabled in any way before triggering logs
|
This is used in hot places of code to check if its enabled in any way before triggering logs
|
||||||
*/
|
*/
|
||||||
if (atoi(sep->arg[4]) > 0){
|
if (atoi(sep->arg[4]) > 0){
|
||||||
Log.log_settings[atoi(sep->arg[3])].is_category_enabled = 1;
|
LogSys.log_settings[atoi(sep->arg[3])].is_category_enabled = 1;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
Log.log_settings[atoi(sep->arg[3])].is_category_enabled = 0;
|
LogSys.log_settings[atoi(sep->arg[3])].is_category_enabled = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -10701,7 +10701,7 @@ void command_mysqltest(Client *c, const Seperator *sep)
|
|||||||
auto results = database.QueryDatabase(query);
|
auto results = database.QueryDatabase(query);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Log.Out(Logs::General, Logs::Debug, "MySQL Test... Took %f seconds", ((float)(std::clock() - t)) / CLOCKS_PER_SEC);
|
Log(Logs::General, Logs::Debug, "MySQL Test... Took %f seconds", ((float)(std::clock() - t)) / CLOCKS_PER_SEC);
|
||||||
}
|
}
|
||||||
|
|
||||||
void command_resetaa_timer(Client *c, const Seperator *sep) {
|
void command_resetaa_timer(Client *c, const Seperator *sep) {
|
||||||
|
|||||||
@ -798,7 +798,7 @@ bool Corpse::Process() {
|
|||||||
spc->zone_id = zone->graveyard_zoneid();
|
spc->zone_id = zone->graveyard_zoneid();
|
||||||
worldserver.SendPacket(pack);
|
worldserver.SendPacket(pack);
|
||||||
safe_delete(pack);
|
safe_delete(pack);
|
||||||
Log.Out(Logs::General, Logs::None, "Moved %s player corpse to the designated graveyard in zone %s.", this->GetName(), database.GetZoneName(zone->graveyard_zoneid()));
|
Log(Logs::General, Logs::None, "Moved %s player corpse to the designated graveyard in zone %s.", this->GetName(), database.GetZoneName(zone->graveyard_zoneid()));
|
||||||
corpse_db_id = 0;
|
corpse_db_id = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -828,10 +828,10 @@ bool Corpse::Process() {
|
|||||||
Save();
|
Save();
|
||||||
player_corpse_depop = true;
|
player_corpse_depop = true;
|
||||||
corpse_db_id = 0;
|
corpse_db_id = 0;
|
||||||
Log.Out(Logs::General, Logs::None, "Tagged %s player corpse has buried.", this->GetName());
|
Log(Logs::General, Logs::None, "Tagged %s player corpse has buried.", this->GetName());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Log.Out(Logs::General, Logs::Error, "Unable to bury %s player corpse.", this->GetName());
|
Log(Logs::General, Logs::Error, "Unable to bury %s player corpse.", this->GetName());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1046,7 +1046,7 @@ void Corpse::MakeLootRequestPackets(Client* client, const EQApplicationPacket* a
|
|||||||
for(; cur != end; ++cur) {
|
for(; cur != end; ++cur) {
|
||||||
ServerLootItem_Struct* item_data = *cur;
|
ServerLootItem_Struct* item_data = *cur;
|
||||||
item = database.GetItem(item_data->item_id);
|
item = database.GetItem(item_data->item_id);
|
||||||
Log.Out(Logs::General, Logs::None, "Corpse Looting: %s was not sent to client loot window (corpse_dbid: %i, charname: %s(%s))", item->Name, GetCorpseDBID(), client->GetName(), client->GetGM() ? "GM" : "Owner");
|
Log(Logs::General, Logs::None, "Corpse Looting: %s was not sent to client loot window (corpse_dbid: %i, charname: %s(%s))", item->Name, GetCorpseDBID(), client->GetName(), client->GetGM() ? "GM" : "Owner");
|
||||||
client->Message(0, "Inaccessable Corpse Item: %s", item->Name);
|
client->Message(0, "Inaccessable Corpse Item: %s", item->Name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -133,9 +133,9 @@ bool Doors::Process()
|
|||||||
void Doors::HandleClick(Client* sender, uint8 trigger)
|
void Doors::HandleClick(Client* sender, uint8 trigger)
|
||||||
{
|
{
|
||||||
//door debugging info dump
|
//door debugging info dump
|
||||||
Log.Out(Logs::Detail, Logs::Doors, "%s clicked door %s (dbid %d, eqid %d) at %s", sender->GetName(), door_name, db_id, door_id, to_string(m_Position).c_str());
|
Log(Logs::Detail, Logs::Doors, "%s clicked door %s (dbid %d, eqid %d) at %s", sender->GetName(), door_name, db_id, door_id, to_string(m_Position).c_str());
|
||||||
Log.Out(Logs::Detail, Logs::Doors, " incline %d, opentype %d, lockpick %d, key %d, nokeyring %d, trigger %d type %d, param %d", incline, opentype, lockpick, keyitem, nokeyring, trigger_door, trigger_type, door_param);
|
Log(Logs::Detail, Logs::Doors, " incline %d, opentype %d, lockpick %d, key %d, nokeyring %d, trigger %d type %d, param %d", incline, opentype, lockpick, keyitem, nokeyring, trigger_door, trigger_type, door_param);
|
||||||
Log.Out(Logs::Detail, Logs::Doors, " size %d, invert %d, dest: %s %s", size, invert_state, dest_zone, to_string(m_Destination).c_str());
|
Log(Logs::Detail, Logs::Doors, " size %d, invert %d, dest: %s %s", size, invert_state, dest_zone, to_string(m_Destination).c_str());
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(OP_MoveDoor, sizeof(MoveDoor_Struct));
|
auto outapp = new EQApplicationPacket(OP_MoveDoor, sizeof(MoveDoor_Struct));
|
||||||
MoveDoor_Struct* md = (MoveDoor_Struct*)outapp->pBuffer;
|
MoveDoor_Struct* md = (MoveDoor_Struct*)outapp->pBuffer;
|
||||||
@ -291,7 +291,7 @@ void Doors::HandleClick(Client* sender, uint8 trigger)
|
|||||||
float modskill = sender->GetSkill(EQEmu::skills::SkillPickLock);
|
float modskill = sender->GetSkill(EQEmu::skills::SkillPickLock);
|
||||||
sender->CheckIncreaseSkill(EQEmu::skills::SkillPickLock, nullptr, 1);
|
sender->CheckIncreaseSkill(EQEmu::skills::SkillPickLock, nullptr, 1);
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Skills, "Client has lockpicks: skill=%f", modskill);
|
Log(Logs::General, Logs::Skills, "Client has lockpicks: skill=%f", modskill);
|
||||||
|
|
||||||
if(GetLockpick() <= modskill)
|
if(GetLockpick() <= modskill)
|
||||||
{
|
{
|
||||||
@ -547,13 +547,13 @@ void Doors::ToggleState(Mob *sender)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Doors::DumpDoor(){
|
void Doors::DumpDoor(){
|
||||||
Log.Out(Logs::General, Logs::None,
|
Log(Logs::General, Logs::None,
|
||||||
"db_id:%i door_id:%i zone_name:%s door_name:%s %s",
|
"db_id:%i door_id:%i zone_name:%s door_name:%s %s",
|
||||||
db_id, door_id, zone_name, door_name, to_string(m_Position).c_str());
|
db_id, door_id, zone_name, door_name, to_string(m_Position).c_str());
|
||||||
Log.Out(Logs::General, Logs::None,
|
Log(Logs::General, Logs::None,
|
||||||
"opentype:%i guild_id:%i lockpick:%i keyitem:%i nokeyring:%i trigger_door:%i trigger_type:%i door_param:%i open:%s",
|
"opentype:%i guild_id:%i lockpick:%i keyitem:%i nokeyring:%i trigger_door:%i trigger_type:%i door_param:%i open:%s",
|
||||||
opentype, guild_id, lockpick, keyitem, nokeyring, trigger_door, trigger_type, door_param, (isopen) ? "open":"closed");
|
opentype, guild_id, lockpick, keyitem, nokeyring, trigger_door, trigger_type, door_param, (isopen) ? "open":"closed");
|
||||||
Log.Out(Logs::General, Logs::None,
|
Log(Logs::General, Logs::None,
|
||||||
"dest_zone:%s destination:%s ",
|
"dest_zone:%s destination:%s ",
|
||||||
dest_zone, to_string(m_Destination).c_str());
|
dest_zone, to_string(m_Destination).c_str());
|
||||||
}
|
}
|
||||||
@ -629,7 +629,7 @@ int32 ZoneDatabase::GetDoorsDBCountPlusOne(const char *zone_name, int16 version)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool ZoneDatabase::LoadDoors(int32 iDoorCount, Door *into, const char *zone_name, int16 version) {
|
bool ZoneDatabase::LoadDoors(int32 iDoorCount, Door *into, const char *zone_name, int16 version) {
|
||||||
Log.Out(Logs::General, Logs::Status, "Loading Doors from database...");
|
Log(Logs::General, Logs::Status, "Loading Doors from database...");
|
||||||
|
|
||||||
|
|
||||||
// Door tmpDoor;
|
// Door tmpDoor;
|
||||||
@ -656,7 +656,7 @@ bool ZoneDatabase::LoadDoors(int32 iDoorCount, Door *into, const char *zone_name
|
|||||||
into[rowIndex].db_id = atoi(row[0]);
|
into[rowIndex].db_id = atoi(row[0]);
|
||||||
into[rowIndex].door_id = atoi(row[1]);
|
into[rowIndex].door_id = atoi(row[1]);
|
||||||
|
|
||||||
Log.Out(Logs::Detail, Logs::Doors, "Door Load: db id: %u, door_id %u", into[rowIndex].db_id, into[rowIndex].door_id);
|
Log(Logs::Detail, Logs::Doors, "Door Load: db id: %u, door_id %u", into[rowIndex].db_id, into[rowIndex].door_id);
|
||||||
|
|
||||||
strn0cpy(into[rowIndex].zone_name,row[2],32);
|
strn0cpy(into[rowIndex].zone_name,row[2],32);
|
||||||
strn0cpy(into[rowIndex].door_name,row[3],32);
|
strn0cpy(into[rowIndex].door_name,row[3],32);
|
||||||
|
|||||||
@ -485,7 +485,7 @@ bool Client::TrainDiscipline(uint32 itemid) {
|
|||||||
const EQEmu::ItemData *item = database.GetItem(itemid);
|
const EQEmu::ItemData *item = database.GetItem(itemid);
|
||||||
if(item == nullptr) {
|
if(item == nullptr) {
|
||||||
Message(13, "Unable to find the tome you turned in!");
|
Message(13, "Unable to find the tome you turned in!");
|
||||||
Log.Out(Logs::General, Logs::Error, "Unable to find turned in tome id %lu\n", (unsigned long)itemid);
|
Log(Logs::General, Logs::Error, "Unable to find turned in tome id %lu\n", (unsigned long)itemid);
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -144,7 +144,7 @@ void PerlembParser::ReloadQuests() {
|
|||||||
perl = nullptr;
|
perl = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Status, "Error re-initializing perlembed: %s", e.what());
|
Log(Logs::General, Logs::Status, "Error re-initializing perlembed: %s", e.what());
|
||||||
throw e.what();
|
throw e.what();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -3654,13 +3654,13 @@ XS(XS__debug)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (debug_level == Logs::General){
|
if (debug_level == Logs::General){
|
||||||
Log.Out(Logs::General, Logs::QuestDebug, log_message);
|
Log(Logs::General, Logs::QuestDebug, log_message);
|
||||||
}
|
}
|
||||||
else if (debug_level == Logs::Moderate){
|
else if (debug_level == Logs::Moderate){
|
||||||
Log.Out(Logs::Moderate, Logs::QuestDebug, log_message);
|
Log(Logs::Moderate, Logs::QuestDebug, log_message);
|
||||||
}
|
}
|
||||||
else if (debug_level == Logs::Detail){
|
else if (debug_level == Logs::Detail){
|
||||||
Log.Out(Logs::Detail, Logs::QuestDebug, log_message);
|
Log(Logs::Detail, Logs::QuestDebug, log_message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
XSRETURN_EMPTY;
|
XSRETURN_EMPTY;
|
||||||
@ -3693,7 +3693,7 @@ EXTERN_C XS(boot_quest)
|
|||||||
file[255] = '\0';
|
file[255] = '\0';
|
||||||
|
|
||||||
if(items != 1)
|
if(items != 1)
|
||||||
Log.Out(Logs::General, Logs::Error, "boot_quest does not take any arguments.");
|
Log(Logs::General, Logs::Error, "boot_quest does not take any arguments.");
|
||||||
|
|
||||||
char buf[128]; //shouldent have any function names longer than this.
|
char buf[128]; //shouldent have any function names longer than this.
|
||||||
|
|
||||||
|
|||||||
@ -140,12 +140,12 @@ void Embperl::DoInit() {
|
|||||||
catch(const char *err)
|
catch(const char *err)
|
||||||
{
|
{
|
||||||
//remember... lasterr() is no good if we crap out here, in construction
|
//remember... lasterr() is no good if we crap out here, in construction
|
||||||
Log.Out(Logs::General, Logs::Quests, "perl error: %s", err);
|
Log(Logs::General, Logs::Quests, "perl error: %s", err);
|
||||||
throw "failed to install eval_file hook";
|
throw "failed to install eval_file hook";
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef EMBPERL_IO_CAPTURE
|
#ifdef EMBPERL_IO_CAPTURE
|
||||||
Log.Out(Logs::General, Logs::Quests, "Tying perl output to eqemu logs");
|
Log(Logs::General, Logs::Quests, "Tying perl output to eqemu logs");
|
||||||
//make a tieable class to capture IO and pass it into EQEMuLog
|
//make a tieable class to capture IO and pass it into EQEMuLog
|
||||||
eval_pv(
|
eval_pv(
|
||||||
"package EQEmuIO; "
|
"package EQEmuIO; "
|
||||||
@ -170,7 +170,7 @@ void Embperl::DoInit() {
|
|||||||
,FALSE
|
,FALSE
|
||||||
);
|
);
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Quests, "Loading perlemb plugins.");
|
Log(Logs::General, Logs::Quests, "Loading perlemb plugins.");
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
std::string perl_command;
|
std::string perl_command;
|
||||||
@ -179,7 +179,7 @@ void Embperl::DoInit() {
|
|||||||
}
|
}
|
||||||
catch(const char *err)
|
catch(const char *err)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Quests, "Warning - %s: %s", Config->PluginPlFile.c_str(), err);
|
Log(Logs::General, Logs::Quests, "Warning - %s: %s", Config->PluginPlFile.c_str(), err);
|
||||||
}
|
}
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -197,7 +197,7 @@ void Embperl::DoInit() {
|
|||||||
}
|
}
|
||||||
catch(const char *err)
|
catch(const char *err)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Quests, "Perl warning: %s", err);
|
Log(Logs::General, Logs::Quests, "Perl warning: %s", err);
|
||||||
}
|
}
|
||||||
#endif //EMBPERL_PLUGIN
|
#endif //EMBPERL_PLUGIN
|
||||||
in_use = false;
|
in_use = false;
|
||||||
|
|||||||
@ -68,7 +68,7 @@ EXTERN_C XS(boot_qc)
|
|||||||
file[255] = '\0';
|
file[255] = '\0';
|
||||||
|
|
||||||
if(items != 1)
|
if(items != 1)
|
||||||
Log.Out(Logs::General, Logs::Error, "boot_qc does not take any arguments.");
|
Log(Logs::General, Logs::Error, "boot_qc does not take any arguments.");
|
||||||
|
|
||||||
char buf[128]; //shouldent have any function names longer than this.
|
char buf[128]; //shouldent have any function names longer than this.
|
||||||
|
|
||||||
@ -104,7 +104,7 @@ XS(XS_EQEmuIO_PRINT)
|
|||||||
int len = 0;
|
int len = 0;
|
||||||
for(i = 0; *cur != '\0'; i++, cur++) {
|
for(i = 0; *cur != '\0'; i++, cur++) {
|
||||||
if(*cur == '\n') {
|
if(*cur == '\n') {
|
||||||
Log.Out(Logs::General, Logs::Quests, str);
|
Log(Logs::General, Logs::Quests, str);
|
||||||
len = 0;
|
len = 0;
|
||||||
pos = i+1;
|
pos = i+1;
|
||||||
} else {
|
} else {
|
||||||
@ -112,7 +112,7 @@ XS(XS_EQEmuIO_PRINT)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(len > 0) {
|
if(len > 0) {
|
||||||
Log.Out(Logs::General, Logs::Quests, str);
|
Log(Logs::General, Logs::Quests, str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -73,12 +73,12 @@ Entity::~Entity()
|
|||||||
Client *Entity::CastToClient()
|
Client *Entity::CastToClient()
|
||||||
{
|
{
|
||||||
if (this == 0x00) {
|
if (this == 0x00) {
|
||||||
Log.Out(Logs::General, Logs::Error, "CastToClient error (nullptr)");
|
Log(Logs::General, Logs::Error, "CastToClient error (nullptr)");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifdef _EQDEBUG
|
#ifdef _EQDEBUG
|
||||||
if (!IsClient()) {
|
if (!IsClient()) {
|
||||||
Log.Out(Logs::General, Logs::Error, "CastToClient error (not client)");
|
Log(Logs::General, Logs::Error, "CastToClient error (not client)");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -90,7 +90,7 @@ NPC *Entity::CastToNPC()
|
|||||||
{
|
{
|
||||||
#ifdef _EQDEBUG
|
#ifdef _EQDEBUG
|
||||||
if (!IsNPC()) {
|
if (!IsNPC()) {
|
||||||
Log.Out(Logs::General, Logs::Error, "CastToNPC error (Not NPC)");
|
Log(Logs::General, Logs::Error, "CastToNPC error (Not NPC)");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -363,7 +363,7 @@ void EntityList::CheckGroupList (const char *fname, const int fline)
|
|||||||
{
|
{
|
||||||
if (*it == nullptr)
|
if (*it == nullptr)
|
||||||
{
|
{
|
||||||
Log.Out(Logs::General, Logs::Error, "nullptr group, %s:%i", fname, fline);
|
Log(Logs::General, Logs::Error, "nullptr group, %s:%i", fname, fline);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -521,17 +521,17 @@ void EntityList::MobProcess()
|
|||||||
#ifdef _WINDOWS
|
#ifdef _WINDOWS
|
||||||
struct in_addr in;
|
struct in_addr in;
|
||||||
in.s_addr = mob->CastToClient()->GetIP();
|
in.s_addr = mob->CastToClient()->GetIP();
|
||||||
Log.Out(Logs::General, Logs::Zone_Server, "Dropping client: Process=false, ip=%s port=%u", inet_ntoa(in), mob->CastToClient()->GetPort());
|
Log(Logs::General, Logs::Zone_Server, "Dropping client: Process=false, ip=%s port=%u", inet_ntoa(in), mob->CastToClient()->GetPort());
|
||||||
#endif
|
#endif
|
||||||
zone->StartShutdownTimer();
|
zone->StartShutdownTimer();
|
||||||
Group *g = GetGroupByMob(mob);
|
Group *g = GetGroupByMob(mob);
|
||||||
if(g) {
|
if(g) {
|
||||||
Log.Out(Logs::General, Logs::Error, "About to delete a client still in a group.");
|
Log(Logs::General, Logs::Error, "About to delete a client still in a group.");
|
||||||
g->DelMember(mob);
|
g->DelMember(mob);
|
||||||
}
|
}
|
||||||
Raid *r = entity_list.GetRaidByClient(mob->CastToClient());
|
Raid *r = entity_list.GetRaidByClient(mob->CastToClient());
|
||||||
if(r) {
|
if(r) {
|
||||||
Log.Out(Logs::General, Logs::Error, "About to delete a client still in a raid.");
|
Log(Logs::General, Logs::Error, "About to delete a client still in a raid.");
|
||||||
r->MemberZoned(mob->CastToClient());
|
r->MemberZoned(mob->CastToClient());
|
||||||
}
|
}
|
||||||
entity_list.RemoveClient(id);
|
entity_list.RemoveClient(id);
|
||||||
@ -578,7 +578,7 @@ void EntityList::AddGroup(Group *group)
|
|||||||
|
|
||||||
uint32 gid = worldserver.NextGroupID();
|
uint32 gid = worldserver.NextGroupID();
|
||||||
if (gid == 0) {
|
if (gid == 0) {
|
||||||
Log.Out(Logs::General, Logs::Error,
|
Log(Logs::General, Logs::Error,
|
||||||
"Unable to get new group ID from world server. group is going to be broken.");
|
"Unable to get new group ID from world server. group is going to be broken.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -607,7 +607,7 @@ void EntityList::AddRaid(Raid *raid)
|
|||||||
|
|
||||||
uint32 gid = worldserver.NextGroupID();
|
uint32 gid = worldserver.NextGroupID();
|
||||||
if (gid == 0) {
|
if (gid == 0) {
|
||||||
Log.Out(Logs::General, Logs::Error,
|
Log(Logs::General, Logs::Error,
|
||||||
"Unable to get new group ID from world server. group is going to be broken.");
|
"Unable to get new group ID from world server. group is going to be broken.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -793,7 +793,7 @@ void EntityList::CheckSpawnQueue()
|
|||||||
auto it = npc_list.find(ns->spawn.spawnId);
|
auto it = npc_list.find(ns->spawn.spawnId);
|
||||||
if (it == npc_list.end()) {
|
if (it == npc_list.end()) {
|
||||||
// We must of despawned, hope that's the reason!
|
// We must of despawned, hope that's the reason!
|
||||||
Log.Out(Logs::General, Logs::Error, "Error in EntityList::CheckSpawnQueue: Unable to find NPC for spawnId '%u'", ns->spawn.spawnId);
|
Log(Logs::General, Logs::Error, "Error in EntityList::CheckSpawnQueue: Unable to find NPC for spawnId '%u'", ns->spawn.spawnId);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
NPC *pnpc = it->second;
|
NPC *pnpc = it->second;
|
||||||
@ -2288,10 +2288,15 @@ bool EntityList::RemoveNPC(uint16 delete_id)
|
|||||||
{
|
{
|
||||||
auto it = npc_list.find(delete_id);
|
auto it = npc_list.find(delete_id);
|
||||||
if (it != npc_list.end()) {
|
if (it != npc_list.end()) {
|
||||||
|
NPC *npc = it->second;
|
||||||
// make sure its proximity is removed
|
// make sure its proximity is removed
|
||||||
RemoveProximity(delete_id);
|
RemoveProximity(delete_id);
|
||||||
|
// remove from client close lists
|
||||||
|
RemoveNPCFromClientCloseLists(npc);
|
||||||
// remove from the list
|
// remove from the list
|
||||||
npc_list.erase(it);
|
npc_list.erase(it);
|
||||||
|
|
||||||
|
|
||||||
// remove from limit list if needed
|
// remove from limit list if needed
|
||||||
if (npc_limit_list.count(delete_id))
|
if (npc_limit_list.count(delete_id))
|
||||||
npc_limit_list.erase(delete_id);
|
npc_limit_list.erase(delete_id);
|
||||||
@ -2300,6 +2305,16 @@ bool EntityList::RemoveNPC(uint16 delete_id)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool EntityList::RemoveNPCFromClientCloseLists(NPC *npc)
|
||||||
|
{
|
||||||
|
auto it = client_list.begin();
|
||||||
|
while (it != client_list.end()) {
|
||||||
|
it->second->close_npcs.erase(npc);
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool EntityList::RemoveMerc(uint16 delete_id)
|
bool EntityList::RemoveMerc(uint16 delete_id)
|
||||||
{
|
{
|
||||||
auto it = merc_list.find(delete_id);
|
auto it = merc_list.find(delete_id);
|
||||||
@ -2659,7 +2674,7 @@ char *EntityList::MakeNameUnique(char *name)
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Log.Out(Logs::General, Logs::Error, "Fatal error in EntityList::MakeNameUnique: Unable to find unique name for '%s'", name);
|
Log(Logs::General, Logs::Error, "Fatal error in EntityList::MakeNameUnique: Unable to find unique name for '%s'", name);
|
||||||
char tmp[64] = "!";
|
char tmp[64] = "!";
|
||||||
strn0cpy(&tmp[1], name, sizeof(tmp) - 1);
|
strn0cpy(&tmp[1], name, sizeof(tmp) - 1);
|
||||||
strcpy(name, tmp);
|
strcpy(name, tmp);
|
||||||
@ -3511,7 +3526,7 @@ void EntityList::ReloadAllClientsTaskState(int TaskID)
|
|||||||
// If we have been passed a TaskID, only reload the client state if they have
|
// If we have been passed a TaskID, only reload the client state if they have
|
||||||
// that Task active.
|
// that Task active.
|
||||||
if ((!TaskID) || (TaskID && client->IsTaskActive(TaskID))) {
|
if ((!TaskID) || (TaskID && client->IsTaskActive(TaskID))) {
|
||||||
Log.Out(Logs::General, Logs::Tasks, "[CLIENTLOAD] Reloading Task State For Client %s", client->GetName());
|
Log(Logs::General, Logs::Tasks, "[CLIENTLOAD] Reloading Task State For Client %s", client->GetName());
|
||||||
client->RemoveClientTaskState();
|
client->RemoveClientTaskState();
|
||||||
client->LoadClientTaskState();
|
client->LoadClientTaskState();
|
||||||
taskmanager->SendActiveTasksToClient(client);
|
taskmanager->SendActiveTasksToClient(client);
|
||||||
|
|||||||
@ -279,6 +279,7 @@ public:
|
|||||||
bool RemoveTrap(uint16 delete_id);
|
bool RemoveTrap(uint16 delete_id);
|
||||||
bool RemoveObject(uint16 delete_id);
|
bool RemoveObject(uint16 delete_id);
|
||||||
bool RemoveProximity(uint16 delete_npc_id);
|
bool RemoveProximity(uint16 delete_npc_id);
|
||||||
|
bool RemoveNPCFromClientCloseLists(NPC *npc);
|
||||||
void RemoveAllMobs();
|
void RemoveAllMobs();
|
||||||
void RemoveAllClients();
|
void RemoveAllClients();
|
||||||
void RemoveAllNPCs();
|
void RemoveAllNPCs();
|
||||||
@ -454,6 +455,14 @@ public:
|
|||||||
void GetSpawnList(std::list<Spawn2*> &d_list);
|
void GetSpawnList(std::list<Spawn2*> &d_list);
|
||||||
void GetTargetsForConeArea(Mob *start, float min_radius, float radius, float height, int pcnpc, std::list<Mob*> &m_list);
|
void GetTargetsForConeArea(Mob *start, float min_radius, float radius, float height, int pcnpc, std::list<Mob*> &m_list);
|
||||||
|
|
||||||
|
inline const std::unordered_map<uint16, Mob *> &GetMobList() { return mob_list; }
|
||||||
|
inline const std::unordered_map<uint16, NPC *> &GetNPCList() { return npc_list; }
|
||||||
|
inline const std::unordered_map<uint16, Merc *> &GetMercList() { return merc_list; }
|
||||||
|
inline const std::unordered_map<uint16, Client *> &GetClientList() { return client_list; }
|
||||||
|
inline const std::unordered_map<uint16, Corpse *> &GetCorpseList() { return corpse_list; }
|
||||||
|
inline const std::unordered_map<uint16, Object *> &GetObjectList() { return object_list; }
|
||||||
|
inline const std::unordered_map<uint16, Doors *> &GetDoorsList() { return door_list; }
|
||||||
|
|
||||||
void DepopAll(int NPCTypeID, bool StartSpawnTimer = true);
|
void DepopAll(int NPCTypeID, bool StartSpawnTimer = true);
|
||||||
|
|
||||||
uint16 GetFreeID();
|
uint16 GetFreeID();
|
||||||
|
|||||||
@ -331,7 +331,7 @@ void Client::AddEXP(uint32 in_add_exp, uint8 conlevel, bool resexp) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Client::SetEXP(uint32 set_exp, uint32 set_aaxp, bool isrezzexp) {
|
void Client::SetEXP(uint32 set_exp, uint32 set_aaxp, bool isrezzexp) {
|
||||||
Log.Out(Logs::Detail, Logs::None, "Attempting to Set Exp for %s (XP: %u, AAXP: %u, Rez: %s)", this->GetCleanName(), set_exp, set_aaxp, isrezzexp ? "true" : "false");
|
Log(Logs::Detail, Logs::None, "Attempting to Set Exp for %s (XP: %u, AAXP: %u, Rez: %s)", this->GetCleanName(), set_exp, set_aaxp, isrezzexp ? "true" : "false");
|
||||||
//max_AAXP = GetEXPForLevel(52) - GetEXPForLevel(51); //GetEXPForLevel() doesn't depend on class/race, just level, so it shouldn't change between Clients
|
//max_AAXP = GetEXPForLevel(52) - GetEXPForLevel(51); //GetEXPForLevel() doesn't depend on class/race, just level, so it shouldn't change between Clients
|
||||||
max_AAXP = RuleI(AA, ExpPerPoint); //this may be redundant since we're doing this in Client::FinishConnState2()
|
max_AAXP = RuleI(AA, ExpPerPoint); //this may be redundant since we're doing this in Client::FinishConnState2()
|
||||||
if (max_AAXP == 0 || GetEXPForLevel(GetLevel()) == 0xFFFFFFFF) {
|
if (max_AAXP == 0 || GetEXPForLevel(GetLevel()) == 0xFFFFFFFF) {
|
||||||
@ -446,7 +446,7 @@ void Client::SetEXP(uint32 set_exp, uint32 set_aaxp, bool isrezzexp) {
|
|||||||
|
|
||||||
//figure out how many AA points we get from the exp were setting
|
//figure out how many AA points we get from the exp were setting
|
||||||
m_pp.aapoints = set_aaxp / max_AAXP;
|
m_pp.aapoints = set_aaxp / max_AAXP;
|
||||||
Log.Out(Logs::Detail, Logs::None, "Calculating additional AA Points from AAXP for %s: %u / %u = %.1f points", this->GetCleanName(), set_aaxp, max_AAXP, (float)set_aaxp / (float)max_AAXP);
|
Log(Logs::Detail, Logs::None, "Calculating additional AA Points from AAXP for %s: %u / %u = %.1f points", this->GetCleanName(), set_aaxp, max_AAXP, (float)set_aaxp / (float)max_AAXP);
|
||||||
|
|
||||||
//get remainder exp points, set in PP below
|
//get remainder exp points, set in PP below
|
||||||
set_aaxp = set_aaxp - (max_AAXP * m_pp.aapoints);
|
set_aaxp = set_aaxp - (max_AAXP * m_pp.aapoints);
|
||||||
@ -572,7 +572,7 @@ void Client::SetEXP(uint32 set_exp, uint32 set_aaxp, bool isrezzexp) {
|
|||||||
void Client::SetLevel(uint8 set_level, bool command)
|
void Client::SetLevel(uint8 set_level, bool command)
|
||||||
{
|
{
|
||||||
if (GetEXPForLevel(set_level) == 0xFFFFFFFF) {
|
if (GetEXPForLevel(set_level) == 0xFFFFFFFF) {
|
||||||
Log.Out(Logs::General, Logs::Error, "Client::SetLevel() GetEXPForLevel(%i) = 0xFFFFFFFF", set_level);
|
Log(Logs::General, Logs::Error, "Client::SetLevel() GetEXPForLevel(%i) = 0xFFFFFFFF", set_level);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -630,7 +630,7 @@ void Client::SetLevel(uint8 set_level, bool command)
|
|||||||
safe_delete(outapp);
|
safe_delete(outapp);
|
||||||
this->SendAppearancePacket(AT_WhoLevel, set_level); // who level change
|
this->SendAppearancePacket(AT_WhoLevel, set_level); // who level change
|
||||||
|
|
||||||
Log.Out(Logs::General, Logs::Normal, "Setting Level for %s to %i", GetName(), set_level);
|
Log(Logs::General, Logs::Normal, "Setting Level for %s to %i", GetName(), set_level);
|
||||||
|
|
||||||
CalcBonuses();
|
CalcBonuses();
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user