Guest User

Untitled

a guest
Sep 12th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.35 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Net;
  6. using System.Net.Sockets;
  7. using System.IO;
  8. using System.Collections;
  9. using ProtoBuf;
  10. using UnnamedGameServer;
  11. using System.Threading;
  12. using Lidgren.Network;
  13.  
  14. namespace Unnamed_game
  15. {
  16. using UnnamedGameServer;
  17.  
  18. class Connection
  19. {
  20. public struct UserInformation
  21. {
  22. public string Username;
  23. public int UserID;
  24. }
  25.  
  26. static private Connection instance;
  27.  
  28. private Connection()
  29. {
  30. netConfig = new NetPeerConfiguration(SharedConstants.ServerInfo.AppIdentifier);
  31. netConfig.EnableMessageType(NetIncomingMessageType.Data);
  32. client = new NetClient(netConfig);
  33. header = new PacketHeader();
  34. _isLoggedCharacter = false;
  35. _isLoggedUser = false;
  36. magicByte = SharedConstants.ServerInfo.MagicByte;
  37. }
  38.  
  39. // properties
  40. NetClient client;
  41. NetConnection serverConnection;
  42. NetPeerConfiguration netConfig;
  43. PacketHeader header;
  44. Thread serverCommThread;
  45. byte[] magicByte;
  46. bool _isLoggedCharacter;
  47. CharacterInformation chInformation
  48. {
  49. get
  50. {
  51. return Player.Instance().Information;
  52. }
  53. }
  54. bool _isLoggedUser;
  55. public UserInformation Information;
  56.  
  57. // methods
  58. static public Connection Instance()
  59. {
  60. if(instance == null)
  61. {
  62. instance = new Connection();
  63. return instance;
  64. }
  65. else
  66. {
  67. return instance;
  68. }
  69. }
  70. public void ConnectServer()
  71. {
  72. this.ConnectServer(new IPEndPoint(UnnamedGameServer.SharedConstants.ServerInfo.ServerAddress, UnnamedGameServer.SharedConstants.ServerInfo.Port));
  73. }
  74. /// <summary>
  75. /// Should never be used. Use the parameterless one to get the server address and information. It doesn't use try-catch, the exception handling should be done on Game1.Initialize()
  76. /// </summary>
  77. public void ConnectServer(IPEndPoint endPoint)
  78. {
  79. lock (this)
  80. {
  81. if (client.ServerConnection != null)
  82. {
  83. return;
  84. }
  85. else
  86. {
  87. client.Start();
  88. serverConnection = client.Connect(endPoint);
  89. //if (serverConnection.Status != NetConnectionStatus.Connected)
  90. //{
  91. // // error connection
  92. // throw new Exception("Cannot connect to server");
  93. //}
  94. serverCommThread = new Thread(HandleServerCommunication);
  95. serverCommThread.Start();
  96. }
  97. }
  98. }
  99. private void HandleServerCommunication()
  100. {
  101. if (client == null)
  102. {
  103. throw new Exception("The NetClient is null");
  104. }
  105. else
  106. {
  107. while (true)
  108. {
  109. PacketHeaderResponse header = new PacketHeaderResponse();
  110. client.MessageReceivedEvent.WaitOne();
  111. var msg = client.ReadMessage();
  112. using (MemoryStream stream = new MemoryStream(msg.Data))
  113. {
  114. switch (msg.MessageType)
  115. {
  116. case NetIncomingMessageType.Data:
  117. header = Serializer.DeserializeWithLengthPrefix<PacketHeaderResponse>(stream, PrefixStyle.Base128);
  118. if (header.type < SharedConstants.Packets.ActionTypeUserStart) // meta
  119. {
  120. switch ((ActionTypeMeta)header.type)
  121. {
  122. case ActionTypeMeta.Connect:
  123. HandleConnect(Serializer.DeserializeWithLengthPrefix<PacketConnectResponse>(stream, PrefixStyle.Base128));
  124. break;
  125. }
  126. }
  127. else if (header.type < SharedConstants.Packets.ActionTypeCharStart) // user
  128. {
  129. }
  130. else // char
  131. {
  132. }
  133. break;
  134. case NetIncomingMessageType.DebugMessage:
  135. string mess = msg.ReadString();
  136. break;
  137. case NetIncomingMessageType.StatusChanged:
  138. NetConnectionStatus asklasf = (NetConnectionStatus)msg.ReadByte();
  139. break;
  140. case NetIncomingMessageType.WarningMessage:
  141. string mess2 = msg.ReadString();
  142. client.Recycle(msg);
  143. break;
  144. }
  145. }
  146. }
  147. }
  148. }
  149. /// <summary>
  150. /// This method doesn't check for permissions/priviledges. should check in other methods if you have enough priviledges to do what you plan to do
  151. /// </summary>
  152. private void SendPacket(short actionType, object packetStruct, NetDeliveryMethod method)
  153. {
  154. header.ActionTypeNumber = (short)actionType;
  155. NetOutgoingMessage msg = client.CreateMessage();
  156.  
  157. using (MemoryStream stream = new MemoryStream())
  158. {
  159. Serializer.SerializeWithLengthPrefix<PacketHeader>(stream, header, PrefixStyle.Base128);
  160. if (actionType < SharedConstants.Packets.ActionTypeUserStart) // meta action
  161. {
  162. switch ((ActionTypeMeta)actionType)
  163. {
  164. case ActionTypeMeta.Connect:
  165. Serializer.SerializeWithLengthPrefix<PacketConnect>(stream, (PacketConnect)packetStruct, PrefixStyle.Base128);
  166. break;
  167. }
  168. }
  169. else if (actionType < SharedConstants.Packets.ActionTypeCharStart) // user action
  170. {
  171. }
  172. else // user action
  173. {
  174. }
  175. msg.Write(stream.ToArray());
  176. client.SendMessage(msg, method);
  177. }
  178. }
  179. public void CreateNewCharacter(string characterName, CharacterClass chClass, CharacterRace chRace)
  180. {
  181. var info = new NewCharacterInfo();
  182. info.Name = characterName;
  183. info.OwnerUsername = Information.Username;
  184. info.Class = chClass;
  185. info.Race = chRace;
  186. CreateNewCharacter(info);
  187. }
  188. public void CreateNewCharacter(NewCharacterInfo info)
  189. {
  190. var packet = new PacketCreateNewCharacter();
  191. packet.chInfo = info;
  192. SendPacket((short)ActionTypeUser.CreateNewCharacter, packet, NetDeliveryMethod.ReliableUnordered);
  193. }
  194. public void ConnectUser(string username, string unhashedPassword)
  195. {
  196. var packet = new PacketConnect();
  197. packet.Username = username;
  198. packet.UnhashedPassword = unhashedPassword;
  199. ConnectUser(packet);
  200. }
  201. public void ConnectUser(PacketConnect packet)
  202. {
  203. if (_isLoggedUser)
  204. {
  205. return;
  206. }
  207. else
  208. {
  209. SendPacket((short)ActionTypeMeta.Connect, packet, NetDeliveryMethod.ReliableUnordered);
  210. }
  211. }
  212. public void ConnectCharacter(string characterName, short serverID)
  213. {
  214. var packet = new PacketLoginCharacter();
  215. packet.CharacterName = characterName;
  216. packet.ServerID = serverID;
  217. ConnectCharacter(packet);
  218. }
  219. public void ConnectCharacter(PacketLoginCharacter packet)
  220. {
  221. if (_isLoggedCharacter || !_isLoggedUser)
  222. {
  223. return;
  224. }
  225. else
  226. {
  227. SendPacket((short)ActionTypeUser.LoginCharacter, packet, NetDeliveryMethod.ReliableUnordered);
  228. }
  229. }
  230. public void Disconnect(PacketDisconnect packet)
  231. {
  232. if (!_isLoggedUser)
  233. {
  234. return;
  235. }
  236. else
  237. {
  238. SendPacket((short)ActionTypeMeta.Disconnect, packet, NetDeliveryMethod.ReliableUnordered);
  239. }
  240. }
  241.  
  242. // incoming packet manipulation
  243. private void HandleConnect(PacketConnectResponse packet)
  244. {
  245. if (packet.Successfully)
  246. {
  247. // login successful
  248. return;
  249. }
  250. else
  251. {
  252. // invalid data
  253. return;
  254. }
  255. }
  256. }
  257. }
Add Comment
Please, Sign In to add comment