예제 #1
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));
                        }
                    }
                }
            }
        }
예제 #2
0
        private static byte[] GenResult(NormalRoom room, byte last)
        {
            if (room.Players.Exists(p => p.GameEndType == 0 && p.Attribute != 3))
            {
                foreach (Account player in room.Players.Where(p => p.GameEndType == 0 && p.Attribute != 3).OrderBy(o => o.RaceDistance))
                {
                    long CurrentTime = Utility.CurrentTimeMilliseconds();
                    player.LapTime       = (int)(CurrentTime + 200000 - room.StartTime);
                    player.ServerLapTime = player.LapTime;
                    player.Rank          = 99;//99 = TIME OVER, 98 = GAME OVER
                    Calc_DropItem(player, room, player.Rank, last);
                    //await Task.Run(() => Calc_DropItem(player, room, player.Rank, last));
                }
            }

            PacketWriter ns = new PacketWriter();

            ns = PacketWriter.CreateInstance(16, true);
            ns.Write((byte)0xFF);
            ns.Write((short)0x381);
            ns.Write((byte)room.RoomKindID);
            ns.Fill(0xB);
            int playercount = room.Players.Count(p => p.Attribute != 3);

            ns.Write((byte)playercount); //count?
            ns.Fill(0x6);
            foreach (var p in room.Players.Where(p => p.Attribute != 3)
                     .Join(room.DropItem, p => p.UserNum, d => d.UserNum, (p, d) => new { player = p, droplist = d })
                     .OrderBy(o => o.droplist.Rank).ThenByDescending(o => o.player.RaceDistance).ThenBy(o => o.player.RoomPos))
            {
                ns.Write(p.player.ServerLapTime);
                ns.Write(p.player.LapTime);
                ns.Write(p.droplist.Rank);
                ns.Write(p.player.RoomPos);
                ns.Write(p.droplist.EXP);
                ns.Write(0);
                ns.Write(p.droplist.TR);
                ns.Write(0);
                ns.Fill(0xC);
                ns.Write(p.droplist.BounsEXP);
                ns.Write(p.droplist.BounsTR);
                int bounsweight = 0;
                if (p.droplist.BounsTR > 0)
                {
                    bounsweight += 4;
                }
                if (p.droplist.BounsEXP > 0)
                {
                    bounsweight += 8;
                }
                ns.Write(bounsweight); // 0C 00 00 00
                ns.Write(playercount); //02 00 00 00 player count?
                int count = p.droplist.CardID.Count;
                ns.Write(count);       //card count

                foreach (var card in p.droplist.CardID)
                {
                    ns.Write(card);
                }
                ns.WriteHex("00BA8B19000000000000000000000000000000000000000000C5B01B000000000000");
            }

            bool hasgavegoods = SendRegisterGoods(room, out byte[] getgoodsnickname, last);

            if (hasgavegoods)
            {
                Account roomMaster = room.Players.Find(p => p.RoomPos == room.RoomMasterIndex);
                roomMaster.Connection.SendAsync(new GameRoom_DeleteKeepItem(roomMaster, room, last));
            }

            ns.Write((short)0);
            ns.Write(2);
            ns.Write(0x3EA);
            ns.Write(!hasgavegoods ? 0x11 : 0x11 + getgoodsnickname.Length);
            ns.Write(room.ItemNum);

            if (!hasgavegoods)
            {
                ns.Write(-1L);
                ns.Write((byte)0);
                ns.Write(1);
            }
            else
            {
                ns.Write(0x3b1c32);                                     //32 1C 3B 00
                ns.Write(2);
                ns.Write(getgoodsnickname, 0, getgoodsnickname.Length); //B5 A3 B8 DC B6 5D A4 48
                ns.Write((byte)0);
                ns.Write(getgoodsnickname.Length + 1);
            }
            ns.Write(0x3F6);
            ns.Write(4);
            ns.Write(0);
            //ns.WriteHex("000002000000EA03000011000000FFFFFFFFFFFFFFFFFFFFFFFF0001000000F60300000400000000000000");
            ns.Write(last);
            byte[] ret = ns.ToArray();
            PacketWriter.ReleaseInstance(ns);
            ns = null;
            //Console.WriteLine("Result packet: " + Utility.ByteArrayToString(ret));
            return(ret);
        }
