mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2024-11-25 23:17:28 +00:00
193 lines
5.3 KiB
C++
193 lines
5.3 KiB
C++
|
/// \file
|
||
|
///
|
||
|
/// This file is part of RakNet Copyright 2003 Kevin Jenkins.
|
||
|
///
|
||
|
/// Usage of RakNet is subject to the appropriate license agreement.
|
||
|
/// Creative Commons Licensees are subject to the
|
||
|
/// license found at
|
||
|
/// http://creativecommons.org/licenses/by-nc/2.5/
|
||
|
/// Single application licensees are subject to the license found at
|
||
|
/// http://www.jenkinssoftware.com/SingleApplicationLicense.html
|
||
|
/// Custom license users are subject to the terms therein.
|
||
|
/// GPL license users are subject to the GNU General Public
|
||
|
/// License as published by the Free
|
||
|
/// Software Foundation; either version 2 of the License, or (at your
|
||
|
/// option) any later version.
|
||
|
|
||
|
#include "NetworkIDManager.h"
|
||
|
#include "NetworkIDObject.h"
|
||
|
#include "RakAssert.h"
|
||
|
#include <string.h> // For memset
|
||
|
|
||
|
bool NetworkIDNode::operator==( const NetworkIDNode& right ) const
|
||
|
{
|
||
|
if ( networkID == right.networkID )
|
||
|
return !0;
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
bool NetworkIDNode::operator > ( const NetworkIDNode& right ) const
|
||
|
{
|
||
|
if ( networkID > right.networkID )
|
||
|
return !0;
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
bool NetworkIDNode::operator < ( const NetworkIDNode& right ) const
|
||
|
{
|
||
|
if ( networkID < right.networkID )
|
||
|
return !0;
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
NetworkIDNode::NetworkIDNode()
|
||
|
{
|
||
|
object = 0;
|
||
|
}
|
||
|
|
||
|
NetworkIDNode::NetworkIDNode( NetworkID _networkID, NetworkIDObject *_object )
|
||
|
{
|
||
|
networkID = _networkID;
|
||
|
object = _object;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-------------------------------------------------------------------------------------
|
||
|
NetworkIDObject* NetworkIDManager::GET_BASE_OBJECT_FROM_ID( NetworkID x )
|
||
|
{
|
||
|
if ( x == UNASSIGNED_NETWORK_ID )
|
||
|
return 0;
|
||
|
|
||
|
#if defined(NETWORK_ID_USE_PTR_TABLE) || defined (NETWORK_ID_USE_HASH)
|
||
|
// You can't use this technique in peer to peer mode. Undefine NETWORK_ID_USE_PTR_TABLE in NetworkIDManager.h
|
||
|
assert(NetworkID::peerToPeerMode==false);
|
||
|
return IDArray[x.localSystemAddress];
|
||
|
#else
|
||
|
|
||
|
NetworkIDNode *n = IDTree.GetPointerToNode( NetworkIDNode( ( x ), 0 ) );
|
||
|
|
||
|
if ( n )
|
||
|
{
|
||
|
return n->object;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
#endif
|
||
|
|
||
|
}
|
||
|
//-------------------------------------------------------------------------------------
|
||
|
void* NetworkIDManager::GET_OBJECT_FROM_ID( NetworkID x )
|
||
|
{
|
||
|
#if defined(NETWORK_ID_USE_PTR_TABLE) || defined (NETWORK_ID_USE_HASH)
|
||
|
if (x.localSystemAddress==65535)
|
||
|
return 0;
|
||
|
|
||
|
// You can't use this technique in peer to peer mode. Undefine NETWORK_ID_USE_PTR_TABLE in NetworkIDManager.h
|
||
|
assert(NetworkID::peerToPeerMode==false);
|
||
|
if (IDArray[x.localSystemAddress])
|
||
|
{
|
||
|
if (IDArray[x.localSystemAddress]->GetParent())
|
||
|
{
|
||
|
return IDArray[x.localSystemAddress]->GetParent();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
#ifdef _DEBUG
|
||
|
// If this assert hit then this object requires a call to SetParent and it never got one.
|
||
|
assert(IDArray[x.localSystemAddress]->RequiresSetParent()==false);
|
||
|
#endif
|
||
|
return IDArray[x.localSystemAddress];
|
||
|
}
|
||
|
}
|
||
|
#else
|
||
|
NetworkIDObject *object = (NetworkIDObject *) GET_BASE_OBJECT_FROM_ID( x );
|
||
|
if (object)
|
||
|
{
|
||
|
if (object->GetParent())
|
||
|
{
|
||
|
return object->GetParent();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
#ifdef _DEBUG
|
||
|
// If this assert hit then this object requires a call to SetParent and it never got one.
|
||
|
assert(object->RequiresSetParent()==false);
|
||
|
#endif
|
||
|
return object;
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
//-------------------------------------------------------------------------------------
|
||
|
NetworkIDManager::NetworkIDManager(void)
|
||
|
{
|
||
|
calledSetIsNetworkIDAuthority=false;
|
||
|
sharedNetworkID=0;
|
||
|
|
||
|
#if defined(NETWORK_ID_USE_PTR_TABLE) || defined (NETWORK_ID_USE_HASH)
|
||
|
// Last element is reserved for UNASSIGNED_NETWORK_ID
|
||
|
IDArray = (NetworkIDObject**) rakMalloc(sizeof(NetworkIDObject*) * 65534);
|
||
|
memset(IDArray,0,sizeof(NetworkIDObject*)*65534);
|
||
|
// You can't use this technique in peer to peer mode. Undefine NETWORK_ID_USE_PTR_TABLE in NetworkIDManager.h
|
||
|
assert(NetworkID::peerToPeerMode==false);
|
||
|
#endif
|
||
|
}
|
||
|
//-------------------------------------------------------------------------------------
|
||
|
NetworkIDManager::~NetworkIDManager(void)
|
||
|
{
|
||
|
#if defined(NETWORK_ID_USE_PTR_TABLE) || defined (NETWORK_ID_USE_HASH)
|
||
|
rakFree(IDArray);
|
||
|
#endif
|
||
|
}
|
||
|
//-------------------------------------------------------------------------------------
|
||
|
|
||
|
void NetworkIDManager::SetIsNetworkIDAuthority(bool isAuthority)
|
||
|
{
|
||
|
isNetworkIDAuthority=isAuthority;
|
||
|
calledSetIsNetworkIDAuthority=true;
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------------------
|
||
|
|
||
|
bool NetworkIDManager::IsNetworkIDAuthority(void) const
|
||
|
{
|
||
|
RakAssert(calledSetIsNetworkIDAuthority);
|
||
|
return isNetworkIDAuthority;
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------------------
|
||
|
|
||
|
unsigned short NetworkIDManager::GetSharedNetworkID( void )
|
||
|
{
|
||
|
RakAssert(calledSetIsNetworkIDAuthority);
|
||
|
return sharedNetworkID;
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------------------
|
||
|
|
||
|
void NetworkIDManager::SetSharedNetworkID( unsigned short i )
|
||
|
{
|
||
|
RakAssert(calledSetIsNetworkIDAuthority);
|
||
|
sharedNetworkID = i;
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------------------
|
||
|
void NetworkIDManager::SetExternalSystemAddress(SystemAddress systemAddress)
|
||
|
{
|
||
|
RakAssert(calledSetIsNetworkIDAuthority);
|
||
|
RakAssert(systemAddress!=UNASSIGNED_SYSTEM_ADDRESS);
|
||
|
externalSystemAddress=systemAddress;
|
||
|
}
|
||
|
//-------------------------------------------------------------------------------------
|
||
|
SystemAddress NetworkIDManager::GetExternalSystemAddress(void)
|
||
|
{
|
||
|
RakAssert(calledSetIsNetworkIDAuthority);
|
||
|
return externalSystemAddress;
|
||
|
}
|