예제 #1
0
        private static int CapsuleMachineGetItem(Account User, int MachineItemNum, int MachineKindID, CapsuleMachineInfo infos, List <CapsuleMachineItem> CapsuleMachineItem, out byte ret)
        {
            int TotalCount = infos.TotalItemCount;
            //int itemnum = 0;
            CapsuleMachineItem ItemInfo = new CapsuleMachineItem();

            foreach (var item in CapsuleMachineItem.OrderBy(o => o.ItemMax))
            {
                Random rnd    = new Random(Guid.NewGuid().GetHashCode());
                int    rndnum = rnd.Next(TotalCount + 1);
                if (rndnum <= item.ItemMax)
                {
                    if (item.ItemCount <= 0)
                    {
                        ItemInfo = CapsuleMachineItem.Where(w => w.ItemCount > 0).OrderBy(_ => Guid.NewGuid()).FirstOrDefault();
                    }
                    else
                    {
                        ItemInfo = item;
                    }
                    //ItemInfo = item;
                    break;
                }
                else
                {
                    TotalCount -= item.ItemMax;
                }
            }

            //ItemInfo = CapsuleMachineItem.Where(w => w.Level == 1).FirstOrDefault();

            ret = 0;
            bool isReset       = false;
            int  resultItemNum = 0;
            int  level         = 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_capsuleMachineSelect";
                cmd.Parameters.Add("machineNum", MySqlDbType.Int32).Value    = infos.RealMachineNum;
                cmd.Parameters.Add("machineKind", MySqlDbType.Int32).Value   = infos.RealMachineNumKind;
                cmd.Parameters.Add("itemNum", MySqlDbType.Int32).Value       = ItemInfo.ItemNum;
                cmd.Parameters.Add("userNum", MySqlDbType.Int32).Value       = User.UserNum;
                cmd.Parameters.Add("selectTime", MySqlDbType.DateTime).Value = DateTime.Now;
                cmd.Parameters.Add("resetCount", MySqlDbType.Int32).Value    = infos.ResetCount;
                MySqlDataReader reader = cmd.ExecuteReader();
                reader.Read();
                ret = (byte)reader.GetInt32("retval");
                if (ret == 0)
                {
                    resultItemNum = reader.GetInt32("resultItemNum");
                    level         = reader.GetInt32("level");
                    isReset       = reader.GetBoolean("isReset");
                    reader.GetInt32("cost");
                    reader.GetInt32("myAsset");
                    //reader.GetInt32("isTRItem");
                }
                else
                {
                    Console.WriteLine("RET: {0}", ret);
                }
                cmd.Dispose();
                reader.Close();
                con.Close();
            }
            if (ret == 0)
            {
                if (level < 3)
                {
                    Task.Run(() =>
                    {
                        foreach (var ac in ClientConnection.CurrentAccounts.Values)
                        {
                            ac.Connection.SendAsync(new CapsuleMachineNotice(ac, (byte)level, MachineItemNum, resultItemNum, User.NickName));
                        }
                    });
                }

                if (isReset)
                {
                    string MachineNum = CapsuleMachineHolder.UpdateCapsuleMachineInfo(MachineItemNum, infos.RealMachineNum, infos.isRotate);
                    if (infos.isRotate)
                    {
                        Task.Run(() =>
                        {
                            foreach (var ac in ClientConnection.CurrentAccounts.Values)
                            {
                                ac.Connection.SendAsync(new RoatateMachineNotice(ac, MachineNum));
                            }
                        });
                    }
                }
                else
                {
                    CapsuleMachineHolder.CapsuleMachineItems[MachineItemNum].Where(w => w.ItemNum == ItemInfo.ItemNum).ToList()
                    .ForEach(f => f.ItemCount -= 1);
                }
            }
            return(resultItemNum);
        }
        public static string UpdateCapsuleMachineInfo(int MachineNum, int RealNachineNum, bool isRotate)
        {
            CapsuleMachineItems[MachineNum].Clear();
            CapsuleMachineInfos.TryGetValue(MachineNum, out CapsuleMachineInfo old);
            int   RotateMachineNum = 0;
            int   RealMachineNum   = 0;
            int   TotalItemCount   = 0;
            short ResetCount       = 0;

            Structuring.Item.ItemCPK cpk = new Structuring.Item.ItemCPK();
            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_capsuleMachineGetMachineInfo";
                cmd.Parameters.Add("machineNum", MySqlDbType.Int32).Value = RealNachineNum;
                MySqlDataReader reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    CapsuleMachineItem Item = new CapsuleMachineItem
                    {
                        ItemNum   = Convert.ToInt32(reader["fdItemNum"]),
                        ItemCount = Convert.ToInt16(reader["fdItemCount"]),
                        ItemMax   = Convert.ToInt16(reader["fdItemMax"]),
                        Level     = Convert.ToByte(reader["fdLevel"])
                    };
                    RotateMachineNum = Convert.ToInt32(reader["fdRotateGroupNum"]);
                    RealMachineNum   = Convert.ToInt32(reader["fdMachineNum"]);
                    if (RotateMachineNum == 0)
                    {
                        RotateMachineNum = RealMachineNum;
                        isRotate         = false;
                    }
                    else
                    {
                        isRotate = true;
                    }

                    TotalItemCount += Convert.ToInt16(reader["fdItemMax"]);
                    ResetCount      = Convert.ToInt16(reader["fdResetCount"]);
                    ItemHolder.ItemCPKInfos.TryGetValue(RealMachineNum, out cpk);
                    CapsuleMachineItems.AddOrUpdate(RotateMachineNum, new List <CapsuleMachineItem> {
                        Item
                    }, (k, v) => { v.Add(Item); return(v); });
                }
                cmd.Dispose();
                reader.Close();
                con.Close();
            }


            CapsuleMachineInfo MachineInfo = new CapsuleMachineInfo
            {
                RealMachineNum     = RealMachineNum,
                RealMachineNumKind = cpk.ItemKind,
                isRotate           = isRotate,
                TotalItemCount     = TotalItemCount,
                ResetCount         = ResetCount,
                LastResetTime      = DateTime.Now.AddSeconds(10)
            };

            CapsuleMachineInfos.TryUpdate(RotateMachineNum, MachineInfo, old);

            return(RealMachineNum.ToString());
        }
        // public static ConcurrentDictionary<int, int> CapsuleMachineKinds { set; get; } = new ConcurrentDictionary<int, int> ();


        public static void LoadCapsuleMachineInfo()
        {
            CapsuleMachineInfos.Clear();
            CapsuleMachineItems.Clear();
            int  RotateMachineNum = 0;
            int  RealMachineNum   = 0;
            bool isRotate         = false;

            //int TotalItemCount = 0;
            //short ResetCount = 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_capsuleMachineGetMachineInfo";
                cmd.Parameters.Add("machineNum", MySqlDbType.Int32).Value = 0;
                MySqlDataReader reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    CapsuleMachineItem Item = new CapsuleMachineItem
                    {
                        ItemNum   = Convert.ToInt32(reader["fdItemNum"]),
                        ItemCount = Convert.ToInt16(reader["fdItemCount"]),
                        ItemMax   = Convert.ToInt16(reader["fdItemMax"]),
                        Level     = Convert.ToByte(reader["fdLevel"])
                    };
                    RotateMachineNum = Convert.ToInt32(reader["fdRotateGroupNum"]);
                    RealMachineNum   = Convert.ToInt32(reader["fdMachineNum"]);
                    if (RotateMachineNum == 0)
                    {
                        RotateMachineNum = RealMachineNum;
                        isRotate         = false;
                    }
                    else
                    {
                        isRotate = true;
                    }

                    ItemHolder.ItemCPKInfos.TryGetValue(RealMachineNum, out Structuring.Item.ItemCPK cpk);
                    CapsuleMachineInfo MachineInfo = new CapsuleMachineInfo
                    {
                        RealMachineNum     = RealMachineNum,
                        RealMachineNumKind = cpk.ItemKind,
                        isRotate           = isRotate,
                        TotalItemCount     = 0,
                        ResetCount         = Convert.ToInt16(reader["fdResetCount"]),
                        LastResetTime      = DateTime.Now
                    };

                    CapsuleMachineInfos.TryAdd(RotateMachineNum, MachineInfo);
                    CapsuleMachineItems.AddOrUpdate(RotateMachineNum, new List <CapsuleMachineItem> {
                        Item
                    }, (k, v) => { v.Add(Item); return(v); });
                }
                cmd.Dispose();
                reader.Close();
                con.Close();
            }

            foreach (var item in CapsuleMachineItems)
            {
                int TotalCount = 0;
                foreach (var items in item.Value)
                {
                    TotalCount += items.ItemMax;
                }
                CapsuleMachineInfos.TryGetValue(item.Key, out CapsuleMachineInfo oldvalue);
                CapsuleMachineInfo MachineInfo = new CapsuleMachineInfo
                {
                    RealMachineNum     = oldvalue.RealMachineNum,
                    RealMachineNumKind = oldvalue.RealMachineNumKind,
                    isRotate           = oldvalue.isRotate,
                    TotalItemCount     = TotalCount,
                    ResetCount         = oldvalue.ResetCount,
                    LastResetTime      = oldvalue.LastResetTime
                };
                CapsuleMachineInfos.TryUpdate(item.Key, MachineInfo, oldvalue);
            }

            Log.Info("Load CapsuleMachineInfo Done!");
            //CapsuleMachineHolder.CapsuleMachineItems.TryGetValue(57212, out List<CapsuleMachineItem> MachineItems);
            //CapsuleMachineHolder.CapsuleMachineInfos.TryGetValue(43861, out CapsuleMachineInfo infos);
            //Console.WriteLine("DrawItem: {0}", infos.RealMachineNum);
            //Console.WriteLine("DrawItem2: {0}", infos.RealMachineNumKind);
        }
