public static void Handle_RegisterItem(ClientConnection Client, PacketReader reader, byte last)
        {
            Account    User = Client.CurrentAccount;
            NormalRoom room = Rooms.NormalRoomList.Find(rm => rm.ID == User.CurrentRoomId);

            //FF C0 02 FF 56 05 CB A3 00 00 7E 41 09 00 00 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 04
            int  itemnum    = reader.ReadLEInt32();
            long storage_id = reader.ReadLEInt64();
            int  unk        = reader.ReadLEInt32();//01 00 00 00
            int  isOrderBy  = reader.ReadLEInt32();
            int  sendcount  = reader.ReadLEInt32();
            bool isPublic   = reader.ReadBoolean();

            if (room.ItemNum != -1)
            {
                User.Connection.SendAsync(new GameRoom_LockKeepItem(User, room, true, last));//解鎖之前保管了的物品
            }

            if (CheckRegisterItem(User.UserNum, storage_id))
            {
                room.RegisterItem(itemnum, storage_id, isOrderBy, sendcount, isPublic);

                foreach (Account RoomPlayer in room.Players)
                {
                    RoomPlayer.Connection.SendAsync(new GameRoom_RegisterSuccess(RoomPlayer, itemnum, storage_id, last));
                    RoomPlayer.Connection.SendAsync(new GameRoom_GoodsInfo(RoomPlayer, room, last));
                }
                //FF 57 05 03 00 00 00 80 <- Register too many times

                if (itemnum != -1)
                {
                    User.Connection.SendAsync(new GameRoom_LockKeepItem(User, room, false, last));//鎖定保管物品
                }
            }
        }
Example #2
0
        public static async Task TimeoutLoading(NormalRoom room, int matchtime)
        {
            await Task.Delay(60000);

            if (matchtime == room.MatchTime)
            {
                bool isAllSync = room.Players.All(player => player.EndLoading);
                if (!isAllSync && room.isPlaying)
                {
                    Account[] Users = room.Players.FindAll(player => !player.EndLoading).ToArray();
                    foreach (Account KickedPlayer in Users)
                    {
                        KickPlayer(KickedPlayer, room, 0x1);
                        byte RoomMasterIndex = room.RoomMasterIndex;
                        if (KickedPlayer.RoomPos == RoomMasterIndex)
                        {
                            if (room.ItemNum != -1)
                            {
                                KickedPlayer.Connection.SendAsync(new GameRoom_LockKeepItem(KickedPlayer, room, true, 0x1));//解鎖之前保管了的物品
                                room.RegisterItem(-1, -1, 0, 0, false);
                            }
                            Account newRoomMaster = room.Players.FirstOrDefault();
                            room.RoomMasterIndex = newRoomMaster.RoomPos;
                            foreach (Account RoomPlayer in room.Players)
                            {
                                RoomPlayer.Connection.SendAsync(new GameRoom_GetRoomMaster(RoomPlayer, newRoomMaster.RoomPos, 0x1));
                            }
                        }
                    }
                    if (room.Players.Count == 0)
                    {
                        Rooms.NormalRoomList.Remove(room);
                    }
                    else
                    {
                        foreach (Account RoomPlayer in room.Players)
                        {
                            RoomPlayer.Connection.SendAsync(new GameRoom_Hex(RoomPlayer, "FF1203", 0x1));
                        }
                    }
                }
            }
        }
