public void Broadcast(Packet packet, NetDeliveryMethod delivery) { PacketLog.LogSend(packet); Network.ProcessPacket(packet, 0); var msg = packet.GetMessage(Server); Server.SendToAll(msg, delivery); }
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); }
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; } }