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); }
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); }