00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef __DATABLOCK_H__
00012 #define __DATABLOCK_H__
00013 #include "RNPlatform/Inc/DLLExportAPI.h"
00014 #include <string>
00015
00016 namespace RNReplicaNet
00017 {
00018
00019 class MessageHelper;
00020 class ReplicaNet;
00021 class ReplicaObject;
00022
00023 const int kDataBlockReason_SomeoneJoined = 0;
00024 const int kDataBlockReason_SomeoneLeft = 1;
00025 const int kDataBlockReason_NormalPoll = 2;
00026 const int kDataBlockReason_CalculateReplicaPoll = 4;
00027 const int kDataBlockReason_CalculateMasterPoll = 5;
00028 const int kDataBlockReason_MasterPrepAfterTakeover = 6;
00029 const int kDataBlockReason_ReplicaCallBackPoll = 7;
00030 const int kDataBlockReason_ReplicaPrepAfterTakeover = 8;
00031 const int kDataBlockReason_RecordingNormalPoll = 9;
00033 struct DataBlockReason;
00034
00041 class REPLICANETDLL_API DataBlock
00042 {
00043 friend class ReplicaObject;
00044 public:
00048 DataBlock();
00049
00053 virtual ~DataBlock();
00054
00059 virtual void Poll(DataBlockReason *reason = 0);
00060
00065 virtual void ParseMessage(MessageHelper *message);
00066
00072 void SetVariableName(const char *name = 0);
00073
00078 void BindReplicaNet(ReplicaNet *current);
00079
00084 void BindReplicaObject(ReplicaObject *object);
00085
00090 void SetReliableFlag(bool reliable = false);
00091
00096 bool GetReliableFlag(void);
00097
00102 void SetCertainFlag(bool certain = false);
00103
00108 bool GetCertainFlag(void);
00109
00114 void SetAutomaticUpdatesFlag(bool automatic = true);
00115
00120 bool GetAutomaticUpdatesFlag(void);
00121
00127 virtual void GiveDeltaHint(void *pdata,int dataLen);
00128
00133 void GiveDeltaHint(float delta)
00134 {
00135 GiveDeltaHint(&delta,sizeof(delta));
00136 }
00137
00141 enum ContinuityBreakTypes
00142 {
00143 kStop = 1,
00144 kSuddenChange = 2,
00145 kTeleport = 4
00146 };
00147
00152 virtual void ContinuityBreak(unsigned char breakTypes);
00153
00158 virtual bool IsAttached(void *data);
00159
00164 virtual bool IsAllocated(void) const;
00165
00170 void SetIsAllocated(const bool isAllocated = true);
00171
00172
00182 void SetUpdateDelayMinimum(const float delay = 0.0f);
00183
00188 float GetUpdateDelayMinimum(void) const;
00189
00201 void SetForceSendMaximumUpdates(const int updates = 0);
00202
00207 int GetForceSendMaximumUpdates(void) const;
00208
00218 void SetForceSendTimeDelay(const float delay = 0.0f);
00219
00224 float GetForceSendTimeDelay(void) const;
00225
00226 protected:
00230 void SetID(int id);
00231
00232 const char *GetROName(ReplicaObject *from = 0);
00233
00234 void EmitBaseDebugInfo(const char *name,const char *className,DataBlockReason *reason);
00235 void EmitBaseDebugInfoUpdates(const char *name,const char *className,DataBlockReason *reason);
00236
00237 std::string GetVariableName(void);
00238
00239 short mID;
00240 ReplicaNet *mBoundReplicaNet;
00241 ReplicaObject *mBoundObject;
00242 bool mReliable;
00243 bool mCertain;
00244 bool mAutomaticUpdates;
00245 bool mIsAllocated;
00246 bool mDebugOn;
00247 char *mDebugText;
00248 float mUpdateDelayMinimum;
00249 int mForceSendMaximumUpdates;
00250 float mForceSendTimeDelay;
00251 char *mVariableName;
00252 };
00253
00257 struct REPLICANETDLL_API DataBlockReason
00258 {
00259 public:
00265 DataBlockReason(int code = kDataBlockReason_NormalPoll,int session = -1,ReplicaObject *object = 0)
00266 {
00267 mReasonCode = code;
00268 mSessionReference = session;
00269 mObserver = object;
00270 mFloatValue = 0.0f;
00271 mFloatTime = -1.0f;
00272 }
00273
00274 int mReasonCode;
00275 int mSessionReference;
00276 MessageHelper *mMessageHelper;
00277 ReplicaObject *mObserver;
00278 float mFloatValue;
00279 float mFloatTime;
00280 float mFloatLocalTime;
00281 };
00282
00283
00284
00285 #define _RO_DO_REGISTERBLOCK_END() \
00286 RegisterDataBlock(datablock); \
00287 }
00288
00289
00290 }
00291
00292 #endif