00001
00002
00003
00004
00005
00006
00007
00008 #include "NativeFeatureIncludes.h"
00009 #if _RAKNET_SUPPORT_ReplicaManager3==1
00010
00011 #ifndef __REPLICA_MANAGER_3
00012 #define __REPLICA_MANAGER_3
00013
00014 #include "DS_Multilist.h"
00015 #include "RakNetTypes.h"
00016 #include "RakNetTime.h"
00017 #include "BitStream.h"
00018 #include "PacketPriority.h"
00019 #include "PluginInterface2.h"
00020 #include "NetworkIDObject.h"
00021
00026
00027 namespace RakNet
00028 {
00029 class Connection_RM3;
00030 class Replica3;
00031
00032
00035 struct PRO
00036 {
00038 PacketPriority priority;
00039
00041 PacketReliability reliability;
00042
00044 char orderingChannel;
00045
00047 uint32_t sendReceipt;
00048
00049 bool operator==( const PRO& right ) const;
00050 bool operator!=( const PRO& right ) const;
00051 };
00052
00053
00068 class RAK_DLL_EXPORT ReplicaManager3 : public PluginInterface2
00069 {
00070 public:
00071 ReplicaManager3();
00072 virtual ~ReplicaManager3();
00073
00084 virtual Connection_RM3* AllocConnection(SystemAddress systemAddress, RakNetGUID rakNetGUID) const=0;
00085
00090 virtual void DeallocConnection(Connection_RM3 *connection) const=0;
00091
00099 void SetAutoManageConnections(bool autoCreate, bool autoDestroy);
00100
00105 bool PushConnection(RakNet::Connection_RM3 *newConnection);
00106
00111 RakNet::Connection_RM3 * PopConnection(RakNetGUID guid);
00112
00117 void Reference(RakNet::Replica3 *replica3);
00118
00123 void Dereference(RakNet::Replica3 *replica3);
00124
00129 void DereferenceList(DataStructures::Multilist<ML_STACK, Replica3*> &replicaListIn);
00130
00136 void GetReplicasCreatedByGuid(RakNetGUID guid, DataStructures::Multilist<ML_STACK, Replica3*> &replicaListOut);
00137
00141 void GetReplicasCreatedByMe(DataStructures::Multilist<ML_STACK, Replica3*> &replicaListOut);
00142
00146 void GetReferencedReplicaList(DataStructures::Multilist<ML_STACK, Replica3*> &replicaListOut);
00147
00151 unsigned GetReplicaCount(void) const;
00152
00157 Replica3 *GetReplicaAtIndex(unsigned index);
00158
00162 DataStructures::DefaultIndexType GetConnectionCount(void) const;
00163
00167 Connection_RM3* GetConnectionAtIndex(unsigned index) const;
00168
00172 Connection_RM3* GetConnectionBySystemAddress(SystemAddress sa) const;
00173
00177 Connection_RM3* GetConnectionByGUID(RakNetGUID guid) const;
00178
00180 void SetDefaultOrderingChannel(char def);
00181
00183 void SetDefaultPacketPriority(PacketPriority def);
00184
00186 void SetDefaultPacketReliability(PacketReliability def);
00187
00193 void SetAutoSerializeInterval(RakNetTime intervalMS);
00194
00199 void GetConnectionsThatHaveReplicaConstructed(Replica3 *replica, DataStructures::Multilist<ML_STACK, Connection_RM3*> &connectionsThatHaveConstructedThisReplica);
00200
00206 void SetWorldID(unsigned char id);
00207
00209 unsigned char GetWorldID(void) const;
00210
00215 void SetNetworkIDManager(NetworkIDManager *_networkIDManager);
00216
00218 NetworkIDManager *GetNetworkIDManager(void) const;
00219
00225 void BroadcastDestructionList(DataStructures::Multilist<ML_STACK, Replica3*> &replicaList, SystemAddress exclusionAddress);
00226
00230 void BroadcastDestruction(Replica3 *replica, SystemAddress exclusionAddress);
00231
00235 void Clear(void);
00236
00238 PRO GetDefaultSendParameters(void) const;
00239
00240 protected:
00241 virtual PluginReceiveResult OnReceive(Packet *packet);
00242 virtual void Update(void);
00243 virtual void OnClosedConnection(SystemAddress systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason );
00244 virtual void OnNewConnection(SystemAddress systemAddress, RakNetGUID rakNetGUID, bool isIncoming);
00245 virtual void OnRakPeerShutdown(void);
00246
00247 void OnConstructionExisting(unsigned char *packetData, int packetDataLength, RakNetGUID senderGuid, unsigned char packetDataOffset);
00248 void OnConstruction(unsigned char *packetData, int packetDataLength, RakNetGUID senderGuid, unsigned char packetDataOffset);
00249 void OnSerialize(unsigned char *packetData, int packetDataLength, RakNetGUID senderGuid, RakNetTime timestamp, unsigned char packetDataOffset);
00250 void OnDownloadStarted(unsigned char *packetData, int packetDataLength, RakNetGUID senderGuid, unsigned char packetDataOffset);
00251 void OnDownloadComplete(unsigned char *packetData, int packetDataLength, RakNetGUID senderGuid, unsigned char packetDataOffset);
00252 void OnLocalConstructionRejected(unsigned char *packetData, int packetDataLength, RakNetGUID senderGuid, unsigned char packetDataOffset);
00253 void OnLocalConstructionAccepted(unsigned char *packetData, int packetDataLength, RakNetGUID senderGuid, unsigned char packetDataOffset);
00254
00255 RakNet::Connection_RM3 * PopConnection(DataStructures::DefaultIndexType index);
00256 Replica3* GetReplicaByNetworkID(NetworkID networkId);
00257 DataStructures::DefaultIndexType ReferenceInternal(RakNet::Replica3 *replica3);
00258
00259 DataStructures::Multilist<ML_STACK, Connection_RM3*> connectionList;
00260 DataStructures::Multilist<ML_STACK, Replica3*> userReplicaList;
00261
00262 PRO defaultSendParameters;
00263 RakNetTime autoSerializeInterval;
00264 RakNetTime lastAutoSerializeOccurance;
00265 unsigned char worldId;
00266 NetworkIDManager *networkIDManager;
00267 bool autoCreateConnections, autoDestroyConnections;
00268
00269 friend class Connection_RM3;
00270 };
00271
00272 static const int RM3_NUM_OUTPUT_BITSTREAM_CHANNELS=8;
00273
00275 struct LastSerializationResultBS
00276 {
00277 RakNet::BitStream bitStream[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS];
00278 bool indicesToSend[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS];
00279 };
00280
00283 struct LastSerializationResult
00284 {
00285 LastSerializationResult();
00286 ~LastSerializationResult();
00287
00289 RakNet::Replica3 *replica;
00290
00291
00292
00293 void AllocBS(void);
00294 LastSerializationResultBS* lastSerializationResultBS;
00295 };
00296
00299 struct SerializeParameters
00300 {
00304 RakNet::BitStream outputBitstream[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS];
00305
00308 RakNet::BitStream* lastSentBitstream[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS];
00309
00313 RakNetTime messageTimestamp;
00314
00318 PRO pro[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS];
00319
00321 RakNet::Connection_RM3 *destinationConnection;
00322
00325 BitSize_t bitsWrittenSoFar;
00326
00329 RakNetTime whenLastSerialized;
00330
00333 RakNetTime curTime;
00334 };
00335
00337 struct DeserializeParameters
00338 {
00339 RakNet::BitStream serializationBitstream[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS];
00340 bool bitstreamWrittenTo[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS];
00341 RakNetTime timeStamp;
00342 RakNet::Connection_RM3 *sourceConnection;
00343 };
00344
00346 enum SendSerializeIfChangedResult
00347 {
00348 SSICR_SENT_DATA,
00349 SSICR_DID_NOT_SEND_DATA,
00350 SSICR_NEVER_SERIALIZE,
00351 };
00352
00356 class RAK_DLL_EXPORT Connection_RM3
00357 {
00358 public:
00359 Connection_RM3(SystemAddress _systemAddress, RakNetGUID _guid);
00360 virtual ~Connection_RM3();
00361
00373 virtual Replica3 *AllocReplica(RakNet::BitStream *allocationIdBitstream, ReplicaManager3 *replicaManager3)=0;
00374
00377 virtual void GetConstructedReplicas(DataStructures::Multilist<ML_STACK, Replica3*> &objectsTheyDoHave);
00378
00382 bool HasReplicaConstructed(RakNet::Replica3 *replica);
00383
00386 virtual void SerializeOnDownloadStarted(RakNet::BitStream *bitStream) {(void) bitStream;}
00387
00390 virtual void DeserializeOnDownloadStarted(RakNet::BitStream *bitStream) {(void) bitStream;}
00391
00394 virtual void SerializeOnDownloadComplete(RakNet::BitStream *bitStream) {(void) bitStream;}
00395
00398 virtual void DeserializeOnDownloadComplete(RakNet::BitStream *bitStream) {(void) bitStream;}
00399
00401 SystemAddress GetSystemAddress(void) const {return systemAddress;}
00402
00404 RakNetGUID GetRakNetGUID(void) const {return guid;}
00405
00407 enum ConstructionMode
00408 {
00412 QUERY_REPLICA_FOR_CONSTRUCTION,
00413
00417 QUERY_REPLICA_FOR_CONSTRUCTION_AND_DESTRUCTION,
00418
00423 QUERY_CONNECTION_FOR_REPLICA_LIST
00424 };
00425
00431 virtual ConstructionMode QueryConstructionMode(void) const {return QUERY_REPLICA_FOR_CONSTRUCTION_AND_DESTRUCTION;}
00432
00448 virtual void QueryReplicaList(
00449 DataStructures::Multilist<ML_STACK, Replica3*, Replica3*> newReplicasToCreate,
00450 DataStructures::Multilist<ML_STACK, Replica3*, Replica3*> existingReplicasToDestroy) {}
00451
00461 virtual SendSerializeIfChangedResult SendSerialize(RakNet::Replica3 *replica, bool indicesToSend[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS], RakNet::BitStream serializationData[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS], RakNetTime timestamp, PRO sendParameters[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS], RakPeerInterface *rakPeer, unsigned char worldId);
00462
00470 virtual SendSerializeIfChangedResult SendSerializeIfChanged(DataStructures::DefaultIndexType queryToSerializeIndex, SerializeParameters *sp, RakPeerInterface *rakPeer, unsigned char worldId, ReplicaManager3 *replicaManager);
00471
00479 virtual void SendConstruction(DataStructures::Multilist<ML_STACK, Replica3*, Replica3*> &newObjects, DataStructures::Multilist<ML_STACK, Replica3*, Replica3*> &deletedObjects, PRO sendParameters, RakPeerInterface *rakPeer, unsigned char worldId);
00480
00484 void CullUniqueNewAndDeletedObjects(DataStructures::Multilist<ML_STACK, Replica3*> &newObjectsIn,
00485 DataStructures::Multilist<ML_STACK, Replica3*> &deletedObjectsIn,
00486 DataStructures::Multilist<ML_STACK, Replica3*> &newObjectsOut,
00487 DataStructures::Multilist<ML_STACK, Replica3*> &deletedObjectsOut);
00488
00490 void SendValidation(RakPeerInterface *rakPeer, unsigned char worldId);
00491
00493 void AutoConstructByQuery(ReplicaManager3 *replicaManager3);
00494
00495
00496
00497 bool isValidated;
00498
00499 bool isFirstConstruction;
00500
00501 protected:
00502
00503 SystemAddress systemAddress;
00504 RakNetGUID guid;
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551 void OnLocalReference(Replica3* replica3, ReplicaManager3 *replicaManager);
00552 void OnDereference(Replica3* replica3, ReplicaManager3 *replicaManager);
00553 void OnDownloadFromThisSystem(Replica3* replica3, ReplicaManager3 *replicaManager);
00554 void OnDownloadFromOtherSystem(Replica3* replica3, ReplicaManager3 *replicaManager);
00555 void OnNeverConstruct(DataStructures::DefaultIndexType queryToConstructIdx, ReplicaManager3 *replicaManager);
00556 void OnConstructToThisConnection(DataStructures::DefaultIndexType queryToConstructIdx, ReplicaManager3 *replicaManager);
00557 void OnConstructToThisConnection(Replica3 *replica, ReplicaManager3 *replicaManager);
00558 void OnNeverSerialize(DataStructures::DefaultIndexType queryToSerializeIndex, ReplicaManager3 *replicaManager);
00559 void OnReplicaAlreadyExists(DataStructures::DefaultIndexType queryToConstructIdx, ReplicaManager3 *replicaManager);
00560 void OnDownloadExisting(Replica3* replica3, ReplicaManager3 *replicaManager);
00561 void OnSendDestructionFromQuery(DataStructures::DefaultIndexType queryToDestructIdx, ReplicaManager3 *replicaManager);
00562 void OnDoNotQueryDestruction(DataStructures::DefaultIndexType queryToDestructIdx, ReplicaManager3 *replicaManager);
00563 void ValidateLists(ReplicaManager3 *replicaManager) const;
00564 void SendSerializeHeader(RakNet::Replica3 *replica, RakNetTime timestamp, RakNet::BitStream *bs, unsigned char worldId);
00565
00566
00567
00568
00569 DataStructures::Multilist<ML_ORDERED_LIST, LastSerializationResult*, Replica3*> constructedReplicaList;
00570
00571
00572
00573
00574 DataStructures::Multilist<ML_STACK, LastSerializationResult*, Replica3*> queryToConstructReplicaList;
00575
00576
00577
00578 DataStructures::Multilist<ML_STACK, LastSerializationResult*, Replica3*> queryToSerializeReplicaList;
00579
00580
00581 DataStructures::Multilist<ML_STACK, LastSerializationResult*, Replica3*> queryToDestructReplicaList;
00582
00583
00584 DataStructures::Multilist<ML_STACK, Replica3*, Replica3*> constructedReplicasCulled, destroyedReplicasCulled;
00585
00586 friend class ReplicaManager3;
00587 private:
00588 Connection_RM3() {};
00589
00590 ConstructionMode constructionMode;
00591 };
00592
00596 enum RM3ConstructionState
00597 {
00601 RM3CS_SEND_CONSTRUCTION,
00602
00608 RM3CS_ALREADY_EXISTS_REMOTELY,
00609
00611 RM3CS_NEVER_CONSTRUCT,
00612
00614 RM3CS_NO_ACTION,
00615 };
00616
00619 enum RM3DestructionState
00620 {
00622 RM3DS_SEND_DESTRUCTION,
00623
00625 RM3DS_DO_NOT_QUERY_DESTRUCTION,
00626
00628 RM3DS_NO_ACTION,
00629 };
00630
00633 enum RM3SerializationResult
00634 {
00638 RM3SR_BROADCAST_IDENTICALLY,
00639
00645 RM3SR_BROADCAST_IDENTICALLY_FORCE_SERIALIZATION,
00646
00650 RM3SR_SERIALIZED_UNIQUELY,
00651
00656 RM3SR_SERIALIZED_ALWAYS,
00657
00660 RM3SR_SERIALIZED_ALWAYS_IDENTICALLY,
00661
00663 RM3SR_DO_NOT_SERIALIZE,
00664
00668 RM3SR_NEVER_SERIALIZE_FOR_THIS_CONNECTION,
00669 };
00670
00673 enum RM3QuerySerializationResult
00674 {
00676 RM3QSR_CALL_SERIALIZE,
00678 RM3QSR_DO_NOT_CALL_SERIALIZE,
00680 RM3QSR_NEVER_CALL_SERIALIZE,
00681 };
00682
00684 enum RM3ActionOnPopConnection
00685 {
00686 RM3AOPC_DO_NOTHING,
00687 RM3AOPC_DELETE_REPLICA,
00688 RM3AOPC_DELETE_REPLICA_AND_BROADCAST_DESTRUCTION,
00689 };
00690
00691
00695 class RAK_DLL_EXPORT Replica3 : public NetworkIDObject
00696 {
00697 public:
00698 Replica3();
00699
00702 virtual ~Replica3();
00703
00709 virtual void WriteAllocationID(RakNet::BitStream *allocationIdBitstream) const=0;
00710
00720 virtual RM3ConstructionState QueryConstruction(RakNet::Connection_RM3 *destinationConnection, ReplicaManager3 *replicaManager3)=0;
00721
00731 virtual RM3DestructionState QueryDestruction(RakNet::Connection_RM3 *destinationConnection, ReplicaManager3 *replicaManager3) {(void) destinationConnection; (void) replicaManager3; return RM3DS_DO_NOT_QUERY_DESTRUCTION;}
00732
00740 virtual bool QueryRemoteConstruction(RakNet::Connection_RM3 *sourceConnection)=0;
00741
00749 virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection)=0;
00750
00756 virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection)=0;
00757
00760 virtual void SerializeConstructionExisting(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection) {(void) constructionBitstream; (void) destinationConnection;};
00761
00764 virtual void DeserializeConstructionExisting(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) {(void) constructionBitstream; (void) sourceConnection;};
00765
00771 virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection)=0;
00772
00776 virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection)=0;
00777
00780 virtual RM3ActionOnPopConnection QueryActionOnPopConnection(RakNet::Connection_RM3 *droppedConnection) const=0;
00781
00783 void OnPoppedConnection(RakNet::Connection_RM3 *droppedConnection) {(void) droppedConnection;}
00784
00795 virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection)=0;
00796
00802 virtual RM3QuerySerializationResult QuerySerialization(RakNet::Connection_RM3 *destinationConnection)=0;
00803
00806 virtual void OnUserReplicaPreSerializeTick(void) {}
00807
00815 virtual RM3SerializationResult Serialize(RakNet::SerializeParameters *serializeParameters)=0;
00816
00819 virtual void OnSerializeTransmission(RakNet::BitStream *bitStream, SystemAddress systemAddress) {(void) bitStream; (void) systemAddress; }
00820
00827 virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters)=0;
00828
00837 virtual void SerializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) {(void) serializationBitstream; (void) requestingConnection;}
00838
00842 virtual void DeserializeConstructionRequestAccepted(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *acceptingConnection) {(void) serializationBitstream; (void) acceptingConnection;}
00843
00847 virtual void SerializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *requestingConnection) {(void) serializationBitstream; (void) requestingConnection;}
00848
00852 virtual void DeserializeConstructionRequestRejected(RakNet::BitStream *serializationBitstream, RakNet::Connection_RM3 *rejectingConnection) {(void) serializationBitstream; (void) rejectingConnection;}
00853
00857 virtual void PostDeserializeConstruction(RakNet::Connection_RM3 *sourceConnection) {(void) sourceConnection;}
00858
00862 virtual void PreDestruction(RakNet::Connection_RM3 *sourceConnection) {(void) sourceConnection;}
00863
00866 RakNetGUID GetCreatingSystemGUID(void) const;
00867
00870 virtual void BroadcastDestruction(void);
00871
00873 virtual RM3ConstructionState QueryConstruction_ClientConstruction(RakNet::Connection_RM3 *destinationConnection);
00875 virtual bool QueryRemoteConstruction_ClientConstruction(RakNet::Connection_RM3 *sourceConnection);
00876
00878 virtual RM3ConstructionState QueryConstruction_ServerConstruction(RakNet::Connection_RM3 *destinationConnection);
00880 virtual bool QueryRemoteConstruction_ServerConstruction(RakNet::Connection_RM3 *sourceConnection);
00881
00883 virtual RM3ConstructionState QueryConstruction_PeerToPeer(RakNet::Connection_RM3 *destinationConnection);
00885 virtual bool QueryRemoteConstruction_PeerToPeer(RakNet::Connection_RM3 *sourceConnection);
00886
00888 virtual RakNet::RM3QuerySerializationResult QuerySerialization_ClientSerializable(RakNet::Connection_RM3 *destinationConnection);
00890 virtual RakNet::RM3QuerySerializationResult QuerySerialization_ServerSerializable(RakNet::Connection_RM3 *destinationConnection);
00892 virtual RakNet::RM3QuerySerializationResult QuerySerialization_PeerToPeer(RakNet::Connection_RM3 *destinationConnection);
00893
00895 virtual RM3ActionOnPopConnection QueryActionOnPopConnection_Client(RakNet::Connection_RM3 *droppedConnection) const;
00897 virtual RM3ActionOnPopConnection QueryActionOnPopConnection_Server(RakNet::Connection_RM3 *droppedConnection) const;
00899 virtual RM3ActionOnPopConnection QueryActionOnPopConnection_PeerToPeer(RakNet::Connection_RM3 *droppedConnection) const;
00900
00903 RakNetGUID creatingSystemGUID;
00905 RakNetGUID deletingSystemGUID;
00906
00909 ReplicaManager3 *replicaManager;
00910
00911 LastSerializationResultBS lastSentSerialization;
00912 RakNetTime whenLastSerialized;
00913 bool forceSendUntilNextUpdate;
00914 };
00915
00916 }
00917
00918
00919 #endif
00920
00921 #endif // _RAKNET_SUPPORT_*