예제 #3
0
        public static void EnterRoom(ClientConnection Client, NormalRoom room, string pw, byte last)
        {
            Account User = Client.CurrentAccount;
            int     MaxPlayer;

            if (room.is8Player)
            {
                MaxPlayer = room.SlotCount;
            }
            else
            {
                MaxPlayer = room.MaxPlayersCount;
            }
            if (room.isPlaying)
            {
                Client.SendAsync(new GameRoom_EnterRoomError(User, 5, (byte)room.RoomKindID, last));
                return;
            }
            if (room.Players.Count(p => p.Attribute != 3) < MaxPlayer || User.Attribute == 3)
            {
                //room.Players.Add(User);
                // User.IsRoomMaster = false;
                if (room.Players.Exists(p => p.Attribute == 3) && User.Attribute == 3)
                {
                    Client.SendAsync(new GameRoom_EnterRoomError(User, 9, (byte)room.RoomKindID, last));
                    return;
                }
                if (room.Password != pw && User.Attribute == 0)
                {
                    Client.SendAsync(new GameRoom_EnterRoomError(User, 7, (byte)room.RoomKindID, last));
                    return;
                }
                DateTime kickedtime;
                if (room.KickedList.TryGetValue(User, out kickedtime))
                {
                    bool cantenter = DateTime.Compare(DateTime.Now, kickedtime.AddSeconds(60)) < 0;
                    if (cantenter)
                    {
                        Client.SendAsync(new GameRoom_EnterRoomError(User, 6, (byte)room.RoomKindID, last));
                        return;
                    }
                    room.KickedList.Remove(User);
                }
                User.InGame        = true;
                User.CurrentRoomId = room.ID;
                User.IsReady       = false;

                //取得當前第一個位置id
                User.RoomPos = (byte)(User.Attribute == 3 ? 100 : room.PosList.FirstOrDefault());
                //Console.WriteLine("User.RoomPos: "+ User.RoomPos);
                room.PosList.Remove(User.RoomPos);

                //Client.SendAsync(new GameRoom_RegisterSuccess(User, room.ItemNum, room.Storage_Id, last));
                Client.SendAsync(new GameRoom_GoodsInfo(User, room, last));
                Client.SendAsync(new GameRoom_SendRoomInfo(User, room, last, User.RoomPos));

                //Send自己info俾其他roomuser
                foreach (Account roomUser in room.Players)
                {
                    roomUser.Connection.SendAsync(new GameRoom_SendPlayerInfo(User, last));
                    if (room.IsTeamPlay == 2)
                    {
                        User.Team = 1;
                        roomUser.Connection.SendAsync(new GameRoom_RoomPosTeam(User, last));
                    }
                }

                room.Players.Add(User);

                //Send roomuser info俾自己
                foreach (Account roomUser in room.Players)
                {
                    Client.SendAsync(new GameRoom_SendPlayerInfo(roomUser, last));
                    Client.SendAsync(new GameRoom_RoomPosReady(roomUser, roomUser.RoomPos, roomUser.IsReady, last));

                    if (room.IsTeamPlay == 2)
                    {
                        Client.SendAsync(new GameRoom_RoomPosTeam(roomUser, last));
                    }
                    if (User.Attribute == 3)
                    {
                        room.setRoomMasterIndex(100);
                        byte africapos = room.RoomMasterIndex; //room.Players.Find(player => player.IsRoomMaster).RoomPos;
                        roomUser.Connection.SendAsync(new GameRoom_GetRoomMaster(roomUser, africapos, last));
                    }
                }

                if (User.Attribute != 3)
                {
                    byte roommasterpos = room.RoomMasterIndex; //room.Players.Find(player => player.IsRoomMaster).RoomPos;
                    Client.SendAsync(new GameRoom_GetRoomMaster(User, roommasterpos, last));
                }
            }
            else
            {
                Client.SendAsync(new GameRoom_EnterRoomError(User, 1, (byte)room.RoomKindID, last));
            }
        }