예제 #4
0
        private static int CapsuleMachineGetItem(Account User, int MachineItemNum, int MachineKindID, CapsuleMachineInfo infos, List <CapsuleMachineItem> CapsuleMachineItem, out byte ret)
        {
            int TotalCount = infos.TotalItemCount;
            //int itemnum = 0;
            CapsuleMachineItem ItemInfo = new CapsuleMachineItem();
            //ItemInfo = CapsuleMachineItem.Where(w => w.Level == 1).FirstOrDefault();

            double UserLucky = (double)User.Luck;
            double CapsuleMachineRateLuckyDiv = 200; //DB
            int    CapsuleMachineMaxDice      = 10;  //DB

            int ItemLevel       = 6;
            int ItemLevelBefore = 0;
            int DrawTime        = 1;

            DrawTime = (int)(UserLucky / CapsuleMachineRateLuckyDiv + 1.0);
            if (DrawTime > CapsuleMachineMaxDice)
            {
                DrawTime = CapsuleMachineMaxDice;
            }

            while (DrawTime > 0)
            {
drawtart:
                Random rnd = new Random(Guid.NewGuid().GetHashCode());
                int rndnum = rnd.Next(1, TotalCount + 1);
                int min = 1, max = 1;
                foreach (var item in CapsuleMachineItem.OrderBy(o => o.ItemMax))
                {
                    max += item.ItemMax;
                    if (min <= rndnum && rndnum < max)
                    {
                        if (item.ItemCount <= 0)
                        {
                            goto drawtart; //redraw
                        }
                        ItemLevelBefore = ItemLevel;
                        if (ItemLevelBefore >= item.Level)
                        {
                            ItemLevel = item.Level;
                            ItemInfo  = item;
                        }
                        break;
                    }
                    min = max;
                }

                DrawTime--;
            }

            ret = 0;
            bool isReset = false;
            int  resultItemNum = 0;
            int  level = 0;
            int  PriceType = 0, cost = 0;

            try
            {
                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_capsuleMachineSelect";
                    cmd.Parameters.Add("machineNum", MySqlDbType.Int32).Value    = infos.RealMachineNum;
                    cmd.Parameters.Add("machineKind", MySqlDbType.Int32).Value   = infos.RealMachineNumKind;
                    cmd.Parameters.Add("itemNum", MySqlDbType.Int32).Value       = ItemInfo.ItemNum;
                    cmd.Parameters.Add("userNum", MySqlDbType.Int32).Value       = User.UserNum;
                    cmd.Parameters.Add("selectTime", MySqlDbType.DateTime).Value = DateTime.Now;
                    cmd.Parameters.Add("resetCount", MySqlDbType.Int32).Value    = infos.ResetCount;
                    MySqlDataReader reader = cmd.ExecuteReader();
                    reader.Read();
                    ret = (byte)reader.GetInt32("retval");
                    if (ret == 0)
                    {
                        resultItemNum = reader.GetInt32("resultItemNum");
                        level         = reader.GetInt32("level");
                        isReset       = reader.GetBoolean("isReset");
                        cost          = reader.GetInt32("cost");
                        //myAsset = reader.GetInt32("myAsset");
                        PriceType = Convert.ToInt32(reader["PriceType"]);
                    }
                    else
                    {
                        Console.WriteLine("RET: {0}", ret);
                    }
                    cmd.Dispose();
                    reader.Close();
                    con.Close();
                }
                if (ret == 0)
                {
                    if (level < 3)
                    {
                        Task.Run(() =>
                        {
                            foreach (var ac in ClientConnection.CurrentAccounts.Values)
                            {
                                ac.Connection.SendAsync(new CapsuleMachineNotice(ac, (byte)level, MachineItemNum, resultItemNum, User.NickName));
                            }
                        });
                    }

                    if (isReset)
                    {
                        string MachineNum = CapsuleMachineHolder.UpdateCapsuleMachineInfo(MachineItemNum, infos.RealMachineNum, infos.isRotate);
                        if (infos.isRotate)
                        {
                            Task.Run(() =>
                            {
                                foreach (var ac in ClientConnection.CurrentAccounts.Values)
                                {
                                    ac.Connection.SendAsync(new RoatateMachineNotice(ac, MachineNum));
                                }
                            });
                        }
                    }
                    else
                    {
                        CapsuleMachineHolder.CapsuleMachineItems[MachineItemNum].Where(w => w.ItemNum == ItemInfo.ItemNum).ToList()
                        .ForEach(f => f.ItemCount -= 1);
                    }

                    if (PriceType == 0) //TR
                    {
                        User.TR -= cost;
                    }
                    else if (PriceType == 1) //點數
                    {
                        User.Cash -= cost;
                    }
                }
            }
            catch (Exception ex)
            {
                Log.Error("Error on capsule machine get item: {0}", ex.Message);
                ret = 1;
            }
            return(resultItemNum);
        }