本文整理汇总了C++中raknet::BitStream类的典型用法代码示例。如果您正苦于以下问题:C++ BitStream类的具体用法?C++ BitStream怎么用?C++ BitStream使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了BitStream类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: sendPickUp
void sendPickUp(int iPickupID)
{
RakNet::BitStream bsSend;
bsSend.Write(iPickupID);
pRakClient->RPC(&RPC_PickedUpPickup, &bsSend, HIGH_PRIORITY, RELIABLE_ORDERED, 0, FALSE, UNASSIGNED_NETWORK_ID, NULL);
}
示例2: ProcessInput
//.........这里部分代码省略.........
// Open the saved positions file
FILE * pFile = fopen( SharedUtility::GetAbsolutePath( "data\\savedpositions.txt" ).Get(), "a" );
// Did the file open?
if( pFile )
{
// Get the localplayer pointer
CLocalPlayer * pLocalPlayer = pCore->GetPlayerManager()->GetLocalPlayer();
// Save the player position
fprintf( pFile, "%d, %f, %f, %f, %f, %f, %f // %s\n", (bOnFoot ? pLocalPlayer->GetModel () : pLocalPlayer->GetVehicle()->GetModel ()), vecPosition.fX, vecPosition.fY, vecPosition.fZ, vecRotation.fX, vecRotation.fY, vecRotation.fZ, strParams.c_str() );
// Close the saved positions file
fclose( pFile );
//
AddInfoMessage( (bOnFoot ? " -> Onfoot position saved!" : " -> Invehicle position saved!") );
}
else
{
//
AddInfoMessage( CColor( 255, 0, 0, 255 ), "Failed to open savedpositions.txt" );
}
}
}
#ifdef DEBUG
else if( strCommand == "lua" )
{
bHasUsedCmd = true;
if( CLua::Execute( strParams.c_str() ) )
AddInfoMessage( CColor( 50, 177, 94, 255 ), strParams.c_str() );
else
AddInfoMessage( CColor( 178, 40, 86, 255 ), strParams.c_str() );
}
#endif
}
// Have we used a command?
if( bHasUsedCmd )
{
// Add this command to the history
AddToHistory();
// This is an internal command, don't pass it to the server!
return;
}
// Is the network module instance valid?
if( pCore->GetNetworkModule() )
{
// Are we connected?
if( pCore->GetNetworkModule()->IsConnected() )
{
RakNet::BitStream bitStream;
RakNet::RakString strInput;
// Is this a command?
if( bIsCommand )
{
// Write 1
bitStream.Write1();
// Set the input minus the command character
strInput = (GetInputText() + 1);
}
else
{
// Write 0
bitStream.Write0();
// Set the input
strInput = GetInputText();
}
// Write the input
bitStream.Write( strInput );
// Call the client event
CSquirrelArguments pArguments;
pArguments.push( strInput.C_String () );
// Should we send this message?
if ( pCore->GetClientScriptingManager()->GetEvents()->Call( "onClientChat", &pArguments ).GetInteger() == 1 )
{
// Send it to the server
pCore->GetNetworkModule()->Call( RPC_PLAYER_CHAT, &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, true );
// Add this message to the history
AddToHistory();
// Add the chat message for the localplayer if it's not a command
if ( !bIsCommand )
AddChatMessage( pCore->GetPlayerManager()->GetLocalPlayer(), GetInputText() );
}
}
}
}
}
示例3: OnAutoRPCCall
void AutoRPC::OnAutoRPCCall(SystemAddress systemAddress, unsigned char *data, unsigned int lengthInBytes)
{
RakNet::BitStream bs(data,lengthInBytes,false);
bool hasParameterCount=false;
char parameterCount;
char inputStack[ARPC_MAX_STACK_SIZE];
NetworkIDObject *networkIdObject;
NetworkID networkId;
bool hasNetworkId=false;
bool hasFunctionIndex=false;
unsigned int functionIndex;
unsigned int bytesOnStack;
char strIdentifier[512];
int numberOfBitsUsed;
incomingExtraData.Reset();
bs.Read(hasParameterCount);
if (hasParameterCount)
bs.Read(parameterCount);
else
parameterCount=-1;
bs.ReadCompressed(numberOfBitsUsed);
if (numberOfBitsUsed > (int) incomingExtraData.GetNumberOfBitsAllocated())
incomingExtraData.AddBitsAndReallocate(numberOfBitsUsed-(int) incomingExtraData.GetNumberOfBitsAllocated());
bs.ReadBits(incomingExtraData.GetData(), numberOfBitsUsed, false);
incomingExtraData.SetWriteOffset(numberOfBitsUsed);
// const unsigned int outputStackSize = ARPC_MAX_STACK_SIZE+128*4; // Enough padding to round up to 4 for each parameter, max 128 parameters
// char outputStack[outputStackSize];
bs.Read(hasNetworkId);
if (hasNetworkId)
{
bs.Read(networkId);
if (networkIdManager==0 && (networkIdManager=rakPeerInterface->GetNetworkIDManager())==0)
{
// Failed - Tried to call object member, however, networkIDManager system was never registered
SendError(systemAddress, RPC_ERROR_NETWORK_ID_MANAGER_UNAVAILABLE, "");
return;
}
networkIdObject = networkIdManager->GET_OBJECT_FROM_ID<NetworkIDObject*>(networkId);
if (networkIdObject==0)
{
// Failed - Tried to call object member, object does not exist (deleted?)
SendError(systemAddress, RPC_ERROR_OBJECT_DOES_NOT_EXIST, "");
return;
}
}
else
{
networkIdObject=0;
}
bs.AlignReadToByteBoundary();
bs.Read(hasFunctionIndex);
if (hasFunctionIndex)
bs.ReadCompressed(functionIndex);
else
stringCompressor->DecodeString(strIdentifier,512,&bs,0);
bs.ReadCompressed(bytesOnStack);
bs.ReadAlignedBytes((unsigned char *) inputStack,bytesOnStack);
if (hasFunctionIndex)
{
if (functionIndex>localFunctions.Size())
{
// Failed - other system specified a totally invalid index
// Possible causes: Bugs, attempts to crash the system, requested function not registered
SendError(systemAddress, RPC_ERROR_FUNCTION_INDEX_OUT_OF_RANGE, "");
return;
}
// it was actually a mistake to implement ID_AUTO_RPC_UNKNOWN_REMOTE_INDEX. This hides the more relevant return code RPC_ERROR_FUNCTION_NO_LONGER_REGISTERED and more importantly can result in the calls being out of order since it takes extra communication steps.
/*
if (localFunctions[functionIndex].functionPtr==0)
{
// Failed - Function index lookup failure. Try passing back what was sent to us, and requesting the string
RakNet::BitStream out;
if (incomingTimeStamp!=0)
{
out.Write((MessageID)ID_TIMESTAMP);
out.Write(incomingTimeStamp);
}
out.Write((MessageID)ID_AUTO_RPC_UNKNOWN_REMOTE_INDEX);
if (parameterCount>=0)
{
out.Write(true);
out.Write(parameterCount);
}
else
{
out.Write(false);
}
out.WriteCompressed(functionIndex);
out.WriteCompressed(numberOfBitsUsed);
out.Write(&incomingExtraData);
out.Write(hasNetworkId);
if (hasNetworkId)
out.Write(networkId);
out.WriteCompressed(bytesOnStack);
out.WriteAlignedBytes((const unsigned char*) inputStack, bytesOnStack);
SendUnified(&out, HIGH_PRIORITY, RELIABLE_ORDERED, 0, systemAddress, false);
//.........这里部分代码省略.........
示例4: InitialData
void InitialData(RakNet::BitStream * pBitStream, RakNet::Packet * pPacket)
{
// Get the playerid
EntityId playerId = (EntityId) pPacket->guid.systemIndex;
// Read the player version
DWORD dwVersion;
pBitStream->Read(dwVersion);
// Read the player name
RakNet::RakString _strName;
pBitStream->Read(_strName);
CString strName(_strName.C_String());
// Read the player serial
RakNet::RakString _strSerial;
pBitStream->Read(_strSerial);
CString strSerial(_strSerial.C_String());
// Is the network version invalid?
if (dwVersion != (DWORD)/*NETWORK_VERSION*/0x0)
{
// TODO
}
// Is the nickname already in use?
// TODO: check is nick in use
// Is the player banned?
// TODO: check is banned
// Add the player to the manager
// TODO: add to player manager
CPlayerEntity * pPlayer = new CPlayerEntity();
pPlayer->SetName(strName);
// Do we need the id; maybe internal for easier sync but definetly not public to the scripting engine
pPlayer->SetId(CServer::GetInstance()->GetPlayerManager()->Add(pPlayer));
playerId = pPlayer->GetId();
srand(time(NULL));
pPlayer->SetColor(CColor(rand() % 256, rand() % 256, rand() % 256).dwHexColor); //generate random color
CLogFile::Printf("[join] %s (%i) has connected to the server. (%s)", strName.Get(), playerId, strSerial.Get());
CScriptArguments args;
CScriptPlayer * pScriptPlayer = new CScriptPlayer();
pScriptPlayer->SetEntity(pPlayer);
pPlayer->SetScriptPlayer(pScriptPlayer);
args.push(pScriptPlayer);
CEvents::GetInstance()->Call("playerJoin", &args, CEventHandler::eEventType::NATIVE_EVENT, 0);
// Construct a new bitstream
RakNet::BitStream bitStream;
// Write the player id
bitStream.Write(playerId);
// Write the player colour
bitStream.Write(pPlayer->GetColor());
// Write the server name
bitStream.Write(RakNet::RakString("IV:Network DEV Server"));
// Write the max player count
bitStream.Write(CVAR_GET_INTEGER("maxplayers"));
// Write the port
bitStream.Write(CVAR_GET_INTEGER("port"));
// Send it back to the player
CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_INITIAL_DATA), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, playerId, false);
for (EntityId i = 0; i < CServer::GetInstance()->GetPlayerManager()->GetMax(); ++i)
{
if (CServer::GetInstance()->GetPlayerManager()->DoesExists(i) && i != playerId)
{
bitStream.Reset();
bitStream.Write(i);
bitStream.Write(CServer::GetInstance()->GetPlayerManager()->GetAt(i)->GetName().Get());
bitStream.Write(CServer::GetInstance()->GetPlayerManager()->GetAt(i)->GetColor());
CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_NEW_PLAYER), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, playerId, false);
}
}
for (EntityId i = 0; i < CServer::GetInstance()->GetPlayerManager()->GetMax(); ++i)
{
if (CServer::GetInstance()->GetPlayerManager()->DoesExists(i) && i != playerId)
{
bitStream.Reset();
bitStream.Write(playerId);
bitStream.Write(pPlayer->GetName().Get());
bitStream.Write(pPlayer->GetColor());
CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_NEW_PLAYER), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, i, false);
}
}
for (EntityId i = 0; i < CServer::GetInstance()->GetVehicleManager()->GetMax(); ++i)
{
//.........这里部分代码省略.........
示例5: Update
void NatTypeDetectionServer::Update(void)
{
int i=0;
RakNet::TimeMS time = RakNet::GetTimeMS();
RakNet::BitStream bs;
SystemAddress boundAddress;
RNS2RecvStruct *recvStruct;
bufferedPacketsMutex.Lock();
if (bufferedPackets.Size()>0)
recvStruct=bufferedPackets.Pop();
else
recvStruct=0;
bufferedPacketsMutex.Unlock();
while (recvStruct)
{
SystemAddress senderAddr = recvStruct->systemAddress;
char *data = recvStruct->data;
if (data[0]==NAT_TYPE_PORT_RESTRICTED && recvStruct->socket==s3p4)
{
RakNet::BitStream bsIn((unsigned char*) data,recvStruct->bytesRead,false);
RakNetGUID senderGuid;
bsIn.IgnoreBytes(sizeof(MessageID));
bool readSuccess = bsIn.Read(senderGuid);
RakAssert(readSuccess);
if (readSuccess)
{
unsigned int i = GetDetectionAttemptIndex(senderGuid);
if (i!=(unsigned int)-1)
{
bs.Reset();
bs.Write((unsigned char) ID_NAT_TYPE_DETECTION_RESULT);
// If different, then symmetric
if (senderAddr!=natDetectionAttempts[i].systemAddress)
{
#ifdef NTDS_VERBOSE
printf("Determined client is symmetric\n");
#endif
bs.Write((unsigned char) NAT_TYPE_SYMMETRIC);
}
else
{
// else port restricted
#ifdef NTDS_VERBOSE
printf("Determined client is port restricted\n");
#endif
bs.Write((unsigned char) NAT_TYPE_PORT_RESTRICTED);
}
rakPeerInterface->Send(&bs,HIGH_PRIORITY,RELIABLE,0,natDetectionAttempts[i].systemAddress,false);
// Done
natDetectionAttempts.RemoveAtIndexFast(i);
}
else
{
// RakAssert("i==0 in Update when looking up GUID in NatTypeDetectionServer.cpp. Either a bug or a late resend" && 0);
}
}
else
{
// RakAssert("Didn't read GUID in Update in NatTypeDetectionServer.cpp. Message format error" && 0);
}
}
DeallocRNS2RecvStruct(recvStruct, _FILE_AND_LINE_);
bufferedPacketsMutex.Lock();
if (bufferedPackets.Size()>0)
recvStruct=bufferedPackets.Pop();
else
recvStruct=0;
bufferedPacketsMutex.Unlock();
}
/*
// Only socket that receives messages is s3p4, to see if the external address is different than that of the connection to rakPeerInterface
char data[ MAXIMUM_MTU_SIZE ];
int len;
SystemAddress senderAddr;
len=NatTypeRecvFrom(data, s3p4, senderAddr);
// Client is asking us if this is port restricted. Only client requests of this type come in on s3p4
while (len>0 && data[0]==NAT_TYPE_PORT_RESTRICTED)
{
RakNet::BitStream bsIn((unsigned char*) data,len,false);
RakNetGUID senderGuid;
bsIn.IgnoreBytes(sizeof(MessageID));
bool readSuccess = bsIn.Read(senderGuid);
RakAssert(readSuccess);
if (readSuccess)
{
unsigned int i = GetDetectionAttemptIndex(senderGuid);
if (i!=(unsigned int)-1)
{
bs.Reset();
bs.Write((unsigned char) ID_NAT_TYPE_DETECTION_RESULT);
// If different, then symmetric
if (senderAddr!=natDetectionAttempts[i].systemAddress)
//.........这里部分代码省略.........
示例6: strlen
void RPC4::CallLoopback( const char* uniqueID, RakNet::BitStream * bitStream )
{
Packet *p=0;
DataStructures::HashIndex skhi = registeredNonblockingFunctions.GetIndexOf(uniqueID);
if (skhi.IsInvalid()==true)
{
if (rakPeerInterface)
p=AllocatePacketUnified(sizeof(MessageID)+sizeof(unsigned char)+(unsigned int) strlen(uniqueID)+1);
#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1
else
p=tcpInterface->AllocatePacket(sizeof(MessageID)+sizeof(unsigned char)+(unsigned int) strlen(uniqueID)+1);
#endif
if (rakPeerInterface)
p->guid=rakPeerInterface->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS);
#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1
else
p->guid=UNASSIGNED_RAKNET_GUID;
#endif
p->systemAddress=UNASSIGNED_SYSTEM_ADDRESS;
p->systemAddress.systemIndex=(SystemIndex)-1;
p->data[0]=ID_RPC_REMOTE_ERROR;
p->data[1]=RPC_ERROR_FUNCTION_NOT_REGISTERED;
strcpy((char*) p->data+2, uniqueID);
PushBackPacketUnified(p,false);
return;
}
RakNet::BitStream out;
out.Write((MessageID) ID_RPC_PLUGIN);
out.Write((MessageID) ID_RPC4_CALL);
out.WriteCompressed(uniqueID);
out.Write(false); // nonblocking
if (bitStream)
{
bitStream->ResetReadPointer();
out.AlignWriteToByteBoundary();
out.Write(bitStream);
}
if (rakPeerInterface)
p=AllocatePacketUnified(out.GetNumberOfBytesUsed());
#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1
else
p=tcpInterface->AllocatePacket(out.GetNumberOfBytesUsed());
#endif
if (rakPeerInterface)
p->guid=rakPeerInterface->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS);
#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1
else
p->guid=UNASSIGNED_RAKNET_GUID;
#endif
p->systemAddress=UNASSIGNED_SYSTEM_ADDRESS;
p->systemAddress.systemIndex=(SystemIndex)-1;
memcpy(p->data,out.GetData(),out.GetNumberOfBytesUsed());
PushBackPacketUnified(p,false);
return;
}
示例7: bsIn
PluginReceiveResult RPC4::OnReceive(Packet *packet)
{
if (packet->data[0]==ID_RPC_PLUGIN)
{
RakNet::BitStream bsIn(packet->data,packet->length,false);
bsIn.IgnoreBytes(2);
if (packet->data[1]==ID_RPC4_CALL)
{
RakNet::RakString functionName;
bsIn.ReadCompressed(functionName);
bool isBlocking=false;
bsIn.Read(isBlocking);
if (isBlocking==false)
{
DataStructures::HashIndex skhi = registeredNonblockingFunctions.GetIndexOf(functionName.C_String());
if (skhi.IsInvalid())
{
RakNet::BitStream bsOut;
bsOut.Write((unsigned char) ID_RPC_REMOTE_ERROR);
bsOut.Write((unsigned char) RPC_ERROR_FUNCTION_NOT_REGISTERED);
bsOut.Write(functionName.C_String(),(unsigned int) functionName.GetLength()+1);
SendUnified(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,packet->systemAddress,false);
return RR_STOP_PROCESSING_AND_DEALLOCATE;
}
void ( *fp ) ( RakNet::BitStream *, Packet * );
fp = registeredNonblockingFunctions.ItemAtIndex(skhi);
bsIn.AlignReadToByteBoundary();
fp(&bsIn,packet);
}
else
{
DataStructures::HashIndex skhi = registeredBlockingFunctions.GetIndexOf(functionName.C_String());
if (skhi.IsInvalid())
{
RakNet::BitStream bsOut;
bsOut.Write((unsigned char) ID_RPC_REMOTE_ERROR);
bsOut.Write((unsigned char) RPC_ERROR_FUNCTION_NOT_REGISTERED);
bsOut.Write(functionName.C_String(),(unsigned int) functionName.GetLength()+1);
SendUnified(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,packet->systemAddress,false);
return RR_STOP_PROCESSING_AND_DEALLOCATE;
}
void ( *fp ) ( RakNet::BitStream *, RakNet::BitStream *, Packet * );
fp = registeredBlockingFunctions.ItemAtIndex(skhi);
RakNet::BitStream returnData;
bsIn.AlignReadToByteBoundary();
fp(&bsIn, &returnData, packet);
RakNet::BitStream out;
out.Write((MessageID) ID_RPC_PLUGIN);
out.Write((MessageID) ID_RPC4_RETURN);
returnData.ResetReadPointer();
out.AlignWriteToByteBoundary();
out.Write(returnData);
SendUnified(&out,IMMEDIATE_PRIORITY,RELIABLE_ORDERED,0,packet->systemAddress,false);
}
}
else if (packet->data[1]==ID_RPC4_SIGNAL)
{
RakNet::RakString sharedIdentifier;
bsIn.ReadCompressed(sharedIdentifier);
DataStructures::HashIndex functionIndex;
functionIndex = localSlots.GetIndexOf(sharedIdentifier);
RakNet::BitStream serializedParameters;
bsIn.AlignReadToByteBoundary();
bsIn.Read(&serializedParameters);
InvokeSignal(functionIndex, &serializedParameters, packet);
}
else
{
RakAssert(packet->data[1]==ID_RPC4_RETURN);
blockingReturnValue.Reset();
blockingReturnValue.Write(bsIn);
gotBlockingReturnValue=true;
}
return RR_STOP_PROCESSING_AND_DEALLOCATE;
}
bool objectExists;
unsigned int index, index2;
index = localCallbacks.GetIndexFromKey(packet->data[0],&objectExists);
if (objectExists)
{
LocalCallback *lc;
lc = localCallbacks[index];
for (index2=0; index2 < lc->functions.Size(); index2++)
{
RakNet::BitStream bsIn(packet->data, packet->length, false);
DataStructures::HashIndex skhi = registeredNonblockingFunctions.GetIndexOf(lc->functions[index2].C_String());
if (skhi.IsInvalid()==false)
{
void ( *fp ) ( RakNet::BitStream *, Packet * );
fp = registeredNonblockingFunctions.ItemAtIndex(skhi);
bsIn.AlignReadToByteBoundary();
fp(&bsIn,packet);
}
//.........这里部分代码省略.........
示例8: bsIn
PluginReceiveResult SQLite3ServerPlugin::OnReceive(Packet *packet)
{
switch (packet->data[0])
{
case ID_SQLite3_EXEC:
{
unsigned int queryId;
RakNet::RakString dbIdentifier;
RakNet::RakString inputStatement;
RakNet::BitStream bsIn(packet->data, packet->length, false);
bsIn.IgnoreBytes(sizeof(MessageID));
bsIn.Read(queryId);
bsIn.Read(dbIdentifier);
bsIn.Read(inputStatement);
bool isRequest;
bsIn.Read(isRequest);
if (isRequest)
{
// Server code
unsigned int idx = dbHandles.GetIndexOf(dbIdentifier);
if (idx==-1)
{
RakNet::BitStream bsOut;
bsOut.Write((MessageID)ID_SQLite3_UNKNOWN_DB);
bsOut.Write(queryId);
bsOut.Write(dbIdentifier);
bsOut.Write(inputStatement);
SendUnified(&bsOut, MEDIUM_PRIORITY,RELIABLE_ORDERED,0,packet->systemAddress,false);
}
else
{
#ifdef SQLite3_STATEMENT_EXECUTE_THREADED
// Push to the thread
SQLExecThreadInput input;
input.data=(char*) rakMalloc_Ex(packet->length, _FILE_AND_LINE_);
memcpy(input.data,packet->data,packet->length);
input.dbHandle=dbHandles[idx].dbHandle;
input.length=packet->length;
input.sender=packet->systemAddress;
sqlThreadPool.AddInput(ExecStatementThread, input);
#else
char *errorMsg;
RakNet::RakString errorMsgStr;
SQLite3Table outputTable;
sqlite3_exec(dbHandles[idx].dbHandle, inputStatement.C_String(), PerRowCallback, &outputTable, &errorMsg);
if (errorMsg)
{
errorMsgStr=errorMsg;
sqlite3_free(errorMsg);
}
RakNet::BitStream bsOut;
bsOut.Write((MessageID)ID_SQLite3_EXEC);
bsOut.Write(queryId);
bsOut.Write(dbIdentifier);
bsOut.Write(inputStatement);
bsOut.Write(false);
bsOut.Write(errorMsgStr);
outputTable.Serialize(&bsOut);
SendUnified(&bsOut, MEDIUM_PRIORITY,RELIABLE_ORDERED,0,packet->systemAddress,false);
#endif
}
}
return RR_STOP_PROCESSING_AND_DEALLOCATE;
}
break;
}
return RR_CONTINUE_PROCESSING;
}
示例9:
// native SendLastSyncData(playerid, toplayerid, animation = 0)
static cell AMX_NATIVE_CALL Natives::SendLastSyncData( AMX* amx, cell* params )
{
if (!serverVersion)
return 0;
CHECK_PARAMS(3, "SendLastSyncData");
int playerid = (int)params[1];
int toplayerid = (int)params[2];
int animation = (int)params[3];
BYTE ps = ID_PLAYER_SYNC;
CSyncData* d = &lastSyncData[playerid];
RakNet::BitStream bs;
bs.Write((BYTE)ID_PLAYER_SYNC);
bs.Write((WORD)playerid);
if (d->wUDAnalog) {
bs.Write(true);
bs.Write((WORD)d->wUDAnalog);
} else {
bs.Write(false);
}
if (d->wLRAnalog) {
bs.Write(true);
bs.Write((WORD)d->wLRAnalog);
} else {
bs.Write(false);
}
bs.Write((WORD)d->wKeys);
bs.Write(d->vecPosition.fX);
bs.Write(d->vecPosition.fY);
bs.Write(d->vecPosition.fZ);
if (fakeQuat[playerid] != NULL) {
bs.Write((bool)(fakeQuat[playerid]->w<0.0f));
bs.Write((bool)(fakeQuat[playerid]->x<0.0f));
bs.Write((bool)(fakeQuat[playerid]->y<0.0f));
bs.Write((bool)(fakeQuat[playerid]->z<0.0f));
bs.Write((unsigned short)(fabs(fakeQuat[playerid]->x)*65535.0));
bs.Write((unsigned short)(fabs(fakeQuat[playerid]->y)*65535.0));
bs.Write((unsigned short)(fabs(fakeQuat[playerid]->z)*65535.0));
} else {
bs.Write((bool)(d->fQuaternionAngle<0.0f));
bs.Write((bool)(d->vecQuaternion.fX<0.0f));
bs.Write((bool)(d->vecQuaternion.fY<0.0f));
bs.Write((bool)(d->vecQuaternion.fZ<0.0f));
bs.Write((unsigned short)(fabs(d->vecQuaternion.fX)*65535.0));
bs.Write((unsigned short)(fabs(d->vecQuaternion.fY)*65535.0));
bs.Write((unsigned short)(fabs(d->vecQuaternion.fZ)*65535.0));
}
BYTE health, armour;
if (fakeHealth[playerid] != 255) {
health = fakeHealth[playerid];
} else {
health = d->byteHealth;
}
if (fakeArmour[playerid] != 255) {
armour = fakeArmour[playerid];
} else {
armour = d->byteArmour;
}
if (health >= 100) {
health = 0xF;
} else {
health /= 7;
}
if (armour >= 100) {
armour = 0xF;
} else {
armour /= 7;
}
bs.Write((BYTE)((health << 4) | (armour)));
bs.Write(d->byteWeapon);
bs.Write(d->byteSpecialAction);
// Make them appear standing still if paused
if (GetTickCount() - lastUpdateTick[playerid] > 2000) {
bs.WriteVector(0.0f, 0.0f, 0.0f);
} else {
bs.WriteVector(d->vecVelocity.fX, d->vecVelocity.fY, d->vecVelocity.fZ);
}
if (d->wSurfingInfo) {
bs.Write(true);
bs.Write(d->wSurfingInfo);
bs.Write(d->vecSurfing.fX);
bs.Write(d->vecSurfing.fY);
//.........这里部分代码省略.........
示例10: bsIn
PluginReceiveResult FullyConnectedMesh2::OnVerifiedJoinStart(Packet *packet)
{
RakNet::BitStream bsIn(packet->data,packet->length,false);
bsIn.IgnoreBytes(sizeof(MessageID));
unsigned short listSize;
bsIn.Read(listSize);
unsigned int curIndex = GetJoinsInProgressIndex(packet->guid);
if (curIndex!=(unsigned int) -1)
{
// Got update to existing list
VerifiedJoinInProgress *vjip = joinsInProgress[curIndex];
// if (vjip->sentResults==false)
// {
// // Got ID_FCM2_VERIFIED_JOIN_START twice before sending ID_FCM2_VERIFIED_JOIN_CAPABLE
// RakAssert(vjip->sentResults!=false);
// return RR_STOP_PROCESSING_AND_DEALLOCATE;
// }
for (unsigned int i=0; i < vjip->members.Size(); i++)
{
vjip->members[i].workingFlag=false;
}
// Server has updated list of participants
for (unsigned short i=0; i < listSize; i++)
{
VerifiedJoinInProgressMember vjipm;
ReadVerifiedJoinInProgressMember(&bsIn, &vjipm);
unsigned int j;
if (vjipm.guid!=UNASSIGNED_RAKNET_GUID)
j = GetVerifiedJoinInProgressMemberIndex(vjipm.guid, vjip);
else
j = GetVerifiedJoinInProgressMemberIndex(vjipm.systemAddress, vjip);
if (j==(unsigned int)-1)
{
// New
vjipm.workingFlag=true;
vjipm.joinInProgressState=JIPS_PROCESSING;
vjip->members.Push(vjipm, _FILE_AND_LINE_);
// Allow resend of ID_FCM2_VERIFIED_JOIN_CAPABLE
//vjip->sentResults=false;
}
else
{
vjip->members[j].workingFlag=true;
}
}
for (unsigned int i=0; i < vjip->members.Size(); i++)
{
if (vjip->members[i].workingFlag==false)
vjip->members[i].joinInProgressState=JIPS_UNNECESSARY;
}
if (ProcessVerifiedJoinInProgressIfCompleted(vjip))
{
// Completed
return RR_STOP_PROCESSING_AND_DEALLOCATE;
}
// Else tell user about new list
return RR_CONTINUE_PROCESSING;
}
VerifiedJoinInProgress *vjip = RakNet::OP_NEW<VerifiedJoinInProgress>(_FILE_AND_LINE_);
vjip->requester=packet->guid;
if (listSize==0)
{
//vjip->sentResults=true;
// Send back result
RakNet::BitStream bsOut;
bsOut.Write((MessageID)ID_FCM2_VERIFIED_JOIN_CAPABLE);
bsOut.WriteCasted<unsigned short>(0);
SendUnified(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, packet->guid, false);
//vjip->sentResults=true;
joinsInProgress.Push(vjip, _FILE_AND_LINE_);
return RR_STOP_PROCESSING_AND_DEALLOCATE;
}
//vjip->sentResults=false;
for (unsigned short i=0; i < listSize; i++)
{
VerifiedJoinInProgressMember vjipm;
ReadVerifiedJoinInProgressMember(&bsIn, &vjipm);
vjip->members.Push(vjipm, _FILE_AND_LINE_);
}
joinsInProgress.Push(vjip, _FILE_AND_LINE_);
return RR_CONTINUE_PROCESSING;
}
示例11: ExecStatementThread
SQLite3ServerPlugin::SQLExecThreadOutput ExecStatementThread(SQLite3ServerPlugin::SQLExecThreadInput threadInput, bool *returnOutput, void* perThreadData)
{
unsigned int queryId;
RakNet::RakString dbIdentifier;
RakNet::RakString inputStatement;
RakNet::BitStream bsIn((unsigned char*) threadInput.data, threadInput.length, false);
bsIn.IgnoreBytes(sizeof(MessageID));
bsIn.Read(queryId);
bsIn.Read(dbIdentifier);
bsIn.Read(inputStatement);
// bool isRequest;
// bsIn.Read(isRequest);
bsIn.IgnoreBits(1);
char *errorMsg;
RakNet::RakString errorMsgStr;
SQLite3Table outputTable;
sqlite3_exec(threadInput.dbHandle, inputStatement.C_String(), PerRowCallback, &outputTable, &errorMsg);
if (errorMsg)
{
errorMsgStr=errorMsg;
sqlite3_free(errorMsg);
}
RakNet::BitStream bsOut;
bsOut.Write((MessageID)ID_SQLite3_EXEC);
bsOut.Write(queryId);
bsOut.Write(dbIdentifier);
bsOut.Write(inputStatement);
bsOut.Write(false);
bsOut.Write(errorMsgStr);
outputTable.Serialize(&bsOut);
// Free input data
rakFree_Ex(threadInput.data,_FILE_AND_LINE_);
// Copy to output data
SQLite3ServerPlugin::SQLExecThreadOutput threadOutput;
threadOutput.data=(char*) rakMalloc_Ex(bsOut.GetNumberOfBytesUsed(),_FILE_AND_LINE_);
memcpy(threadOutput.data,bsOut.GetData(),bsOut.GetNumberOfBytesUsed());
threadOutput.length=bsOut.GetNumberOfBytesUsed();
threadOutput.sender=threadInput.sender;
// SendUnified(&bsOut, MEDIUM_PRIORITY,RELIABLE_ORDERED,0,packet->systemAddress,false);
*returnOutput=true;
return threadOutput;
}
示例12: AllocatePacketUnified
void FullyConnectedMesh2::RespondOnVerifiedJoinCapable(Packet *packet, bool accept, BitStream *additionalData)
{
VerifiedJoinInProgress vjip;
DecomposeJoinCapable(packet, &vjip);
DataStructures::List<RakNetGUID> participatingMembersOnClientSucceeded;
DataStructures::List<RakNetGUID> participatingMembersOnClientFailed;
DataStructures::List<RakNetGUID> participatingMembersNotOnClient;
DataStructures::List<RakNetGUID> clientMembersNotParticipatingSucceeded;
DataStructures::List<RakNetGUID> clientMembersNotParticipatingFailed;
CategorizeVJIP(&vjip,
participatingMembersOnClientSucceeded,
participatingMembersOnClientFailed,
participatingMembersNotOnClient,
clientMembersNotParticipatingSucceeded,
clientMembersNotParticipatingFailed);
if (participatingMembersNotOnClient.Size()>0)
{
BitStream bsOut;
bsOut.Write((MessageID) ID_FCM2_VERIFIED_JOIN_START);
bsOut.WriteCasted<unsigned short>(participatingMembersNotOnClient.Size());
unsigned int i;
for (i=0; i < participatingMembersNotOnClient.Size(); i++)
{
bsOut.Write(participatingMembersNotOnClient[i]);
bsOut.Write(rakPeerInterface->GetSystemAddressFromGuid(participatingMembersNotOnClient[i]));
}
SendUnified(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, packet->guid, false);
return;
}
RakAssert(participatingMembersOnClientFailed.Size()==0);
RakAssert(participatingMembersNotOnClient.Size()==0);
RakNet::BitStream bsOut;
if (accept)
{
bsOut.Write((MessageID)ID_FCM2_VERIFIED_JOIN_ACCEPTED);
bsOut.Write(packet->guid);
// Tell client to disconnect from clientMembersNotParticipatingSucceeded
bsOut.WriteCasted<unsigned short>(clientMembersNotParticipatingSucceeded.Size());
for (unsigned int i=0; i < clientMembersNotParticipatingSucceeded.Size(); i++)
bsOut.Write(clientMembersNotParticipatingSucceeded[i]);
// Tell client to call AddParticipant() for participatingMembersOnClientSucceeded
bsOut.WriteCasted<unsigned short>(participatingMembersOnClientSucceeded.Size());
for (unsigned int i=0; i < participatingMembersOnClientSucceeded.Size(); i++)
bsOut.Write(participatingMembersOnClientSucceeded[i]);
if (additionalData)
bsOut.Write(additionalData);
for (unsigned int i=0; i < fcm2ParticipantList.Size(); i++)
SendUnified(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, fcm2ParticipantList[i].rakNetGuid, false);
// Process immediately
// This is so if another ID_FCM2_VERIFIED_JOIN_CAPABLE is buffered, it responds with ID_FCM2_VERIFIED_JOIN_START
AddParticipant(packet->guid);
Packet *p = AllocatePacketUnified(bsOut.GetNumberOfBytesUsed());
memcpy(p->data, bsOut.GetData(), bsOut.GetNumberOfBytesUsed());
p->systemAddress=packet->systemAddress;
p->systemAddress.systemIndex=(SystemIndex)-1;
p->guid=packet->guid;
p->wasGeneratedLocally=true;
rakPeerInterface->PushBackPacket(p, true);
}
else
{
// Tell client rejected, otherwise process the same as ID_FCM2_VERIFIED_JOIN_FAILED
bsOut.Write((MessageID)ID_FCM2_VERIFIED_JOIN_REJECTED);
bsOut.Write(additionalData);
}
SendUnified(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, packet->guid, false);
}
示例13: RequestClass
void RequestClass(PCHAR Data, int iBitLength, PlayerID sender)
{
RakNet::BitStream bsData(Data,iBitLength/8,FALSE);
BYTE byteRequestedClass;
BYTE byteRequestOutcome = 0;
BYTE bytePlayerID = pRak->GetIndexFromPlayerID(sender);
bsData.Read(byteRequestedClass);
if(!pNetGame->GetPlayerPool()->GetSlotState(bytePlayerID)) return;
if(pNetGame->GetGameLogic()->HandleSpawnClassRequest(bytePlayerID,byteRequestedClass))
{
byteRequestOutcome = 1;
}
RakNet::BitStream bsSpawnRequestReply;
CPlayer *pPlayer=pNetGame->GetPlayerPool()->GetAt(bytePlayerID);
PLAYER_SPAWN_INFO *SpawnInfo = pPlayer->GetSpawnInfo();
bsSpawnRequestReply.Write(byteRequestOutcome);
bsSpawnRequestReply.Write(SpawnInfo->byteTeam);
bsSpawnRequestReply.Write(SpawnInfo->byteSkin);
bsSpawnRequestReply.Write((float)SpawnInfo->vecPos.X);
bsSpawnRequestReply.Write((float)SpawnInfo->vecPos.Y);
bsSpawnRequestReply.Write((float)SpawnInfo->vecPos.Z);
bsSpawnRequestReply.Write((float)SpawnInfo->fRotation);
bsSpawnRequestReply.Write(SpawnInfo->iSpawnWeapons[0]);
bsSpawnRequestReply.Write(SpawnInfo->iSpawnWeaponsAmmo[0]);
bsSpawnRequestReply.Write(SpawnInfo->iSpawnWeapons[1]);
bsSpawnRequestReply.Write(SpawnInfo->iSpawnWeaponsAmmo[1]);
bsSpawnRequestReply.Write(SpawnInfo->iSpawnWeapons[2]);
bsSpawnRequestReply.Write(SpawnInfo->iSpawnWeaponsAmmo[2]);
pRak->RPC("RequestClass",&bsSpawnRequestReply,HIGH_PRIORITY,RELIABLE,0,sender,FALSE,FALSE);
}
示例14: selectTextDraw
void selectTextDraw(int iTextDrawID)
{
RakNet::BitStream bsSend;
bsSend.Write(iTextDrawID);
pRakClient->RPC(&RPC_ClickTextDraw, &bsSend, HIGH_PRIORITY, RELIABLE_ORDERED, 0, FALSE, UNASSIGNED_NETWORK_ID, NULL);
}
示例15: OnClosedConnection
void NatPunchthroughServer::OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason )
{
(void) lostConnectionReason;
(void) systemAddress;
unsigned int i=0;
bool objectExists;
i = users.GetIndexFromKey(rakNetGUID, &objectExists);
if (objectExists)
{
RakNet::BitStream outgoingBs;
DataStructures::List<User *> freedUpInProgressUsers;
User *user = users[i];
User *otherUser;
unsigned int connectionAttemptIndex;
ConnectionAttempt *connectionAttempt;
for (connectionAttemptIndex=0; connectionAttemptIndex < user->connectionAttempts.Size(); connectionAttemptIndex++)
{
connectionAttempt=user->connectionAttempts[connectionAttemptIndex];
outgoingBs.Reset();
if (connectionAttempt->recipient==user)
{
otherUser=connectionAttempt->sender;
}
else
{
otherUser=connectionAttempt->recipient;
}
// 05/28/09 Previously only told sender about ID_NAT_CONNECTION_TO_TARGET_LOST
// However, recipient may be expecting it due to external code
// In that case, recipient would never get any response if the sender dropped
outgoingBs.Write((MessageID)ID_NAT_CONNECTION_TO_TARGET_LOST);
outgoingBs.Write(rakNetGUID);
outgoingBs.Write(connectionAttempt->sessionId);
rakPeerInterface->Send(&outgoingBs,HIGH_PRIORITY,RELIABLE_ORDERED,0,otherUser->systemAddress,false);
// 4/22/09 - Bug: was checking inProgress, legacy variable not used elsewhere
if (connectionAttempt->attemptPhase==ConnectionAttempt::NAT_ATTEMPT_PHASE_GETTING_RECENT_PORTS)
{
otherUser->isReady=true;
freedUpInProgressUsers.Insert(otherUser, _FILE_AND_LINE_ );
}
otherUser->DeleteConnectionAttempt(connectionAttempt);
}
RakNet::OP_DELETE(users[i], _FILE_AND_LINE_);
users.RemoveAtIndex(i);
for (i=0; i < freedUpInProgressUsers.Size(); i++)
{
StartPunchthroughForUser(freedUpInProgressUsers[i]);
}
}
// Also remove from groupPunchthroughRequests
for (i=0; i < users.Size(); i++)
{
bool objectExists;
unsigned int gprIndex;
gprIndex = users[i]->groupPunchthroughRequests.GetIndexFromKey(rakNetGUID, &objectExists);
if (objectExists)
{
// printf("DEBUG %i\n", __LINE__);
RakNet::BitStream outgoingBs;
outgoingBs.Write((MessageID)ID_NAT_TARGET_NOT_CONNECTED);
outgoingBs.Write(rakNetGUID);
rakPeerInterface->Send(&outgoingBs,HIGH_PRIORITY,RELIABLE_ORDERED,0,users[i]->systemAddress,false);
users[i]->groupPunchthroughRequests.RemoveAtIndex(gprIndex);
}
}
}