Exemple #1
0
        public void Broadcast(Packet packet, NetDeliveryMethod delivery)
        {
            PacketLog.LogSend(packet);

            Network.ProcessPacket(packet, 0);

            var msg = packet.GetMessage(Server);

            Server.SendToAll(msg, delivery);
        }
Exemple #2
0
        public void Start()
        {
            NetPeerConfiguration config = new NetPeerConfiguration("MulTUNG");

            config.Port         = (int)Configuration.Get <long>("ServerPort", 5678);
            config.LocalAddress = IPAddress.Parse(Configuration.Get("LocalServerIP", "127.0.0.1"));
            config.EnableMessageType(NetIncomingMessageType.ConnectionApproval);

            Server = new NetServer(config);
            Server.Start();

            Network.IsServer = true;

            ThreadPool.QueueUserWorkItem(_ =>
            {
                NetIncomingMessage msg;
                while (Server != null)
                {
                    msg = Server.WaitMessage(int.MaxValue);

                    if (msg == null)
                    {
                        continue;
                    }

                    HandleMessage(msg);

                    Server.Recycle(msg);
                }
            });

            World.AddNetObjects();
            World.LoadCircuitState();

            Network.StartPositionUpdateThread(Constants.PositionUpdateInterval);

            Log.WriteLine("Listening on port " + config.Port);
        }
Exemple #3
0
        private void HandleMessage(NetIncomingMessage msg)
        {
            switch (msg.MessageType)
            {
            case NetIncomingMessageType.ConnectionApproval:
                string  verStr = msg.ReadString();
                Version ver    = new Version(verStr);

                if (ver == MulTUNG.MulTUNG.Version)
                {
                    msg.SenderConnection.Approve();

                    string username = msg.ReadString().Trim();

                    if (!Players.Any(o => o.Value.Username.Equals(username)))
                    {
                        IGConsole.Log($"{username.Length} {MaxUsernameLength}");
                        if (username.Length < MaxUsernameLength)
                        {
                            msg.SenderConnection.Approve();
                        }
                        else
                        {
                            msg.SenderConnection.Deny($"your username must be shorter than {MaxUsernameLength} characters.");
                        }
                    }
                    else
                    {
                        msg.SenderConnection.Deny("someone is already using that username.");
                    }
                }
                else
                {
                    msg.SenderConnection.Deny($"wrong MulTUNG version, server has v{MulTUNG.MulTUNG.Version}.");
                }

                break;

            case NetIncomingMessageType.Data:
                var packet = PacketDeserializer.DeserializePacket(new MessagePacketReader(msg));

                if (packet.SenderID == Network.ServerPlayerID)
                {
                    break;
                }

                PacketLog.LogReceive(packet);

                if (packet.ShouldBroadcast)
                {
                    Broadcast(packet, packet.ReliableBroadcast ? NetDeliveryMethod.ReliableOrdered : NetDeliveryMethod.UnreliableSequenced);
                }
                else
                {
                    Network.ProcessPacket(packet, Network.ServerPlayerID);
                }

                break;

            case NetIncomingMessageType.StatusChanged:
                var status = (NetConnectionStatus)msg.ReadByte();

                if (status == NetConnectionStatus.Connected)
                {
                    int id = PlayerIdCounter++;

                    msg.SenderConnection.SendMessage(new PlayerWelcomePacket
                    {
                        YourID         = id,
                        ServerUsername = Network.Username,
                        Players        = Players.Select(o => new Tuple <int, string>(o.Key, o.Value.Username)).ToList()
                    }.GetMessage(Server), NetDeliveryMethod.ReliableOrdered, 0);

                    var player = new Player(id, msg.SenderConnection);

                    Log.WriteLine("Connected player " + player.ID);

                    Players.Add(id, player);
                }
                else if (status == NetConnectionStatus.Disconnected)
                {
                    var player = Players.SingleOrDefault(o => o.Value.Connection == msg.SenderConnection);

                    Players.Remove(player.Key);
                    PlayerManager.WaveGoodbye(player.Key);
                }

                break;
            }
        }