HandleEnterWorldPacket refactor

This commit is contained in:
Arthur Ice 2013-03-10 16:15:23 -07:00
parent 29262d966e
commit d5da4aa90b
2 changed files with 231 additions and 223 deletions

View File

@ -687,78 +687,25 @@ bool Client::HandleCharacterCreatePacket(const EQApplicationPacket *app)
return true; return true;
} }
bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app)
bool Client::HandlePacket(const EQApplicationPacket *app) { {
const WorldConfig *Config=WorldConfig::get(); const WorldConfig *Config=WorldConfig::get();
EmuOpcode opcode = app->GetOpcode();
clog(WORLD__CLIENT_TRACE,"Recevied EQApplicationPacket");
_pkt(WORLD__CLIENT_TRACE,app);
bool ret = true;
if (!eqs->CheckState(ESTABLISHED)) {
clog(WORLD__CLIENT,"Client disconnected (net inactive on send)");
return false;
}
// Voidd: Anti-GM Account hack, Checks source ip against valid GM Account IP Addresses
if (RuleB(World, GMAccountIPList) && this->GetAdmin() >= (RuleI(World, MinGMAntiHackStatus))) {
if(!database.CheckGMIPs(long2ip(this->GetIP()).c_str(), this->GetAccountID())) {
clog(WORLD__CLIENT,"GM Account not permited from source address %s and accountid %i", long2ip(this->GetIP()).c_str(), this->GetAccountID());
eqs->Close();
}
}
if (GetAccountID() == 0 && opcode != OP_SendLoginInfo) {
// Got a packet other than OP_SendLoginInfo when not logged in
clog(WORLD__CLIENT_ERR,"Expecting OP_SendLoginInfo, got %s", OpcodeNames[opcode]);
return false;
}
else if (opcode == OP_AckPacket) {
return true;
}
switch(opcode)
{
case OP_CrashDump:
break;
case OP_SendLoginInfo:
{
return HandleLoginInfoPacket(app);
}
case OP_ApproveName: //Name approval
{
return HandleApproveNamePacket(app);
}
case OP_RandomNameGenerator:
{
return HandleRandomNameGeneratorPacket(app);
}
case OP_CharacterCreateRequest:
{
return HandleCharacterCreateRequestPacket(app);
}
case OP_CharacterCreate: //Char create
{
return HandleCharacterCreatePacket(app);
}
case OP_EnterWorld: // Enter world
{
if (GetAccountID() == 0) { if (GetAccountID() == 0) {
clog(WORLD__CLIENT_ERR,"Enter world with no logged in account"); clog(WORLD__CLIENT_ERR,"Enter world with no logged in account");
eqs->Close(); eqs->Close();
break; return false;
} }
if(GetAdmin() < 0) if(GetAdmin() < 0)
{ {
clog(WORLD__CLIENT,"Account banned or suspended."); clog(WORLD__CLIENT,"Account banned or suspended.");
eqs->Close(); eqs->Close();
break; return false;
} }
if (RuleI(World, MaxClientsPerIP) >= 0) { if (RuleI(World, MaxClientsPerIP) >= 0) {
client_list.GetCLEIP(this->GetIP()); //Check current CLE Entry IPs against incoming connection //Check current CLE Entry IPs against incoming connection
client_list.GetCLEIP(this->GetIP());
} }
EnterWorld_Struct *ew=(EnterWorld_Struct *)app->pBuffer; EnterWorld_Struct *ew=(EnterWorld_Struct *)app->pBuffer;
@ -767,17 +714,18 @@ bool Client::HandlePacket(const EQApplicationPacket *app) {
EQApplicationPacket *outapp; EQApplicationPacket *outapp;
uint32 tmpaccid = 0; uint32 tmpaccid = 0;
charid = database.GetCharacterInfo(char_name, &tmpaccid, &zoneID, &instanceID); charid = database.GetCharacterInfo(char_name, &tmpaccid, &zoneID, &instanceID);
if (charid == 0 || tmpaccid != GetAccountID()) { if (charid == 0 || tmpaccid != GetAccountID()) {
clog(WORLD__CLIENT_ERR,"Could not get CharInfo for '%s'",char_name); clog(WORLD__CLIENT_ERR,"Could not get CharInfo for '%s'",char_name);
eqs->Close(); eqs->Close();
break; return false;
} }
// Make sure this account owns this character // Make sure this account owns this character
if (tmpaccid != GetAccountID()) { if (tmpaccid != GetAccountID()) {
clog(WORLD__CLIENT_ERR,"This account does not own the character named '%s'",char_name); clog(WORLD__CLIENT_ERR,"This account does not own the character named '%s'",char_name);
eqs->Close(); eqs->Close();
break; return false;
} }
if(!pZoning && ew->return_home) if(!pZoning && ew->return_home)
@ -809,7 +757,7 @@ bool Client::HandlePacket(const EQApplicationPacket *app) {
clog(WORLD__CLIENT_ERR,"'%s' is trying to go home before they're able...",char_name); clog(WORLD__CLIENT_ERR,"'%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();
break; return false;
} }
} }
@ -842,7 +790,7 @@ bool Client::HandlePacket(const EQApplicationPacket *app) {
clog(WORLD__CLIENT_ERR,"'%s' is trying to go to tutorial but are not allowed...",char_name); clog(WORLD__CLIENT_ERR,"'%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();
break; return false;
} }
} }
@ -897,8 +845,8 @@ bool Client::HandlePacket(const EQApplicationPacket *app) {
outapp->pBuffer = new uchar[outapp->size]; outapp->pBuffer = new uchar[outapp->size];
memset(outapp->pBuffer,0,outapp->size); memset(outapp->pBuffer,0,outapp->size);
strcpy((char*)outapp->pBuffer, tmp); strcpy((char*)outapp->pBuffer, tmp);
}
} else { else {
// Null Message of the Day. :) // Null Message of the Day. :)
outapp->size = 1; outapp->size = 1;
outapp->pBuffer = new uchar[outapp->size]; outapp->pBuffer = new uchar[outapp->size];
@ -922,12 +870,14 @@ bool Client::HandlePacket(const EQApplicationPacket *app) {
EQApplicationPacket *outapp2 = new EQApplicationPacket(OP_SetChatServer); EQApplicationPacket *outapp2 = new EQApplicationPacket(OP_SetChatServer);
char buffer[112]; char buffer[112];
sprintf(buffer,"%s,%i,%s.%s,%c%08X", sprintf(buffer,
"%s,%i,%s.%s,%c%08X",
Config->ChatHost.c_str(), Config->ChatHost.c_str(),
Config->ChatPort, Config->ChatPort,
Config->ShortName.c_str(), Config->ShortName.c_str(),
this->GetCharName(), ConnectionType, MailKey this->GetCharName(),
); ConnectionType,
MailKey);
outapp2->size=strlen(buffer)+1; outapp2->size=strlen(buffer)+1;
outapp2->pBuffer = new uchar[outapp2->size]; outapp2->pBuffer = new uchar[outapp2->size];
memcpy(outapp2->pBuffer,buffer,outapp2->size); memcpy(outapp2->pBuffer,buffer,outapp2->size);
@ -943,8 +893,10 @@ bool Client::HandlePacket(const EQApplicationPacket *app) {
Config->MailHost.c_str(), Config->MailHost.c_str(),
Config->MailPort, Config->MailPort,
Config->ShortName.c_str(), Config->ShortName.c_str(),
this->GetCharName(), ConnectionType, MailKey this->GetCharName(),
); ConnectionType,
MailKey);
outapp2->size=strlen(buffer)+1; outapp2->size=strlen(buffer)+1;
outapp2->pBuffer = new uchar[outapp2->size]; outapp2->pBuffer = new uchar[outapp2->size];
memcpy(outapp2->pBuffer,buffer,outapp2->size); memcpy(outapp2->pBuffer,buffer,outapp2->size);
@ -952,10 +904,68 @@ bool Client::HandlePacket(const EQApplicationPacket *app) {
safe_delete(outapp2); safe_delete(outapp2);
EnterWorld(); EnterWorld();
return true;
}
bool Client::HandlePacket(const EQApplicationPacket *app) {
const WorldConfig *Config=WorldConfig::get();
EmuOpcode opcode = app->GetOpcode();
clog(WORLD__CLIENT_TRACE,"Recevied EQApplicationPacket");
_pkt(WORLD__CLIENT_TRACE,app);
if (!eqs->CheckState(ESTABLISHED)) {
clog(WORLD__CLIENT,"Client disconnected (net inactive on send)");
return false;
}
// Voidd: Anti-GM Account hack, Checks source ip against valid GM Account IP Addresses
if (RuleB(World, GMAccountIPList) && this->GetAdmin() >= (RuleI(World, MinGMAntiHackStatus))) {
if(!database.CheckGMIPs(long2ip(this->GetIP()).c_str(), this->GetAccountID())) {
clog(WORLD__CLIENT,"GM Account not permited from source address %s and accountid %i", long2ip(this->GetIP()).c_str(), this->GetAccountID());
eqs->Close();
}
}
if (GetAccountID() == 0 && opcode != OP_SendLoginInfo) {
// Got a packet other than OP_SendLoginInfo when not logged in
clog(WORLD__CLIENT_ERR,"Expecting OP_SendLoginInfo, got %s", OpcodeNames[opcode]);
return false;
}
else if (opcode == OP_AckPacket) {
return true;
}
switch(opcode)
{
case OP_CrashDump:
break; break;
case OP_SendLoginInfo:
{
return HandleLoginInfoPacket(app);
}
case OP_ApproveName: //Name approval
{
return HandleApproveNamePacket(app);
}
case OP_RandomNameGenerator:
{
return HandleRandomNameGeneratorPacket(app);
}
case OP_CharacterCreateRequest:
{
return HandleCharacterCreateRequestPacket(app);
}
case OP_CharacterCreate: //Char create
{
return HandleCharacterCreatePacket(app);
}
case OP_EnterWorld: // Enter world
{
return HandleEnterWorldPacket(app);
} }
case OP_LoginComplete:{ case OP_LoginComplete:{
break; return true;
} }
case OP_DeleteCharacter: { case OP_DeleteCharacter: {
uint32 char_acct_id = database.GetAccountIDByChar((char*)app->pBuffer); uint32 char_acct_id = database.GetAccountIDByChar((char*)app->pBuffer);
@ -965,14 +975,14 @@ bool Client::HandlePacket(const EQApplicationPacket *app) {
database.DeleteCharacter((char *)app->pBuffer); database.DeleteCharacter((char *)app->pBuffer);
SendCharInfo(); SendCharInfo();
} }
break; return true;
} }
case OP_ApproveWorld: case OP_ApproveWorld:
{ {
break; return true;
} }
case OP_WorldClientReady:{ case OP_WorldClientReady:{
break; return true;
} }
case OP_World_Client_CRC1: case OP_World_Client_CRC1:
case OP_World_Client_CRC2: { case OP_World_Client_CRC2: {
@ -981,18 +991,18 @@ bool Client::HandlePacket(const EQApplicationPacket *app) {
// before OP_World_Client_CRC1. Therefore, if we receive OP_World_Client_CRC1 before OP_EnterWorld, // before OP_World_Client_CRC1. Therefore, if we receive OP_World_Client_CRC1 before OP_EnterWorld,
// then 'Start Tutorial' was not chosen. // then 'Start Tutorial' was not chosen.
StartInTutorial = false; StartInTutorial = false;
break; return true;
} }
case OP_WearChange: { // User has selected a different character case OP_WearChange: { // User has selected a different character
break; return true;
} }
case OP_WorldComplete: { case OP_WorldComplete: {
eqs->Close(); eqs->Close();
break; return true;
} }
case OP_LoginUnknown1: case OP_LoginUnknown1:
case OP_LoginUnknown2: case OP_LoginUnknown2:
break; return true;
case OP_ZoneChange: case OP_ZoneChange:
// HoT sends this to world while zoning and wants it echoed back. // HoT sends this to world while zoning and wants it echoed back.
@ -1000,16 +1010,13 @@ bool Client::HandlePacket(const EQApplicationPacket *app) {
{ {
QueuePacket(app); QueuePacket(app);
} }
break; return true;
default: { default: {
clog(WORLD__CLIENT_ERR,"Received unknown EQApplicationPacket"); clog(WORLD__CLIENT_ERR,"Received unknown EQApplicationPacket");
_pkt(WORLD__CLIENT_ERR,app); _pkt(WORLD__CLIENT_ERR,app);
break; return true;
} }
} }
return ret;
} }
bool Client::Process() { bool Client::Process() {

View File

@ -96,6 +96,7 @@ private:
bool HandleRandomNameGeneratorPacket(const EQApplicationPacket *app); bool HandleRandomNameGeneratorPacket(const EQApplicationPacket *app);
bool HandleCharacterCreateRequestPacket(const EQApplicationPacket *app); bool HandleCharacterCreateRequestPacket(const EQApplicationPacket *app);
bool HandleCharacterCreatePacket(const EQApplicationPacket *app); bool HandleCharacterCreatePacket(const EQApplicationPacket *app);
bool HandleEnterWorldPacket(const EQApplicationPacket *app);
ClientListEntry* cle; ClientListEntry* cle;
Timer CLE_keepalive_timer; Timer CLE_keepalive_timer;