예제 #4
0
        public static int Calc_EXP(Account User, NormalRoom room, byte rank, out short BounsEXP)
        {
            int    PlayerCount = room.Players.Count(p => p.Attribute != 3); //room.Players.FindAll(p => p.Attribute != 3).Count;
            int    initexp     = (int)Math.Round(12 * PlayerCount * (float)(1 - (((decimal)rank / 10) - (decimal)0.1)), MidpointRounding.AwayFromZero);
            int    exptotal    = 0;
            float  exppercent  = 0;
            float  expnormal   = 0;
            Random rnd         = new Random();

            foreach (var a in User.WearAvatarItemAttr.Where(w => w.Attr == 2 || w.Attr == 38 || w.Attr == 52))
            {
                switch (a.Attr)
                {
                case 2:
                    exppercent += a.AttrValue;
                    break;

                case 38:
                    expnormal += a.AttrValue;
                    break;

                case 52:
                    expnormal += rnd.Next(Convert.ToInt32(a.AttrValue));
                    break;

                default:
                    break;
                }
            }
            //avon
            if (User.costumeMode == 1)
            {
                foreach (var a in User.WearCosAvatarItemAttr.Where(w => w.Attr == 2 || w.Attr == 38 || w.Attr == 52))
                {
                    switch (a.Attr)
                    {
                    case 2:
                        exppercent += a.AttrValue;
                        break;

                    case 38:
                        expnormal += a.AttrValue;
                        break;

                    case 52:
                        expnormal += rnd.Next(Convert.ToInt32(a.AttrValue));
                        break;

                    default:
                        break;
                    }
                }
            }
            if (User.AvatarItems.Any(i => i.itemdescnum == 47635)) //優越童話通行証BUFF
            {
                exppercent += (float)1.5;
            }
            //exptotal = initexp + (initexp * exppercent) + expnormal;
            exptotal = (int)Math.Round(initexp + (initexp * exppercent) + expnormal, MidpointRounding.AwayFromZero);
            BounsEXP = (short)(exptotal - initexp);
            return(exptotal);
        }
예제 #5
0
        public static int Calc_TR(Account User, NormalRoom room, byte rank, out short BounsTR)
        {
            int PlayerCount = room.Players.Count(p => p.Attribute != 3); //room.Players.FindAll(p => p.Attribute != 3).Count;
            //float inittr = 12 * PlayerCount * ((110 - (rank * 10)) / 100);
            int    inittr    = (int)Math.Round(12 * PlayerCount * (float)(1 - (((decimal)rank / 10) - (decimal)0.1)), MidpointRounding.AwayFromZero);
            int    trtotal   = 0;
            float  trpercent = 0;
            float  trnormal  = 0;
            Random rnd       = new Random();

            foreach (var a in User.WearAvatarItemAttr.Where(w => w.Attr == 1 || w.Attr == 37 || w.Attr == 51))
            {
                switch (a.Attr)
                {
                case 1:
                    trpercent += a.AttrValue;
                    break;

                case 37:
                    trnormal += a.AttrValue;
                    break;

                case 51:
                    trnormal += rnd.Next(Convert.ToInt32(a.AttrValue));
                    break;

                default:
                    break;
                }
            }
            //avon
            if (User.costumeMode == 1)
            {
                foreach (var a in User.WearCosAvatarItemAttr.Where(w => w.Attr == 1 || w.Attr == 37 || w.Attr == 51))
                {
                    switch (a.Attr)
                    {
                    case 1:
                        trpercent += a.AttrValue;
                        break;

                    case 37:
                        trnormal += a.AttrValue;
                        break;

                    case 51:
                        trnormal += rnd.Next(Convert.ToInt32(a.AttrValue));
                        break;

                    default:
                        break;
                    }
                }
            }
            if (User.AvatarItems.Any(i => i.itemdescnum == 47635)) //優越童話通行証BUFF
            {
                trpercent += 1;
            }
            trtotal = (int)Math.Round((inittr + (inittr * trpercent) + trnormal), MidpointRounding.AwayFromZero);
            //trtotal = inittr + (inittr * trpercent) + trnormal;
            BounsTR = (short)(trtotal - inittr);
            return(trtotal);
        }
