public static int CapsuleMachineGetItem(CapsuleMachineInfo infos, List <CapsuleMachineItem> CapsuleMachineItem)
        {
            int TotalCount = infos.TotalItemCount;
            int itemnum    = 0;

            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)
                    {
                        itemnum = CapsuleMachineItem.Where(w => w.ItemCount > 0 && w.Level != 1).OrderBy(_ => Guid.NewGuid()).Select(s => s.ItemNum).FirstOrDefault();
                    }
                    else
                    {
                        itemnum = item.ItemNum;
                    }
                    break;
                }
                else
                {
                    TotalCount -= item.ItemMax;
                }
            }
            return(itemnum);
        }
Example #2
0
 public GetMachineInfo(Account User, int MachineNum, CapsuleMachineInfo MachineInfo, byte last)
 {
     /*FF 74 05 7C DF 00 00 62 00 00 00 FF FF FF FF 01 00 00 00 00
      * 0A 00 00 00 62 F2 00 00 00 00 00 00 05 00 00 00 62 F2 00
      * 00 02 66 F2 00 00 01 00 00 00 02 00 00 00 66 F2 00 00 01
      * 6A F2 00 00 03 00 00 00 14 00 00 00 6A F2 00 00 03 6E F2
      * 00 00 03 00 00 00 14 00 00 00 6E F2 00 00 03 72 F2 00 00
      * 08 00 00 00 1E 00 00 00 72 F2 00 00 03 76 F2 00 00 03 00
      * 00 00 1E 00 00 00 76 F2 00 00 03 8A F2 00 00 42 00 00 00
      * 78 00 00 00 8A F2 00 00 04 8B F2 00 00 46 00 00 00 78 00
      * 00 00 8B F2 00 00 04 8C F2 00 00 8E 00 00 00 96 00 00 00
      * 8C F2 00 00 05 8F F2 00 00 1C 01 00 00 2F 01 00 00 8F F2
      * 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
      * 00 00 00 00 40*/
     ns.Write((byte)0xFF);
     ns.Write((short)0x574);
     ns.Write(MachineInfo.RealMachineNum);
     ns.Write(MachineInfo.RealMachineNumKind);
     if (MachineNum != MachineInfo.RealMachineNum)
     {
         ns.Write(MachineNum);
     }
     else
     {
         ns.Write(-1); //FF FF FF FF
     }
     ns.Write((byte)1);
     ns.Write(0);
     CapsuleMachineHolder.CapsuleMachineItems.TryGetValue(MachineNum, out List <CapsuleMachineItem> MachineItems);
     ns.Write(MachineItems.Count);
     foreach (var item in MachineItems)
     {
         ns.Write(item.ItemNum);
         ns.Write((int)item.ItemCount);
         ns.Write((int)item.ItemMax);
         ns.Write(item.ItemNum);
         ns.Write(item.Level);
     }
     ns.Fill(0x14);
     ns.Write(last);
     //Console.WriteLine("ns: {0}",Utility.ByteArrayToString(ns.ToArray()));
 }
Example #3
0
 public GetMachineInfoResetting(Account User, int MachineNum, CapsuleMachineInfo MachineInfo, byte last)
 {
     /*FF 74 05 17 52 00 00 0E 00 00 00 FF FF FF FF 00
      * 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00
      * 00 60 BC 87 06 00 00 00 00 00 00 00 00 01*/
     ns.Write((byte)0xFF);
     ns.Write((short)0x574);
     ns.Write(MachineInfo.RealMachineNum);
     ns.Write(MachineInfo.RealMachineNumKind);
     if (MachineNum != MachineInfo.RealMachineNum)
     {
         ns.Write(MachineNum);
     }
     else
     {
         ns.Write(-1); //FF FF FF FF
     }
     ns.Write((byte)0);
     ns.Write(9);
     ns.Write(0);
     ns.Fill(0x14);
     ns.Write(last);
 }
Example #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();

            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 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);
        }
        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());
        }
Example #7
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);
        }