void ReadyEvent::OnReadyEventPacketUpdate(Packet *packet) { RakNet::BitStream incomingBitStream(packet->data, packet->length, false); incomingBitStream.IgnoreBits(8); int eventId; incomingBitStream.Read(eventId); bool objectExists; unsigned readyIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists); if (objectExists) { ReadyEventNode *ren = readyEventNodeList[readyIndex]; bool systemExists; unsigned systemIndex = ren->systemList.GetIndexFromKey(packet->systemAddress, &systemExists); if (systemExists) { // Just return if no change if (ren->systemList[systemIndex].lastReceivedStatus == packet->data[0]) return; bool wasCompleted = IsEventCompletedByIndex(readyIndex); ren->systemList[systemIndex].lastReceivedStatus = packet->data[0]; // If forced all set, doesn't matter what the new packet is if (ren->eventStatus == ID_READY_EVENT_FORCE_ALL_SET) return; UpdateReadyStatus(readyIndex); if (wasCompleted == false && IsEventCompletedByIndex(readyIndex)) PushCompletionPacket(readyIndex); } } }
void MasterClient::HandleRelayedConnectionNotification(Packet *packet) { PlayerID clientSystem; BitStream incomingBitStream(packet->data, packet->length, false); incomingBitStream.IgnoreBits(8*sizeof(unsigned char)); incomingBitStream.Read(clientSystem.binaryAddress); incomingBitStream.Read(clientSystem.port); OnConnectionRequest(rakPeer->PlayerIDToDottedIP(clientSystem), clientSystem.port); }
void ReadyEvent::OnReadyEventQuery(Packet *packet) { RakNet::BitStream incomingBitStream(packet->data, packet->length, false); incomingBitStream.IgnoreBits(8); int eventId; incomingBitStream.Read(eventId); bool objectExists; unsigned readyIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists); if (objectExists) { unsigned systemIndex = readyEventNodeList[readyIndex]->systemList.GetIndexFromKey(packet->systemAddress, &objectExists); // Force the non-default send, because our initial send may have arrived at a system that didn't yet create the ready event if (objectExists) SendReadyUpdate(readyIndex, systemIndex, true); } }
void ReadyEvent::OnReadyEventForceAllSet(Packet *packet) { RakNet::BitStream incomingBitStream(packet->data, packet->length, false); incomingBitStream.IgnoreBits(8); int eventId; incomingBitStream.Read(eventId); bool objectExists; unsigned readyIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists); if (objectExists) { ReadyEventNode *ren = readyEventNodeList[readyIndex]; if (ren->eventStatus != ID_READY_EVENT_FORCE_ALL_SET) { ren->eventStatus = ID_READY_EVENT_FORCE_ALL_SET; PushCompletionPacket(ren->eventId); } } }
void MasterServer::HandleRelayedConnectionNotification(Packet *packet) { char str[22]; unsigned short clientGamePort, serverGamePort; BitStream incomingBitStream(packet->data, packet->length, false); incomingBitStream.IgnoreBits(8*sizeof(unsigned char)); incomingBitStream.Read(clientGamePort); incomingBitStream.Read(serverGamePort); if (!stringCompressor->DecodeString(str, 22, &incomingBitStream)) return; if (str[0]==0) return; BitStream outgoingBitStream; outgoingBitStream.Write((unsigned char)ID_RELAYED_CONNECTION_NOTIFICATION); // Assumes the game client is on the same computer as the master client outgoingBitStream.Write(packet->playerId.binaryAddress); // This is the public IP, which the sender doesn't necessarily know outgoingBitStream.Write(clientGamePort); PlayerID targetID; rakPeer->IPToPlayerID(str, serverGamePort, &targetID); // Given the IP and port of the game system, give me the index into the game server list int serverIndex = gameServerList.GetIndexByPlayerID(targetID); if (serverIndex>=0) { #ifdef _SHOW_MASTER_SERVER_PRINTF printf("ID_RELAYED_CONNECTION_NOTIFICATION sent to %s:%i from %s:%i\n", str, serverGamePort, rakPeer->PlayerIDToDottedIP(packet->playerId), packet->playerId.port); #endif rakPeer->Send(&outgoingBitStream, HIGH_PRIORITY, RELIABLE, 0, gameServerList.serverList[serverIndex]->originationId, false); } else { #ifdef _SHOW_MASTER_SERVER_PRINTF printf("ID_RELAYED_CONNECTION_NOTIFICATION not sent to %s:%i from %s:%i.\nMaster server does not know about target system.\n", str, serverGamePort, rakPeer->PlayerIDToDottedIP(packet->playerId), packet->playerId.port); #endif } }
void MasterServer::HandleUpdateServer(Packet *packet) { GameServer *gameServer; bool newServerAdded; BitStream incomingBitStream(packet->data, packet->length, false); incomingBitStream.IgnoreBits(8*sizeof(unsigned char)); gameServer = DeserializeServer(&incomingBitStream); gameServer->connectionIdentifier.binaryAddress=packet->playerId.binaryAddress; UpdateServerList(gameServer, true, &newServerAdded); if (newServerAdded) { #ifdef _SHOW_MASTER_SERVER_PRINTF printf("Server added. %i servers on the list\n", gameServerList.serverList.Size()); #endif gameServer->originationId=packet->playerId; } #ifdef _SHOW_MASTER_SERVER_PRINTF else printf("Server updated. %i servers on the list\n", gameServerList.serverList.Size()); #endif }