Example #3
0
        public static void GameMode_MiniGame_RoundThread(long RoundTime, NormalRoom room)
        {
            while (Utility.CurrentTimeMilliseconds() < RoundTime)
            {
                if (room.Survival == 0) //next round
                {
                    break;
                }
                //wait all gameover or time
            }

            int point = 100 + 50 * room.Round;

            if (room.PlayingMapNum != 40006)
            {
                room.Players.Where(w => w.Attribute != 3 && !w.GameOver)
                .Join(room.DropItem, p => p.UserNum, d => d.UserNum, (p, d) => new { p, d })
                .ToList().ForEach(f => f.d.MiniGamePoint += point);
            }

            int isnextround = 1;

            foreach (Account RoomPlayer in room.Players)
            {
                RoomPlayer.Connection.SendAsync(new GameRoom_MiniGame_RoundTime(RoomPlayer, room.Round, isnextround, 1, 0x1));
                RoomPlayer.Connection.SendAsync(new GameRoom_MiniGame_UpdatePoint(room, 0x1));
            }

            int nextround = room.Round + 1;
            int maxround  = room.PlayingMapNum == 40003 ? 1 : 3;

            if (nextround == maxround) //endgame
            {
                int laptime = 100;

                foreach (var p in room.Players.Where(p => p.Attribute != 3)
                         .Join(room.DropItem, p => p.UserNum, d => d.UserNum, (p, d) => new { p, d })
                         .OrderByDescending(o => o.d.MiniGamePoint).ThenBy(o => o.p.RoomPos))
                {
                    if (p.d.MiniGamePoint > 0)
                    {
                        p.d.Rank = room.Rank++;
                        int mylabtime = laptime++;
                        p.p.ServerLapTime     = mylabtime;
                        p.p.LapTime           = mylabtime;
                        p.d.MiniGameStarPoint = (int)Math.Round(p.d.MiniGamePoint / 4.5, MidpointRounding.AwayFromZero);
                        UpdateUserPoint(p.p.UserNum, 2400, p.d.MiniGameStarPoint);
                    }
                    else
                    {
                        p.d.Rank          = 98;
                        p.p.ServerLapTime = 100000;
                        p.p.LapTime       = 100000;
                    }
                }

                room.Result = GenResult_ForMiniGameMode(room, 0x1);
                room.RegisterItem(-1, -1, 2, 0x1049F00C, true);

                foreach (Account RoomPlayer in room.Players)
                {
                    RoomPlayer.Connection.SendAsync(new GameRoom_GameUpdateEXP(RoomPlayer, 0x1));
                }
                foreach (Account RoomPlayer in room.Players)
                {
                    RoomPlayer.Connection.SendAsync(new GameRoom_GameResult2(RoomPlayer, room.Result));
                    RoomPlayer.Connection.SendAsync(new GameRoom_Hex("FF0102", 0x1));
                    foreach (Account Player in room.Players)
                    {
                        RoomPlayer.Connection.SendAsync(new GameRoom_RoomPosReady(Player.RoomPos, false, 0x1));
                    }
                    RoomPlayer.Connection.SendAsync(new GameRoom_GoodsInfo(room, 0x1));
                }
                foreach (Account RoomPlayer in room.Players)
                {
                    //FF2D02A3220000C4C11400CB110000DB0800000E0C00001E0F0000
                    RoomPlayer.Connection.SendAsync(new GameRoom_UpdateIndividualGameRecord(RoomPlayer, 0x1));
                }
                Thread.Sleep(5000);
                foreach (Account RoomPlayer in room.Players)
                {
                    //MoveToGameRoom
                    RoomPlayer.Connection.SendAsync(new MoveToGameRoom(0x1)); //9704
                }

                room.GameEndSetNewRoomMaster();
                room.addMatchTime();
                room.StartAutoChangeRoomMaster();
                //reset
                room.GameEndReset();
            }
        }
