public ServerPacket(byte[] binaryServerPacket)
 {
     this.packetIdField = new PacketIdCounter( BitConverter.ToUInt16(binaryServerPacket, 2));
     int playerNumber = BitConverter.ToUInt16(binaryServerPacket, 4);
     this.timestampField = DateTime.FromBinary(BitConverter.ToInt64(binaryServerPacket, 6));
     this.playerInfoListField = new List<PlayerInfo>();
     int positionIn = 14;
     for (int i = 0; i < playerNumber; i++)
     {
         PlayerInfo info = new PlayerInfo(binaryServerPacket, positionIn);
         positionIn += info.ByteCount;
         playerInfoListField.Add(info);
     }
 }
 public static PlayerInfo TranslateBetweenClientPacketAndPlayerInfo(ClientPacket from)
 {
     PlayerInfo to = new PlayerInfo();
     to.PlayerCarringWeponOne = from.PlayerCarringWeponOne;
     to.PlayerCarringWeponTwo = from.PlayerCarringWeponTwo;
     to.PlayerDucking = from.PlayerDucking;
     to.PlayerId = from.PlayerId;
     to.PlayerJumping = from.PlayerJumping;
     to.PlayerLookingDirection = from.PlayerLookingDirection;
     to.PlayerMovementDirection = from.PlayerMovementDirection;
     to.PlayerPosition = from.PlayerPosition;
     //to.PlayerRunning = from.PlayerRunning;
     to.PlayerShooting = from.PlayerShooting;
     //to.PlayerWalking = from.PlayerWalking;
     to.Timestamp = from.TimeStamp;
     return to;
 }
        /// <summary>
        /// Starts local game, it also starts broadcasting game info all over network
        /// </summary>
        /// <param name="gameOptions"> game parameters</param>
        /// <param name="dedicatedServer">is server going to be dedicated</param>
        /// <param name="Me">if server is not dedicated - playerData is needed</param>
        /// <returns>Server Adress or null if error occured</returns>
        public IPEndPoint StartLANServer(GameOptions gameOptions,bool dedicatedServer,Interfaces.IPlayerMe Me)
        {
            try
            {
                if(lanBroadcast == null)
                lanBroadcast = new ServerLanBroadcast();
                Usefull.PlayerMe me = (Usefull.PlayerMe)Me;
                PlayerStatus ps = new PlayerStatus();
                lock (gameInfoPacketLock)
                {
                    Random rand = new Random(gameOptions.GetHashCode());
                    gameInfoPacket.GameId = (ushort)rand.Next(1000, 9999);
                    gameInfoPacket.GameType = gameOptions.GameType;
                    gameInfoPacket.Limit = gameOptions.GameLimit;
                    gameInfoPacket.PlayerStatusList = new List<PlayerStatus>();
                    gameInfoPacket.RoundNumber = 1;
                    if (!dedicatedServer && me != null)
                    {
                        ps.PlayerId = (ushort)rand.Next(1000, 9999);
                        ps.PlayerName = (string) me.PlayerName.Clone();
                        if (me.PlayerTeam == gameOptions.TeamOneName)
                            ps.PlayerTeam = 13;
                        else
                            ps.PlayerTeam = 39;

                        if (clientForServer == null)
                        {
                            clientForServer = new ClientForServer();
                            clientForServer.AddMessageToServer += new ClientForServer.AddMessageDelegate(clientForServer_AddMessageToServer);
                            clientForServer.EndGameEvent += new EventHandler(clientForServer_EndGameEvent);
                        }
                        clientForServer.JoinGame(ps.PlayerId, gameInfoPacket.GameId, ps.PlayerName, ps.PlayerTeam);
                        gameInfoPacket.PlayerStatusList.Add(ps);
                    }

                    gameInfoPacket.TeamScoreList = new List<TeamData>();
                    TeamData ts1 = new TeamData(13, gameOptions.TeamOneName);
                    TeamData ts2 = new TeamData(39, gameOptions.TeamTwoName);
                    gameInfoPacket.ServerAddress = base.ServerIpAdress;
                    gameInfoPacket.TeamScoreList.Add(ts1);
                    gameInfoPacket.TeamScoreList.Add(ts2);
                    gameInfoPacketSendCounter = 0;
                }
                if (!dedicatedServer && me != null)
                {
                    lock (serverPacketLock)
                    {
                        PlayerInfo pi = new PlayerInfo();
                        pi.PlayerId = ps.PlayerId;
                        serverPacket.PlayerInfoList.Add(pi);
                    }
                }

                timer.Change(0, _TimerTickPeriod);
                return base.Start();
            }
            catch (Exception ex)
            {
                Diagnostic.NetworkingDiagnostics.Logging.Fatal("StartLanServer S", ex);
            }
            return null;
        }
        private void myUdpServer_MessageWasReceivedEvent(object sender, EventArgs e)
        {
            UDPPacketBuffer buff = sender as UDPPacketBuffer;

            if (buff != null)
            {
                try
                {
                    Interfaces.IPacket packet = PacketTypeChecker.GetPacket(buff.Data);
                    if (packet != null)
                    {
                        switch (packet.PacketType)
                        {
                            case PacketTypeEnumeration.PingResponse :
                                DateTime received = DateTime.Now;
                                TimeSpan span = received.Subtract(packet.TimeStamp);
                                Packets.PingResponsePacket pingResponsePacket = (Packets.PingResponsePacket)packet;
                                lock (gameInfoPacketLock)
                                {
                                    for (int i = 0; i < gameInfoPacket.PlayerStatusList.Count; i++)
                                    {
                                        if (gameInfoPacket.PlayerStatusList[i].PlayerId == pingResponsePacket.PlayerId)
                                        {
                                            gameInfoPacket.PlayerStatusList[i].PlayerPing = (ushort)span.TotalMilliseconds;
                                            break;
                                        }
                                    }
                                }
                                break;
                            case (PacketTypeEnumeration.JoinPacket):
                                JoinPacket joinPacket = (JoinPacket)packet;
                                ushort id = 0;
                                lock (gameInfoPacketLock)
                                {
                                    // quit if this is join for other game
                                    if (gameInfoPacket.GameId != joinPacket.GameId)
                                        return;

                                    bool newPlayer = true;
                                    // id smaller then 1000 means that new player without id
                                    if (joinPacket.PlayerId < 1000)
                                        for (int i = 0; i < gameInfoPacket.PlayerStatusList.Count; i++)
                                        {
                                            if (gameInfoPacket.PlayerStatusList[i].PlayerId == joinPacket.PlayerId)
                                            {
                                                // we already have this player
                                                newPlayer = false;
                                                // we update playerName
                                                gameInfoPacket.PlayerStatusList[i].PlayerName = joinPacket.PlayerName;
                                                // change team request
                                                gameInfoPacket.PlayerStatusList[i].PlayerTeam = joinPacket.TeamId;
                                                break;
                                            }
                                        }
                                    // we need to add new player to gameInformation
                                    if (newPlayer)
                                    {
                                        PlayerStatus ps = new PlayerStatus();
                                        Random rand = new Random(joinPacket.PlayerName.GetHashCode());
                                        id = (ushort)rand.Next(1000, 9999);

                                        bool newPlayerOk = true;
                                        List<ushort> idList = new List<ushort>();

                                        for (int i = 0; i < gameInfoPacket.PlayerStatusList.Count; i++)
                                        {
                                            idList.Add(gameInfoPacket.PlayerStatusList[i].PlayerId);
                                            if (gameInfoPacket.PlayerStatusList[i].PlayerName == joinPacket.PlayerName)
                                                newPlayerOk = false;
                                        }
                                        if (!newPlayerOk)
                                            return;

                                        // ensure that id is uniqe
                                        while (idList.Contains(id))
                                        {
                                            id = (ushort)rand.Next(1000, 9999);
                                        }
                                        ps.PlayerId = id;
                                        ps.PlayerName = joinPacket.PlayerName;
                                        ps.PlayerTeam = joinPacket.TeamId;
                                        gameInfoPacket.PlayerStatusList.Add(ps);
                                    }
                                }
                                lock (serverPacketLock)
                                {
                                    if (!cliendAdressList.Contains(buff.RemoteEndPoint))
                                    {
                                        cliendAdressList.Add(buff.RemoteEndPoint);

                                        PlayerInfo playerInfo = new PlayerInfo();
                                        playerInfo.PlayerId = id;
                                        serverPacket.PlayerInfoList.Add(playerInfo);
                                    }
                                }
                                break;
                            case (PacketTypeEnumeration.StandardClientPacket):
                                ClientPacket clientPacket = (ClientPacket)packet;
                                bool packetOk = false;
                                bool getOnlyEvents = false;
                                lock (clientPackagesDictionaryLock)
                                {
                                    if (!clientPackagesDictionary.ContainsKey(clientPacket.PlayerId))
                                    {
                                        clientPackagesDictionary.Add(clientPacket.PlayerId, new UDPClientServerCommons.Usefull.Last10Packages());
                                        clientPackagesDictionary[clientPacket.PlayerId].AddPacket(clientPacket);
                                        packetOk = true;
                                    }
                                    else
                                        if (clientPackagesDictionary[clientPacket.PlayerId].LastPacket != null &&
                                            clientPacket.PacketId == clientPackagesDictionary[clientPacket.PlayerId].LastPacket.PacketId)
                                        {
                                            Diagnostic.NetworkingDiagnostics.Logging.Error("Old ClientPacket was received and ignored");
                                            return;
                                        }
                                        else if (clientPackagesDictionary[clientPacket.PlayerId].LastPacket != null &&
                                            clientPacket.PacketId < clientPackagesDictionary[clientPacket.PlayerId].LastPacket.PacketId)
                                        {
                                            //clientPackagesDictionary[clientPacket.PlayerId].AddPacket(clientPacket);
                                            packetOk = true;
                                            getOnlyEvents = true;
                                        }
                                        else
                                        {
                                            //clientPacket.PacketId > clientPackagesDictionary[clientPacket.PlayerId].LastPacket.PacketId
                                            clientPackagesDictionary[clientPacket.PlayerId].AddPacket(clientPacket);
                                            packetOk = true;
                                        }
                                }
                                if(packetOk)
                                lock (serverPacketLock)
                                {
                                    for (int i = 0; i < serverPacket.PlayerInfoList.Count; i++)
                                    {
                                        if (clientPacket.PlayerId == serverPacket.PlayerInfoList[i].PlayerId)
                                        {
                                            //if (clientPacket.PlayerJumping || clientPacket.PlayerShooting)
                                            //    Diagnostic.NetworkingDiagnostics.Logging.Warn(" Packet with events received " + clientPacket.ToString());
                                            // here we need to validate what Client send us !!!!!!
                                            // todo: validation
                                            if (getOnlyEvents)
                                            {
                                                if (clientPacket.PlayerJumping)
                                                    serverPacket.PlayerInfoList[i].PlayerJumping = clientPacket.PlayerJumping;
                                                if (clientPacket.PlayerShooting)
                                                    serverPacket.PlayerInfoList[i].PlayerShooting = clientPacket.PlayerShooting;
                                            }
                                            else
                                            {
                                                bool jmp = serverPacket.PlayerInfoList[i].PlayerJumping;
                                                bool sho = serverPacket.PlayerInfoList[i].PlayerShooting;
                                                serverPacket.PlayerInfoList[i] = UDPClientServerCommons.Translator.TranslateBetweenClientPacketAndPlayerInfo(clientPacket);
                                                if (jmp)
                                                    serverPacket.PlayerInfoList[i].PlayerJumping = true;
                                                if (sho)
                                                    serverPacket.PlayerInfoList[i].PlayerShooting = true;
                                            }
                                            break;
                                        }
                                    }
                                }
                                break;
                            case (PacketTypeEnumeration.QuitPacket):
                                LeaveGamePacket leaveGamePacket = (LeaveGamePacket)packet;
                                lock (gameInfoPacketLock)
                                {
                                    // do nothing if its not this game
                                    if (gameInfoPacket.GameId != leaveGamePacket.GameId)
                                        return;

                                    for (int i = 0; i < gameInfoPacket.PlayerStatusList.Count; i++)
                                    {
                                        if (leaveGamePacket.PlayerId == gameInfoPacket.PlayerStatusList[i].PlayerId)
                                        {
                                            gameInfoPacket.PlayerStatusList.RemoveAt(i);
                                            break;
                                        }
                                    }
                                }
                                lock (serverPacketLock)
                                {
                                    cliendAdressList.Remove(buff.RemoteEndPoint);

                                    for (int i = 0; i < serverPacket.PlayerInfoList.Count; i++)
                                    {
                                        if (serverPacket.PlayerInfoList[i].PlayerId == leaveGamePacket.PlayerId)
                                        {
                                            serverPacket.PlayerInfoList.RemoveAt(i);
                                            break;
                                        }
                                    }
                                }
                                break;
                        }
                    }
                }
                catch (Exception ex)
                {
                    UDPClientServerCommons.Diagnostic.NetworkingDiagnostics.Logging.Fatal("myUdpServer_MessageWasReceivedEvent", ex);
                }
            }
        }
