Clone of Akilla's ac2d @ https://github.com/deregtd/AC2D

cNetwork.h 7.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. #pragma once
  2. #include "cPacket.h"
  3. #include "cMessage.h"
  4. #include "cInterface.h"
  5. #include "cThread.h"
  6. #include "cObjectDB.h"
  7. #include "cCharInfo.h"
  8. #include "ChecksumXorGenerator.h"
  9. //Speed Consts
  10. const float sidestep_factor = 0.5f;
  11. const float backwards_factor = 0.64999998f;
  12. const float run_turn_factor = 1.5f;
  13. const float run_anim_speed = 4.0f;
  14. const float walk_anim_speed = 3.1199999f;
  15. const float sidestep_anim_speed = 1.25f;
  16. const float max_sidestep_anim_rate = 3.0f;
  17. //Server flags
  18. #define SF_CONNECTED (1 << 0)
  19. #define SF_CRCSEEDS (1 << 2)
  20. // timeout and interval settings
  21. // Connection attempt timeout
  22. #define TIMEOUT_MS 1000
  23. // Interval between ack messages sent by us
  24. #define ACK_INTERVAL_MS 2000
  25. //enum OptionalHeaderFlags
  26. //{
  27. // kDisposable = 0x00000001, // this header may be removed from a retransmission
  28. // kExclusive = 0x00000002, // a packet with this header has its own sequence number
  29. // kNotConn = 0x00000004, // this header is sent before connect request/reply handshake completes
  30. // kTimeSensitive = 0x00000008,
  31. // kShouldPiggyBack = 0x00000010, // this header should ride along in a packet with others headers and content
  32. // kHighPriority = 0x00000020,
  33. // kCountsAsTouch = 0x00000040,
  34. // kEncrypted = 0x20000000, // a packet with this header has its checksum encrypted
  35. // kSigned = 0x40000000
  36. //};
  37. /* server authentication type */
  38. enum NetAuthType
  39. {
  40. kAuthUndef = 0x00000000,
  41. kAuthAccount = 0x00000001,
  42. kAuthAccountPassword = 0x00000002,
  43. kAuthGlsTicket = 0x40000002
  44. };
  45. enum PacketFlags
  46. {
  47. kRetransmission = 0x00000001,
  48. kEncryptedChecksum = 0x00000002,
  49. kBlobFragments = 0x00000004, // Packet contains a fragment of a larger blob. All world packets are blob fragments.
  50. kServerSwitch = 0x00000100, // CServerSwitchStruct (60, kHighPriority|kCountsAsTouch)
  51. kLogonServerAddr = 0x00000200, // CLogonRouteHeader (sockaddr_in) (7, kDisposable|kExclusive|kNotConn)
  52. kEmptyHeader1 = 0x00000400, // EmptyHeader (7, kDisposable|kExclusive|kNotConn)
  53. kReferral = 0x00000800, // CReferralStruct (40000062, kExclusive|kHighPriority|kCountsAsTouch|kSigned)
  54. kRequestRetransmit = 0x00001000, // SeqIDList (33, kDisposable|kExclusive|kShouldPiggyBack|kHighPriority)
  55. kRejectRetransmit = 0x00002000, // SeqIDList (33, kDisposable|kExclusive|kShouldPiggyBack|kHighPriority)
  56. kAckSequence = 0x00004000, // CPakHeader (unsigned long) (1, kDisposable)
  57. kDisconnect = 0x00008000, // EmptyHeader (3, kDisposable|kExclusive)
  58. kLogon = 0x00010000, // CLogonHeader (?)
  59. kReferred = 0x00020000, // uint64_t (7, kDisposable|kExclusive|kNotConn)
  60. kConnectRequest = 0x00040000, // CConnectHeader (?)
  61. kConnectResponse = 0x00080000, // uint64_t (20000007, kDisposable|kExclusive|kNotConn|kEncrypted)
  62. kNetError1 = 0x00100000, // PackObjHeader<NetError> (7, kDisposable|kExclusive|kNotConn)
  63. kNetError2 = 0x00200000, // PackObjHeader<NetError> (2, kExclusive)
  64. kCICMDCommand = 0x00400000, // CICMDCommandStruct (7, kDisposable|kExclusive|kNotConn)
  65. kTimeSync = 0x01000000, // CTimeSyncHeader (?)
  66. kEchoRequest = 0x02000000, // CEchoRequestHeader (?)
  67. kEchoResponse = 0x04000000, // CEchoResponseHeader (?)
  68. kFlow = 0x08000000 // CFlowStruct (10, kShouldPiggyBack)
  69. };
  70. struct stServerInfo {
  71. SOCKADDR_IN m_saServer;
  72. std::list <cPacket *> m_lSentPackets;
  73. std::list <cMessage *> m_lIncomingMessages;
  74. DWORD m_dwSendSequence;
  75. WORD m_wLogicalID;
  76. WORD m_wTable;
  77. WORD m_wBasePort;
  78. QWORD m_qwCookie;
  79. //Tracking our received packets
  80. // Last received packet sequence number in sequence (does not increment if out of sequence)
  81. DWORD m_dwRecvSequence;
  82. //Logical
  83. DWORD m_dwConnectAttempts;
  84. //Time based stuff
  85. DWORD m_dwLastPacketAck;
  86. DWORD m_dwLastConnectAttempt;
  87. DWORD m_dwLastPacketSent;
  88. DWORD m_dwLastPing;
  89. DWORD m_dwLastSyncSent;
  90. DWORD m_dwLastSyncRecv;
  91. double m_flServerTime; //At our last sync, this was the server's time
  92. //Flags to determine our status/phase
  93. DWORD m_dwFlags;
  94. // the rng used to generate xor values for server packets
  95. ChecksumXorGenerator *serverXorGen;
  96. // the rng used to generate xor values for client packets
  97. ChecksumXorGenerator *clientXorGen;
  98. };
  99. class cNetwork : public cThread {
  100. public:
  101. cNetwork();
  102. ~cNetwork();
  103. void SetInterface(cInterface *Interface);
  104. void SetObjectDB(cObjectDB *ObjectDB);
  105. void SetCharInfo(cCharInfo *CharInfo);
  106. void SendLSGameEvent(cPacket *Packet, WORD wGroup);
  107. void SendWSGameEvent(cPacket *Packet, WORD wGroup);
  108. void SendLSMessage(cPacket *Packet, WORD wGroup);
  109. void SendWSMessage(cPacket *Packet, WORD wGroup);
  110. void SendLSPacket(cPacket *Packet, bool IncludeSeq, bool IncrementSeq);
  111. void SendPacket(cPacket *Packet, stServerInfo *Target, bool IncludeSeq, bool IncrementSeq);
  112. void SendLostPacket(int iSendSequence, stServerInfo *Target);
  113. void SendPacket(cPacket *Packet, stServerInfo *Target);
  114. void SendAckPacket(stServerInfo *Server);
  115. void ProcessFragment(cByteStream* stream, stServerInfo *Server);
  116. void ProcessPacket(cPacket *Packet, stServerInfo *Server);
  117. void ProcessWSPacket(cPacket *Packet, stServerInfo *Server);
  118. void ProcessMessage(cMessage *Msg, stServerInfo *Server);
  119. void ServerLoginError(DWORD Error);
  120. void ServerCharacterError(DWORD Error);
  121. void ServerCharCreateError(DWORD Error);
  122. void Run();
  123. void Stop();
  124. void CheckPings();
  125. void PingServer(stServerInfo *Server);
  126. void SyncServer(stServerInfo *Server);
  127. void SendDDDInterrogationResponse();
  128. void SendDDDEndMessage();
  129. void SendEnterWorldRequest(DWORD GUID);
  130. void SendEnterWorldMessage(DWORD GUID, char *account);
  131. void DownloadLandblock(DWORD Landblock);
  132. void SendPositionUpdate(stLocation *Location, stMoveInfo *MoveInfo);
  133. void SendAnimUpdate(int iFB, int iStrafe, int iTurn, bool bRunning);
  134. void SetCombatMode(bool CombatMode);
  135. void CastSpell(DWORD Target, DWORD Spell);
  136. void SendAllegianceRecall();
  137. void SendHouseRecall();
  138. void SendLifestoneRecall();
  139. void SendMarketplaceRecall();
  140. void SendPublicMessage(std::string & Message);
  141. void SendTell(std::string & Name, std::string & Message);
  142. void SendTell(DWORD dwGUID, std::string & Message);
  143. void UseItem(DWORD Item, DWORD Target = 0);
  144. void SendHouseInfoQuery();
  145. void RequestAllegianceUpdate();
  146. void Reset();
  147. void Connect();
  148. void Disconnect();
  149. void CloseConnection(stServerInfo *Server);
  150. stServerInfo * AddWorldServer(SOCKADDR_IN NewServer);
  151. void SetActiveWorldServer(SOCKADDR_IN NewServer);
  152. void DumpWorldServerList();
  153. void SendMaterialize();
  154. private:
  155. void SendConnectResponse();
  156. cInterface *m_Interface;
  157. cObjectDB *m_ObjectDB;
  158. cCharInfo *m_CharInfo;
  159. WORD GetTime();
  160. SOCKET m_sSocket;
  161. DWORD m_dwStartTicks;
  162. int iConnPacketCount;
  163. DWORD m_dwFragmentSequenceOut;
  164. DWORD m_dwGameEventOut;
  165. stServerInfo m_siLoginServer;
  166. std::list <stServerInfo> m_siWorldServers;
  167. stServerInfo * m_pActiveWorld;
  168. BYTE m_zTicketSize;
  169. BYTE m_zTicket[0x100];
  170. char m_zTicketKey[100];
  171. char m_zAccountName[40];
  172. char m_zPassword[100];
  173. DWORD m_dwGUIDLogin;
  174. WORD f74ccount;
  175. bool bPortalMode;
  176. // Cache Tell ids
  177. std::map< std::string, DWORD > m_treeNameIDCache;
  178. };