Example #1
0
        public async static void Handle_GameEndInfo(ClientConnection Client, PacketReader reader, byte last)
        {
            Account User = Client.CurrentAccount;

            User.RaceDistance = reader.ReadLESingle();
            float MapDistance = reader.ReadLESingle();

            User.GameEndType = reader.ReadLEInt16();
            long CurrentTime = Utility.CurrentTimeMilliseconds();

            Log.Debug("Game End - Nickname: {0}, GameEndType: {1}, RaceDistance: {2}", User.NickName, User.GameEndType, User.RaceDistance);

            if (User.GameEndType > 1)
            {
                NormalRoom room = Rooms.NormalRoomList.Find(rm => rm.ID == User.CurrentRoomId);
                if (room.GameMode == 38) //小遊戲
                {
                    return;
                }
                //GameEndType 2 = alive
                //GameEndType 3 = timeover
                //GameEndType 4 = gameover
                if (User.GameEndType == 2)
                {
                    User.LapTime       = (int)(CurrentTime - room.StartTime);
                    User.ServerLapTime = User.LapTime;
                    User.Rank          = room.Rank++;
                    Task calctask = Task.Run(() => GameRoomEvent.Calc_DropItem(User, room, User.Rank, last));
                    long EndTime  = Utility.CurrentTimeMilliseconds() + 2000;
                    await Task.Run(() => GameRoomEvent.Execute_GameEnd(room, EndTime, last));
                }
                else if (User.GameEndType == 3)
                {
                    User.LapTime       = (int)(CurrentTime + 200000 - room.StartTime);
                    User.ServerLapTime = User.LapTime;
                }
                else if (User.GameEndType == 4)
                {
                    User.LapTime       = (int)(CurrentTime + 240000 - room.StartTime);
                    User.ServerLapTime = User.LapTime;
                    room.Survival     -= 1;
                    byte mypos = User.RoomPos;
                    foreach (Account RoomPlayer in room.Players)
                    {
                        RoomPlayer.Connection.SendAsync(new GameRoom_GameOver(RoomPlayer, mypos, last));
                        if (room.Survival == 1 && room.RuleType == 2) //生存mode
                        {
                            byte alivepos = room.Players.Find(f => f.GameEndType == 0 && f.Attribute != 3).RoomPos;
                            RoomPlayer.Connection.SendAsync(new GameRoom_alive(RoomPlayer, alivepos, last));
                        }
                    }

                    if (room.Survival == 0 && room.RuleType == 3) //Hardcore
                    {
                        long EndTime = Utility.CurrentTimeMilliseconds() + 2000;
                        await Task.Run(() => GameRoomEvent.Execute_GameEnd(room, EndTime, last));
                    }
                }
            }
        }
        public async static void Handle_GoalInData(ClientConnection Client, PacketReader reader, byte last)
        {
            Account    User = Client.CurrentAccount;
            NormalRoom room = Rooms.NormalRoomList.Find(rm => rm.ID == User.CurrentRoomId);

            if (room.GameMode == 38) //小遊戲
            {
                return;
            }
            //FF C0 02 FF 52 03
            User.LapTime       = reader.ReadLEInt32(); //11 31 02 00 goal time
            User.ServerLapTime = (int)(Utility.CurrentTimeMilliseconds() - room.StartTime);
            reader.ReadLEUInt32();                     //54 6A 02 00
            //User.RaceDistance = reader.ReadLESingle(); //6F C3 DE 47 RaceDistance float 114054.867188
            //00 00 00 00 flag?
            long EndTime = Utility.CurrentTimeMilliseconds() + 13000;

            User.Rank = room.Rank++;
            if (!room.isGoal)
            {
                MapHolder.MapInfos.TryGetValue(room.PlayingMapNum, out MapInfo mapinfo);
                if (mapinfo.GoalInLimitTime * 1000 < User.ServerLapTime)
                {
                    Console.WriteLine("GoalIn");
                    foreach (Account RoomPlayer in room.Players)
                    {
                        RoomPlayer.Connection.SendAsync(new GameRoom_GoalInData(User, User.LapTime, last));
                        RoomPlayer.Connection.SendAsync(new GameRoom_StartTimeOutCount(RoomPlayer, User.LapTime + 2000, last)); //FF 7C 03 E1 38 02 00 0A
                        room.isGoal = true;
                    }
                    //await Task.Run(() => GameRoomEvent.Execute_GameEnd(room, EndTime, last));
                    Task calctask = Task.Run(() => GameRoomEvent.Calc_DropItem(User, room, User.Rank, last));
                    await Task.Run(() => GameRoomEvent.Execute_GameEnd(room, EndTime, last));
                }
                else
                {
                    Console.WriteLine("GoalInError");
                    Client.SendAsync(new GameRoom_GoalInError(User, last));
                }
            }
            else
            {
                foreach (Account RoomPlayer in room.Players)
                {
                    RoomPlayer.Connection.SendAsync(new GameRoom_GoalInData(User, User.LapTime, last));
                }
                //GameRoomEvent.Calc_DropItem(User, room, User.Rank, last);
                Task calctask = Task.Run(() => GameRoomEvent.Calc_DropItem(User, room, User.Rank, last));
            }
        }