void UDPProxyCoordinator::ForwardingRequest::OrderRemainingServersToTry(void) { //DataStructures::Multilist<ML_ORDERED_LIST,UDPProxyCoordinator::ServerWithPing,unsigned short> swpList; DataStructures::OrderedList<unsigned short, UDPProxyCoordinator::ServerWithPing, ServerWithPingComp> swpList; // swpList.SetSortOrder(true); if (sourceServerPings.Size()==0 && targetServerPings.Size()==0) return; unsigned int idx; UDPProxyCoordinator::ServerWithPing swp; for (idx=0; idx < remainingServersToTry.Size(); idx++) { swp.serverAddress=remainingServersToTry[idx]; swp.ping=0; if (sourceServerPings.Size()) swp.ping+=(unsigned short) (sourceServerPings[idx].ping); else swp.ping+=(unsigned short) (DEFAULT_CLIENT_UNRESPONSIVE_PING_TIME); if (targetServerPings.Size()) swp.ping+=(unsigned short) (targetServerPings[idx].ping); else swp.ping+=(unsigned short) (DEFAULT_CLIENT_UNRESPONSIVE_PING_TIME); swpList.Insert(swp.ping, swp, false, _FILE_AND_LINE_); } remainingServersToTry.Clear(_FILE_AND_LINE_ ); for (idx=0; idx < swpList.Size(); idx++) { remainingServersToTry.Push(swpList[idx].serverAddress, _FILE_AND_LINE_ ); } }
void ConnectionGraph::SerializeIgnoreListAndBroadcast(RakNet::BitStream *outBitstream, DataStructures::OrderedList<SystemAddress,SystemAddress> &ignoreList, RakPeerInterface *peer) { DataStructures::List<SystemAddress> sendList; unsigned i; for (i=0; i < participantList.Size(); i++) { if (ignoreList.HasData(participantList[i])==false) sendList.Insert(participantList[i], __FILE__, __LINE__); } if (sendList.Size()==0) return; SystemAddress self = peer->GetExternalID(sendList[0]); ignoreList.Insert(self,self, false, __FILE__, __LINE__); outBitstream->Write((unsigned short) (ignoreList.Size()+sendList.Size())); for (i=0; i < ignoreList.Size(); i++) outBitstream->Write(ignoreList[i]); for (i=0; i < sendList.Size(); i++) outBitstream->Write(sendList[i]); for (i=0; i < sendList.Size(); i++) { peer->Send(outBitstream, LOW_PRIORITY, RELIABLE_ORDERED, connectionGraphChannel, sendList[i], false); } }
void ConnectionGraph2::GetParticipantList(DataStructures::OrderedList<RakNetGUID, RakNetGUID> &participantList) { participantList.Clear(true, _FILE_AND_LINE_); unsigned int i; for (i=0; i < remoteSystems.Size(); i++) participantList.InsertAtEnd(remoteSystems[i]->guid, _FILE_AND_LINE_); }
void GridSectorizer::GetEntries(DataStructures::List<void*>& intersectionList, const float minX, const float minY, const float maxX, const float maxY) { #ifdef _USE_ORDERED_LIST DataStructures::OrderedList<void*, void*>* cell; #else DataStructures::List<void*>* cell; #endif int xStart, yStart, xEnd, yEnd, xCur, yCur; unsigned index; xStart=WorldToCellXOffsetAndClamped(minX); yStart=WorldToCellYOffsetAndClamped(minY); xEnd=WorldToCellXOffsetAndClamped(maxX); yEnd=WorldToCellYOffsetAndClamped(maxY); intersectionList.Clear(true, _FILE_AND_LINE_); for (xCur=xStart; xCur <= xEnd; ++xCur) { for (yCur=yStart; yCur <= yEnd; ++yCur) { cell = grid+yCur*gridCellWidthCount+xCur; for (index=0; index < cell->Size(); ++index) intersectionList.Insert(cell->operator [](index), _FILE_AND_LINE_); } } }
bool StatisticsHistory::GetHistorySorted(uint64_t objectId, SHSortOperation sortType, DataStructures::List<StatisticsHistory::TimeAndValueQueue *> &values) const { unsigned int idx = GetObjectIndex(objectId); if (idx == (unsigned int) -1) return false; TrackedObject *to = objects[idx]; DataStructures::List<TimeAndValueQueue*> itemList; DataStructures::List<RakString> keyList; to->dataQueues.GetAsList(itemList,keyList,_FILE_AND_LINE_); Time curTime = GetTime(); DataStructures::OrderedList<TimeAndValueQueue*, TimeAndValueQueue*,TimeAndValueQueueCompAsc> sortedQueues; for (unsigned int i=0; i < itemList.Size(); i++) { TimeAndValueQueue *tavq = itemList[i]; tavq->CullExpiredValues(curTime); if (sortType == SH_SORT_BY_RECENT_SUM_ASCENDING || sortType == SH_SORT_BY_RECENT_SUM_DESCENDING) tavq->sortValue = tavq->GetRecentSum(); else if (sortType == SH_SORT_BY_LONG_TERM_SUM_ASCENDING || sortType == SH_SORT_BY_LONG_TERM_SUM_DESCENDING) tavq->sortValue = tavq->GetLongTermSum(); else if (sortType == SH_SORT_BY_RECENT_SUM_OF_SQUARES_ASCENDING || sortType == SH_SORT_BY_RECENT_SUM_OF_SQUARES_DESCENDING) tavq->sortValue = tavq->GetRecentSumOfSquares(); else if (sortType == SH_SORT_BY_RECENT_AVERAGE_ASCENDING || sortType == SH_SORT_BY_RECENT_AVERAGE_DESCENDING) tavq->sortValue = tavq->GetRecentAverage(); else if (sortType == SH_SORT_BY_LONG_TERM_AVERAGE_ASCENDING || sortType == SH_SORT_BY_LONG_TERM_AVERAGE_DESCENDING) tavq->sortValue = tavq->GetLongTermAverage(); else if (sortType == SH_SORT_BY_RECENT_HIGHEST_ASCENDING || sortType == SH_SORT_BY_RECENT_HIGHEST_DESCENDING) tavq->sortValue = tavq->GetRecentHighest(); else if (sortType == SH_SORT_BY_RECENT_LOWEST_ASCENDING || sortType == SH_SORT_BY_RECENT_LOWEST_DESCENDING) tavq->sortValue = tavq->GetRecentLowest(); else if (sortType == SH_SORT_BY_LONG_TERM_HIGHEST_ASCENDING || sortType == SH_SORT_BY_LONG_TERM_HIGHEST_DESCENDING) tavq->sortValue = tavq->GetLongTermHighest(); else tavq->sortValue = tavq->GetLongTermLowest(); if ( sortType == SH_SORT_BY_RECENT_SUM_ASCENDING || sortType == SH_SORT_BY_LONG_TERM_SUM_ASCENDING || sortType == SH_SORT_BY_RECENT_SUM_OF_SQUARES_ASCENDING || sortType == SH_SORT_BY_RECENT_AVERAGE_ASCENDING || sortType == SH_SORT_BY_LONG_TERM_AVERAGE_ASCENDING || sortType == SH_SORT_BY_RECENT_HIGHEST_ASCENDING || sortType == SH_SORT_BY_RECENT_LOWEST_ASCENDING || sortType == SH_SORT_BY_LONG_TERM_HIGHEST_ASCENDING || sortType == SH_SORT_BY_LONG_TERM_LOWEST_ASCENDING) sortedQueues.Insert(tavq, tavq, false, _FILE_AND_LINE_, TimeAndValueQueueCompAsc); else sortedQueues.Insert(tavq, tavq, false, _FILE_AND_LINE_, TimeAndValueQueueCompDesc); } for (unsigned int i=0; i < sortedQueues.Size(); i++) values.Push(sortedQueues[i], _FILE_AND_LINE_); return true; }
void Table::SortTable(Table::SortQuery *sortQueries, unsigned numSortQueries, Table::Row** out) { unsigned i; unsigned outLength; DataStructures::List<unsigned> columnIndices; _sortQueries=sortQueries; _numSortQueries=numSortQueries; _columnIndices=&columnIndices; _columns=&columns; bool anyValid=false; for (i=0; i < numSortQueries; i++) { if (sortQueries[i].columnIndex<columns.Size() && columns[sortQueries[i].columnIndex].columnType!=BINARY) { columnIndices.Insert(sortQueries[i].columnIndex, _FILE_AND_LINE_); anyValid=true; } else columnIndices.Insert((unsigned)-1, _FILE_AND_LINE_); // Means don't check this column } DataStructures::Page<unsigned, Row*, _TABLE_BPLUS_TREE_ORDER> *cur; cur = rows.GetListHead(); if (anyValid==false) { outLength=0; while (cur) { for (i=0; i < (unsigned)cur->size; i++) { out[(outLength)++]=cur->data[i]; } cur=cur->next; } return; } // Start adding to ordered list. DataStructures::OrderedList<Row*, Row*, RowSort> orderedList; while (cur) { for (i=0; i < (unsigned)cur->size; i++) { RakAssert(cur->data[i]); orderedList.Insert(cur->data[i],cur->data[i], true, _FILE_AND_LINE_); } cur=cur->next; } outLength=0; for (i=0; i < orderedList.Size(); i++) out[(outLength)++]=orderedList[i]; }
void Lobby2Client_Steam_Impl::GetRoomMembers(DataStructures::OrderedList<uint64_t, uint64_t> &_roomMembers) { _roomMembers.Clear(true,_FILE_AND_LINE_); int cLobbyMembers = SteamMatchmaking()->GetNumLobbyMembers( roomId ); for ( int i = 0; i < cLobbyMembers; i++ ) { CSteamID steamIDLobbyMember = SteamMatchmaking()->GetLobbyMemberByIndex( roomId, i ) ; uint64_t memberid=steamIDLobbyMember.ConvertToUint64(); _roomMembers.Insert(memberid,memberid,true,_FILE_AND_LINE_); } }
bool AutoRPC::GetRemoteFunctionIndex(SystemAddress systemAddress, AutoRPC::RPCIdentifier identifier, unsigned int *outerIndex, unsigned int *innerIndex) { bool objectExists=false; if (remoteFunctions.Has(systemAddress)) { *outerIndex = remoteFunctions.GetIndexAtKey(systemAddress); DataStructures::OrderedList<RPCIdentifier, RemoteRPCFunction, AutoRPC::RemoteRPCFunctionComp> *theList = remoteFunctions[*outerIndex]; *innerIndex = theList->GetIndexFromKey(identifier, &objectExists); } return objectExists; }
void ConnectionGraph::AddAndRelayConnection(DataStructures::OrderedList<SystemAddress,SystemAddress> &ignoreList, const SystemAddressAndGroupId &conn1, const SystemAddressAndGroupId &conn2, unsigned short ping, RakPeerInterface *peer) { if (graph.HasConnection(conn1,conn2)) return; if (ping==65535) ping=0; RakAssert(conn1.systemAddress!=UNASSIGNED_SYSTEM_ADDRESS); RakAssert(conn2.systemAddress!=UNASSIGNED_SYSTEM_ADDRESS); if (IsNewRemoteConnection(conn1,conn2,peer)) { NotifyUserOfRemoteConnection(conn1,conn2,ping,peer); // What was this return here for? // return; } graph.AddConnection(conn1,conn2,ping); RakNet::BitStream outBitstream; outBitstream.Write((MessageID)ID_CONNECTION_GRAPH_NEW_CONNECTION); outBitstream.Write(conn1.systemAddress); outBitstream.Write(conn1.groupId); outBitstream.Write(conn1.guid); outBitstream.Write(conn2.systemAddress); outBitstream.Write(conn2.groupId); outBitstream.Write(conn2.guid); outBitstream.Write(ping); ignoreList.Insert(conn2.systemAddress,conn2.systemAddress, false, __FILE__, __LINE__); ignoreList.Insert(conn1.systemAddress,conn1.systemAddress, false, __FILE__, __LINE__); SerializeIgnoreListAndBroadcast(&outBitstream, ignoreList, peer); }
void AutoRPC::OnCloseConnection(RakPeerInterface *peer, SystemAddress systemAddress) { (void) peer; if (remoteFunctions.Has(systemAddress)) { DataStructures::OrderedList<RPCIdentifier, RemoteRPCFunction, AutoRPC::RemoteRPCFunctionComp> *theList = remoteFunctions.Get(systemAddress); unsigned i; for (i=0; i < theList->Size(); i++) { if (theList->operator [](i).identifier.uniqueIdentifier) rakFree(theList->operator [](i).identifier.uniqueIdentifier); } RakNet::OP_DELETE(theList); remoteFunctions.Delete(systemAddress); } }
void AutoRPC::OnRPCRemoteIndex(SystemAddress systemAddress, unsigned char *data, unsigned int lengthInBytes) { // A remote system has given us their internal index for a particular function. // Store it and use it from now on, to save bandwidth and search time bool objectExists; char strIdentifier[512]; unsigned int insertionIndex; unsigned int remoteIndex; RemoteRPCFunction newRemoteFunction; RakNet::BitStream bs(data,lengthInBytes,false); RPCIdentifier identifier; bs.Read(identifier.isObjectMember); bs.ReadCompressed(remoteIndex); stringCompressor->DecodeString(strIdentifier,512,&bs,0); identifier.uniqueIdentifier=strIdentifier; if (strIdentifier[0]==0) return; DataStructures::OrderedList<RPCIdentifier, RemoteRPCFunction, AutoRPC::RemoteRPCFunctionComp> *theList; if (remoteFunctions.Has(systemAddress)) { theList = remoteFunctions.Get(systemAddress); insertionIndex=theList->GetIndexFromKey(identifier, &objectExists); if (objectExists==false) { newRemoteFunction.functionIndex=remoteIndex; newRemoteFunction.identifier.isObjectMember=identifier.isObjectMember; newRemoteFunction.identifier.uniqueIdentifier = (char*) rakMalloc_Ex(strlen(strIdentifier)+1, __FILE__, __LINE__); strcpy(newRemoteFunction.identifier.uniqueIdentifier, strIdentifier); theList->InsertAtIndex(newRemoteFunction, insertionIndex, __FILE__, __LINE__); } } else { theList = RakNet::OP_NEW<DataStructures::OrderedList<RPCIdentifier, RemoteRPCFunction, AutoRPC::RemoteRPCFunctionComp> >( __FILE__, __LINE__ ); newRemoteFunction.functionIndex=remoteIndex; newRemoteFunction.identifier.isObjectMember=identifier.isObjectMember; newRemoteFunction.identifier.uniqueIdentifier = (char*) rakMalloc_Ex(strlen(strIdentifier)+1, __FILE__, __LINE__); strcpy(newRemoteFunction.identifier.uniqueIdentifier, strIdentifier); theList->InsertAtEnd(newRemoteFunction, __FILE__, __LINE__); remoteFunctions.SetNew(systemAddress,theList); } }
void AutoRPC::OnClosedConnection(SystemAddress systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ) { (void) rakNetGUID; (void) lostConnectionReason; if (remoteFunctions.Has(systemAddress)) { DataStructures::OrderedList<RPCIdentifier, RemoteRPCFunction, AutoRPC::RemoteRPCFunctionComp> *theList = remoteFunctions.Get(systemAddress); unsigned i; for (i=0; i < theList->Size(); i++) { if (theList->operator [](i).identifier.uniqueIdentifier) rakFree_Ex(theList->operator [](i).identifier.uniqueIdentifier, __FILE__, __LINE__ ); } RakNet::OP_DELETE(theList, __FILE__, __LINE__); remoteFunctions.Delete(systemAddress); } }
void ConnectionGraph::OnConnectionGraphUpdate(Packet *packet) { // Only accept from participants if (participantList.HasData(packet->systemAddress)==false) return; RakNet::BitStream inBitstream(packet->data, packet->length, false); inBitstream.IgnoreBits(8); if (DeserializeWeightedGraph(&inBitstream, rakPeerInterface)==false) return; DataStructures::OrderedList<SystemAddress,SystemAddress> ignoreList; DeserializeIgnoreList(ignoreList, &inBitstream); // Forward the updated graph to all participants. ignoreList.Insert(packet->systemAddress,packet->systemAddress, false, __FILE__, __LINE__); BroadcastGraphUpdate(ignoreList, rakPeerInterface); }
bool ConnectionGraph::OnConnectionLostInternal(Packet *packet, unsigned char packetId) { // Only accept from participants if (participantList.HasData(packet->systemAddress)==false) return false; SystemAddress node1, node2; RakNet::BitStream inBitstream(packet->data, packet->length, false); inBitstream.IgnoreBits(8); // This is correct - group IDs are not written for removal, only addition. inBitstream.Read(node1); if (inBitstream.Read(node2)==false) return false; DataStructures::OrderedList<SystemAddress,SystemAddress> ignoreList; DeserializeIgnoreList(ignoreList, &inBitstream); ignoreList.Insert(packet->systemAddress, packet->systemAddress, false, __FILE__, __LINE__); return RemoveAndRelayConnection(ignoreList, packetId, node1, node2, rakPeerInterface); }
// connectionRequestsMutex should already be locked void Router2::RequestForwarding(ConnnectRequest* connectionRequest) { RakAssert(connectionRequest->requestState==R2RS_REQUEST_STATE_QUERY_FORWARDING); connectionRequest->requestState=REQUEST_STATE_REQUEST_FORWARDING; if (connectionRequest->GetGuidIndex(connectionRequest->lastRequestedForwardingSystem)!=(unsigned int)-1) { char buff[512]; if (debugInterface) debugInterface->ShowFailure(FormatStringTS(buff,"Router2 failed at %s:%i\n", _FILE_AND_LINE_)); return; } // Prioritize systems to request forwarding DataStructures::OrderedList<ConnectionRequestSystem, ConnectionRequestSystem, ConnectionRequestSystemComp> commandList; unsigned int connectionRequestGuidIndex; connectionRequest->connectionRequestSystemsMutex.Lock(); for (connectionRequestGuidIndex=0; connectionRequestGuidIndex < connectionRequest->connectionRequestSystems.Size(); connectionRequestGuidIndex++) { RakAssert(connectionRequest->connectionRequestSystems[connectionRequestGuidIndex].pingToEndpoint>=0); commandList.Insert(connectionRequest->connectionRequestSystems[connectionRequestGuidIndex], connectionRequest->connectionRequestSystems[connectionRequestGuidIndex], true, _FILE_AND_LINE_); } connectionRequest->connectionRequestSystemsMutex.Unlock(); connectionRequest->lastRequestedForwardingSystem=commandList[0].guid; RakNet::BitStream bsOut; bsOut.Write((MessageID)ID_ROUTER_2_INTERNAL); bsOut.Write((unsigned char) ID_ROUTER_2_REQUEST_FORWARDING); bsOut.Write(connectionRequest->endpointGuid); rakPeerInterface->Send(&bsOut,MEDIUM_PRIORITY,RELIABLE_ORDERED,0,connectionRequest->lastRequestedForwardingSystem,false); if (debugInterface) { char buff[512]; debugInterface->ShowDiagnostic(FormatStringTS(buff,"Sending ID_ROUTER_2_REQUEST_FORWARDING " "(connectionRequest->lastRequestedForwardingSystem = %I64d, connectionRequest->endpointGuid = %I64d) at %s:%i\n", connectionRequest->lastRequestedForwardingSystem.g,connectionRequest->endpointGuid.g, __FILE__, __LINE__)); } }
void ConnectionGraph::OnConnectionGraphReply(Packet *packet) { unsigned char password[256]; RakNet::BitStream inBitstream(packet->data, packet->length, false); inBitstream.IgnoreBits(8); stringCompressor->DecodeString((char*)password,256,&inBitstream); if (pw && pw[0] && strcmp(pw, (const char*)password)!=0) return; // Serialize the weighted graph and send it to them RakNet::BitStream outBitstream; outBitstream.Write((MessageID)ID_CONNECTION_GRAPH_UPDATE); #ifdef _CONNECTION_GRAPH_DEBUG_PRINT RAKNET_DEBUG_PRINTF("ID_CONNECTION_GRAPH_UPDATE "); #endif // Send our current graph to the sender SerializeWeightedGraph(&outBitstream, graph); // Write the systems that have processed this graph so we don't resend to these systems outBitstream.Write((unsigned short) 1); outBitstream.Write(rakPeerInterface->GetExternalID(packet->systemAddress)); #ifdef _CONNECTION_GRAPH_DEBUG_PRINT RAKNET_DEBUG_PRINTF("from %i to %i\n", peer->GetInternalID().port, packet->systemAddress.port); #endif SendUnified(&outBitstream, LOW_PRIORITY, RELIABLE_ORDERED, connectionGraphChannel, packet->systemAddress, false); // Add packet->systemAddress to the participant list if it is not already there AddParticipant(packet->systemAddress); if (DeserializeWeightedGraph(&inBitstream, rakPeerInterface)==false) return; // Forward the updated graph to all current participants DataStructures::OrderedList<SystemAddress,SystemAddress> ignoreList; ignoreList.Insert(packet->systemAddress,packet->systemAddress, true, __FILE__, __LINE__); BroadcastGraphUpdate(ignoreList, rakPeerInterface); }
void AutoRPC::Clear(void) { unsigned i,j; for (j=0; j < remoteFunctions.Size(); j++) { DataStructures::OrderedList<RPCIdentifier, RemoteRPCFunction, AutoRPC::RemoteRPCFunctionComp> *theList = remoteFunctions[j]; for (i=0; i < theList->Size(); i++) { if (theList->operator [](i).identifier.uniqueIdentifier) rakFree_Ex(theList->operator [](i).identifier.uniqueIdentifier, __FILE__, __LINE__ ); } RakNet::OP_DELETE(theList, __FILE__, __LINE__); } for (i=0; i < localFunctions.Size(); i++) { if (localFunctions[i].identifier.uniqueIdentifier) rakFree_Ex(localFunctions[i].identifier.uniqueIdentifier, __FILE__, __LINE__ ); } localFunctions.Clear(false, __FILE__, __LINE__); remoteFunctions.Clear(); outgoingExtraData.Reset(); incomingExtraData.Reset(); }
void ConnectionGraph::OnNewConnectionInternal(Packet *packet) { // Only accept from participants if (participantList.HasData(packet->systemAddress)==false) return; SystemAddressAndGroupId node1, node2; unsigned short ping; RakNet::BitStream inBitstream(packet->data, packet->length, false); inBitstream.IgnoreBits(8); inBitstream.Read(node1.systemAddress); inBitstream.Read(node1.groupId); inBitstream.Read(node1.guid); inBitstream.Read(node2.systemAddress); inBitstream.Read(node2.groupId); inBitstream.Read(node2.guid); if (inBitstream.Read(ping)==false) return; DataStructures::OrderedList<SystemAddress,SystemAddress> ignoreList; DeserializeIgnoreList(ignoreList, &inBitstream); ignoreList.Insert(packet->systemAddress,packet->systemAddress, false, __FILE__, __LINE__); AddAndRelayConnection(ignoreList, node1, node2, ping, rakPeerInterface); }
void FullyConnectedMesh2::GetHostOrder(DataStructures::List<RakNetGUID> &hostList) { hostList.Clear(true, _FILE_AND_LINE_); if (ourFCMGuid==0 || fcm2ParticipantList.Size()==0) { hostList.Push(rakPeerInterface->GetMyGUID(), _FILE_AND_LINE_); return; } FCM2Participant fcm2; fcm2.fcm2Guid=ourFCMGuid; fcm2.rakNetGuid=rakPeerInterface->GetMyGUID(); DataStructures::OrderedList<FCM2Participant, FCM2Participant, FCM2ParticipantComp> olist; olist.Insert(fcm2, fcm2, true, _FILE_AND_LINE_); for (unsigned int i=0; i < fcm2ParticipantList.Size(); i++) olist.Insert(fcm2ParticipantList[i], fcm2ParticipantList[i], true, _FILE_AND_LINE_); for (unsigned int i=0; i < olist.Size(); i++) { hostList.Push(olist[i].rakNetGuid, _FILE_AND_LINE_); } }
bool ConnectionGraph::DeserializeIgnoreList(DataStructures::OrderedList<SystemAddress,SystemAddress> &ignoreList, RakNet::BitStream *inBitstream ) { unsigned short count; SystemAddress temp; unsigned i; inBitstream->Read(count); for (i=0; i < count; i++) { if (inBitstream->Read(temp)==false) { RakAssert(0); return false; } ignoreList.Insert(temp,temp, false, __FILE__, __LINE__); } return true; }
bool ConnectionGraph::RemoveAndRelayConnection(DataStructures::OrderedList<SystemAddress,SystemAddress> &ignoreList, unsigned char packetId, const SystemAddress node1, const SystemAddress node2, RakPeerInterface *peer) { SystemAddressAndGroupId n1, n2; n1.systemAddress=node1; n2.systemAddress=node2; if (graph.HasConnection(n1,n2)==false) return false; graph.RemoveConnection(n1,n2); // TODO - clear islands RakNet::BitStream outBitstream; outBitstream.Write(packetId); outBitstream.Write(node1); outBitstream.Write(node2); ignoreList.Insert(node1,node1, false, __FILE__, __LINE__); ignoreList.Insert(node2,node2, false, __FILE__, __LINE__); SerializeIgnoreListAndBroadcast(&outBitstream, ignoreList, peer); return true; }
void Lobby2Client_Steam_Impl::CallRoomCallbacks() { DataStructures::OrderedList<uint64_t,uint64_t> currentMembers; GetRoomMembers(currentMembers); DataStructures::OrderedList<uint64_t, RoomMember, SteamIDAndRoomMemberComp> updatedRoomMembers; bool anyChanges=false; unsigned int currentMemberIndex=0, oldMemberIndex=0; while (currentMemberIndex < currentMembers.Size() && oldMemberIndex < roomMembersById.Size()) { if (currentMembers[currentMemberIndex]<roomMembersById[oldMemberIndex].steamIDRemote) { RoomMember roomMember; roomMember.steamIDRemote=currentMembers[currentMemberIndex]; roomMember.systemAddress.address.addr4.sin_addr.s_addr=nextFreeSystemAddress++; roomMember.systemAddress.SetPortHostOrder(STEAM_UNUSED_PORT); updatedRoomMembers.Insert(roomMember.steamIDRemote,roomMember,true,_FILE_AND_LINE_); anyChanges=true; // new member NotifyNewMember(currentMembers[currentMemberIndex], roomMember.systemAddress); currentMemberIndex++; } else if (currentMembers[currentMemberIndex]>roomMembersById[oldMemberIndex].steamIDRemote) { anyChanges=true; // dropped member NotifyDroppedMember(roomMembersById[oldMemberIndex].steamIDRemote, roomMembersById[oldMemberIndex].systemAddress); oldMemberIndex++; } else { updatedRoomMembers.Insert(roomMembersById[oldMemberIndex].steamIDRemote,roomMembersById[oldMemberIndex],true,_FILE_AND_LINE_); currentMemberIndex++; oldMemberIndex++; } } while (oldMemberIndex < roomMembersById.Size()) { anyChanges=true; // dropped member NotifyDroppedMember(roomMembersById[oldMemberIndex].steamIDRemote, roomMembersById[oldMemberIndex].systemAddress); oldMemberIndex++; } while (currentMemberIndex < currentMembers.Size()) { RoomMember roomMember; roomMember.steamIDRemote=currentMembers[currentMemberIndex]; roomMember.systemAddress.address.addr4.sin_addr.s_addr=nextFreeSystemAddress++; roomMember.systemAddress.SetPortHostOrder(STEAM_UNUSED_PORT); updatedRoomMembers.Insert(roomMember.steamIDRemote,roomMember,true,_FILE_AND_LINE_); anyChanges=true; // new member NotifyNewMember(currentMembers[currentMemberIndex], roomMember.systemAddress); currentMemberIndex++; } if (anyChanges) { roomMembersById=updatedRoomMembers; roomMembersByAddr.Clear(true, _FILE_AND_LINE_); for (currentMemberIndex=0; currentMemberIndex < roomMembersById.Size(); currentMemberIndex++) { roomMembersByAddr.Insert(roomMembersById[currentMemberIndex].systemAddress, roomMembersById[currentMemberIndex], true, _FILE_AND_LINE_); } } }
int main(int argc, char **argv) { if (argc>1) { printf("Command arguments:\n"); for (int i=1; i < argc; i++) { printf("%i. %s\n", i, argv[i]); } } SteamResults steamResults; rakPeer = RakNet::RakPeerInterface::GetInstance(); fcm2 = RakNet::FullyConnectedMesh2::GetInstance(); messageFactory = new Lobby2MessageFactory_Steam; lobby2Client = Lobby2Client_Steam::GetInstance(); lobby2Client->AddCallbackInterface(&steamResults); lobby2Client->SetMessageFactory(messageFactory); SocketDescriptor sd(1234,0); rakPeer->Startup(32,&sd,1); rakPeer->SetMaximumIncomingConnections(32); rakPeer->AttachPlugin(fcm2); rakPeer->AttachPlugin(lobby2Client); // Connect manually in Notification_Console_MemberJoinedRoom fcm2->SetConnectOnNewRemoteConnection(false, ""); RakNet::Lobby2Message* msg = messageFactory->Alloc(RakNet::L2MID_Client_Login); lobby2Client->SendMsg(msg); if (msg->resultCode!=L2RC_PROCESSING && msg->resultCode!=L2RC_SUCCESS) { printf("Steam must be running to play this game (SteamAPI_Init() failed).\n"); printf("If this fails, steam_appid.txt was probably not in the working directory.\n"); messageFactory->Dealloc(msg); return -1; } messageFactory->Dealloc(msg); PrintCommands(); bool quit=false; char ch; while(!quit) { RakNet::Packet *packet; for (packet=rakPeer->Receive(); packet; rakPeer->DeallocatePacket(packet), packet=rakPeer->Receive()) { switch (packet->data[0]) { case ID_DISCONNECTION_NOTIFICATION: // Connection lost normally printf("ID_DISCONNECTION_NOTIFICATION\n"); break; case ID_ALREADY_CONNECTED: // Connection lost normally printf("ID_ALREADY_CONNECTED\n"); break; case ID_REMOTE_DISCONNECTION_NOTIFICATION: // Server telling the clients of another client disconnecting gracefully. You can manually broadcast this in a peer to peer enviroment if you want. printf("ID_REMOTE_DISCONNECTION_NOTIFICATION\n"); break; case ID_REMOTE_CONNECTION_LOST: // Server telling the clients of another client disconnecting forcefully. You can manually broadcast this in a peer to peer enviroment if you want. printf("ID_REMOTE_CONNECTION_LOST\n"); break; case ID_REMOTE_NEW_INCOMING_CONNECTION: // Server telling the clients of another client connecting. You can manually broadcast this in a peer to peer enviroment if you want. printf("ID_REMOTE_NEW_INCOMING_CONNECTION\n"); break; case ID_CONNECTION_BANNED: // Banned from this server printf("We are banned from this server.\n"); break; case ID_CONNECTION_ATTEMPT_FAILED: printf("Connection attempt failed\n"); break; case ID_NO_FREE_INCOMING_CONNECTIONS: // Sorry, the server is full. I don't do anything here but // A real app should tell the user printf("ID_NO_FREE_INCOMING_CONNECTIONS\n"); break; case ID_INVALID_PASSWORD: printf("ID_INVALID_PASSWORD\n"); break; case ID_CONNECTION_LOST: // Couldn't deliver a reliable packet - i.e. the other system was abnormally // terminated printf("ID_CONNECTION_LOST\n"); break; case ID_CONNECTION_REQUEST_ACCEPTED: // This tells the client they have connected printf("ID_CONNECTION_REQUEST_ACCEPTED to %s with GUID %s\n", packet->systemAddress.ToString(), packet->guid.ToString()); break; case ID_NEW_INCOMING_CONNECTION: printf("ID_NEW_INCOMING_CONNECTION\n"); break; case ID_FCM2_NEW_HOST: { if (packet->systemAddress==RakNet::UNASSIGNED_SYSTEM_ADDRESS) printf("Got new host (ourselves)"); else printf("Got new host %s, GUID=%s", packet->systemAddress.ToString(true), packet->guid.ToString()); RakNet::BitStream bs(packet->data,packet->length,false); bs.IgnoreBytes(1); RakNetGUID oldHost; bs.Read(oldHost); // If the old host is different, then this message was due to losing connection to the host. if (oldHost!=packet->guid) printf(". Oldhost Guid=%s\n", oldHost.ToString()); else printf("\n"); } break; default: // It's a client, so just show the message printf("Unknown Message ID %i\n", packet->data[0]); break; } } if (kbhit()) { ch=(char)getch(); switch (ch) { case 'a': { RakNet::Lobby2Message* logoffMsg = messageFactory->Alloc(RakNet::L2MID_Console_SearchRooms); lobby2Client->SendMsg(logoffMsg); messageFactory->Dealloc(logoffMsg); } break; case 'b': { if (lobby2Client->GetRoomID()==0) { printf("Not in a room\n"); break; } RakNet::Console_LeaveRoom_Steam* msg = (RakNet::Console_LeaveRoom_Steam*) messageFactory->Alloc(RakNet::L2MID_Console_LeaveRoom); msg->roomId=lobby2Client->GetRoomID(); lobby2Client->SendMsg(msg); messageFactory->Dealloc(msg); } break; case 'c': { if (lobby2Client->GetRoomID()!=0) { printf("Already in a room\n"); break; } RakNet::Console_CreateRoom_Steam* msg = (RakNet::Console_CreateRoom_Steam*) messageFactory->Alloc(RakNet::L2MID_Console_CreateRoom); // set the name of the lobby if it's ours char rgchLobbyName[256]; msg->roomIsPublic=true; _snprintf( rgchLobbyName, sizeof( rgchLobbyName ), "%s's lobby", SteamFriends()->GetPersonaName() ); msg->roomName=rgchLobbyName; msg->publicSlots=8; lobby2Client->SendMsg(msg); messageFactory->Dealloc(msg); } break; case 'd': { if (lobby2Client->GetRoomID()!=0) { printf("Already in a room\n"); break; } RakNet::Console_JoinRoom_Steam* msg = (RakNet::Console_JoinRoom_Steam*) messageFactory->Alloc(RakNet::L2MID_Console_JoinRoom); printf("Enter room id, or enter for %" PRINTF_64_BIT_MODIFIER "u: ", lastRoom); char str[256]; Gets(str, sizeof(str)); if (str[0]==0) { msg->roomId=lastRoom; } else { msg->roomId=_atoi64(str); } lobby2Client->SendMsg(msg); messageFactory->Dealloc(msg); } break; case 'e': { if (lobby2Client->GetRoomID()==0) { printf("Not in a room\n"); break; } RakNet::Console_GetRoomDetails_Steam* msg = (RakNet::Console_GetRoomDetails_Steam*) messageFactory->Alloc(RakNet::L2MID_Console_GetRoomDetails); msg->roomId=lobby2Client->GetRoomID(); lobby2Client->SendMsg(msg); messageFactory->Dealloc(msg); } break; case 'f': { if (lobby2Client->GetRoomID()==0) { printf("Not in a room\n"); break; } RakNet::Console_SendRoomChatMessage_Steam* msg = (RakNet::Console_SendRoomChatMessage_Steam*) messageFactory->Alloc(RakNet::L2MID_Console_SendRoomChatMessage); msg->message="Test chat message."; msg->roomId=lobby2Client->GetRoomID(); lobby2Client->SendMsg(msg); messageFactory->Dealloc(msg); } break; case 'g': { DataStructures::OrderedList<uint64_t, uint64_t> roomMembers; lobby2Client->GetRoomMembers(roomMembers); for (unsigned int i=0; i < roomMembers.Size(); i++) { printf("%i. %s ID=%" PRINTF_64_BIT_MODIFIER "u\n", i+1, lobby2Client->GetRoomMemberName(roomMembers[i]), roomMembers[i]); } } break; case '?': { PrintCommands(); } break; case 27: { quit=true; } break; } } RakSleep(30); } RakNet::Lobby2Message* logoffMsg = messageFactory->Alloc(RakNet::L2MID_Client_Logoff); lobby2Client->SendMsg(logoffMsg); messageFactory->Dealloc(logoffMsg); rakPeer->DetachPlugin(lobby2Client); rakPeer->DetachPlugin(fcm2); RakNet::RakPeerInterface::DestroyInstance(rakPeer); Lobby2Client_Steam::DestroyInstance(lobby2Client); RakNet::FullyConnectedMesh2::DestroyInstance(fcm2); return 1; }
void AutoRPC::OnRPCUnknownRemoteIndex(SystemAddress systemAddress, unsigned char *data, unsigned int lengthInBytes, RakNetTime timestamp) { char inputStack[ARPC_MAX_STACK_SIZE]; NetworkID networkId; bool hasNetworkId=false; unsigned int functionIndex; unsigned int bytesOnStack; int numberOfBitsUsed; char parameterCount; bool hasParameterCount=false; RakNet::BitStream extraData; RakNet::BitStream bs(data,lengthInBytes,false); bs.Read(hasParameterCount); if (hasParameterCount) bs.Read(parameterCount); bs.ReadCompressed(functionIndex); bs.ReadCompressed(numberOfBitsUsed); extraData.AddBitsAndReallocate(numberOfBitsUsed); bs.ReadBits(extraData.GetData(), numberOfBitsUsed, false); extraData.SetWriteOffset(numberOfBitsUsed); bs.Read(hasNetworkId); if (hasNetworkId) bs.Read(networkId); bs.ReadCompressed(bytesOnStack); bs.ReadAlignedBytes((unsigned char*) inputStack, bytesOnStack); unsigned outerIndex; if (remoteFunctions.Has(systemAddress)) { outerIndex = remoteFunctions.GetIndexAtKey(systemAddress); DataStructures::OrderedList<RPCIdentifier, RemoteRPCFunction, AutoRPC::RemoteRPCFunctionComp> *theList = remoteFunctions[outerIndex]; unsigned i; for (i=0; i < theList->Size(); i++) { if (theList->operator [](i).functionIndex==functionIndex) { RakNet::BitStream out; // Recover by resending the RPC with the function identifier string this time if (timestamp!=0) { out.Write((MessageID)ID_TIMESTAMP); out.Write(timestamp); } out.Write((MessageID)ID_AUTO_RPC_CALL); if (parameterCount>=0) { out.Write(true); out.Write(parameterCount); } else { out.Write(false); } out.WriteCompressed(numberOfBitsUsed); out.Write(&extraData); out.Write(hasNetworkId); if (hasNetworkId) out.Write(networkId); out.AlignWriteToByteBoundary(); out.Write(false); stringCompressor->EncodeString(theList->operator [](i).identifier.uniqueIdentifier, 512, &out, 0); out.WriteCompressed(bytesOnStack); out.WriteAlignedBytes((const unsigned char*) inputStack, bytesOnStack); SendUnified(&out, outgoingPriority, outgoingReliability, outgoingOrderingChannel, systemAddress, false); return; } } } // Failed to recover, inform the user Packet *p = rakPeerInterface->AllocatePacket(sizeof(MessageID)+sizeof(unsigned char)); RakNet::BitStream bs2(p->data, sizeof(MessageID)+sizeof(unsigned char), false); bs2.SetWriteOffset(0); bs2.Write((MessageID)ID_RPC_REMOTE_ERROR); bs2.Write((unsigned char)RPC_ERROR_FUNCTION_NO_LONGER_REGISTERED); stringCompressor->EncodeString("",256,&bs,0); p->systemAddress=systemAddress; rakPeerInterface->PushBackPacket(p, false); }