diff --git a/OshimaModules/Models/FunGameConstant.cs b/OshimaModules/Models/FunGameConstant.cs index eca9a50..db888fa 100644 --- a/OshimaModules/Models/FunGameConstant.cs +++ b/OshimaModules/Models/FunGameConstant.cs @@ -38,6 +38,7 @@ namespace Oshima.FunGame.OshimaModules.Models public static SemaphoreSlim MarketSemaphoreSlim { get; } = new(1, 1); public static ItemType[] ItemCanUsed => [ItemType.Consumable, ItemType.MagicCard, ItemType.SpecialItem, ItemType.GiftBox, ItemType.Others]; public static ItemType[] ItemCanNotDrawCard => [ItemType.Collectible, ItemType.QuestItem, ItemType.GiftBox, ItemType.Others]; + public static char[] SplitChars => [',', ' ', ',', ';', ';']; public static Dictionary> LevelBreakNeedyList { get; } = new() { diff --git a/OshimaServers/Service/FunGameService.cs b/OshimaServers/Service/FunGameService.cs index ca96a9b..fc47db5 100644 --- a/OshimaServers/Service/FunGameService.cs +++ b/OshimaServers/Service/FunGameService.cs @@ -3811,7 +3811,7 @@ namespace Oshima.FunGame.OshimaServers.Service } region ??= FunGameConstant.Regions[Random.Shared.Next(FunGameConstant.Regions.Count)]; item ??= region.Crops.ToList()[Random.Shared.Next(region.Crops.Count)]; - award = Math.Max(1, Random.Shared.Next(1, 4) * difficulty / 2); + award = difficulty + Random.Shared.Next(0, 3); regionItems.Add($"{award} 个{item.Name}(来自{region.Name})"); for (int j = 0; j < award; j++) { @@ -3838,7 +3838,7 @@ namespace Oshima.FunGame.OshimaServers.Service } } item ??= FunGameConstant.CharacterLevelBreakItems[Random.Shared.Next(FunGameConstant.CharacterLevelBreakItems.Count)]; - award = Math.Max(1, Random.Shared.Next(1, 4) * difficulty / Math.Max(2, (int)item.QualityType + 1)); + award = difficulty + Random.Shared.Next(0, 3); characterLevelBreakItems.Add($"{award} 个{item.Name}"); for (int j = 0; j < award; j++) { @@ -3865,7 +3865,7 @@ namespace Oshima.FunGame.OshimaServers.Service } } item ??= FunGameConstant.SkillLevelUpItems[Random.Shared.Next(FunGameConstant.SkillLevelUpItems.Count)]; - award = Math.Max(1, Random.Shared.Next(1, 4) * difficulty / Math.Max(2, (int)item.QualityType + 1)); + award = difficulty + Random.Shared.Next(0, 3); skillLevelUpItems.Add($"{award} 个{item.Name}"); for (int j = 0; j < award; j++) { @@ -4368,7 +4368,7 @@ namespace Oshima.FunGame.OshimaServers.Service { foreach (MarketItem marketItem in MarketItemsValid) { - builder.AppendLine(GetMarketItemInfo(marketItem, true, user?.Id ?? 0)); + builder.AppendLine(GetMarketItemInfo(marketItem, true, user ?? General.UnknownUserInstance)); } builder.AppendLine("提示:使用【市场查看+序号】查看商品详细信息,使用【市场购买+序号】购买商品。"); } @@ -4382,7 +4382,7 @@ namespace Oshima.FunGame.OshimaServers.Service return builder.ToString().Trim(); } - public static string GetMarketItemInfo(MarketItem item, bool simply, long visitUser) + public static string GetMarketItemInfo(MarketItem item, bool simply, User visitUser) { StringBuilder builder = new(); if (simply) @@ -4421,7 +4421,7 @@ namespace Oshima.FunGame.OshimaServers.Service { builder.AppendLine($"商品已售罄"); if (item.FinishTime.HasValue) builder.AppendLine($"售罄时间:{item.FinishTime.Value.ToString(General.GeneralDateTimeFormatChinese)}"); - if (visitUser == item.User && item.Buyers.Count > 0) + if (visitUser.Id == item.User && item.Buyers.Count > 0) { HashSet buyers = []; foreach (long buyerid in item.Buyers) @@ -4442,7 +4442,9 @@ namespace Oshima.FunGame.OshimaServers.Service if (item.FinishTime.HasValue) builder.AppendLine($"下架时间:{item.FinishTime.Value.ToString(General.GeneralDateTimeFormatChinese)}"); } else builder.AppendLine($"剩余库存:{(item.Stock == -1 ? "不限" : item.Stock)}"); - builder.AppendLine($"☆--- 物品信息 ---☆\r\n{item.Item}"); + Item newItem = item.Item.Copy(); + newItem.Character = visitUser.Inventory.MainCharacter; + builder.AppendLine($"☆--- 物品信息 ---☆\r\n{newItem.ToString(false, true)}"); } return builder.ToString().Trim(); } diff --git a/OshimaWebAPI/Controllers/FunGameController.cs b/OshimaWebAPI/Controllers/FunGameController.cs index 1c08b92..62d4941 100644 --- a/OshimaWebAPI/Controllers/FunGameController.cs +++ b/OshimaWebAPI/Controllers/FunGameController.cs @@ -2441,6 +2441,7 @@ namespace Oshima.FunGame.WebAPI.Controllers Dictionary itemsMsg = []; using SQLHelper? sql = Factory.OpenFactory.GetSQLHelper(); + Item[] items = [.. user.Inventory.Items]; foreach (int itemIndex in itemsIndex) { if (!result) @@ -2450,10 +2451,10 @@ namespace Oshima.FunGame.WebAPI.Controllers bool subResult = true; Item? item = null; - if (itemIndex > 0 && itemIndex <= user.Inventory.Items.Count) + if (itemIndex > 0 && itemIndex <= items.Length) { itemsMsg[itemIndex] = ""; - item = user.Inventory.Items.ToList()[itemIndex - 1]; + item = items[itemIndex - 1]; if (FunGameConstant.ItemCanUsed.Contains(item.ItemType)) { if (item.IsLock) @@ -2479,7 +2480,7 @@ namespace Oshima.FunGame.WebAPI.Controllers if (sql != null && SQLService.IsItemInOffers(sql, item.Guid)) { FunGameService.ReleaseUserSemaphoreSlim(uid); - return $"这个物品 {itemIndex}. {item.Name} 无法使用!因为它正在进行交易,请检查交易报价!"; + itemsMsg[itemIndex] += $"这个物品 {itemIndex}. {item.Name} 无法使用!因为它正在进行交易,请检查交易报价!\r\n"; } } catch (Exception e) @@ -2531,6 +2532,8 @@ namespace Oshima.FunGame.WebAPI.Controllers } else { + if (msg != "") msg += "\r\n"; + msg += "使用物品遇到错误,上述使用结果均已回滚,没有消耗也没有获得任何物品。"; FunGameService.ReleaseUserSemaphoreSlim(uid); } @@ -7047,7 +7050,7 @@ namespace Oshima.FunGame.WebAPI.Controllers { foreach (MarketItem marketItem in marketItems) { - msg += FunGameService.GetMarketItemInfo(marketItem, true, userid) + "\r\n"; + msg += FunGameService.GetMarketItemInfo(marketItem, true, user) + "\r\n"; } } else msg += "你还没有上架过任何物品。"; @@ -7091,7 +7094,7 @@ namespace Oshima.FunGame.WebAPI.Controllers string msg = ""; if (market.MarketItems.TryGetValue(itemid, out MarketItem? item) && item != null) { - msg = FunGameService.GetMarketItemInfo(item, false, userid); + msg = FunGameService.GetMarketItemInfo(item, false, user); } if (msg != "") { diff --git a/OshimaWebAPI/Services/RainBOTService.cs b/OshimaWebAPI/Services/RainBOTService.cs index 6f1e9c3..580e575 100644 --- a/OshimaWebAPI/Services/RainBOTService.cs +++ b/OshimaWebAPI/Services/RainBOTService.cs @@ -1482,7 +1482,6 @@ namespace Oshima.FunGame.WebAPI.Services if (e.Detail.StartsWith("批量使用")) { string detail = e.Detail.Replace("批量使用", "").Trim(); - char[] chars = [',', ' ', ',', ';', ';']; string pattern = @"\s*(?:角色\s*(?\d+))?\s*(?[\d\s,,;;]+)"; Match match = Regex.Match(detail, pattern); if (match.Success) @@ -1490,7 +1489,7 @@ namespace Oshima.FunGame.WebAPI.Services string itemIdsString = match.Groups["itemIds"].Value; string characterId = match.Groups["characterId"].Value; int[] characterIds = characterId != "" ? [int.Parse(characterId)] : [1]; - int[] itemIds = itemIdsString.Split(chars, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray(); + int[] itemIds = itemIdsString.Split(FunGameConstant.SplitChars, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray(); if (itemIds.Length > 0) { string msg = Controller.UseItem4(uid, (itemIds, characterIds)); @@ -1538,7 +1537,6 @@ namespace Oshima.FunGame.WebAPI.Services else { string detail = e.Detail.Replace("使用", "").Trim(); - char[] chars = [',', ' ', ',', ';', ';']; string pattern = @"^\s*(?:(?\d+)|(?[^\d\s].*?))(?:\s+(?\d+))?(?:\s*角色\s*(?[\d\s,,;;]*))?$"; Match match = Regex.Match(detail, pattern); if (match.Success) @@ -1547,7 +1545,7 @@ namespace Oshima.FunGame.WebAPI.Services string itemPart = match.Groups["itemPart"].Value.Trim(); string countStr = match.Groups["countPart"].Value; string characterIdsString = match.Groups["characterIds"].Value; - int[] characterIds = characterIdsString != "" ? [.. characterIdsString.Split(chars, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).Select(int.Parse)] : [1]; + int[] characterIds = characterIdsString != "" ? [.. characterIdsString.Split(FunGameConstant.SplitChars, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).Select(int.Parse)] : [1]; int count = string.IsNullOrEmpty(countStr) ? 1 : int.Parse(countStr); if (!string.IsNullOrEmpty(itemId) && int.TryParse(itemId, out int id)) @@ -1576,7 +1574,7 @@ namespace Oshima.FunGame.WebAPI.Services { string detail = e.Detail.Replace("分解物品", "").Trim(); List ids = []; - foreach (string str in detail.Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)) + foreach (string str in detail.Split(FunGameConstant.SplitChars, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)) { if (int.TryParse(str, out int id)) { @@ -2015,7 +2013,7 @@ namespace Oshima.FunGame.WebAPI.Services if (e.Detail.StartsWith("设置小队") || e.Detail.StartsWith("重组小队")) { string detail = e.Detail.Replace("设置小队", "").Replace("重组小队", "").Trim(); - string[] strings = detail.Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); + string[] strings = detail.Split(FunGameConstant.SplitChars, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); List cindexs = []; foreach (string s in strings) { @@ -2386,7 +2384,7 @@ namespace Oshima.FunGame.WebAPI.Services string detail = e.Detail.Replace("探索", "").Replace("前往", "").Trim(); string msg = ""; string eid = ""; - string[] strings = detail.Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); + string[] strings = detail.Split(FunGameConstant.SplitChars, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); List cindexs = []; foreach (string s in strings) { @@ -2531,7 +2529,7 @@ namespace Oshima.FunGame.WebAPI.Services { string detail = e.Detail.Replace("上锁", "").Replace("锁定", "").Trim(); string msg = ""; - string[] strings = detail.Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); + string[] strings = detail.Split(FunGameConstant.SplitChars, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); List indexs = []; foreach (string s in strings) { @@ -2555,7 +2553,7 @@ namespace Oshima.FunGame.WebAPI.Services { string detail = e.Detail.Replace("解锁", "").Trim(); string msg = ""; - string[] strings = detail.Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); + string[] strings = detail.Split(FunGameConstant.SplitChars, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); List indexs = []; foreach (string s in strings) { @@ -2688,7 +2686,7 @@ namespace Oshima.FunGame.WebAPI.Services { string detail = e.Detail.Replace("报价添加物品", "").Trim(); string msg = ""; - string[] strings = detail.Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); + string[] strings = detail.Split(FunGameConstant.SplitChars, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); List indexs = []; foreach (string s in strings) { @@ -2716,7 +2714,7 @@ namespace Oshima.FunGame.WebAPI.Services { string detail = e.Detail.Replace("报价添加对方物品", "").Trim(); string msg = ""; - string[] strings = detail.Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); + string[] strings = detail.Split(FunGameConstant.SplitChars, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); List indexs = []; foreach (string s in strings) { @@ -2744,7 +2742,7 @@ namespace Oshima.FunGame.WebAPI.Services { string detail = e.Detail.Replace("报价移除物品", "").Trim(); string msg = ""; - string[] strings = detail.Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); + string[] strings = detail.Split(FunGameConstant.SplitChars, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); List indexs = []; foreach (string s in strings) { @@ -2772,7 +2770,7 @@ namespace Oshima.FunGame.WebAPI.Services { string detail = e.Detail.Replace("报价移除对方物品", "").Trim(); string msg = ""; - string[] strings = detail.Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); + string[] strings = detail.Split(FunGameConstant.SplitChars, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); List indexs = []; foreach (string s in strings) { @@ -2800,7 +2798,7 @@ namespace Oshima.FunGame.WebAPI.Services { string detail = e.Detail.Replace("商店出售", "").Trim(); List ids = []; - foreach (string str in detail.Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)) + foreach (string str in detail.Split(FunGameConstant.SplitChars, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)) { if (int.TryParse(str, out int id)) { @@ -3067,7 +3065,7 @@ namespace Oshima.FunGame.WebAPI.Services if (e.Detail.StartsWith("市场出售")) { string detail = e.Detail.Replace("市场出售", "").Trim(); - string[] strings = detail.Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); + string[] strings = detail.Split(FunGameConstant.SplitChars, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); if (strings.Length < 2 || !double.TryParse(strings[^1], out double price)) { await SendAsync(e, "市场出售", "格式不正确,请使用:市场出售 <{物品序号...}> <价格>。多个物品序号使用空格隔开。");