Exemple #1
0
        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;
            }
        }
Exemple #2
0
 public void AddServerData(CarGoServer.ServerData serverData)
 {
     serverDatas.Add(serverData);
 }
Exemple #3
0
        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");
        }
Exemple #4
0
        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;
            }
        }