ReplicaNet Release notes

The workspace for all example projects are contained in the 'Examples' directory. The DotNET2008 solution file is 'Examples\Examples_2008.sln'. The DotNET2010 solution is 'Examples_2010.sln' etc.

Each example has a "readme.txt" file that explains the brief outline of each example.
Example 4 is a particularly useful example that shows how to use ReplicaNet inside a typical game situation where the game uses classes for each object.
The 'Docs' folder contains Doxygen generated documentation and CHM files for this build of the libraries

The components to ReplicaNet are in the ReplicaNetPublic folder. Your include directories need to be set to "ReplicaNetPublic/Includes".

The tutorial index can be found in "Tutorials\index.html"

Compiling and linking
This public release uses amalgamated source code for ReplicaNet and RNLobby client APIs. Just add "ReplicaNetPublic\AmalgamatedReplicaNet.cpp" to your project and an include path to "ReplicaNetPublic\Includes" then you're ready to compile. This source includes all of the original client facing source code from the core ReplicaNet and RNLobby libraries. The core libraries are around 100 C++ source files in around 12 projects with extra private headers that do not comprise the public interfaces. The amalgamated source is simpler to include in a project and compile. An added bonus is that during testing the amalgamated source runs faster. Most compilers are able to utilise extra optimisations when all the code is included into one block. Performance improvements of 5 to 10% have been measured.
Individual source files are available in the full SDK. Full instructions are in the "Using ReplicaNet" section of the ReplicaNet class documentation.

Microsoft Windows
This SDK has been tested with:

  • dotNET2008 SP 1. The service pack is available from Microsoft Update.
  • dotNET2010 SP 1. The service pack is available from Microsoft Update.
  • dotNET2012 Update 4.
  • MinGW GCC 4.6.2
  • C# with SWIG 2.0.6

Linux
The headers and tools for Linux can be found in the 'ReplicaNetLinux.tar.gz' archive. Example2 has an example makefile. Tested with Ubuntu 12.04 and GCC 4.6.3

Maramalade
Tested with Maramalade 6.3.2

Android
Tested with Android NDK R8

Apple
Tested with iOS/iPhone/iPad using Xcode 4.3.2

Xbox360
The Xbox360 version is only available to registered Microsoft developers. Please contact your Microsoft account manager who will be able verify your developer status with us.

Playstation2
The Playstation2 version is only available to Sony registered developers. Please contact your Sony account manager who will be able verify your developer status with us.

Other games consoles
Please contact us with your requirements and we will do our best to help.

Common headers
The header files for all builds are in the 'ReplicaNetPublic\Includes' directory.

Examples
The 'Demo1' directory now contains the "Planes and Dolphin" demo with integrated lobby and statistics tracking.
Workspace solutions are available in the 'Examples' directory. The solution 'Examples_2008.sln' is used by dotNET2008. The solution 'Examples_2010.sln' is used by dotNET2010.


Windows build notes
DotNET2008 and DotNET2010 may produce "libci.lib" link problems when using some versions of the DirectX SDK. To resolve this problem add "libci" to Project Properties->Linker->Input->Ignore Specific Library.

The graphical examples use the Microsoft® DirectX® 9.0 SDK Update (April 2005) with patches for Visual Studio 6.0 from the Microsoft® DirectX® 9.0 SDK Update (Summer 2003) and this was used to test the installation. This DirectX version still maintains compiler support for Visual Studio 6.0 where later DirectX SDK versions remove this compiler support. The library and header files for this version of the DirectX SDK can be downloaded from http://www.replicanet.com/DX90SDK.zip.

Some of the examples use the Microsoft® WTL library.
The dotNET2008 and dotNET2010 projects have been tested with WTL 7.5 (mirror)
After decompressing the relevant archive add the WTL include path to the compiler include directory paths.

To get technical support on any issues you may have please email techsupport@replicanet.com

Release V7.2

Global additions and changes

  • TransportUDP is now even more reliable when there is lots of packet loss.

  • XPSock_Utility* functions have been removed and similar functionality added to the status MessageHelper::Get*/Set* functions.

  • XPStream has been deprecated.

  • Added ExampleAndroidNDK

  • Example 1 now has bandwidth graphs and allows network latency and packet loss to be emulated.

  • Checksum::ChecksumDataWithSlots has been improved to include optional initialisation of the checksum slots.

  • Added Encrypt::CommutativeEncrypt() and Encrypt::CommutativeDecrypt()

  • Windows threading has switched to using _beginthreadex() etc.

  • Added RNReplicaNet::GetStringSafe()

  • Added RNODBCSQL::Prepare to aid in the creation of SQL queries with proper escaping.

  • Added RNSQL.exe tool to allow RNODBCSQL to be used from the command line, it will automatically translate queries for the supported database providers.

  • Transport CRYPTOUDP@ has been added. This uses a handshake to enforce a different encryption key for every connection.

  • Microsoft Visual Studio 2012 solution and projects created.

  • TransportConfig::SetPacketBufferEnable() and SetPacketBufferTime() now default to using packet buffering with a time of 0.01f seconds. Previously packet buffers were disabled and had to be explicitly enabled.

Additions and changes to ReplicaNet

  • Added ReplicaObject::SetDelayIDFetch() to control when GetNewSessionIDAndUniqueID() is called.

  • Added virtual int ReplicaObject::GetNumExpectedDataBlocks(void) and StaticSetExpectedNumDataBlocks()

  • Added ReplicaNet and XPSession GetNetworkPacketsRejected().

  • ReplicaObject::GetNewSessionIDAndUniqueID() accepts an optional ReplicaNet pointer to attach the ReplicaObject instance to.

Additions and changes to RNLobby

  • RNSimpleScriptCompiler can now accept ARM source code in GCC format.

  • Compile C/C++ or any other language supported by GCC into SimpleScript for use weith the StatServer statistics parsing engine.

  • RNSimpleScriptDebugger has been improved to display more register and source level debugging.

  • Added more debug logs to AdvertiseServer.

  • RNLobby website updated to use the new escaping and user/email validation code.

  • RNLog no longer replaces ' with _ and the allowed range of characters has been increased.

  • Service::DebugOut and Service::DebugPrintFile are now much faster.

  • Added REST mobile API XMLLoginProcess.asp XMLGetVariables.asp XMLSetVariable.asp for the website to login and set variables that have relevant access.

  • Added Service::Get/SetRegistry

  • User SQL tables now have TimeUpdated added to allow operations to be more easily audited.

  • Default service long descriptions now include the service name.

  • Added MyService::GetDebugStatusLine() to improve common service debug information.

  • Added Example12Script2.cpp to demonstrate using C++ with StatServer.

  • RNAdminTool improved with extra status display.

  • RNLobby web APIs now use UTF-8 encoding.

  • RLHub source updated to compile with VS2012

  • Windows services can now be configured to operate with more secure access rights to the registry.

  • Service::GetServiceList() now differentiates between 32 and 64 bit service processes.

  • Service processes can now be 32 or 64 bit.

  • Service configuration and debug reporting via the command line has been improved.

  • RLSrvSecurity helps to guard against server hacking attempts by blocking suspicious activity detected on the network.

Release V7.1

Global additions and changes

  • Added support for MinGW, C# using SWIG, native Android and Apple using Xcode.

