ReadyEvent.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572
  1. /*
  2. * Copyright (c) 2014, Oculus VR, Inc.
  3. * All rights reserved.
  4. *
  5. * This source code is licensed under the BSD-style license found in the
  6. * LICENSE file in the root directory of this source tree. An additional grant
  7. * of patent rights can be found in the PATENTS file in the same directory.
  8. *
  9. */
  10. #include "NativeFeatureIncludes.h"
  11. #if _RAKNET_SUPPORT_ReadyEvent==1
  12. #include "ReadyEvent.h"
  13. #include "RakPeerInterface.h"
  14. #include "BitStream.h"
  15. #include "MessageIdentifiers.h"
  16. #include "RakAssert.h"
  17. #ifdef _MSC_VER
  18. #pragma warning( push )
  19. #endif
  20. using namespace RakNet;
  21. int RakNet::ReadyEvent::RemoteSystemCompByGuid( const RakNetGUID &key, const RemoteSystem &data )
  22. {
  23. if (key < data.rakNetGuid)
  24. return -1;
  25. else if (key==data.rakNetGuid)
  26. return 0;
  27. else
  28. return 1;
  29. }
  30. int RakNet::ReadyEvent::ReadyEventNodeComp( const int &key, ReadyEvent::ReadyEventNode * const &data )
  31. {
  32. if (key < data->eventId)
  33. return -1;
  34. else if (key==data->eventId)
  35. return 0;
  36. else
  37. return 1;
  38. }
  39. STATIC_FACTORY_DEFINITIONS(ReadyEvent,ReadyEvent);
  40. ReadyEvent::ReadyEvent()
  41. {
  42. channel=0;
  43. }
  44. ReadyEvent::~ReadyEvent()
  45. {
  46. Clear();
  47. }
  48. bool ReadyEvent::SetEvent(int eventId, bool isReady)
  49. {
  50. bool objectExists;
  51. unsigned eventIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists);
  52. if (objectExists==false)
  53. {
  54. // Totally new event
  55. CreateNewEvent(eventId, isReady);
  56. }
  57. else
  58. {
  59. return SetEventByIndex(eventIndex, isReady);
  60. }
  61. return true;
  62. }
  63. void ReadyEvent::ForceCompletion(int eventId)
  64. {
  65. bool objectExists;
  66. unsigned eventIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists);
  67. if (objectExists==false)
  68. {
  69. // Totally new event
  70. CreateNewEvent(eventId, true);
  71. eventIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists);
  72. }
  73. ReadyEventNode *ren = readyEventNodeList[eventIndex];
  74. ren->eventStatus=ID_READY_EVENT_FORCE_ALL_SET;
  75. UpdateReadyStatus(eventIndex);
  76. }
  77. bool ReadyEvent::DeleteEvent(int eventId)
  78. {
  79. bool objectExists;
  80. unsigned eventIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists);
  81. if (objectExists)
  82. {
  83. RakNet::OP_DELETE(readyEventNodeList[eventIndex], _FILE_AND_LINE_);
  84. readyEventNodeList.RemoveAtIndex(eventIndex);
  85. return true;
  86. }
  87. return false;
  88. }
  89. bool ReadyEvent::IsEventSet(int eventId)
  90. {
  91. bool objectExists;
  92. unsigned eventIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists);
  93. if (objectExists)
  94. {
  95. return readyEventNodeList[eventIndex]->eventStatus==ID_READY_EVENT_SET || readyEventNodeList[eventIndex]->eventStatus==ID_READY_EVENT_ALL_SET;
  96. }
  97. return false;
  98. }
  99. bool ReadyEvent::IsEventCompletionProcessing(int eventId) const
  100. {
  101. bool objectExists;
  102. unsigned eventIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists);
  103. if (objectExists)
  104. {
  105. bool anyAllReady=false;
  106. bool allAllReady=true;
  107. ReadyEventNode *ren = readyEventNodeList[eventIndex];
  108. if (ren->eventStatus==ID_READY_EVENT_FORCE_ALL_SET)
  109. return false;
  110. for (unsigned i=0; i < ren->systemList.Size(); i++)
  111. {
  112. if (ren->systemList[i].lastReceivedStatus==ID_READY_EVENT_ALL_SET)
  113. anyAllReady=true;
  114. else
  115. allAllReady=false;
  116. }
  117. return anyAllReady==true && allAllReady==false;
  118. }
  119. return false;
  120. }
  121. bool ReadyEvent::IsEventCompleted(int eventId) const
  122. {
  123. bool objectExists;
  124. unsigned eventIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists);
  125. if (objectExists)
  126. {
  127. return IsEventCompletedByIndex(eventIndex);
  128. }
  129. return false;
  130. }
  131. bool ReadyEvent::HasEvent(int eventId)
  132. {
  133. return readyEventNodeList.HasData(eventId);
  134. }
  135. unsigned ReadyEvent::GetEventListSize(void) const
  136. {
  137. return readyEventNodeList.Size();
  138. }
  139. int ReadyEvent::GetEventAtIndex(unsigned index) const
  140. {
  141. return readyEventNodeList[index]->eventId;
  142. }
  143. bool ReadyEvent::AddToWaitList(int eventId, RakNetGUID guid)
  144. {
  145. bool eventExists;
  146. unsigned eventIndex = readyEventNodeList.GetIndexFromKey(eventId, &eventExists);
  147. if (eventExists==false)
  148. eventIndex=CreateNewEvent(eventId, false);
  149. // Don't do this, otherwise if we are trying to start a 3 player game, it will not allow the 3rd player to hit ready if the first two players have already done so
  150. //if (IsLocked(eventIndex))
  151. // return false; // Not in the list, but event is already completed, or is starting to complete, and adding more waiters would fail this.
  152. unsigned i;
  153. unsigned numAdded=0;
  154. if (guid==UNASSIGNED_RAKNET_GUID)
  155. {
  156. for (i=0; i < rakPeerInterface->GetMaximumNumberOfPeers(); i++)
  157. {
  158. RakNetGUID firstGuid = rakPeerInterface->GetGUIDFromIndex(i);
  159. if (firstGuid!=UNASSIGNED_RAKNET_GUID)
  160. {
  161. numAdded+=AddToWaitListInternal(eventIndex, firstGuid);
  162. }
  163. }
  164. }
  165. else
  166. {
  167. numAdded=AddToWaitListInternal(eventIndex, guid);
  168. }
  169. if (numAdded>0)
  170. UpdateReadyStatus(eventIndex);
  171. return numAdded>0;
  172. }
  173. bool ReadyEvent::RemoveFromWaitList(int eventId, RakNetGUID guid)
  174. {
  175. bool eventExists;
  176. unsigned eventIndex = readyEventNodeList.GetIndexFromKey(eventId, &eventExists);
  177. if (eventExists)
  178. {
  179. if (guid==UNASSIGNED_RAKNET_GUID)
  180. {
  181. // Remove all waiters
  182. readyEventNodeList[eventIndex]->systemList.Clear(false, _FILE_AND_LINE_);
  183. UpdateReadyStatus(eventIndex);
  184. }
  185. else
  186. {
  187. bool systemExists;
  188. unsigned systemIndex = readyEventNodeList[eventIndex]->systemList.GetIndexFromKey(guid, &systemExists);
  189. if (systemExists)
  190. {
  191. bool isCompleted = IsEventCompletedByIndex(eventIndex);
  192. readyEventNodeList[eventIndex]->systemList.RemoveAtIndex(systemIndex);
  193. if (isCompleted==false && IsEventCompletedByIndex(eventIndex))
  194. PushCompletionPacket(readyEventNodeList[eventIndex]->eventId);
  195. UpdateReadyStatus(eventIndex);
  196. return true;
  197. }
  198. }
  199. }
  200. return false;
  201. }
  202. bool ReadyEvent::IsInWaitList(int eventId, RakNetGUID guid)
  203. {
  204. bool objectExists;
  205. unsigned readyIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists);
  206. if (objectExists)
  207. {
  208. return readyEventNodeList[readyIndex]->systemList.HasData(guid);
  209. }
  210. return false;
  211. }
  212. unsigned ReadyEvent::GetRemoteWaitListSize(int eventId) const
  213. {
  214. bool objectExists;
  215. unsigned readyIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists);
  216. if (objectExists)
  217. {
  218. return readyEventNodeList[readyIndex]->systemList.Size();
  219. }
  220. return 0;
  221. }
  222. RakNetGUID ReadyEvent::GetFromWaitListAtIndex(int eventId, unsigned index) const
  223. {
  224. bool objectExists;
  225. unsigned readyIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists);
  226. if (objectExists)
  227. {
  228. return readyEventNodeList[readyIndex]->systemList[index].rakNetGuid;
  229. }
  230. return UNASSIGNED_RAKNET_GUID;
  231. }
  232. ReadyEventSystemStatus ReadyEvent::GetReadyStatus(int eventId, RakNetGUID guid)
  233. {
  234. bool objectExists;
  235. unsigned readyIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists);
  236. if (objectExists)
  237. {
  238. ReadyEventNode *ren = readyEventNodeList[readyIndex];
  239. unsigned systemIndex = ren->systemList.GetIndexFromKey(guid, &objectExists);
  240. if (objectExists==false)
  241. return RES_NOT_WAITING;
  242. if (ren->systemList[systemIndex].lastReceivedStatus==ID_READY_EVENT_SET)
  243. return RES_READY;
  244. if (ren->systemList[systemIndex].lastReceivedStatus==ID_READY_EVENT_UNSET)
  245. return RES_WAITING;
  246. if (ren->systemList[systemIndex].lastReceivedStatus==ID_READY_EVENT_ALL_SET)
  247. return RES_ALL_READY;
  248. }
  249. return RES_UNKNOWN_EVENT;
  250. }
  251. void ReadyEvent::SetSendChannel(unsigned char newChannel)
  252. {
  253. channel=newChannel;
  254. }
  255. PluginReceiveResult ReadyEvent::OnReceive(Packet *packet)
  256. {
  257. unsigned char packetIdentifier;
  258. packetIdentifier = ( unsigned char ) packet->data[ 0 ];
  259. // bool doPrint = packet->systemAddress.GetPort()==60002 || rakPeerInterface->GetInternalID(UNASSIGNED_SYSTEM_ADDRESS).GetPort()==60002;
  260. switch (packetIdentifier)
  261. {
  262. case ID_READY_EVENT_UNSET:
  263. case ID_READY_EVENT_SET:
  264. case ID_READY_EVENT_ALL_SET:
  265. // if (doPrint) {if (packet->systemAddress.GetPort()==60002) RAKNET_DEBUG_PRINTF("FROM 60002: "); else if (rakPeerInterface->GetInternalID(UNASSIGNED_SYSTEM_ADDRESS).port==60002) RAKNET_DEBUG_PRINTF("TO 60002: "); RAKNET_DEBUG_PRINTF("ID_READY_EVENT_SET\n");}
  266. OnReadyEventPacketUpdate(packet);
  267. return RR_CONTINUE_PROCESSING;
  268. case ID_READY_EVENT_FORCE_ALL_SET:
  269. OnReadyEventForceAllSet(packet);
  270. return RR_CONTINUE_PROCESSING;
  271. case ID_READY_EVENT_QUERY:
  272. // if (doPrint) {if (packet->systemAddress.GetPort()==60002) RAKNET_DEBUG_PRINTF("FROM 60002: "); else if (rakPeerInterface->GetInternalID(UNASSIGNED_SYSTEM_ADDRESS).port==60002) RAKNET_DEBUG_PRINTF("TO 60002: "); RAKNET_DEBUG_PRINTF("ID_READY_EVENT_QUERY\n");}
  273. OnReadyEventQuery(packet);
  274. return RR_STOP_PROCESSING_AND_DEALLOCATE;
  275. }
  276. return RR_CONTINUE_PROCESSING;
  277. }
  278. bool ReadyEvent::AddToWaitListInternal(unsigned eventIndex, RakNetGUID guid)
  279. {
  280. ReadyEventNode *ren = readyEventNodeList[eventIndex];
  281. bool objectExists;
  282. unsigned systemIndex = ren->systemList.GetIndexFromKey(guid, &objectExists);
  283. if (objectExists==false)
  284. {
  285. RemoteSystem rs;
  286. rs.lastReceivedStatus=ID_READY_EVENT_UNSET;
  287. rs.lastSentStatus=ID_READY_EVENT_UNSET;
  288. rs.rakNetGuid=guid;
  289. ren->systemList.InsertAtIndex(rs,systemIndex, _FILE_AND_LINE_);
  290. SendReadyStateQuery(ren->eventId, guid);
  291. return true;
  292. }
  293. return false;
  294. }
  295. void ReadyEvent::OnReadyEventForceAllSet(Packet *packet)
  296. {
  297. RakNet::BitStream incomingBitStream(packet->data, packet->length, false);
  298. incomingBitStream.IgnoreBits(8);
  299. int eventId;
  300. incomingBitStream.Read(eventId);
  301. bool objectExists;
  302. unsigned readyIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists);
  303. if (objectExists)
  304. {
  305. ReadyEventNode *ren = readyEventNodeList[readyIndex];
  306. if (ren->eventStatus!=ID_READY_EVENT_FORCE_ALL_SET)
  307. {
  308. ren->eventStatus=ID_READY_EVENT_FORCE_ALL_SET;
  309. PushCompletionPacket(ren->eventId);
  310. }
  311. }
  312. }
  313. void ReadyEvent::OnReadyEventPacketUpdate(Packet *packet)
  314. {
  315. RakNet::BitStream incomingBitStream(packet->data, packet->length, false);
  316. incomingBitStream.IgnoreBits(8);
  317. int eventId;
  318. incomingBitStream.Read(eventId);
  319. bool objectExists;
  320. unsigned readyIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists);
  321. if (objectExists)
  322. {
  323. ReadyEventNode *ren = readyEventNodeList[readyIndex];
  324. bool systemExists;
  325. unsigned systemIndex = ren->systemList.GetIndexFromKey(packet->guid, &systemExists);
  326. if (systemExists)
  327. {
  328. // Just return if no change
  329. if (ren->systemList[systemIndex].lastReceivedStatus==packet->data[0])
  330. return;
  331. bool wasCompleted = IsEventCompletedByIndex(readyIndex);
  332. ren->systemList[systemIndex].lastReceivedStatus=packet->data[0];
  333. // If forced all set, doesn't matter what the new packet is
  334. if (ren->eventStatus==ID_READY_EVENT_FORCE_ALL_SET)
  335. return;
  336. UpdateReadyStatus(readyIndex);
  337. if (wasCompleted==false && IsEventCompletedByIndex(readyIndex))
  338. PushCompletionPacket(readyIndex);
  339. }
  340. }
  341. }
  342. void ReadyEvent::OnReadyEventQuery(Packet *packet)
  343. {
  344. RakNet::BitStream incomingBitStream(packet->data, packet->length, false);
  345. incomingBitStream.IgnoreBits(8);
  346. int eventId;
  347. incomingBitStream.Read(eventId);
  348. bool objectExists;
  349. unsigned readyIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists);
  350. if (objectExists)
  351. {
  352. unsigned systemIndex = readyEventNodeList[readyIndex]->systemList.GetIndexFromKey(packet->guid,&objectExists);
  353. // Force the non-default send, because our initial send may have arrived at a system that didn't yet create the ready event
  354. if (objectExists)
  355. SendReadyUpdate(readyIndex, systemIndex, true);
  356. }
  357. }
  358. void ReadyEvent::OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason )
  359. {
  360. (void) systemAddress;
  361. (void) rakNetGUID;
  362. (void) lostConnectionReason;
  363. RemoveFromAllLists(rakNetGUID);
  364. }
  365. void ReadyEvent::OnRakPeerShutdown(void)
  366. {
  367. Clear();
  368. }
  369. bool ReadyEvent::SetEventByIndex(int eventIndex, bool isReady)
  370. {
  371. ReadyEventNode *ren = readyEventNodeList[eventIndex];
  372. if ((ren->eventStatus==ID_READY_EVENT_ALL_SET || ren->eventStatus==ID_READY_EVENT_SET) && isReady==true)
  373. return false; // Success - no change
  374. if (ren->eventStatus==ID_READY_EVENT_UNSET && isReady==false)
  375. return false; // Success - no change
  376. if (ren->eventStatus==ID_READY_EVENT_FORCE_ALL_SET)
  377. return false; // Can't change
  378. if (isReady)
  379. ren->eventStatus=ID_READY_EVENT_SET;
  380. else
  381. ren->eventStatus=ID_READY_EVENT_UNSET;
  382. UpdateReadyStatus(eventIndex);
  383. // Check if now completed, and if so, tell the user about it
  384. if (IsEventCompletedByIndex(eventIndex))
  385. {
  386. PushCompletionPacket(ren->eventId);
  387. }
  388. return true;
  389. }
  390. bool ReadyEvent::IsEventCompletedByIndex(unsigned eventIndex) const
  391. {
  392. ReadyEventNode *ren = readyEventNodeList[eventIndex];
  393. unsigned i;
  394. if (ren->eventStatus==ID_READY_EVENT_FORCE_ALL_SET)
  395. return true;
  396. if (ren->eventStatus!=ID_READY_EVENT_ALL_SET)
  397. return false;
  398. for (i=0; i < ren->systemList.Size(); i++)
  399. if (ren->systemList[i].lastReceivedStatus!=ID_READY_EVENT_ALL_SET)
  400. return false;
  401. return true;
  402. }
  403. void ReadyEvent::Clear(void)
  404. {
  405. unsigned i;
  406. for (i=0; i < readyEventNodeList.Size(); i++)
  407. {
  408. RakNet::OP_DELETE(readyEventNodeList[i], _FILE_AND_LINE_);
  409. }
  410. readyEventNodeList.Clear(false, _FILE_AND_LINE_);
  411. }
  412. unsigned ReadyEvent::CreateNewEvent(int eventId, bool isReady)
  413. {
  414. ReadyEventNode *ren = RakNet::OP_NEW<ReadyEventNode>( _FILE_AND_LINE_ );
  415. ren->eventId=eventId;
  416. if (isReady==false)
  417. ren->eventStatus=ID_READY_EVENT_UNSET;
  418. else
  419. ren->eventStatus=ID_READY_EVENT_SET;
  420. return readyEventNodeList.Insert(eventId, ren, true, _FILE_AND_LINE_);
  421. }
  422. void ReadyEvent::UpdateReadyStatus(unsigned eventIndex)
  423. {
  424. ReadyEventNode *ren = readyEventNodeList[eventIndex];
  425. bool anyUnset;
  426. unsigned i;
  427. if (ren->eventStatus==ID_READY_EVENT_SET)
  428. {
  429. // If you are set, and no other systems are ID_READY_EVENT_UNSET, then change your status to ID_READY_EVENT_ALL_SET
  430. anyUnset=false;
  431. for (i=0; i < ren->systemList.Size(); i++)
  432. {
  433. if (ren->systemList[i].lastReceivedStatus==ID_READY_EVENT_UNSET)
  434. {
  435. anyUnset=true;
  436. break;
  437. }
  438. }
  439. if (anyUnset==false)
  440. {
  441. ren->eventStatus=ID_READY_EVENT_ALL_SET;
  442. }
  443. }
  444. else if (ren->eventStatus==ID_READY_EVENT_ALL_SET)
  445. {
  446. // If you are all set, and any systems are ID_READY_EVENT_UNSET, then change your status to ID_READY_EVENT_SET
  447. anyUnset=false;
  448. for (i=0; i < ren->systemList.Size(); i++)
  449. {
  450. if (ren->systemList[i].lastReceivedStatus==ID_READY_EVENT_UNSET)
  451. {
  452. anyUnset=true;
  453. break;
  454. }
  455. }
  456. if (anyUnset==true)
  457. {
  458. ren->eventStatus=ID_READY_EVENT_SET;
  459. }
  460. }
  461. BroadcastReadyUpdate(eventIndex, false);
  462. }
  463. void ReadyEvent::SendReadyUpdate(unsigned eventIndex, unsigned systemIndex, bool forceIfNotDefault)
  464. {
  465. ReadyEventNode *ren = readyEventNodeList[eventIndex];
  466. RakNet::BitStream bs;
  467. // I do this rather than write true or false, so users that do not use BitStreams can still read the data
  468. if ((ren->eventStatus!=ren->systemList[systemIndex].lastSentStatus) ||
  469. (forceIfNotDefault && ren->eventStatus!=ID_READY_EVENT_UNSET))
  470. {
  471. bs.Write(ren->eventStatus);
  472. bs.Write(ren->eventId);
  473. SendUnified(&bs, HIGH_PRIORITY, RELIABLE_ORDERED, channel, ren->systemList[systemIndex].rakNetGuid, false);
  474. ren->systemList[systemIndex].lastSentStatus=ren->eventStatus;
  475. }
  476. }
  477. void ReadyEvent::BroadcastReadyUpdate(unsigned eventIndex, bool forceIfNotDefault)
  478. {
  479. ReadyEventNode *ren = readyEventNodeList[eventIndex];
  480. unsigned systemIndex;
  481. for (systemIndex=0; systemIndex < ren->systemList.Size(); systemIndex++)
  482. {
  483. SendReadyUpdate(eventIndex, systemIndex, forceIfNotDefault);
  484. }
  485. }
  486. void ReadyEvent::SendReadyStateQuery(unsigned eventId, RakNetGUID guid)
  487. {
  488. RakNet::BitStream bs;
  489. bs.Write((MessageID)ID_READY_EVENT_QUERY);
  490. bs.Write(eventId);
  491. SendUnified(&bs, HIGH_PRIORITY, RELIABLE_ORDERED, channel, guid, false);
  492. }
  493. void ReadyEvent::RemoveFromAllLists(RakNetGUID guid)
  494. {
  495. unsigned eventIndex;
  496. for (eventIndex=0; eventIndex < readyEventNodeList.Size(); eventIndex++)
  497. {
  498. bool isCompleted = IsEventCompletedByIndex(eventIndex);
  499. bool systemExists;
  500. unsigned systemIndex;
  501. systemIndex = readyEventNodeList[eventIndex]->systemList.GetIndexFromKey(guid, &systemExists);
  502. if (systemExists)
  503. readyEventNodeList[eventIndex]->systemList.RemoveAtIndex(systemIndex);
  504. UpdateReadyStatus(eventIndex);
  505. if (isCompleted==false && IsEventCompletedByIndex(eventIndex))
  506. PushCompletionPacket(readyEventNodeList[eventIndex]->eventId);
  507. }
  508. }
  509. void ReadyEvent::PushCompletionPacket(unsigned eventId)
  510. {
  511. (void) eventId;
  512. // Not necessary
  513. /*
  514. // Pass a packet to the user that we are now completed, as setting ourselves to signaled was the last thing being waited on
  515. Packet *p = AllocatePacketUnified(sizeof(MessageID)+sizeof(int));
  516. RakNet::BitStream bs(p->data, sizeof(MessageID)+sizeof(int), false);
  517. bs.SetWriteOffset(0);
  518. bs.Write((MessageID)ID_READY_EVENT_ALL_SET);
  519. bs.Write(eventId);
  520. rakPeerInterface->PushBackPacket(p, false);
  521. */
  522. }
  523. #ifdef _MSC_VER
  524. #pragma warning( pop )
  525. #endif
  526. #endif // _RAKNET_SUPPORT_*
粤ICP备19079148号