00001
00002
00003
00004
00005
00006
00007
00008 #include "NativeFeatureIncludes.h"
00009 #if _RAKNET_SUPPORT_ReplicaManager2==1
00010
00011 #ifndef __REPLICA_MANAGER_2_H
00012 #define __REPLICA_MANAGER_2_H
00013
00014 #include "Export.h"
00015 #include "RakNetTypes.h"
00016 #include "DS_Map.h"
00017 #include "PluginInterface2.h"
00018 #include "NetworkIDObject.h"
00019 #include "PacketPriority.h"
00020 #include "GetTime.h"
00021 #include "BitStream.h"
00022 #include "DS_Queue.h"
00023
00024 namespace RakNet
00025 {
00026 class BitStream;
00027 class Replica2;
00028 class Connection_RM2;
00029 class Connection_RM2Factory;
00030
00035
00038 typedef int SerializationType;
00039 enum
00040 {
00042 SEND_SERIALIZATION_GENERIC_TO_SYSTEM,
00044 BROADCAST_SERIALIZATION_GENERIC_TO_SYSTEM,
00046 SEND_SERIALIZATION_CONSTRUCTION_TO_SYSTEM,
00048 BROADCAST_SERIALIZATION_CONSTRUCTION_TO_SYSTEM,
00050 SEND_AUTO_SERIALIZE_TO_SYSTEM,
00052 BROADCAST_AUTO_SERIALIZE_TO_SYSTEM,
00054 RELAY_SERIALIZATION_TO_SYSTEMS,
00055
00057 SEND_CONSTRUCTION_SERIALIZATION_AUTO_INITIAL_DOWNLOAD_TO_SYSTEM,
00058
00059 SEND_VISIBILITY_AUTO_INITIAL_DOWNLOAD_TO_SYSTEM,
00061 SEND_DATA_SERIALIZATION_AUTO_INITIAL_DOWNLOAD_TO_SYSTEM,
00062
00064 SEND_DESTRUCTION_GENERIC_TO_SYSTEM,
00066 SEND_DESTRUCTION_VISIBILITY_RECALCULATION_TO_SYSTEM,
00068 BROADCAST_DESTRUCTION_GENERIC_TO_SYSTEM,
00070 RELAY_DESTRUCTION_TO_SYSTEMS,
00071
00073 SEND_CONSTRUCTION_GENERIC_TO_SYSTEM,
00075 SEND_CONSTRUCTION_VISIBILITY_RECALCULATION_TO_SYSTEM,
00077 BROADCAST_CONSTRUCTION_GENERIC_TO_SYSTEM,
00079 SEND_CONSTRUCTION_REQUEST_TO_SERVER,
00081 BROADCAST_CONSTRUCTION_REQUEST_ACCEPTED_TO_SYSTEM,
00083 SEND_CONSTRUCTION_REPLY_ACCEPTED_TO_CLIENT,
00085 SEND_CONSTRUCTION_REPLY_DENIED_TO_CLIENT,
00086
00088 SEND_VISIBILITY_TRUE_TO_SYSTEM,
00090 BROADCAST_VISIBILITY_TRUE_TO_SYSTEM,
00092 SEND_VISIBILITY_FALSE_TO_SYSTEM,
00094 BROADCAST_VISIBILITY_FALSE_TO_SYSTEM,
00096 RELAY_VISIBILITY_TRUE_TO_SYSTEMS,
00098 RELAY_VISIBILITY_FALSE_TO_SYSTEMS,
00099
00101 AUTOSERIALIZE_RESYNCH_ONLY,
00103 AUTOSERIALIZE_DEFAULT,
00104
00106 UNDEFINED_REASON,
00107 };
00108
00110
00130 class RAK_DLL_EXPORT ReplicaManager2 : public PluginInterface2
00131 {
00132 public:
00133
00134 ReplicaManager2();
00135
00136
00137 virtual ~ReplicaManager2();
00138
00141 void SetConnectionFactory(Connection_RM2Factory *factory);
00142
00144 void SetDefaultOrderingChannel(char def);
00145
00147 void SetDefaultPacketPriority(PacketPriority def);
00148
00150 void SetDefaultPacketReliability(PacketReliability def);
00151
00156 void SetAutoUpdateScope(bool construction, bool visibility);
00157
00161 void SetAutoAddNewConnections(bool autoAdd);
00162
00167 bool AddNewConnection(SystemAddress systemAddress);
00168
00172 bool RemoveConnection(SystemAddress systemAddress);
00173
00177 bool HasConnection(SystemAddress systemAddress);
00178
00183 void SetDoReplicaAutoSerializeUpdate(bool autoUpdate);
00184
00202 void SendConstruction(Replica2 *replica, BitStream *replicaData, SystemAddress recipient, RakNetTime timestamp, bool sendMessage,
00203 DataStructures::OrderedList<SystemAddress,SystemAddress> &exclusionList,
00204 unsigned char localClientId, SerializationType type=SEND_CONSTRUCTION_GENERIC_TO_SYSTEM,
00205 PacketPriority priority=NUMBER_OF_PRIORITIES, PacketReliability reliability=NUMBER_OF_RELIABILITIES, char orderingChannel=-1);
00206
00223 void SendDestruction(Replica2 *replica, BitStream *replicaData, SystemAddress recipient, RakNetTime timestamp, bool sendMessage,
00224 DataStructures::OrderedList<SystemAddress,SystemAddress> &exclusionList,
00225 SerializationType type=SEND_DESTRUCTION_GENERIC_TO_SYSTEM,
00226 PacketPriority priority=NUMBER_OF_PRIORITIES, PacketReliability reliability=NUMBER_OF_RELIABILITIES, char orderingChannel=-1);
00227
00243 void SendSerialize(Replica2 *replica, BitStream *replicaData, SystemAddress recipient, RakNetTime timestamp,
00244 DataStructures::OrderedList<SystemAddress,SystemAddress> &exclusionList,
00245 SerializationType type=SEND_SERIALIZATION_GENERIC_TO_SYSTEM,
00246 PacketPriority priority=NUMBER_OF_PRIORITIES, PacketReliability reliability=NUMBER_OF_RELIABILITIES, char orderingChannel=-1);
00247
00264 void SendVisibility(Replica2 *replica, BitStream *replicaData, SystemAddress recipient, RakNetTime timestamp,
00265 DataStructures::OrderedList<SystemAddress,SystemAddress> &exclusionList,
00266 SerializationType type=SEND_VISIBILITY_TRUE_TO_SYSTEM,
00267 PacketPriority priority=NUMBER_OF_PRIORITIES, PacketReliability reliability=NUMBER_OF_RELIABILITIES, char orderingChannel=-1);
00268
00273 unsigned GetReplicaCount(void) const;
00274
00279 Replica2 *GetReplicaAtIndex(unsigned index);
00280
00285 unsigned GetConnectionCount(void) const;
00286
00290 Connection_RM2* GetConnectionAtIndex(unsigned index) const;
00291
00295 Connection_RM2* GetConnectionBySystemAddress(SystemAddress systemAddress) const;
00296
00300 unsigned int GetConnectionIndexBySystemAddress(SystemAddress systemAddress) const;
00301
00305 void RecalculateVisibility(Replica2 *replica);
00306
00308 static int Replica2ObjectComp( RakNet::Replica2 * const &key, RakNet::Replica2 * const &data );
00310 static int Replica2CompByNetworkID( const NetworkID &key, RakNet::Replica2 * const &data );
00312 static int Connection_RM2CompBySystemAddress( const SystemAddress &key, RakNet::Connection_RM2 * const &data );
00313
00317 void GetConnectionsWithReplicaConstructed(Replica2 *replica, DataStructures::OrderedList<SystemAddress, Connection_RM2*, ReplicaManager2::Connection_RM2CompBySystemAddress> &output);
00318
00322 void GetConnectionsWithSerializeVisibility(Replica2 *replica, DataStructures::OrderedList<SystemAddress, Connection_RM2*, ReplicaManager2::Connection_RM2CompBySystemAddress> &output);
00323
00326 RakPeerInterface *GetRakPeer(void) const;
00327
00330 void Reference(Replica2* replica, bool *newReference);
00331
00334 void Dereference(Replica2 *replica);
00335
00336 protected:
00337
00338 void OnAttach(void);
00339 PluginReceiveResult OnReceive(Packet *packet);
00340 void OnClosedConnection(SystemAddress systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason );
00341 void OnRakPeerShutdown(void);
00342 void Update(void);
00343 virtual void OnNewConnection(SystemAddress systemAddress, RakNetGUID rakNetGUID, bool isIncoming);
00344
00345 PluginReceiveResult OnDownloadComplete(unsigned char *packetData, int packetDataLength, SystemAddress sender, RakNetTime timestamp);
00346 PluginReceiveResult OnDownloadStarted(unsigned char *packetData, int packetDataLength, SystemAddress sender, RakNetTime timestamp);
00347 PluginReceiveResult OnConstruction(unsigned char *packetData, int packetDataLength, SystemAddress sender, RakNetTime timestamp);
00348 PluginReceiveResult OnDestruction(unsigned char *packetData, int packetDataLength, SystemAddress sender, RakNetTime timestamp);
00349 PluginReceiveResult OnVisibilityChange(unsigned char *packetData, int packetDataLength, SystemAddress sender, RakNetTime timestamp);
00350 PluginReceiveResult OnSerialize(unsigned char *packetData, int packetDataLength, SystemAddress sender, RakNetTime timestamp);
00351
00352 bool AddToAndWriteExclusionList(SystemAddress recipient, RakNet::BitStream *bs, DataStructures::OrderedList<SystemAddress,SystemAddress> &exclusionList);
00353 void WriteExclusionList(RakNet::BitStream *bs, DataStructures::OrderedList<SystemAddress,SystemAddress> &exclusionList);
00354 void CullByAndAddToExclusionList(
00355 DataStructures::OrderedList<SystemAddress, Connection_RM2*,ReplicaManager2::Connection_RM2CompBySystemAddress> &inputList,
00356 DataStructures::OrderedList<SystemAddress, Connection_RM2*,ReplicaManager2::Connection_RM2CompBySystemAddress> &culledOutput,
00357 DataStructures::OrderedList<SystemAddress,SystemAddress> &exclusionList);
00358 void ReadExclusionList(RakNet::BitStream *bs, DataStructures::OrderedList<SystemAddress,SystemAddress> &exclusionList);
00359
00360 void Send(RakNet::BitStream *bs, SystemAddress recipient, PacketPriority priority, PacketReliability reliability, char orderingChannel);
00361 void Clear(void);
00362 void DownloadToNewConnection(Connection_RM2* connection, RakNetTime timestamp, PacketPriority priority, PacketReliability reliability, char orderingChannel);
00363
00364 Connection_RM2* CreateConnectionIfDoesNotExist(SystemAddress systemAddress, bool *newConnection);
00365 Connection_RM2* AutoCreateConnection(SystemAddress systemAddress, bool *newConnection);
00366 void AddConstructionReference(Connection_RM2* connection, Replica2* replica);
00367 void AddVisibilityReference(Connection_RM2* connection, Replica2* replica);
00368 void RemoveVisibilityReference(Connection_RM2* connection, Replica2* replica);
00369 void WriteHeader(RakNet::BitStream *bs, MessageID type, RakNetTime timestamp);
00370
00371 friend class Connection_RM2;
00372 friend class Replica2;
00373
00374 Connection_RM2Factory *connectionFactoryInterface;
00375 bool autoUpdateConstruction, autoUpdateVisibility;
00376
00377 char defaultOrderingChannel;
00378 PacketPriority defaultPacketPriority;
00379 PacketReliability defaultPacketReliablity;
00380 bool autoAddNewConnections;
00381 bool doReplicaAutoUpdate;
00382 RakNetTime lastUpdateTime;
00383
00384 DataStructures::List<Replica2*> fullReplicaUnorderedList;
00385 DataStructures::OrderedList<Replica2*, Replica2*, ReplicaManager2::Replica2ObjectComp> fullReplicaOrderedList;
00386 DataStructures::OrderedList<Replica2*, Replica2*, ReplicaManager2::Replica2ObjectComp> alwaysDoConstructReplicaOrderedList;
00387 DataStructures::OrderedList<Replica2*, Replica2*, ReplicaManager2::Replica2ObjectComp> alwaysDoSerializeReplicaOrderedList;
00388
00389 DataStructures::OrderedList<Replica2*, Replica2*, ReplicaManager2::Replica2ObjectComp> variableConstructReplicaOrderedList;
00390 DataStructures::OrderedList<Replica2*, Replica2*, ReplicaManager2::Replica2ObjectComp> variableSerializeReplicaOrderedList;
00391
00392 DataStructures::OrderedList<SystemAddress, Connection_RM2*, ReplicaManager2::Connection_RM2CompBySystemAddress> connectionList;
00393 };
00394
00397 enum RAK_DLL_EXPORT BooleanQueryResult
00398 {
00400 BQR_ALWAYS,
00401
00403 BQR_YES,
00404
00406 BQR_NO,
00407
00409 BQR_NEVER
00410 };
00411
00414 struct RAK_DLL_EXPORT SerializationContext
00415 {
00416 SerializationContext() {}
00417 ~SerializationContext() {}
00418 SerializationContext(SerializationType st, SystemAddress relay, SystemAddress recipient, RakNetTime _timestamp) {serializationType=st; relaySourceAddress=relay; recipientAddress=recipient; timestamp=_timestamp;}
00419
00421 SystemAddress relaySourceAddress;
00422
00424 SystemAddress recipientAddress;
00425
00427 RakNetTime timestamp;
00428
00430 SerializationType serializationType;
00431
00433 static bool IsSerializationCommand(SerializationType r);
00435 static bool IsDownloadCommand(SerializationType r);
00437 static bool IsDestructionCommand(SerializationType r);
00439 static bool IsConstructionCommand(SerializationType r);
00441 static bool IsVisibilityCommand(SerializationType r);
00443 static bool IsVisible(SerializationType r);
00444 };
00445
00446
00451 class RAK_DLL_EXPORT Replica2 : public NetworkIDObject
00452 {
00453 public:
00454
00455 Replica2();
00456
00457
00458 virtual ~Replica2();
00459
00464 void SetReplicaManager(ReplicaManager2* rm);
00465
00468 ReplicaManager2* GetReplicaManager(void) const;
00469
00475 virtual void SendConstruction(SystemAddress recipientAddress, SerializationType serializationType=UNDEFINED_REASON);
00476
00481 virtual void SendDestruction(SystemAddress recipientAddress, SerializationType serializationType=UNDEFINED_REASON);
00482
00487 virtual void SendSerialize(SystemAddress recipientAddress, SerializationType serializationType=UNDEFINED_REASON);
00488
00493 virtual void SendVisibility(SystemAddress recipientAddress, SerializationType serializationType=UNDEFINED_REASON);
00494
00497 virtual void BroadcastConstruction(SerializationContext *serializationContext=0);
00498
00502 virtual void BroadcastSerialize(SerializationContext *serializationContext=0);
00503
00507 virtual void BroadcastDestruction(SerializationContext *serializationContext=0);
00508
00513 virtual void BroadcastVisibility(bool isVisible, SerializationContext *serializationContext=0);
00514
00520 virtual bool SerializeConstruction(RakNet::BitStream *bitStream, SerializationContext *serializationContext)=0;
00521
00527 virtual bool SerializeDestruction(RakNet::BitStream *bitStream, SerializationContext *serializationContext);
00528
00534 virtual bool Serialize(RakNet::BitStream *bitStream, SerializationContext *serializationContext);
00535
00541 virtual bool SerializeVisibility(RakNet::BitStream *bitStream, SerializationContext *serializationContext);
00542
00549 virtual void DeserializeDestruction(RakNet::BitStream *bitStream, SerializationType serializationType, SystemAddress sender, RakNetTime timestamp);
00550
00557 virtual void Deserialize(RakNet::BitStream *bitStream, SerializationType serializationType, SystemAddress sender, RakNetTime timestamp);
00558
00565 virtual void DeserializeVisibility(RakNet::BitStream *bitStream, SerializationType serializationType, SystemAddress sender, RakNetTime timestamp);
00566
00574 virtual BooleanQueryResult QueryConstruction(Connection_RM2 *connection);
00575
00583 virtual BooleanQueryResult QueryVisibility(Connection_RM2 *connection);
00584
00590 virtual bool QueryIsConstructionAuthority(void) const;
00591
00597 virtual bool QueryIsDestructionAuthority(void) const;
00598
00604 virtual bool QueryIsVisibilityAuthority(void) const;
00605
00611 virtual bool QueryIsSerializationAuthority(void) const;
00612
00620 virtual bool AllowRemoteConstruction(SystemAddress sender, RakNet::BitStream *replicaData, SerializationType type, RakNetTime timestamp);
00621
00633 virtual void AddAutoSerializeTimer(RakNetTime interval, SerializationType serializationType=AUTOSERIALIZE_DEFAULT, RakNetTime countdown=(RakNetTime)-1 );
00634
00639 virtual void ElapseAutoSerializeTimers(RakNetTime timeElapsed, bool resynchOnly);
00640
00644 RakNetTime GetTimeToNextAutoSerialize(SerializationType serializationType=AUTOSERIALIZE_DEFAULT);
00645
00650 virtual void BroadcastAutoSerialize(SerializationContext *serializationContext, RakNet::BitStream *serializedObject);
00651
00654 virtual void CancelAutoSerializeTimer(SerializationType serializationType=AUTOSERIALIZE_DEFAULT);
00655
00657 virtual void ClearAutoSerializeTimers(void);
00658
00661 virtual void OnAutoSerializeTimerElapsed(SerializationType serializationType, RakNet::BitStream *output, RakNet::BitStream *lastOutput, RakNetTime lastAutoSerializeCountdown, bool resynchOnly);
00662
00667 virtual void ForceElapseAllAutoserializeTimers(bool resynchOnly);
00668
00676 virtual void OnConstructionComplete(RakNet::BitStream *replicaData, SystemAddress sender, SerializationType type, ReplicaManager2 *replicaManager, RakNetTime timestamp, NetworkID networkId, bool networkIDCollision);
00677
00678 protected:
00679
00680 virtual void ReceiveSerialize(SystemAddress sender, RakNet::BitStream *serializedObject, SerializationType serializationType, RakNetTime timestamp, DataStructures::OrderedList<SystemAddress,SystemAddress> &exclusionList );
00681 virtual void ReceiveDestruction(SystemAddress sender, RakNet::BitStream *serializedObject, SerializationType serializationType, RakNetTime timestamp, DataStructures::OrderedList<SystemAddress,SystemAddress> &exclusionList );
00682 virtual void DeleteOnReceiveDestruction(SystemAddress sender, RakNet::BitStream *serializedObject, SerializationType serializationType, RakNetTime timestamp, DataStructures::OrderedList<SystemAddress,SystemAddress> &exclusionList );
00683 virtual void ReceiveVisibility(SystemAddress sender, RakNet::BitStream *serializedObject, SerializationType serializationType, RakNetTime timestamp, DataStructures::OrderedList<SystemAddress,SystemAddress> &exclusionList);
00684 virtual Replica2 * ReceiveConstructionReply(SystemAddress sender, BitStream *replicaData, bool constructionAllowed);
00685 void DereferenceFromDestruction(void);
00686
00687 friend class ReplicaManager2;
00688 friend class Connection_RM2;
00689
00690 static unsigned char clientSharedID;
00691 static Replica2* clientPtrArray[256];
00692
00693 bool hasClientID;
00694 unsigned char clientID;
00695 ReplicaManager2 *rm2;
00696
00697 struct AutoSerializeEvent
00698 {
00699 SerializationType serializationType;
00700 RakNetTime initialCountdown;
00701 RakNetTime remainingCountdown;
00702 bool writeToResult1;
00703 RakNet::BitStream lastAutoSerializeResult1;
00704 RakNet::BitStream lastAutoSerializeResult2;
00705 };
00706
00707 DataStructures::Map<SerializationType, AutoSerializeEvent*> autoSerializeTimers;
00708
00709 };
00710
00713 class RAK_DLL_EXPORT Connection_RM2Factory
00714 {
00715 public:
00716 Connection_RM2Factory() {}
00717 virtual ~Connection_RM2Factory() {}
00718 virtual Connection_RM2* AllocConnection(void) const=0;
00719 virtual void DeallocConnection(Connection_RM2* s) const=0;
00720 };
00721
00727 class RAK_DLL_EXPORT Connection_RM2
00728 {
00729 public:
00730
00731 Connection_RM2();
00732
00733
00734 virtual ~Connection_RM2();
00735
00747 virtual Replica2* Construct(RakNet::BitStream *replicaData, SystemAddress sender, SerializationType type, ReplicaManager2 *replicaManager, RakNetTime timestamp, NetworkID networkId, bool networkIDCollision)=0;
00748
00755 virtual void SortInitialDownload( const DataStructures::List<Replica2*> &orderedDownloadList, DataStructures::List<Replica2*> &initialDownloadList );
00756
00757
00763 virtual void SerializeDownloadStarted(RakNet::BitStream *objectData, ReplicaManager2 *replicaManager, SerializationContext *serializationContext);
00764
00770 virtual void SerializeDownloadComplete(RakNet::BitStream *objectData, ReplicaManager2 *replicaManager, SerializationContext *serializationContext);
00771
00780 virtual void DeserializeDownloadStarted(RakNet::BitStream *objectData, SystemAddress sender, ReplicaManager2 *replicaManager, RakNetTime timestamp, SerializationType serializationType);
00781
00790 virtual void DeserializeDownloadComplete(RakNet::BitStream *objectData, SystemAddress sender, ReplicaManager2 *replicaManager, RakNetTime timestamp, SerializationType serializationType);
00791
00799 virtual void SetConstructionByList(DataStructures::OrderedList<Replica2*, Replica2*, ReplicaManager2::Replica2ObjectComp> ¤tVisibility, ReplicaManager2 *replicaManager);
00800
00808 virtual void SetVisibilityByList(DataStructures::OrderedList<Replica2*, Replica2*, ReplicaManager2::Replica2ObjectComp> ¤tVisibility, ReplicaManager2 *replicaManager);
00809
00814 virtual void SetConstructionByReplicaQuery(ReplicaManager2 *replicaManager);
00815
00820 virtual void SetVisibilityByReplicaQuery(ReplicaManager2 *replicaManager);
00821
00823 void SetSystemAddress(SystemAddress sa);
00824
00826 SystemAddress GetSystemAddress(void) const;
00827
00829 void SetGuid(RakNetGUID guid);
00830
00832 RakNetGUID GetGuid(void) const;
00833
00834 protected:
00835 void Deref(Replica2* replica);
00836
00837 void CalculateListExclusivity(
00838 const DataStructures::OrderedList<Replica2*, Replica2*, ReplicaManager2::Replica2ObjectComp> &listOne,
00839 const DataStructures::OrderedList<Replica2*, Replica2*, ReplicaManager2::Replica2ObjectComp> &listTwo,
00840 DataStructures::OrderedList<Replica2*, Replica2*, ReplicaManager2::Replica2ObjectComp> &exclusiveToListOne,
00841 DataStructures::OrderedList<Replica2*, Replica2*, ReplicaManager2::Replica2ObjectComp> &exclusiveToListTwo
00842 ) const;
00843
00844 virtual Replica2 * ReceiveConstruct(RakNet::BitStream *replicaData, NetworkID networkId, SystemAddress sender, unsigned char localClientId, SerializationType type,
00845 ReplicaManager2 *replicaManager, RakNetTime timestamp, DataStructures::OrderedList<SystemAddress,SystemAddress> &exclusionList);
00846
00847 friend class ReplicaManager2;
00848
00849
00850 SystemAddress systemAddress;
00851 RakNetGUID rakNetGuid;
00852
00853 DataStructures::OrderedList<Replica2*, Replica2*, ReplicaManager2::Replica2ObjectComp> lastConstructionList;
00854 DataStructures::OrderedList<Replica2*, Replica2*, ReplicaManager2::Replica2ObjectComp> lastSerializationList;
00855 };
00856
00857 }
00858
00859 #endif
00860
00861 #endif // _RAKNET_SUPPORT_*