Additions and changes to ReplicaNet

  • ReplicaNet::SetObserver() can observe ReplicaObjects using any update type.

  • Added ReplicaObject::SetPropagateToSessionDistanceInclude() and SetPropagateToSessionDistanceExclude() to allow a minimum and maximum distance to be set for distance based propagation.

  • RNROLCompiler has been updated to allow lang file classes to include text, use "H<", into the output header file instead of the default output cpp file. An example can be found in "RNROLCompiler\lang\object.lang".

  • RNROLCompiler now splits the application::object() defintion macros.

  • RNROLCompiler lang files have been updated.

  • RNROLCompiler now only searches the registry key include path after other include paths. User defined include paths have priority.

  • DataBlock_Predict_Float::ReplicaContinuityBreak changed to add ignoreTimeCheck and clearPreviousUpdates options.

  • Added checks for the defines RN_EXCEPTIONS_IGNORE/RN_EXCEPTIONS_ENABLED

  • Added a templated ReplicaObject::FindDataBlock() that will return the correct DataBlock derived class pointer type for a class member.

  • Each DataBlock derived class wanting to support type checking functionality should add the macro RN_CLASS_MINIMAL_RTTI to the public portion of their class definition.

  • ReplicaNet::CallbackGetObjectUniqueID() has been added to allow ReplicaObject unique IDs to be calculated by the user.

