void ReplicaManager::Destruct(Replica *replica, PlayerID playerId, bool broadcast) { assert(replica); bool objectExists; unsigned replicatedObjectsIndex; replicatedObjectsIndex = replicatedObjects.GetIndexFromKey(replica, &objectExists); if (objectExists==false) return; // For each existing participant, send a packet telling them of this object destruction RakNet::BitStream outBitstream; unsigned i,tempIndex; bool replicaReferenced; ParticipantStruct *participantStruct; replicaReferenced=false; for (i=0; i < participantList.Size(); i++) { participantStruct=participantList[i]; if ((broadcast==true && playerId!=participantStruct->playerId) || (broadcast==false && playerId==participantStruct->playerId)) { // Send the destruction packet immediately if (replica->GetNetworkID()!=UNASSIGNED_NETWORK_ID && (replicatedObjects[replicatedObjectsIndex].allowedInterfaces & REPLICA_SEND_DESTRUCTION)) { outBitstream.Reset(); outBitstream.Write((unsigned char)ID_REPLICA_MANAGER_DESTRUCTION); outBitstream.Write(replica->GetNetworkID()); replica->SendDestruction(&outBitstream, participantStruct->playerId); if (outBitstream.GetNumberOfBitsUsed()>0) { rakPeer->Send(&outBitstream, HIGH_PRIORITY, RELIABLE_ORDERED, sendChannel, participantStruct->playerId, false); } } // Remove any pending commands that reference this object, for this player tempIndex = participantStruct->commandList.GetIndexFromKey(replica, &objectExists); if (objectExists) participantStruct->commandList.RemoveAtIndex(tempIndex); // Remove any remote object state tracking for this object, for this player tempIndex = participantStruct->remoteObjectList.GetIndexFromKey(replica, &objectExists); if (objectExists) participantStruct->remoteObjectList.RemoveAtIndex(tempIndex); } else if (replicaReferenced==false) { // See if any commands or objects reference replica if (participantStruct->commandList.HasData(replica)) replicaReferenced=true; else if (participantStruct->remoteObjectList.HasData(replica)) replicaReferenced=true; } } // Remove replica from the list if no commands and no remote objects reference it if (replicaReferenced==false) replicatedObjects.RemoveAtIndex(replicatedObjectsIndex); }
void StringCompressor::EncodeString( const char *input, int maxCharsToWrite, RakNet::BitStream *output, int languageID ) { HuffmanEncodingTree *huffmanEncodingTree; if (huffmanEncodingTrees.Has(languageID)==false) return; huffmanEncodingTree=huffmanEncodingTrees.Get(languageID); if ( input == 0 ) { output->WriteCompressed( (unsigned short) 0 ); return; } RakNet::BitStream encodedBitStream; unsigned short stringBitLength; int charsToWrite; if ( maxCharsToWrite<=0 || ( int ) strlen( input ) < maxCharsToWrite ) charsToWrite = ( int ) strlen( input ); else charsToWrite = maxCharsToWrite - 1; huffmanEncodingTree->EncodeArray( ( unsigned char* ) input, charsToWrite, &encodedBitStream ); stringBitLength = ( unsigned short ) encodedBitStream.GetNumberOfBitsUsed(); output->WriteCompressed( stringBitLength ); output->WriteBits( encodedBitStream.GetData(), stringBitLength ); }