net7/branches/linux-port/UDP_Master.cpp
2014-05-11 16:54:16 -04:00

66 lines
2.1 KiB
C++

#include "Net7.h"
#include "ServerManager.h"
#include "UDPConnection.h"
#include "Opcodes.h"
#include "PacketStructures.h"
#include "PacketMethods.h"
#include "PlayerClass.h"
#include "MemoryHandler.h"
#define ENB_OPCODE_2008_MASTER_HANDOFF 0x2008
#define ENB_OPCODE_2009_MASTER_HANDOFF_CONFIRM 0x2009
void UDP_Connection::HandleMasterOpcode(char *msg, EnbUdpHeader *hdr, const long source_addr, const short source_port)
{
switch (hdr->opcode)
{
case ENB_OPCODE_2008_MASTER_HANDOFF:
ProcessHandoff(msg, hdr, source_addr, source_port);
break;
default:
LogMessage("bad Master UDP opcode, id 0x%04X\n",hdr->opcode);
break;
}
}
void UDP_Connection::ProcessHandoff(char *msg, EnbUdpHeader *hdr, const long source_addr, const short source_port)
{
unsigned char data[16];
int index = 0;
long sector_id = *((long*) msg);
LogMessage("Master handoff received from player id %x, to sector = %d\n", hdr->player_id, sector_id);
Player *player = m_ServerMgr->m_PlayerMgr.GetPlayer(hdr->player_id, true);
if (player)
{
ServerRedirect redirect;
memset(&redirect, 0, sizeof(redirect));
redirect.sector_id = ntohl(sector_id);
LogMessage("Processing player '%s', sector %d\n", player->Name(), sector_id);
if (m_ServerMgr->m_SectorServerMgr.LookupSectorServer(redirect))
{
LogMessage("Found sector %d\n",sector_id);
//build response, ip addr of sector and sector port
AddData(data, redirect.ip_address, index);
AddData(data, redirect.port, index);
SendOpcode(ENB_OPCODE_2009_MASTER_HANDOFF_CONFIRM, player, data, index, source_addr, source_port);
player->SetUDPConnection(g_ServerMgr->m_UDPConnection);
player->SetHandoffReceived(true);
}
else
{
LogMessage("Unable to locate sector server for sector %d\n", sector_id);
}
}
else
{
LogMessage("SERVER ERROR: Unable to find player [%x]\n", hdr->player_id);
}
}