Additions and changes to RNLobby

  • ProductPatcher::GetRealFilePath now copes with some proxies that were returning incorrect zero length files.

  • ProductPatcher::GetDownloadAttemptsAndFailed() and ProductPatcher::GetDownloadSpeed() have been added.

  • UserServer, StatServer and BackendServer has more logging.

  • All the RLSrv instances log the bandwidth sent and received and CPU to the server monitor.

  • TransportNATUDP::Accepted() now reports the connection state correctly.

  • BaseTransportServer::Start() renamed to StartWithTransport().

  • BaseServer::Start() renamed to StartWithSocket().

  • Patcher speed and compression improved.

  • The database function RN_INTERVAL_TO_DOUBLE() has been added. In MySQL it does nothing since MySQL returns a numerical value. In PostgreSQL it uses EXRACT(EPOCH...

Release V7.0

Global additions and changes

  • Amalgamated source code is included, binary library builds are no longer needed.

  • FreewareSetRegistrationCode() and "RNPlatform/Inc/FreewareCode.h" are no longer needed and have been deprecated.

  • ReplicaNet_MemoryDumpAllocatedBlocks and ReplicaNet_MemoryBreakOnAllocatedBlocks are deprecated. Since source is now included any memory tracking can be included at compile time.

  • DLL builds have been deprecated and REPNETEXPORTAPI REPLICANETDLL_API XPSESSIONDLL_API XPURLDLL_API have been removed.

Additions and changes to ReplicaNet

  • RNPlatform/Inc/Rand.h has added RNReplicaNet::Rand::SeedFastWeak() and FastWeak() functions to avoid conflicts with the CRT srand() and rand() functions. All internal ReplicaNet calls to srand and rand have been replaced with this new API.

  • Windows XP support for IPv6 addresses has been added. Specifically this fixes the wsock32.dll missing exports for inep_pton and inet_ntop.

  • Handling of incomming data packets has been improved when multi-threading is enabled.

  • XPSession::SetProxyMode() and GetProxyMode() have been added. This allows a master session to act as a proxy for messages, only allowing messages to be routed through the master. Messages cannot be sent to or from the master. The master session ID is not not notified to other machines as a joiner or leaver, therefore ReplicaNet will not attempt to replicate objects to the master ID. This can be useful where a dedicated server needs to start a session to allow clients behind a restrictive firewall to connect and where the server does not want to receive any ReplicaObject updates. In effect a ReplicaNet session can connect to this proxy XPSession instance and not have to worry about superfluous object updates being sent to the master ID.

  • DataBlock_Predict_Float::GetLastDelta() Adds the ability to read the last received delta hint for a data block.

  • DataBlock::SetForceReflectionUpdate() Adds the ability to use received delta update hint values for any outgoing reflection master updates.

Additions and changes to RNLobby

  • PatchIndexManager now uses a file information cache index and scanning for modified files is quicker.

  • UserServer: The user ID to enter a room is always the last to get a UserClient::CallbackChatRoomEntered().

  • GameLobby now has a remove all friend requests menu item.

  • GameLobby chat now expires old chat messages to avoid filling up the chat window during prolonged use.

  • UserServer password security has been improved during login by using a unique login attempt salt.

  • All servers using BaseTransportServer have had their security improved by using a unique connection key.

  • NATResolver, NAT punch through and negotiation, has been improved for some rare types of firewall with very restrictive policies.

  • RLSrv services from different versions can be used on the same physical server by adding a "_VERxxx" extension to the EXE name.

  • RLSrv services can be configured to use different databases.

  • Added Debug.asp to test for common ASP/DB/COM setup problems.

  • RLSrvUtility is a platform agnostic RESTful HTTP server designed to handle requests from the web server. This replaces functionality from RLCOMUser which has been deprecated.

Additions and changes to RNSimpleScript

  • RNSimpleScriptcompiler spots duplicate labels and produces an error.

  • The script engine is now endian agnostic.

  • RNSimpleScriptCompiler will automatically include "FunctionEpilogue.lang" after encountering the first EndProc command.

Release V6.4

Additions and changes to the RNLobby API

  • StatServer: Scripting added the ability to shift a range of variables in contiguous sections by an offset. This can be used for a history of scores to be built up and rendered as a graph or table by the web backend. Script:Stat.lang: ShiftVariables(loginID,startSection,access,name,numItems,sectionOffset)

  • StatServer: Scripting added the ability to output the date/time stamp as a variable value. This can be used by the stat script backend to check the frequency of updates for game sessions and to reject sessions that are too frequent. Script:Stat.lang: GetTimeAsSeconds()

Additions and changes to the RNSimpleScript API

  • Added update of sl(r31) when items are pushed or popped on the stack. Also added "AsmPop r0" which will pop the register to the same pushing register. Very useful for self-unwinding stacks.

  • The include file "FunctionEpilogue.lang" needs to be included when procedures are used because it defines the label _proc_PopStackFrames

  • RNSimpleScriptCompiler now has a separate lang directory containing include scripts. The compiler will search this as part of the default include path.

  • RNSimpleScriptCompiler now optimises multiple branch chains with conditions.

  • Unusued script procedures are removed from the build output.

  • DefProc can now be used with blank () parameters.

  • The keywords "#define" and "#pragma once" can now be used in script files, allowing these files to also be included in C/C++ code.

  • RNSimpleScriptDebugger will display more accurate debug line information from the ".bnd" file.

Additions and changes to the ReplicaNet API

  • DataBlocks now support SetDiscardOlder() updates to tag each update with a variable window size allowing old out of order updates to be detected and discarded. This is instead of using the transport level unreliable ordered delivery.

  • The virtual method DataBlock::Poll() has changed to include two extra parameters. Classes that derive from DataBlock will need to be updated.

Global changes

  • IPv6 format addresses are now supported by ReplicaNet, XPSession, RNXPURL, RNXPSockets and RNLobby servers. Each socket or transport can support a listen address on IPv4 and IPv6 addresses at the same time. A socket or transport can choose either IPv4 or IPv6 to connect to a listening address. The textual address format has changed as follows in these examples: IPv4 only "127.0.0.1:80". IPv6 only "[1234::1bcd:4321:1234:43bc]:80". Combined IPv4 and IPv6 address, note the separating '-' character "127.0.0.1:80-[1000:0123:0000:0000:0000:0000:1234:4321]:80".

  • To aid IPv4 and IPv6 compatibility TransportConfig::SetIPv4Detection(), TransportConfig::GetIPv4Detection(), TransportConfig::SetIPv6Detection(), TransportConfig::GetIPv6Detection() TransportConfig::SetIPv4Detected() TransportConfig::GetIPv4Detected(), TransportConfig::SetIPv6Detected() TransportConfig::GetIPv6Detected() have been added.

  • Transport has a new pure virtual function "Error Listen(const std::string &address)". This allows a Transport to listen on a specific address.

  • Unreliable ordered packet delivery options for RNPXURL, RNXPSession and RNReplicaNet are now supported. Similar to the reliable ordered delivery option there are separate bands provided by XPURL transports.

  • RNXPCompression speed and compression has been improved.

  • Transport discovery and replies have been improved for machines on a LAN that are behind their own NAT.

Release V6.3

Additions and changes to the RNLobby API

  • Password salting and security for UserServer and RLCOMUser Account::ObfuscatePassword() has been improved.

  • PostgreSQL database support has been added. MySQL and PostgreSQL are now automatically detected when lobby services start and compatible code is used.

  • UserServer, StatServer and AdvertiseServer now include extensive logging for actions taken by each user. The ASP web based account manager example code includes these extra logs.

  • Web based password resets now require two step authentication.

  • NATResolver connection negotiation has been improved.

Global changes

  • Example 4 now uses DataBlock frame based synchronisation using ReplicaNet::ProcessDataBlockUpdate() and recording compression using a separate thread.

  • To simplify the build process the separate libraries such as RNXPSession, RNPlatform, RNXPURL etc have all been merged into RNReplicaNet library. VC6 builds and builds that allow DLL linking have been deperecated.

  • Handling of the "getinfo" UDP packet (FF FF FF FF 67 65 74 69 6E 66 6F) by listen services has been fixed.

  • The Linux build now includes RNLobby support, with optional memory tracking.

Release V6.2

Additions and changes  to the ReplicaNet API

  • Added DataBlock_Predict_Float::ReplicaContinuityBreak() to allow local replica extrapolation/interpolation to be used until an update arrives from the network.

  • The RNVisualDebugger tool has been updated to allow selection of the packet graph to highlight and filter packet updates. This allows unusual packet data to be analysed to find ReplicaObject updates causing bandwidth spikes.

Additions and changes  to the RNLobby API

  • ODBCSQL TransactionBegin(), TransactionRollback and TransactionCommit() have been added to aid readability of SQL related transactions. The related SQL commands will also still work as intended.

  • UserClient ChatRoomAdminMessage(), ChatRoomSay() and ChatRoomWhisper() all now accept user defined flags that can be used by the application.

  • BaseTransportServer::GetNumTotalSessions() has been added.

  • UserClient::CallbackChatRoomMessage() the flags have changed from size_t to be unsigned int.

  • UserServer now has the ability to lock user account details such as email address and password.

  • Added RNSimpleScriptCompiler and RNSimpleScriptDebugger to allow scripting to be used with the StatServer and StatClient. Example12 and Demo1 examples demonstrate persistent user data.

  • Added RNAdminTool be able to upload files to the StatServer.

Additions and changes  to the RNXPURL API

  • TransportConfig::SetExtraPacketSecurity() allows the packet security to be enabled or disabled. Versions of RNXPURL prior to 6000 (ReplicaNet 6200, RNLobby 0700) do not use this extra security. To allow later versions to connect to earlier versions use SetExtraPacketSecurity(false). All old clients will still be able to connect to new servers. Security will be disabled for those connections.

Global changes

  • 64bit x64 builds are available along with CLR enabled libraries.

Release V6.1

Additions and changes  to the ReplicaNet API

  • The compression algorithm has been changed so it is slightly quicker than before, uses half as much memory and compresses slightly better with test data.

  • Example2 has been updated to show hExample2 has been updated to show how to pass variable length parameters with network function calls.

  • Added a virtual function ReplicaNet::SetSessionIDCallback() to allow the session IDs to be calculated by the user instead of the code. For example, random session IDs.

Additions and changes  to the XPSession API

  • Added a registered callback XPSession::RegisterSessionIDCallback() to allow the session IDs to be calculated by the user instead of the code. For example, random session IDs.

Additions and changes  to the RNLobby API

  • UserClient::CallbackUserLoginFailed() changed to add a "const Reason reason".

  • Added the ability to kick and ban users from the UserServer and created chat rooms with the functions UserClient::ChatRoomKickUser(), UserClient::GlobalKickUser(), UserClient::CallbackGlobalKicked(), UserClient::CallbackChatRoomKicked().

  • Whispering and friend messages added to RLHub.

  • Added RLCOMUser which is a helper object that can be used with ASP pages to reset passwords.

  • Added the ability to change password and email address using the functions UserClient::ChangePassword(), UserClient::ChangeEmail().

  • Added a user state option function UserClient::PlayingAGame().

  • Statisics and tracking updates using StatServer and StatClient.

  • GameLobby and Demo1 game demonstration with integrated user and statistics tracking using ASP web hosting. The full source is included as part of the Developer Premier SDK. The page for player ranking information is available at this report page

Release V6.0

Additions and changes  to the ReplicaNet API

  • A new object migration option ReplicaNet::kMigrateObjectsToNewMaster has been added to SetOnSessionError()

  • DataBlock_Predict_Float has been updated to include a 16 bit short floating point value or delta. This can reduce bandwidth for frequently updated floating point numbers using this DataBlock type. See SetValueShortFloat() and SetDeltaShortFloat()

  • Added ReplicaNet::CallbackMasterSessionIDChanged()

  • Added GetLatencyToSessionID() for ReplicaNet and XPSession.

  • Added SetBand() to the ReplicaObject and DataBlock updates. The band parameter allows the object to send reliable updates and ensure they are in original order grouped by band.

Additions and changes  to the XPSession API

  • Added GetLatencyToSessionID() for ReplicaNet and XPSession.

  • DataSendToSession() and DataSendToSessionReliable() now have an extra band parameter. This allows the user to send reliable packets and ensure they are in original order grouped by band.

Additions and changes  to the RNLobby API

  • AdvertiseClient now uses a port range from 4400 to 4409 for LAN discovery of servers.

Bug fixes

  • After session migration sessions would receive the same data packets from the new host twice if the packet was sent with kXPSessionBroadcastID, data packets are now only sent once.

  • After session migration the new host would not calculate ping to the remaining peers. The ping to peers is now calculated by the new host.

Release V5.9

Additions and changes  to the ReplicaNet API

  • Added TransportConfig::SetExternalIP() and TransportConfig::GetExternalIP()

  • Speed optimised pending connections for TransportUDP.

  • Added DataBlock_Predict_Float::SetSnapToDifference() allows this replica DataBlock to snap to the extrapolated value if the difference is greater than the configured difference.

  • Added DataBlock_Predict_Float BoundaryEnable(), BoundaryDisable(), BoundaryWrapAround(), BoundaryCapped(), BoundaryLowerUpper(), BoundaryApplyToMaster() to allow values that wrap around or are clamped.

  • The documentation for all components is now included as one file with all classes cross-referenced.

Bug fixes

  • Xbox360: When calling  PlatformHeap::ForceFree() the Live registered transport is now de-allocated at the correct time.

  • Transport::GetPeerURL() now returns std::string("") when there is no peer.

  • ReplicaNet::GetTime() and GetLocalTime() are now called during PlaybackAdvanceTo()

  • When using manual ReplicaNet polling and the poll rate is less than one call per second the DataBlock_Predict_Float simulation has been improved. 

Breaking changes

  • Transport::SendReliable() has been updated to include an extra band parameter. Any used created Transport derived classes will need updating.


Release V5.8

Additions and changes  to the ReplicaNet API

  • ReplicaObject::FindDataBlock() now registers all DataBlocks before trying to find attached blocks.

  • Added DataBlock_Predict_Float::SetLagged() which allows this DataBlock to use interpolation and permanently lag the changes made to the variable attached to this DataBlock. SetLagged() has also been added to the Predict_Float ROL language file.

  • All library DataBlocks now have protected member variables to allow user extensions to have access.

  • Added a delaySeconds parameter to ReplicaObject::DelayedDelete() to allow the object to be delay deleted in delaySeconds amount of time.

  • The documentation regarding ReplicaNet_MemoryTotalsEnable() and REPLICANET_ALWAYSDOMEMORYTRACKING has been updated.

  • To allow ReplicaObjects to become dormant or active after a specified time period added ReplicaObject::
    UpdateSendDormantDelay()
    UpdateSendDormantDelayCancel()
    GetUpdateSendDormantDelay()
    UpdateSendDormantDelayStateChange()

Release V5.7

Additions and changes  to the ReplicaNet API

  • Added the ROL command "namespace" to allow C++ classes from different namespaces to be defined.

  • Added PlatformInfo::SetProcessorReplicaNet()/SetProcessorXPSession()/SetProcessorXPURL() to allow the preferred processor for each of the components.

  • Added Thread::SetPreferredProcessor() to allow the preferred processor to be set for the thread.
    Calling PlatformHeap::ForceFree() will call XPSock_Quit() if XPSock_Init() was previously called.

  • Added ReplicaObject::GetProcessingDataBlocksFromSessionID() to return the originator sessionID while processing DataBlock updates.

  • Added ReplicaObject::Unpublish() with the supporting callbacks CallbackObjectUnpublishPre() and CallbackObjectUnpublishPost()

  • Added delayed deletion of ReplicaObjects with ReplicaObject::DelayedDelete(), DelayedDeleteCancel() and GetDelayedDelete().

  • Added ReplicaNet::ObjectListFind() to find a ReplicaObject from its sessionID and uniqueID.

  • Changed the internals of the MutexClass to use critical sections on Windows and Xbox/Xbox360 builds.

  • Added ReplicaObject::IsPublished().

  • Added ReplicaObject::UpdateSendDormant() and ReplicaObject::GetUpdateSendDormant() to set a ReplicaObject as dormant and not send any DataBlock updates. Dormant objects use less processor time because DataBlocks are not checked.

  • Xbox360: Updated the samples to use VC2005

  • Xbox360: Added the option to use VisualDebugger connections with Test2, currently enabled in the Debug build.

Additions and changes  to the RNLobby API

  • RNMakePatches: When uploading files using FTP and the patch index has been done then use FtpDeleteFile to delete old patches that are not used in the live index.

  • Removed the RNSQLite database library and replaced it with an RNODBC interface.

  • RNLobby now uses MySQL via ODBC.

  • The RLSrv services are now dependant on the database service.

  • AdvertiseClient queries can now use complex filters based on the rules supplied for each entry.

  • UserClient::AddUserInfo() allows UserInfo from a loginID to be requested and watched in a similar manner to the friends list.

  • Added UserClient::
    CreateChatRoom()
    LeaveChatRoom()
    EnterChatRoom()
    GetCurrentRoom()
    ChatRoomAdminMessage()
    ChatRoomSay()
    ChatRoomWhisper()

  • The Backend now does not need to be allocated before other RNLobby classes. However the Backend class must still successfully complete before other RNLobby classes are started or connected to the servers.

  • RLHub is an example of a win32 MFC application using the RNLobby API to provide a user, friend, chat and game listings services.

Bug fixes

  • Fixed the linking problem static MFC static libraries.

  • Xbox360: Fixed an assert complaining about an invalid handle when calling ShutdownNetwork(true)

  • Changed the AdvertiseServer rule and user update to be atomic.

  • Fixed an issue when trying to call networked ReplicaObject functions before the object has been published.

  • Vastly improved performance with more than 100 connections.

Release V5.6

Additions and changes  to the ReplicaNet API

  • Protocol "NATUDP@" with RNLobby can be used by XPURL, XPSession and ReplicaNet to provide NAT/firewall defeating.

  • Example11 has been added to show how to use RNLobby services with ReplicaNet.

  • Added templated operator<< and operator>> to DynamicMessageHelper

  • Removed compiler warnings for GCC 4.x in -pedantic mode. Rebuilding RNROLCompiler generated files will also help.

  • There is now no limit to the number of parameters for ReplicaObject networked function calls using DataBlock_Function.

  • Example1 has been updated to include a simple DataBlock_Function example.

  • Example10 has been added to show example use of RNReplicaNet::RNLobby::ProductPatcher

  • XPSock_UrgentSetRawMode(), XPSocketUrgent::SetRawMode() and XPSockUrgent::ProcessACKS(), XPSockUrgent::SendWithACK(),
    XPSock_UrgentListen() have been removed because they are obsolete.

  • XPSock_GetAddress() will no longer return 0.0.0.0 as the address of a listening TCP or UDP socket. The IP address of the host will be used. This matches the Transport::GetAddress() behaviour.

  • XPSock_UrgentCreate(), XPSock_Listen(), XPSocketUrgent::Create() and XPSocket::Listen() have been updated to include an address
    to bind to for the socket. This is useful for multihomed machines.

  • Added ReplicaNet::FindSession(const std::string protocols)

  • Using a debug ReplicaNet DLL library and forgetting to call REPLICANET_DLLPREREGISTER() will trigger an assert.

  • Added -P option to the RNROLCompiler to allow pre-compiled header files to be added to the output cpp file.

  • Added XPAddress:Import() to import a string in x.x.x.x:x format.

  • MessageHelper::SetGuardSize() can be used to throw a C++ exception of type MessageHelper::Exception() when the data is read from beyond the end of a message.

  • Added: XPSock_ICMPCreate(), XPSock_ICMPSendPing(), XPSock_ICMPRecvPing(), XPSock_ICMPWaitForPing()

  • TransportUDP has been optimised for processor time and memory use.

Additions and changes  to the RNLobby API

  • This version of RNLobby is in the alpha stage of development and as such may be subject to substantial changes until beta.

  • Binary difference patch creation and delivery. (RNMakePatches tool/Patcher)

  • Backend availability and TitleID verification. (BackendServer/BackendClient)

  • Internet CD/License key verification. (CodeServer / CodeClient)

  • NAT Detection. (NATDetectServer / NATDetectClient)

  • NAT Resolving. (NATResolver) TransportNATUDP for use with XPURL/XPSession/ReplicaNet uses NATResolver.

  • Advertising and querying of sessions player list and rule list. (AdvertiseServer / AdvertiseClient)

  • Added LAN only operation for AdvertiseClient.

  • User account create/authenticate, friends list, game invites and persistent data storage. (UserServer / UserClient)

  • All servers now have service modules. For Win32 these are be configured to start with the system and restart on error.

  • RLSrvMonitor can be used to produce an HTML report to a file which is useful for producing web based reports.  ( http://www.rnlobby.com/RLSrvMonitor.html )

  • RLServerMonitor is a Win32 GUI application to display the status like RLSrvMonitor.

Bug fixes

  • Calling PlatformHeap::ForceFree() will call XPSock_Quit() if XPSock_Init() was previously called.

  • Fixed a bug in MutexClass::~MutexClass() where a mutex handle was being closed before it was released on Win32 platforms.

  • Fixed a deadlock issue with the database when many threads and processes were accessing it at the same time.

Proposed deprecation
The next version of ReplicaNet is planned to deprecate the includes (and classes included in) DatabaseManager.h and Database.h
Please email techsupport@replicanet.com if you wish to discuss or find out more about this particular change.

 

Release V5.5

Additions and changes  to the API

  • A quick view of functions added:
    ReplicaNet::CallbackPlaybackAdvanceToFinished()
    [ReplicaNet/XPSession]::DataReceivePeek()

  • Packets larger than 512 bytes can now be sent through XPsession::DataSendToSession[Unreliable/Certain/Reliable] and ReplicaNet::DataSend().

  • ReplicaObject updates can now be any size, memory permitting.

  • The version of the ReplicaNet recording files has been increased. Previous versions will not playback with this version of ReplicaNet.

  • ReplicaNet::CallbackPlaybackAdvanceToFinished() has been added as a callback to signal when the last requested ReplicaNet::PlaybackAdvanceTo() finishes.

  • A DataBlock reason event called kDataBlockReason_AfterDataBlocksReceived has been added to provide better flexibility for the ReplicaObject::PostObjectCreate() event.

  • Processing DataBlock updates has been optimised.

  • ReplicaObject::DataSend() and ReplicaObject::CallBackDataReceive() have been added to allow ReplicaObject derived classes to send and receive raw data.

  • XPsocket::Send(), XPSocket::Recv(), XPSock_Send() and XPSock_Recv() now propagate XPSOCK_ECLOSED to the last xoscket error when a connection failed to connect.

  • RNReplicaNet::StrDup() has been added to RNPlatform/Inc/StrDup.h to avoid problems with dotNET2005 warning _strdup has been deprecated.

  • Code changes have been made to remove warnings when compiling with Linux Suse 9.3

  • TransportConfig::SetPacketMTU() has been added to allow the the MTU of packets to be set when using packet buffering.

Bug fixes

  • When network packet loss emulation is enabled some memory was allocated after calling PlatformHeap::ForceFree().

  • After deleting an XPSession instance and allocating a new instance to connect to the same server within thirty seconds some Certain packets were lost.

  • XPCompression now uses the DLL export API to avoid having to statically link this library.

  • XPAddress operator == and != tests the port number with the IP address.

  • ReplicaObject::PostObjectCreate() was not being called when in playback mode.

  • RNXPURL.DLL DebugMTDLL/ReleaseMTDLL builds were not using the correct code generation options.


Release V5.4

Additions and changes  to the API

  • A quick view of functions added:
    ReplicaNet::SetPlaybackSpeed()
    ReplicaNet::PlaybackAdvanceTo()
    ReplicaNet::GetSessionRecord()
    XPSock_GetHardwareStatus()
    [ReplicaNet/XPSession]::[Set/Get]NodeBuffers()

  • ReplicaNet and XPSession have session manager and ReplicaObject database optimisations.

  • ReplicaNet and XPSession can utilise extra memory to offset thread synchronisation costs by using SetNodeBuffers().

  • Network session recordings can now be started at any time and are not limited to starting before a session is created or joined.

  • Playback of a network session recording can be paused or played at any other speed or advanced to any future time.

  • When a playback of a recording finishes ReplicaNet::GetSessionErrorReason() returns ReplicaNet::kReplicaNet_EEND_RECORDING

  • Extra debugging information is shown by RNVisualDebugger for  DataBlocks, including function parameters and other parameters used to configure the DataBlock to show if/when those values are changed by the user.

  • When RNVisualDebugger makes a successful debug connection to a ReplicaNet session the address of the node is included in the debug file.

Bug fixes

  • DataBlock_Predict_Float would sometimes use an old incorrect value when migrating a ReplicaObject from a session node to a different session node and then back to the original session node.


Release V5.3

Additions and changes  to the API

  • A quick view of functions added:
    ReplicaNet::BeginSessionRecord()
    ReplicaNet::StopSessionRecord()
    ReplicaNet::CallbackSessionRecord()
    ReplicaNet::BeginSessionPlayback()
    ReplicaNet::StopSessionPlayback()
    ReplicaNet::CallbackSessionPlayback()
    ReplicaNet::GetSessionPlayback()
    ReplicaNet::SetPlaybackAllowMasterReplicaObjects()
    ReplicaNet::GetPlaybackAllowMasterReplicaObjects()
    DebugHandler::CallbackConnectionError()
    ReplicaNet::CallBackAllocate()
    ReplicaNet::CallBackDelete()
    Transport::GetTransportClosed()
    XPSession::GetSessionErrorReason()
    ReplicaNet::GetSessionErrorReason()
    Transport::SetEnableLANDiscovery()
    XPSession::SetAllowConnections()
    XPSession::GetAllowConnections()
    ReplicaNet::SetAllowConnections()
    ReplicaNet::GetAllowConnections()

  • Recording and playback of ReplicaNet sessions is now possible using the SessionRecord/SessionPlayback functions. The CallbackSessionRecord/CallbackSessionPlayback functions allow the user to implement their own storage solution for the data. Example4 has been updated to use this functionality.

  • Added virtual void DebugHandler::CallbackConnectionError() to allow visual debugger connection errors to be detected.

  • ReplicaNet::CallBackAllocate() and ReplicaNet::CallBackDelete() allow users to override the ReplicaObject allocation and deletion behaviour from a callback.

  • Example 2 has been updated to show how to add custom data types to networked function parameters.

  • Transport::GetTransportClosed(), XPSession::GetSessionErrorReason() and ReplicaNet::CallbackSessionErrorReason() allows the type of transport and session errors to be determined.

  • LAN Discovery of transports can be enabled or disabled by using Transport::SetEnableLANDiscovery().

  • A master session can now allow or deny other session nodes from joining a session by using SetAllowConnections() when using ReplicaNet or XPSession.

Bug fixes

  • Fixed a bug in the RNROLCompiler when parsing ">" directives such as "object > RealInclude..."

  • Fixed sending data packets with ReplicaNet when SetDataRetention() is not true would result in an assert "Not allowed to leave unknown packets types in the queue".

Other changes

  • The RNVisualDebugger displays packets in the list view sorted by time.

  • The RNVisualDebugger remembers the last settings used for the Connect dialog.

  • The RNVisualDebugger debug output for DataBlocks contains more information about what distance and tolerance values are used when calculating updates.

Compiler support

  • Support for DotNET2002 has been discontinued. Visual Studio 6.0, DotNET2003 and Linux continue to be supported. Support for DotNET2005 will be added when the compiler finishes its beta phase.

 

Release V5.2

Additions and changes  to the API

  • A quick view of functions added:
    XPSock_SentHistogram()
    XPSock_RecvHistogram()
    TransportConfig::PacketBufferBeginCaptureWindow()
    TransportConfig::PacketBufferEndCaptureWindow()
    TransportConfig::SetPacketBufferEnable()
    TransportConfig::GetPacketBufferEnable()
    DataBlock::GetForceSendTimeDelay()
    DataBlock::GetForceSendMaximumUpdates()
    XPSession::GetBandwidthFromSessionID()
    ReplicaNet::GetBandwidthFromSessionID()

  • Detailed logs of the packets sent using the low-level XPSock API can be created by using XPSock_SentHistogram() and XPSock_RecvHistogram(). For example the reliable UDP transport uses the cross platform XPSock layer.

  • The application can now define a specific window for packet buffering to use. TransportConfig::PacketBuffer[Begin/End]CaptureWindow(). Packet buffering will now need to be enabled or disabled by using TransportConfig::SetPacketBufferEnable() in conjunction with the packet buffer API. If TransportConfig::SetPacketBufferTime() was used previously, a new call to SetPacketBufferEnable() will need to be added.

  • DataBlock::GetForceSendTimeDelay() and DataBlock::GetForceSendMaximumUpdates() have been added.

  • Configuration options have been improved  for reliable UDP packets that have been lost or have missing ACKs by increasing the table of resend times. TransportConfig::SetResendTimes() and TransportConfig::GetResendTimes() have been updated.

  • The CXPSession interface, to allow the XPSession class to be used from C, has had the extra functionality of XPSession added.

  • It is now possible to read the configured bandwidth of a session by using the [XPSession/ReplicaNet]::GetBandwidthFromSessionID() functions.

  • The RNPlatform utility library has been made available to all builds so that applications wishing to only use the RNPlatform headers do not need to include the RNXPURL library.

Bug fixes

  • The changes to the reliable UDP transport resend times and internal buffering controls in the event of excessive packet loss have improved the situation where the Demo1 game session will stay connected when emulating 1000ms latency, 300ms jitter and 30% packet loss. The plane pitch and roll values have also had maximum values added so that latency artefacts with these rotation values are much less apparent.

 

Release V5.1

Additions and changes  to the API

  • A quick view of functions added:
    ReplicaNet::SetAutomaticPacketCompression()
    ReplicaNet::GetAutomaticPacketCompression()
    ReplicaNet::GetCompressionStatistics()
    ReplicaNet::GetMergedStatistics()
    ReplicaNet::SetPollLayerBelowForXPSession()
    ReplicaNet::GetPollLayerBelowForXPSession()
    ReplicaNet::GetMasterSessionID()
    ReplicaNet::GetURLFromSessionID()
    XPSession::SetAutomaticPacketCompression()
    XPSession::GetAutomaticPacketCompression()
    XPSession::GetCompressionStatistics()
    XPSession::GetMergedStatistics()
    XPSession::GetMasterSessionID()
    XPSession::GetURLFromSessionID()
    ReplicaNet::SetClientOnly()
    ReplicaNet::GetClientOnly()
    XPSession::SetClientOnly()
    XPSession::GetClientOnly()

  • Automatic packet compression can be configured by using:
    XPSession::SetAutomaticPacketCompression()
    XPSession::GetAutomaticPacketCompression()
    XPSession::GetCompressionStatistics()

  • Added RNPlatform include files to the documentation.

  • Added documentation for FreewareSetRegistrationCode().

  • Packet buffering (coalescing/packet marshalling) has been added to the RNXPURL library with the TransportConfig::SetPacketBufferTime() and related functions. Transport::GetPacketsSentMerged() and Transport::GetPacketsReceivedMerged() have been added to the Transport class. ReplicaNet::GetMergedStatistics() and XPSession::GetMergedStatistics() have also been added to allow packet statistics to be read.

  • Spider nodes or potential master nodes now try to use the configured game channel for their listen connections first. If the transport isn't listening on the game channel when it becomes a master node it will try again to allocate listen connections using the configured game channel.

  • Spelling errors corrected and documentation made clearer for numerous functions.

  • Client only nodes can now be configured using XPSession/ReplicaNet SetClientOnly() and GetClientOnly(). If set then the node will only receive session joiner and leaver notification for nodes that are able to become a master node and use spidering. This helps a MMO type of game enforce a rigid data propagation policy for client nodes connecting to peer-to-peer server nodes.

  • The ability to control the use of threads used for XPSession and XPURL from ReplicaNet has been added with the SetPollLayerBelowForXPSession() function.

  • The session ID for the master session can be read using the [ReplicaNet/XPSession]::GetMasterSessionID() function.

  • A session ID can be resolved to a URL using the [ReplicaNet::XPSession]::GetURLFromSessionID() function.

  • Transport Network bandwidth can be configured by transport type using Transport::SetBandwidthLimit() and Transport::SetMaximum[Output/Input]Bandwidth() functions.

Bug fixes

  • The reliable UDP disconnect packet was not be being matched against valid input packet addresses for a socket created from a connect call. This would cause a premature disconnect if a socket received this packet from any other address that isn't valid.

  • Extraneous reliable UDP disconnect packets were being sent when a connection was already broken by one end of the communication channel.

  • Fixed a bug caused by network emulation being enabled with packet latency, which then was not sending disconnect packets when a transport was disconnected or deleted. This was causing the disconnection to take longer than normal when network emulation was enabled.


Release V5.0

Breaking changes

  • Header files are now fully qualified. For example #include "ReplicaNet.h" has changed to be #include "RNReplicaNet/Inc/ReplicaNet.h". Similar changes are required for all of the other ReplicaNet, XPSession and XPURL header files.

  • Now all ReplicaNet classes are in the RNReplicaNet namespace, previously used empty forward declarations of ReplicaNet classes might produce compiler errors. The fix for this is to make sure your own empty forward declarations of ReplicaNet classes are included in the correct namespace.

  • Examples, tutorials and documentation have been updated to use the new library directories and the new directories for the RNROLCompiler.

Additions and changes  to the API

  • A visual debugger had been added called RNVisualDebugger and is able to display debug information about a network session. The preprocessor define REPLICANET_VISUALDEBUGGER is used to turn on this extra debug information. The standard implementations of DataBlock_NData, DataBlock_PredictFloat and DataBlock_Function have been updated to use this macro. The new DebugHandler class ("XPURL/Inc/DebugHandler.h") can be extended and registered with the XPURL::RegisterDebugHandler() function. Please see the XPURL and the ReplicaNet documentation for more information.

  • Added more speed improvements for distance based propagation.

  • When using DataBlock_PredictFloat delta hints the resulting extrapolation has been improved to be more accurate.

  • DataBlock::SetID() changed to be protected and a friend of ReplicaObject to highlight that this function method should not normally be called by the user.

  • Added ReplicaNet::[Set/Get]DataBlockUpdatePolicy() and ReplicaNet::ProcessDataBlockUpdate() to optionally separate the DataBlock updates from the normal ReplicaNet::Poll() or threaded periodic updates.

  • The pure virtual ReplicaObject::GetRegistryBlock() has been promoted from private to public to allow the s_RO_RegistryBlock for an unknown ReplicaObject class to be queried by the user.
    For example, to get the registered class name of an unknown "ReplicaObject *theObject" pointer:
    theObject->GetRegistryBlock()->GetName()

  • XPSession::SetLatencyRecalculationDelay() and therefore ReplicaNet::SetLatencyRecalculationDelay() have had their algorithm changed to calculate a more accurate latency to the master session. The input parameter meaning has changed so existing code should be checked for this change.

  • XPSession/ReplicaNet::GetLatencyToMasterSession() was reporting latency in the event of the master disconnecting and a session becomming master. The latency is now reported to be 0 seconds if the session becomes the new session master.

  • DataBlock update filters have been extended to use the functions SetUpdateDelayMinimum(),SetForceSendMaximumUpdates() and
    SetForceSendTimeDelay(). Please see the ReplicaNet documentation for a complete description.

  • XPSock_GetHostAddress() (and Transport::ExportURL() which uses this function) changed to avoid using DNS queries if at all possible.

  • XPSock_Send() and XPSocket::Send() changed to return the number of sent bytes.

  • Session spider messages have been made shorter, this improves network bandwidth from the master session.

  • XPSession fault recovery and notification of faults improved.

  • Documentation improved relating to GetTime() and GetLocalTime().

  • Each example ReadMe.txt file states what build configurations are available.

  • Examples 1,4,9 updated to include a section on how to implement a graceful shutdown for ReplicaNet.

  • SysTime.h is now a public include.

ROLCompiler and ROL Language changes

  • RNROLCompiler object::datablockcustom() This keyword defines a custom DataBlock that is used in the object and added in to RNROLCompiler documentation.

Bug fixes

  • RNROLCompiler object::addinclude() was changed so that it uses the whole line minus comments for the include file.

  • Removed a strdup and replaced it with malloc, strcpy. Was causing problems with the memory hooks.

  • Fixed a few bugs with session propagation filter and thus distance based propagation which uses the session propagation.

  • A session without an observer was getting a spike of all available objects when using distance based propagation.

  • Fixed a couple of std::string bugs that cause problems on non-Win32 versions of the STL.

  • Found a memory leak with TransportUDP that would very rarely leave memory allocated when the network stack was shutdown.

  • Fixed a bug if multithreading is enabled the session thread could hang if pre-connection is enabled.

  • Fixed a bug where broadcast packets were using too much bandwidth when spidering was enabled.

  • Bug fixed with reflected ReplicaObjects where some DataBlocks were not getting updated properly.

  • UDPReliableManager now frees all memory allocated in the databases when shutdown.

 

Release V4.1

Additions and changes  to the API

  • Fixed: ReplicaNet::DataReceive() was not setting the session ID properly.

  • Observer ReplicaObjects can now be allocated and used from any session node.

  • Fixed: A rare bug could have happened when deleting the ReplicaNet class and using XPURL::ShutdownNetwork().

  • The examples have not changed from the previous release.

Proposed breaking changes
The next version of ReplicaNet is planned to include one significant breaking change for existing code. This change will involve adding a RNReplicaNet namespace to the components XPURL and XPSession. The helper classes attached to ReplicaNet including, but not limited to, Encryption, PlatformInfo, SysTime, MutexClass and ThreadClass will also be added to the same RNReplicaNet namespace. The ReplicaNet component naming will remain unchanged. The quick fix for existing code could be to include "using namespace RN ReplicaNet;" at the top of every CPP file or, less recommended, inside a header file. The better fix would involve adding the prefix namespace "RNReplicaNet::" to every referenced class used in the ReplicaNet library, except the ReplicaNet class.

The second change to reduce header file name collisions will be to change all of the header files for each component to include the prefix "ReplicaNet/Inc/". The examples will be updated to reflect this change. To quickly fix existing code the header include directory could include both paths to the ReplicaNet include directory so that both the long and short versions resolve to the same location. The better fix could involve adding the necessary prefix to all header files that include parts of ReplicaNet components.

These changes have been driven by the need for developers to avoid potential name collisions for classes and header files.

This version will be called V5.0 to reflect this significant change in version from the previous releases.

Please email version5@replicanet.com if you wish to discuss or find out more about this particular change.

 

Release V4.0

Additions and changes  to the API

This is a large update with some very exciting additions to the API. A special thank you goes to the developers who helped to beta test the stability of this release.

  • ReplicaObject Session propagation, when enabled the ReplicaObject will ignore all joining sessions and the user application is then responsible for supplying the session IDs that this object will propagate to. This mechanism effectively turns off all ReplicaNet object propagation functions for this object, including the distance based propagation. This mechanism can only be enabled or disabled before the object is published to ReplicaNet. This gives full user control over how and where ReplicaObjects are propagated in a session.

  • For XPSession and ReplicaNet the function Disconnect() can be used to force disconnect any session node ID.

  • Before a session node fully connects, a state can be entered in to that allows raw data packets to be exchanged between the joining node and the master session node.

  • The raw packet mechanism has been added to ReplicaNet allowing user created raw data packets to be transferred.

  • Added two new examples that show the new features available in ReplicaNet V4.0

  • Updated Example6 to show how to create a DataBlock derived class that updates an STL container member variable.

  • For the DataBlock NData and NDataAt a new ROL keyword has been added DisableEndianTest(). This disables the endian test for the block of memory.

  • Removed a potential for a thread deadlock to happen inside TransportUDP with regards to THREADSAFELOCKCLASS(gUDPKnownAddresses) and THREADSAFELOCKCLASS(gUDPKnownTransports) being out of order is some cases.

  • Added build rules for Example2 Linux build. Also added extended build rules for the Linux libraries.

  • Known issues with Linux are with the pthread mutex mechanism where Linux pthreads operate differently to SGI IRIX pthread mutex. This Linux problem is expected to be resolved soon.

  • Added an extra class called NetworkVector3 to Example6 that shows how to create a networked representation of a 3D vector.

  • Documented the ReplicaObject extensions AllocateForReplicaNet() and DeleteForReplicaNet().

  • Fixed - Trying to call a network function on an object before it was published caused a null pointer exception.

  • It is possible to alter the disconnection and packet retry parameters using the TransportConfig class.

  • Documentation for load balancing ha been added. 

  • A virtual function when a DataBlock receives packet data has been added, ReplicaObject::DataBlockPacketDataReceived()

ROLCompiler and ROL Language changes

  • The win32 pragma to disable a harmless browse database warning has been wrapped in #ifdef _WIN32/#endif

  • SetOpaqueType() allows "::" to be used so that namespaces can be included as part of the opaque type.

 

Release V3.9

Additions and changes  to the API

  • The function 'realloc' has been added to the memory tracking layer.

  • The documentation for ReplicaObject::GetUniqueID() has been updated.

  • ReplicaNet::AllocateReplicaObject() Has been moved to be a private function. This function should not have been available for public use.

  • Memory tracking now has the option to enable total and peak blocks and sizes, see ReplicaNet_MemoryTotalsEnable()

  • Added Example7 - Which shows just basic XPSession operation.

  • Beta - ReplicaObject::SetPropagateToSessionDistance() , ReplicaObject::SetPropagateToSessionDistanceDefault() and ReplicaObject::GetPropagateToSessionDistance() have been added.
    These allow objects to specify a distance and if that object is outside the distance to a session observer then that session does not get object updates. This is very useful for helping to reduce network bandwidth for MMO games.

  • CurrentThreadSleep_SetHook() has been added in CThreadClass.h to allow a hook to be set for the CurrentThreadSleep() function.

  • Beta - ReplicaObject::SetMessageReflectionID(const int sessionID)
    This function allows an object to state which sessionID should be used for sending messages to other sessions.
    By default the master object is used to send DataBlock and message updates. Useful for MMO games where the network bandwidth for object replication can be assigned to other sessions.

  • ReplicaObject::SetClassID() Has been removed because the idea of setting the classID of an allocated replica object is outside the scope of the user.

  • ROLCompiler created ReplicaObject derived classes used the static class member function Allocate() to allocate a derived class.
    This function has been renamed to AllocateForReplicaNet(). This was to tidy up the naming convention for this derived class
    Also a static delete function has been added called DeleteForReplicaNet(ReplicaObject *)
    Both of these functions can be implemented in a derived class to alter the behaviour of allocate and delete methods for these classes.

  • Callbacks ReplicaNet::JoinerSessionID[Pre/Post]() and ReplicaNet::LeaverSessionID[Pre/Post]() have been added to allow a ReplicaNet derived class to be notified when a sessionID joins or leaves the network session.

Release V3.8

Additions and changes  to the API

  • XPURL, XPSession and ReplicaNet have been changed to use an optional DLL component.
    The libraries that start with "DLL" will force the library DLL to be loaded at run time.
    When using the DLL libraries you must define DOREPNETEXPORTAPI in the preprocessor. This ensures importing of the correct dll functions. It also automatically does #include "MemoryTracking.h"
    The memory tracking header is needed to ensure that the dll calling method accounts for memory properly.
    The automatic inclusion of the header during DLL builds can be turned off by defining REPLICANET_NOAUTOMATICINCLUDEMEMORYTRACKING
    For non-dll builds the memory tracking header is not included.
    Specifically for ReplicaNet and DLL builds, REPLICANET_DLLPREREGISTER() must used called before the ReplicaNet class is allocated. This ties the object classes to the DLL.
    REPLICANET_DLLPREREGISTER() can also be called in a non-DLL build without any adverse side effects.

  • The memory tracking header ("MemoryTracking.h") can be auto included by defining REPLICANET_ALWAYSDOMEMORYTRACKING for non-dll based builds.

  • Some include headers changed. ReplicaNet.h changed to remove as much private data from the public class as possible.
    ReplicaManager.h removed from the public API.
    Added DLLExportAPI.h

  • ROLCompiler: Changed to spot bugs due to braces being mismatched.

  • ROL Language: Command object::Reliable() was not implemented. Since all objects default to using the reliable method this wasn't a bad bug.

  • ROL Language: Added #include "<file>" and #includeclass <class> and updated the ROLCompiler docs.

  • ROL Language: Added object::RealInclude(), see the ROL Compiler documentation for details.

  • ROL Language: Added object::SetOpaqueType(), see the ROL Compiler documentation for details.

 

Release V3.7

Please consult the documentation for complete information covering the added features.

Additions and changes  to the API

  • Automatic load balancing has been added. The default is for load balancing to be switched off to remain compatible with previous version of ReplicaNet.
    Use these added functions in ReplicaNet:
    void SetLoadBalancing(const bool enable = false);
    bool GetLoadBalancing(void);
    void SetMaximumLoad(float load = 0.0f);
    float GetMaximumLoad(int sessionID = kReplicaNetUnknownUniqueID);
    float GetTotalLoad(int sessionID = kReplicaNetUnknownUniqueID);
    void ObjectListBeginIterate(void);
    and in ReplicaObject:
    void SetLoadBalancing(const bool enable = false);
    bool GetLoadBalancing(void);
    void SetLoadScore(const float load = 0.0f);
    float GetLoadScore(void);

  • Optimisations to the reliable UDP layer to include a fast matching database have been successful in reducing CPU load for intensive packet transfers.

  • More ROL Compiler documentation has been added to describe the data blocks.

  • virtual ReplicaObject::UserRegisterDataBlocks() has been added to allow user extensions of the data block mechanism. Using this function, or by extending the ROL language includes, it is possible to create your own data blocks that could use your own complex extrapolated motion routines.

  • Object list iteration in ReplicaNet:
    void ObjectListBeginIterate(void);
    void ObjectListFinishIterate(void);
    ReplicaObject *ObjectListIterate(void);

  • The NData datablock now has SetDefaultData() which can set default data for a member variable and reduce packet size for newly created objects.

  • Bug fixed in ReplicaObject::FindDataBlock() that wasn't finding all data blocks for all member variables.

  • Object iteration functions with automatic object list locking.
    void ReplicaNet::ObjectListBeginIterate(void);
    void ReplicaNet::ObjectListFinishIterate(void);
    ReplicaObject *ReplicaNet::ObjectListIterate(void);

  • A thread locking problem that affected some Windows98 machines when the application shut down has been fixed.

  • ReplicaNet::GetTime() and XPSession::GetTime() are unchanged, however since these time values can vary due to latency changing between each machine, another time function has been added. ReplicaNet::GetLocalTime() and XPSession::GetLocalTime() now report the local time for the machine. The examples have been changed to reflect this.

  • Memory function hooks have been added to MemoryTracking.h.
    void SetReplicaNetAllocateFunction(tReplicaNet_AllocateFunc *allocateFunction);
    void SetReplicaNetClearAndAllocateFunction(tReplicaNet_ClearAndAllocateFunc *allocateFunction);
    void SetReplicaNetFreeFunction(tReplicaNet_FreeFunc *allocateFunction);
    All memory in the libraries is now allocated through functions provided by this API. Memory allocated in the user application is unchanged unless you include "MemoryTracking.h" 

Changes that might throw up minor compatibility problems

  • void ReplicaObject::ValidateObject(void) and virtual void ReplicaObject:: RegisterDataBlock(DataBlock *block) have been moved to be private/protected status since they are for internal use only.

 

Release V3.6

An improved object and session migration API.
A new type of update packet that relieves network congestion.
Two new example applications, including the source code to a multiplayer demo game.
More optimisations to the network packet layer to reduce CPU and memory use.
Increased stability for networks with packet loss.
Network emulation API to allow your application to be tested using different types of lag and packet loss.
Microsoft dotNET library builds included.

Release V3.5

Optimisations to ReplicaNet, XPSession and XPURL have significantly reduced CPU time to around 10% of what was being used before. A breakthrough in caching has enabled this incredible performance jump.
Significant gains have also been made while improving the accuracy of interpolated data types and reducing jitter from extrapolated data.
Encryption has been made stronger without compromising speed.
Extra API functions allow fine tuning of the network session to cater for specific latency calculation intervals.
Initial session discovery and connection has been improved to reduce some of the initial packet traffic.