public void ParseUnconnectedMessage(NetIncomingMessage im) { var type = (MessageType)im.ReadByte(); if (type == MessageType.ServerInList) { long key = im.ReadInt64(); CarGoServer.ServerData serverData = new CarGoServer.ServerData(); im.ReadAllFields(serverData); game.lobbySearch.AddServerData(serverData); } if (type == MessageType.ServerOnline) { networkThread.serverRunning = true; } }
public void AddServerData(CarGoServer.ServerData serverData) { serverDatas.Add(serverData); }
static void Main(string[] args) { Dictionary <long, CarGoServer.ServerData> registeredHosts = new Dictionary <long, CarGoServer.ServerData>(); NetPeerConfiguration config = new NetPeerConfiguration("masterserver"); config.SetMessageTypeEnabled(NetIncomingMessageType.UnconnectedData, true); config.Port = CommonConstants.MasterServerPort; NetPeer peer = new NetPeer(config); peer.Start(); // keep going until ESCAPE is pressed Console.WriteLine("Press ESC to quit"); while (!Console.KeyAvailable || Console.ReadKey().Key != ConsoleKey.Escape) { NetIncomingMessage msg; while ((msg = peer.ReadMessage()) != null) { switch (msg.MessageType) { case NetIncomingMessageType.UnconnectedData: // // We've received a message from a client or a host // // by design, the first byte always indicates action switch ((MasterServerMessageType)msg.ReadByte()) { case MasterServerMessageType.RegisterHost: // It's a host wanting to register its presence var id = msg.ReadInt64(); // server unique identifier //var name = msg.ReadString(); CarGoServer.ServerData serverData = new CarGoServer.ServerData(); msg.ReadAllFields(serverData); IPAddress address; IPAddress.TryParse(serverData.localAddress, out address); IPEndPoint hostEndPoint = new IPEndPoint(address, serverData.serverPort); Console.WriteLine("Got registration for host " + id); registeredHosts[id] = serverData; break; case MasterServerMessageType.RequestHostList: // It's a client wanting a list of registered hosts //Console.WriteLine("Sending list of " + registeredHosts.Count + " hosts to client " + msg.SenderEndPoint); foreach (var hostData in registeredHosts) { if (hostData.Value.showInServerList) { // send registered host to client //Console.WriteLine("sending " + hostData.Value.serverName); NetOutgoingMessage om = peer.CreateMessage(); om.Write((byte)CarGo.Network.MessageType.ServerInList); om.Write(hostData.Key); om.WriteAllFields(hostData.Value); peer.SendUnconnectedMessage(om, msg.SenderEndPoint); } } break; case MasterServerMessageType.RequestIntroduction: // It's a client wanting to connect to a specific (external) host IPEndPoint clientInternal = msg.ReadIPEndPoint(); long hostId = msg.ReadInt64(); string token = msg.ReadString(); Console.WriteLine(msg.SenderEndPoint + " requesting introduction to " + hostId + " (token " + token + ")"); // find in list IPEndPoint[] elist; CarGoServer.ServerData data; long publicAddress; IPAddress localAddress; if (registeredHosts.TryGetValue(hostId, out data)) { IPAddress.TryParse(data.localAddress, out localAddress); if (long.TryParse(data.publicAddress, out publicAddress)) { // found in list - introduce client and host to eachother Console.WriteLine("Sending introduction..."); peer.Introduce( new IPEndPoint(localAddress, data.serverPort), // host internal new IPEndPoint(publicAddress, data.serverPort), // host external clientInternal, // client internal msg.SenderEndPoint, // client external token // request token ); } } else { Console.WriteLine("Client requested introduction to nonlisted host!"); } break; case MasterServerMessageType.GetHostByCode: CarGoServer.ServerData serverData1; if (registeredHosts.TryGetValue(msg.ReadInt64(), out serverData1)) { NetOutgoingMessage om = peer.CreateMessage(); om.Write((byte)CarGo.Network.MessageType.ReceiveServerAddress); om.WriteAllFields(serverData1); peer.SendUnconnectedMessage(om, msg.SenderEndPoint); } else { Console.WriteLine("Code not correct"); } break; } break; case NetIncomingMessageType.DebugMessage: case NetIncomingMessageType.VerboseDebugMessage: case NetIncomingMessageType.WarningMessage: case NetIncomingMessageType.ErrorMessage: // print diagnostics message Console.WriteLine(msg.ReadString()); break; } } } peer.Shutdown("shutting down"); }
public void ParseMessage(NetIncomingMessage im) { //Parse and Apply all Changes var del = im.ReadByte(); var type = im.ReadByte(); CarGoServer.ServerData serverData = new CarGoServer.ServerData(); switch ((MessageType)type) { case MessageType.GameState: GameState newState = (GameState)im.ReadByte(); StateMachine.Instance.RemoteChangeState(newState); //Update GameState break; case MessageType.ObjectUpdate: var objectMessageType = (ObjectMessageType)im.ReadByte(); var objectID = im.ReadInt32(); Vector2 center; int clientID; switch (objectMessageType) { case ObjectMessageType.PlayerSpawn: clientID = im.ReadInt32(); center = XNAExtensions.ReadVector2(im); CarType carType = (CarType)im.ReadByte(); CarFrontType carFrontType = (CarFrontType)im.ReadByte(); AbilityType abilityType = (AbilityType)im.ReadByte(); scene.RemoteAddPlayer(clientID, center, objectID, carType, carFrontType, abilityType, lobbyOnline.GetOnlinePlayer(clientID)); break; case ObjectMessageType.Spawn: EntityType entityType = (EntityType)im.ReadByte(); center = XNAExtensions.ReadVector2(im); scene.RemoteAddEntity(entityType, center, objectID); break; case ObjectMessageType.Despawn: scene.RemoteRemoveEntity(objectID); break; case ObjectMessageType.UpdatePosition: center = XNAExtensions.ReadVector2(im); float rotation = im.ReadFloat(); Vector2 velocity = XNAExtensions.ReadVector2(im); scene.RemoteUpdatePosition(objectID, center, rotation, velocity); break; case ObjectMessageType.StateChange: break; case ObjectMessageType.UpdateHitpoints: int newHitpoints = im.ReadInt32(); scene.RemoteUpdateHitpoints(objectID, newHitpoints); break; } break; case MessageType.ReceiveClientNumber: clientID = im.ReadInt32(); ID_Manager.Instance.ClientNumber = clientID; lobbyOnline.AddOnlinePlayer(Settings.Instance.PlayerName, clientID, PreferredInput.Instance.GetPreferredInput); break; case MessageType.IntroduceClient: clientID = im.ReadInt32(); var clientName = im.ReadString(); lobbyOnline.AddOnlinePlayer(clientName, clientID, InputController.Remote); //create new onlinePlayer for Lobby break; case MessageType.MenuInput: Menu currentmenu = game.GetCurrentMenu(); clientID = im.ReadInt32(); currentmenu.RemoteInput((InputType)im.ReadByte(), clientID); break; case MessageType.ReceiveServerInfo: im.ReadAllFields(serverData); //string serverName = im.ReadString(); //string address = im.ReadString() + ":" + networkThread.port;//im.SenderEndPoint.ToString(); lobbyOnline.serverData = serverData; break; case MessageType.PlayerReady: clientID = im.ReadInt32(); lobbyOnline.SetPlayerReady(clientID); break; case MessageType.Chat: string message = im.ReadString(); game.menuPause.AddChatMessage(message); break; case MessageType.ServerInList: long key = im.ReadInt64(); serverData = new CarGoServer.ServerData(); im.ReadAllFields(serverData); game.lobbySearch.AddServerData(serverData); break; case MessageType.ReceiveServerAddress: break; } }