/** Recursively send the server tree. * This is used during network burst to inform the other server * (and any of ITS servers too) of what servers we know about. * If at any point any of these servers already exist on the other * end, our connection may be terminated. * The hopcount parameter (3rd) is deprecated, and is always 0. */ void TreeSocket::SendServers(TreeServer* Current, TreeServer* s) { SendServerInfo(Current); const TreeServer::ChildServers& children = Current->GetChildren(); for (TreeServer::ChildServers::const_iterator i = children.begin(); i != children.end(); ++i) { TreeServer* recursive_server = *i; if (recursive_server != s) { this->WriteLine(CommandServer::Builder(recursive_server)); /* down to next level */ this->SendServers(recursive_server, s); } } }
static int Run() { int64 NextHeartBeat = 0; NETADDR BindAddr = {NETTYPE_IPV4, {0},0}; if(!pNet->Open(BindAddr, 0, 0, 0, 0)) return 0; while(1) { CNetChunk p; pNet->Update(); while(pNet->Recv(&p)) { if(p.m_ClientID == -1) { if(p.m_DataSize == sizeof(SERVERBROWSE_GETINFO) && mem_comp(p.m_pData, SERVERBROWSE_GETINFO, sizeof(SERVERBROWSE_GETINFO)) == 0) { SendServerInfo(&p.m_Address); } else if(p.m_DataSize == sizeof(SERVERBROWSE_FWCHECK) && mem_comp(p.m_pData, SERVERBROWSE_FWCHECK, sizeof(SERVERBROWSE_FWCHECK)) == 0) { SendFWCheckResponse(&p.m_Address); } } } /* send heartbeats if needed */ if(NextHeartBeat < time_get()) { NextHeartBeat = time_get()+time_freq()*(15+(rand()%15)); SendHeartBeats(); } thread_sleep(100); } }
void GameSocket::ProcessData(unsigned char* data, int size) { Reader.SetBuffer(data); int offset = 0; while(offset < size) { unsigned short psize = Reader.ReadWord() + 6; unsigned short opcode = Reader.ReadWord(); Reader.Skip(2); switch(opcode) { case GAME_CLIENT_KEEP_ALIVE: case GAME_CLIENT_ACCEPT_HANDSHAKE: break; case GAME_CLIENT_INFO: SendServerInfo(); break; case GAME_CLIENT_PATCH_REQUEST: SendPatchInfo(); break; case GAME_CLIENT_AUTH: OnAuth(); break; case GAME_CLIENT_CHARACTER: OnCharacter(); break; case GAME_CLIENT_INGAME_REQUEST: OnIngameRequest(); break; case GAME_CLIENT_MOVEMENT: OnMovement(); break; case GAME_CLIENT_CLOSE: OnGameQuit(); break; case GAME_CLIENT_CHAT: OnChat(); break; case GAME_CLIENT_ITEM_MOVE: OnItem(); break; case GAME_CLIENT_TARGET: OnTarget(); break; case GAME_CLIENT_INGAME_NOTIFY: OnIngameNotify(); break; case GAME_CLIENT_EMOTION://update carlosx OnEmotion(); break; case GAME_CLIENT_SIT: //update carlosx OnSit(); break; case GAME_CLIENT_ESTRELLA: //update carlosx OnEstrella(); break; case GAME_CLIENT_ADDSKILL: //update carlosx OnUpdateSkill(); break; case GAME_CLIENT_MASTERY: //update carlosx OnMastertSkill(); break; case GAME_CLIENT_ATSKILL: //update carlosx OnATSkill(); break; case GAME_CLIENT_ADDSTR: //update carlosx OnADDStr(); break; case GAME_CLIENT_ADDINT: //update carlosx OnADDInt(); break; case GAME_CLIENT_GM: OnGM(); break; default: printf("Unknown opcode: %.4x\n", opcode); } Reader.Reset(); Reader.Skip(psize); offset += psize; } Reader.Reset(); }