PluginReceiveResult ReadyEvent::OnReceive(RakPeerInterface *peer, Packet *packet) { unsigned char packetIdentifier; packetIdentifier = ( unsigned char ) packet->data[ 0 ]; // bool doPrint = packet->systemAddress.port==60002 || rakPeer->GetInternalID(UNASSIGNED_SYSTEM_ADDRESS).port==60002; switch (packetIdentifier) { case ID_READY_EVENT_UNSET: case ID_READY_EVENT_SET: case ID_READY_EVENT_ALL_SET: // if (doPrint) {if (packet->systemAddress.port==60002) RAKNET_DEBUG_PRINTF("FROM 60002: "); else if (rakPeer->GetInternalID(UNASSIGNED_SYSTEM_ADDRESS).port==60002) RAKNET_DEBUG_PRINTF("TO 60002: "); RAKNET_DEBUG_PRINTF("ID_READY_EVENT_SET\n");} OnReadyEventPacketUpdate(peer, packet); return RR_CONTINUE_PROCESSING; case ID_READY_EVENT_FORCE_ALL_SET: OnReadyEventForceAllSet(peer, packet); return RR_CONTINUE_PROCESSING; case ID_READY_EVENT_QUERY: // if (doPrint) {if (packet->systemAddress.port==60002) RAKNET_DEBUG_PRINTF("FROM 60002: "); else if (rakPeer->GetInternalID(UNASSIGNED_SYSTEM_ADDRESS).port==60002) RAKNET_DEBUG_PRINTF("TO 60002: "); RAKNET_DEBUG_PRINTF("ID_READY_EVENT_QUERY\n");} OnReadyEventQuery(peer, packet); return RR_STOP_PROCESSING_AND_DEALLOCATE; case ID_DISCONNECTION_NOTIFICATION: case ID_CONNECTION_LOST: OnCloseConnection(peer, packet->systemAddress); return RR_CONTINUE_PROCESSING; } return RR_CONTINUE_PROCESSING; }
PluginReceiveResult ReplicaManager::OnReceive(RakPeerInterface *peer, Packet *packet) { unsigned char packetIdentifier; if ( ( unsigned char ) packet->data[ 0 ] == ID_TIMESTAMP ) { if ( packet->length > sizeof( unsigned char ) + sizeof( unsigned int ) ) packetIdentifier = ( unsigned char ) packet->data[ sizeof( unsigned char ) + sizeof( unsigned int ) ]; else return RR_STOP_PROCESSING_AND_DEALLOCATE; } else packetIdentifier = ( unsigned char ) packet->data[ 0 ]; switch (packetIdentifier) { case ID_NEW_INCOMING_CONNECTION: case ID_CONNECTION_REQUEST_ACCEPTED: if (autoParticipateNewConnections) AddParticipant(packet->playerId); return RR_CONTINUE_PROCESSING; case ID_DISCONNECTION_NOTIFICATION: case ID_CONNECTION_LOST: OnCloseConnection(peer, packet->playerId); return RR_CONTINUE_PROCESSING; case ID_REPLICA_MANAGER_DOWNLOAD_COMPLETE: if (_receiveDownloadCompleteCB==0) { return RR_STOP_PROCESSING_AND_DEALLOCATE; } case ID_REPLICA_MANAGER_CONSTRUCTION: case ID_REPLICA_MANAGER_DESTRUCTION: case ID_REPLICA_MANAGER_SCOPE_CHANGE: case ID_REPLICA_MANAGER_SERIALIZE: { ParticipantStruct *participantStruct; bool hasNetworkId; ReceivedCommand receivedCommand; bool b=true; RakNet::BitStream inBitstream(packet->data, packet->length, false); // SetWriteOffset is used here to get around a design flaw, where I should have had the bitstream constructor take bits, rather than bytes // It sets the actual number of bits in the packet inBitstream.SetWriteOffset(packet->bitSize); receivedCommand.playerId=packet->playerId; receivedCommand.command=packetIdentifier; if ( ( unsigned char ) packet->data[ 0 ] == ID_TIMESTAMP ) { inBitstream.IgnoreBits(8); b=inBitstream.Read(receivedCommand.u1); } else receivedCommand.u1=0; inBitstream.IgnoreBits(8); // Ignore the packet id receivedCommand.networkID=UNASSIGNED_NETWORK_ID; if (packetIdentifier==ID_REPLICA_MANAGER_CONSTRUCTION) // ID_REPLICA_MANAGER_CONSTRUCTION has an optional networkID { b=inBitstream.Read(hasNetworkId); if (hasNetworkId) b=inBitstream.Read(receivedCommand.networkID); } else if (packetIdentifier!=ID_REPLICA_MANAGER_DOWNLOAD_COMPLETE) { b=inBitstream.Read(receivedCommand.networkID); // Other packets always have an networkID } if (b==false) { // Invalid packet #ifdef _DEBUG assert(0); #endif return RR_STOP_PROCESSING_AND_DEALLOCATE; } receivedCommand.userData=&inBitstream; participantStruct=GetParticipantByPlayerID(receivedCommand.playerId); if (participantStruct) { // .Size()>0 is because commands are always processed in order. If a command is delayed, no further commands are processed. // ProcessReceivedCommand(...)==false means that the use signaled to delay a command if (participantStruct->pendingCommands.Size()>0 || ProcessReceivedCommand(participantStruct, &receivedCommand)==REPLICA_PROCESS_LATER) { // Copy the data and add this to a queue that will call ProcessReceivedCommand again in Update. // Allocate and copy structure ReceivedCommand *rc = new ReceivedCommand; memcpy(rc, &receivedCommand, sizeof(ReceivedCommand)); // Allocate and copy inBitstream remaining data rc->userData = new RakNet::BitStream; rc->userData->Write(&inBitstream, inBitstream.GetNumberOfBitsUsed()); participantStruct->pendingCommands.Push(rc); } } return RR_STOP_PROCESSING_AND_DEALLOCATE; } } return RR_CONTINUE_PROCESSING; }