예제 #6
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;
            }
        }
예제 #7
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));
                        }
                    }
                }
            }
        }
예제 #8
0
        public SendFarmInfo(Account User, NormalRoom room, int farmindex, byte last)
        {
            int    FarmTypeNum = 0, TotalVisitedCount = 0, TodaysVisitorCount = 0, farmExp = 0;
            string FarmName = "", MasterName = "", Password = "";
            long   ExpireDateTime = 0, CreateDateTime = 0;

            using (var con = new MySqlConnection(Conf.Connstr))
            {
                con.Open();
                var cmd = new MySqlCommand(string.Empty, con);
                cmd.Parameters.Clear();
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "usp_Farm_GetFarmInfo";
                cmd.Parameters.Add("pFarmUniqueNum", MySqlDbType.Int32).Value = farmindex;
                MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow);
                if (reader.HasRows)
                {
                    reader.Read();
                    FarmTypeNum        = Convert.ToInt32(reader["FarmTypeNum"]);
                    FarmName           = reader["FarmName"].ToString();
                    MasterName         = reader["MasterName"].ToString();
                    ExpireDateTime     = Convert.IsDBNull(reader["ExpireDateTime"]) ? 0x68BB6671178CB : Utility.ConvertToTimestamp(Convert.ToDateTime(reader["ExpireDateTime"]));
                    CreateDateTime     = Convert.IsDBNull(reader["CreateDateTime"]) ? 0x68BB6671178CB : Utility.ConvertToTimestamp(Convert.ToDateTime(reader["CreateDateTime"]));
                    Password           = reader["Password"].ToString();
                    TotalVisitedCount  = Convert.ToInt32(reader["TotalVisitedCount"]);
                    TodaysVisitorCount = Convert.ToInt32(reader["TodaysVisitorCount"]);
                    farmExp            = Convert.ToInt32(reader["farmExp"]);
                }
                cmd.Dispose();
                reader.Close();
                con.Close();
            }

            ns.Write((byte)0xA5);
            ns.Write(0);
            ns.Write((byte)room.RoomKindID);
            ns.WriteBIG5Fixed_intSize(room.Name);
            ns.Write((byte)0x16);
            ns.WriteBIG5Fixed_intSize(room.Password);//password
            ns.Write(2);
            ns.Write(room.ID);
            ns.Write(User.RoomPos);
            ns.Write(room.MapNum);
            ns.Write(0x1E);
            ns.Write(room.IsTeamPlay);
            ns.Write(room.IsStepOn);
            ns.Write(room.ItemType);
            ns.Write(0);
            ns.Write(Utility.CurrentTimeMilliseconds());
            ns.Write(room.PosWeight);
            ns.Write(farmindex);
            ns.Write(0);
            ns.Write(1);
            ns.Write(FarmTypeNum);
            ns.WriteBIG5Fixed_intSize(FarmName);
            ns.WriteBIG5Fixed_intSize(MasterName); //Farm Master??
            ns.Write(ExpireDateTime);              //farm expire date time
            ns.Write(CreateDateTime);              //farm create date time
            ns.Write((short)1);
            ns.Write(TotalVisitedCount);           //total count
            ns.Write(TodaysVisitorCount);          //today visitor count
            ns.Write((byte)0);
            ns.Write(0x68BB6671178CB);             //datetime null
            ns.Fill(0x10);
            ns.Write(last);
        }