Exemple #5
0
        static void Main(string[] args)
        {
            UDPClientServerCommons.Usefull.PlayerData pd = new UDPClientServerCommons.Usefull.PlayerData();
            pd.Duck = true;
            bool tst = pd.Duck;
            byte[] binary = null;

            Vector vector = new Vector(34.35f, 12.89f, 31.98f);
            Console.WriteLine(vector);
            binary = vector.ToMinimalByte();

            Vector newVector = new Vector(binary,0);

            Console.WriteLine(newVector);
            Console.ReadLine();
            Console.WriteLine("========================================");
               // ClientPacket testClientPacket = new ClientPacket();

            ClientPacket testClientPacket = new ClientPacket();

            //testClientPacket.PacketId = 10;
            testClientPacket.PlayerCarringWeponOne = true;
            testClientPacket.PlayerCarringWeponTwo = false;
            testClientPacket.PlayerDucking = true;
            testClientPacket.PlayerId = 67;
            testClientPacket.PlayerJumping = true;
            testClientPacket.PlayerLookingDirection = new Vector(45.56f, 34.67f, 87.45f);
            testClientPacket.PlayerMovementDirection = new Vector(43.54f, 87.34f, 56.21f);
            testClientPacket.PlayerPosition = new Vector(1f, 5f, 67.65f);
            //testClientPacket.PlayerRunning = true;
            testClientPacket.PlayerShooting = true;
            //testClientPacket.PlayerWalking = false;
            testClientPacket.TimeStamp = DateTime.Now;
            testClientPacket.PacketId = 10;

            Console.WriteLine(testClientPacket);

            ClientPacket tmp = new ClientPacket(testClientPacket.ToByte());
            Console.WriteLine("========================================");
            Console.WriteLine(tmp);
            Console.WriteLine("========================================");
            Console.ReadLine();

            GameInfoPacket gameInfoPacket = new GameInfoPacket();
            gameInfoPacket.GameType = GameTypeEnumeration.Objective;
            gameInfoPacket.Limit = 10;
            gameInfoPacket.PacketId = 6889;
            gameInfoPacket.GameId = 10;
            gameInfoPacket.ServerAddress = new IPEndPoint(IPAddress.Parse("90.156.78.90"), 1234);
            PlayerStatus ps1 = new PlayerStatus();
            ps1.PlayerHealth = 100;
            ps1.PlayerId = 8;
            ps1.PlayerName = "Karpik";
            ps1.PlayerPing = 23;
            ps1.PlayerScore = 3;
            ps1.PlayerTeam = 1;
            PlayerStatus ps2 = new PlayerStatus();
            ps2.PlayerHealth = 78;
            ps2.PlayerId = 2;
            ps2.PlayerName = "Ziomek";
            ps2.PlayerPing = 34;
            ps2.PlayerScore = 7;
            ps2.PlayerTeam = 2;
            gameInfoPacket.PlayerStatusList.Add(ps1);
            gameInfoPacket.PlayerStatusList.Add(ps2);
            TeamData ts1 = new TeamData();
            ts1.TeamId = 1;
            ts1.TeamScore = 89;
            ts1.TeamName = "the crazy killers";
            TeamData ts2 = new TeamData();
            ts2.TeamId = 2;
            ts2.TeamScore = 45;
            ts2.TeamName = "what the fuckers";
            gameInfoPacket.TeamScoreList.Add(ts1);
            gameInfoPacket.TeamScoreList.Add(ts2);
            gameInfoPacket.TimeStamp = DateTime.Now;

            Console.WriteLine(gameInfoPacket);

            GameInfoPacket tmp2 = new GameInfoPacket(gameInfoPacket.ToByte());
            Console.WriteLine("========================================");
            Console.WriteLine(tmp2);
            Console.WriteLine("========================================");
            Console.ReadLine();

            JoinPacket joinPacket = new JoinPacket();
            joinPacket.GameId = 1;
            joinPacket.PacketId = 6543;
            joinPacket.PlayerId = 34;
            joinPacket.PlayerName = "Ziomek2";
            joinPacket.TimeStamp = DateTime.Now;
            joinPacket.TeamId = 67;

            Console.WriteLine(joinPacket);
            JoinPacket tmp3 = new JoinPacket(joinPacket.ToByte());
            Console.WriteLine("========================================");
            Console.WriteLine(tmp3);
            Console.WriteLine("========================================");
            Console.ReadLine();

            LeaveGamePacket leaveGamePacket = new LeaveGamePacket();
            leaveGamePacket.GameId = 56;
            leaveGamePacket.PacketId = 876;
            leaveGamePacket.PlayerId = 89;
            leaveGamePacket.TimeStamp = DateTime.Now;

            Console.WriteLine(leaveGamePacket);
            LeaveGamePacket tmp4 = new LeaveGamePacket(leaveGamePacket.ToByte());
            Console.WriteLine("========================================");
            Console.WriteLine(tmp4);
            Console.WriteLine("========================================");
            Console.ReadLine();

            PlayerInfo testClientPacket2 = new PlayerInfo();

            //testClientPacket.PacketId = 10;
            testClientPacket2.PlayerCarringWeponOne = false;
            testClientPacket2.PlayerCarringWeponTwo = true;
            testClientPacket2.PlayerDucking = true;
            testClientPacket2.PlayerId = 647;
            testClientPacket2.PlayerJumping = true;
            testClientPacket2.PlayerLookingDirection = new Vector(45.4f, 334.617f, 187.425f);
            testClientPacket2.PlayerMovementDirection = new Vector(473.547f, 837.343f, 546.231f);
            testClientPacket2.PlayerPosition = new Vector(17f, 57f, 677.675f);
            //testClientPacket2.PlayerRunning = true;
            testClientPacket2.PlayerShooting = true;
            //testClientPacket2.PlayerWalking = false;

            testClientPacket2.Health = 100;
            testClientPacket2.AckIds.Add(412);
            testClientPacket2.AckIds.Add(456);
            testClientPacket2.Timestamp = DateTime.Now;
            Console.WriteLine(testClientPacket2);
            PlayerInfo tmp5 = new PlayerInfo(testClientPacket2.ToByte());
            Console.WriteLine("========================================");
            Console.WriteLine(tmp5);
            Console.WriteLine("========================================");
            Console.ReadLine();

            ServerPacket server = new ServerPacket();

            //server.NumberOfPlayers = 2;
            server.PacketId = 346;
            server.PlayerInfoList.Add(testClientPacket2);
            server.PlayerInfoList.Add(testClientPacket2);
            server.TimeStamp = DateTime.Now;

            Console.WriteLine(server);
            ServerPacket tmp6 = new ServerPacket(server.ToByte());
            Console.WriteLine("========================================");
            Console.WriteLine(tmp6);
            Console.WriteLine("========================================");
            Console.ReadLine();
        }