Example #4
0
        public static void Handle_LeaveRoom(ClientConnection Client, PacketReader reader, byte last)
        {
            Account User = Client.CurrentAccount;

            if (User.CurrentRoomId != 0 && User.InGame)
            {
                byte       roompos    = User.RoomPos;
                NormalRoom normalRoom = Rooms.NormalRoomList.Find(room => room.ID == User.CurrentRoomId);
                bool       isRemoved  = true;
                if (normalRoom.Players.Count == 1)
                {
                    if (normalRoom.ItemNum != -1)
                    {
                        User.Connection.SendAsync(new GameRoom_LockKeepItem(User, normalRoom, true, last));//解鎖之前保管了的物品
                    }
                    Rooms.NormalRoomList.Remove(normalRoom);
                }
                else
                {
                    //加回位置id
                    normalRoom.Players.Remove(User);
                    normalRoom.PosList.Add(roompos);
                    isRemoved = false;
                }

                byte RoomMasterIndex = normalRoom.RoomMasterIndex;
                User.InGame        = false;
                User.CurrentRoomId = 0;
                User.EndLoading    = false;
                User.RoomPos       = 0;

                Client.SendAsync(new GameRoom_LeaveRoomUser_0XA9(User, roompos, last));
                Client.SendAsync(new GameRoom_Hex(User, "FFA80500000000", last));

                //Client.SendAsync(new GameRoom_Hex(User, "FF6405F703000002000000", last));
                if (!isRemoved)
                {
                    foreach (Account RoomPlayer in normalRoom.Players)
                    {
                        RoomPlayer.Connection.SendAsync(new GameRoom_RemoveRoomUser(RoomPlayer, roompos, last));
                    }

                    if (roompos == RoomMasterIndex)
                    {
                        if (normalRoom.ItemNum != -1)
                        {
                            User.Connection.SendAsync(new GameRoom_LockKeepItem(User, normalRoom, true, last));//解鎖之前保管了的物品
                            normalRoom.RegisterItem(-1, -1, 0, 0, false);

                            foreach (Account RoomPlayer in normalRoom.Players)
                            {
                                //RoomPlayer.Connection.SendAsync(new GameRoom_RegisterSuccess(User, -1, -1, last));
                                RoomPlayer.Connection.SendAsync(new GameRoom_GoodsInfo(User, normalRoom, last));
                            }
                        }
                        Account newRoomMaster = normalRoom.Players.FirstOrDefault();
                        normalRoom.RoomMasterIndex = newRoomMaster.RoomPos;
                        foreach (Account RoomPlayer in normalRoom.Players)
                        {
                            RoomPlayer.Connection.SendAsync(new GameRoom_GetRoomMaster(RoomPlayer, newRoomMaster.RoomPos, last));
                        }
                    }
                    bool isAllSync = normalRoom.Players.All(player => player.EndLoading);
                    if (isAllSync)
                    {
                        foreach (Account RoomPlayer in normalRoom.Players)
                        {
                            RoomPlayer.Connection.SendAsync(new GameRoom_Hex(RoomPlayer, "FF1203", last));
                        }
                    }
                }
            }
        }
