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