Example #5
0
        public static async Task Execute_GameEnd(NormalRoom room, long EndTime, byte last)
        {
            room.addMatchTime();
            while (Utility.CurrentTimeMilliseconds() < EndTime)
            {
                if (room.Players.Where(p => p.Attribute != 3).All(p => p.GameEndType > 0))
                {
                    foreach (Account player in room.Players.Where(p => p.GameEndType > 2 && p.Attribute != 3)
                             .OrderBy(o => o.GameEndType).ThenByDescending(o => o.RaceDistance))
                    {
                        if (player.GameEndType == 4)
                        {
                            player.Rank = 98;
                        }
                        else
                        {
                            player.Rank = 99;
                        }
                        Calc_DropItem(player, room, player.Rank, last);
                        //await Task.Run(() => Calc_DropItem(player, room, player.Rank, last));
                    }
                    break;
                }

                await Task.Delay(500);
            }
            ;
            await Task.Delay(4000);

            room.Result = GenResult(room, last);
            room.RegisterItem(-1, -1, 2, 0x1049F00C, true);
            try
            {
                foreach (Account RoomPlayer in room.Players) //更新自己EXP
                {
                    RoomPlayer.Connection.SendAsync(new GameRoom_GameUpdateEXP(RoomPlayer, last));
                }
                foreach (Account RoomPlayer in room.Players)
                {
                    RoomPlayer.Connection.SendAsync(new GameRoom_GameResult2(RoomPlayer, room.Result));
                    RoomPlayer.Connection.SendAsync(new GameRoom_Hex(RoomPlayer, "FF0102", last));
                    foreach (Account Player in room.Players)
                    {
                        RoomPlayer.Connection.SendAsync(new GameRoom_RoomPosReady(RoomPlayer, Player.RoomPos, false, last));
                    }
                    RoomPlayer.Connection.SendAsync(new GameRoom_GoodsInfo(RoomPlayer, room, last));
                }
                foreach (Account RoomPlayer in room.Players)
                {
                    //RoomPlayer.Connection.SendAsync(new GameRoom_Hex(RoomPlayer, "FF2D02000000000000000000000000000800000000000000000000", last)); //FF2D02A3220000C4C11400CB110000DB0800000E0C00001E0F0000
                    RoomPlayer.Connection.SendAsync(new GameRoom_UpdateIndividualGameRecord(RoomPlayer, last));
                }
                await Task.Delay(6000);

                foreach (Account RoomPlayer in room.Players)
                {
                    //MoveToGameRoom
                    RoomPlayer.Connection.SendAsync(new GameRoom_Hex(RoomPlayer, "FF9503", last)); //9704
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }

            //reset
            room.Rank   = 1;
            room.Result = null;
            room.DropItem.Clear();
            room.isPlaying = false;
            foreach (Account RoomPlayer in room.Players)
            {
                RoomPlayer.IsReady     = false;
                RoomPlayer.EndLoading  = false;
                RoomPlayer.GameEndType = 0;
            }
        }
Example #6
0
        public static void DisconnectRoom(Account User)
        {
            if (User.CurrentRoomId != 0 && User.InGame)
            {
                byte       roompos    = User.RoomPos;
                NormalRoom normalRoom = Rooms.NormalRoomList.Find(room => room.ID == User.CurrentRoomId);
                bool       isRemoved  = true;
                if (normalRoom.Players.Count == 1)
                {
                    if (normalRoom.ItemNum != -1)
                    {
                        User.Connection.SendAsync(new GameRoom_LockKeepItem(User, normalRoom, true, 0x1));//解鎖之前保管了的物品
                    }
                    Rooms.NormalRoomList.Remove(normalRoom);
                }
                else
                {
                    //加回位置id
                    normalRoom.Players.Remove(User);
                    normalRoom.PosList.Add(roompos);
                    isRemoved = false;

                    if (normalRoom.isPlaying)
                    {
                        normalRoom.Survival -= 1;
                        if (normalRoom.Survival == 1 && normalRoom.RuleType == 2) //生存mode
                        {
                            byte alivepos = normalRoom.Players.Find(f => f.GameEndType == 0 && f.Attribute != 3).RoomPos;
                            foreach (Account RoomPlayer in normalRoom.Players)
                            {
                                RoomPlayer.Connection.SendAsync(new GameRoom_alive(RoomPlayer, alivepos, 0x01));
                            }
                        }
                        else if (normalRoom.Survival == 0 && normalRoom.RuleType == 3) //Hardcore
                        {
                            long EndTime = Utility.CurrentTimeMilliseconds() + 2000;
                            Task.Run(() => Execute_GameEnd(normalRoom, EndTime, 0x1));
                        }
                    }
                }
                byte RoomMasterIndex = normalRoom.RoomMasterIndex;
                if (!isRemoved)
                {
                    foreach (Account RoomPlayer in normalRoom.Players)
                    {
                        RoomPlayer.Connection.SendAsync(new GameRoom_RemoveRoomUser(RoomPlayer, roompos, 0x1));
                    }
                    if (User.RoomPos == RoomMasterIndex)
                    {
                        if (normalRoom.ItemNum != -1)
                        {
                            User.Connection.SendAsync(new GameRoom_LockKeepItem(User, normalRoom, true, 0x1));//解鎖之前保管了的物品
                            normalRoom.RegisterItem(-1, -1, 0, 0, false);

                            foreach (Account RoomPlayer in normalRoom.Players)
                            {
                                //RoomPlayer.Connection.SendAsync(new GameRoom_RegisterSuccess(User, -1, -1, 0x1));
                                RoomPlayer.Connection.SendAsync(new GameRoom_GoodsInfo(User, normalRoom, 0x1));
                            }
                        }
                        Account newRoomMaster = normalRoom.Players.FirstOrDefault();
                        normalRoom.RoomMasterIndex = newRoomMaster.RoomPos;
                        foreach (Account RoomPlayer in normalRoom.Players)
                        {
                            RoomPlayer.Connection.SendAsync(new GameRoom_GetRoomMaster(RoomPlayer, newRoomMaster.RoomPos, 0x1));
                        }
                    }
                }
            }
        }