From b344b9b20bd697b0225c5eb4ef3fd441c097dd58 Mon Sep 17 00:00:00 2001 From: milimoe Date: Fri, 10 Apr 2026 00:14:47 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=A8=E5=81=9A=E6=B4=BB=E5=8A=A8?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E3=80=81=E9=A2=86=E6=B4=BB=E5=8A=A8=E5=A5=96?= =?UTF-8?q?=E5=8A=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OshimaServers/Service/FunGameOrderList.cs | 4 +- OshimaServers/Service/FunGameService.cs | 96 ++++++++++++++- OshimaWebAPI/Controllers/FunGameController.cs | 115 +++++++++++++++++- OshimaWebAPI/Services/RainBOTService.cs | 38 ++++++ 4 files changed, 247 insertions(+), 6 deletions(-) diff --git a/OshimaServers/Service/FunGameOrderList.cs b/OshimaServers/Service/FunGameOrderList.cs index c632d9e..8148df1 100644 --- a/OshimaServers/Service/FunGameOrderList.cs +++ b/OshimaServers/Service/FunGameOrderList.cs @@ -163,8 +163,8 @@ {"公告", "查看系统公告"}, {"活动", "查看活动中心"}, {"查活动 <活动序号>", "查看指定活动详情"}, - {"做活动任务 <活动序号> <任务序号>", "开始指定活动任务"}, - {"领取奖励 <活动序号>", "领取活动的奖励"}, + {"做活动任务 <活动序号> <任务序号>", "做指定的活动任务"}, + {"领取奖励 <活动序号> <任务序号>", "领取活动任务的奖励"}, }; public static Dictionary StoreHelp { get; } = new() { diff --git a/OshimaServers/Service/FunGameService.cs b/OshimaServers/Service/FunGameService.cs index 08cd123..f4032f6 100644 --- a/OshimaServers/Service/FunGameService.cs +++ b/OshimaServers/Service/FunGameService.cs @@ -2607,7 +2607,7 @@ namespace Oshima.FunGame.OshimaServers.Service if (userActivities.Values.FirstOrDefault(a => a.Id == id) is Activity userActivity) { if (result != "") result += "\r\n"; - result += userActivity.ToString(true, true); + result += GetActivityString(userActivity, true, true); } } return result; @@ -4973,6 +4973,100 @@ namespace Oshima.FunGame.OshimaServers.Service return builder.ToString().Trim(); } + public static bool ExecuteImmediateQuest(User user, Quest quest, out string result, Activity? activity = null) + { + result = "在任务过程中,你碰巧遇到了米莉,任务直接完成了!"; + return true; + } + + public static string SettleActivityQuest(User user, Activity activity, Quest quest) + { + if (quest.AwardsString != "") + { + if (quest.CreditsAward > 0) + { + user.Inventory.Credits += quest.CreditsAward; + } + if (quest.MaterialsAward > 0) + { + user.Inventory.Materials += quest.MaterialsAward; + } + foreach (Item item in quest.Awards) + { + if (quest.AwardsCount.TryGetValue(item.Name, out int qty)) + { + for (int i = 0; i < qty; i++) + { + if (FunGameConstant.AllItems.FirstOrDefault(i => i.Name == item.Name) != null) + { + AddItemToUserInventory(user, item, copyLevel: item.ItemType == ItemType.MagicCard); + } + } + } + } + return $"活动【{activity.Name}】的任务【{quest.Name}】已结算,获得奖励:【{quest.AwardsString}】!"; + } + return ""; + } + + public static string GetActivityString(Activity activity, bool showQuests, bool isSubActivity = false, User? user = null) + { + activity.UpdateState(); + StringBuilder builder = new(); + + if (!isSubActivity) + { + builder.AppendLine($"☆--- {activity.Name} ---☆"); + } + else + { + builder.AppendLine($"==[ {activity.Name} ]=="); + } + + builder.AppendLine($"{activity.Description}"); + builder.AppendLine($"活动状态:{CommonSet.GetActivityStatus(activity.Status)}"); + builder.AppendLine(activity.GetTimeString(!isSubActivity)); + + if (showQuests && activity.Quests.Count > 0) + { + builder.AppendLine("=== 任务列表 ==="); + builder.AppendLine(string.Join("\r\n", activity.Quests.Select(q => GetQuestString(q, activity, user)))); + } + + return builder.ToString().Trim(); + } + + public static string GetQuestString(Quest quest, Activity? activity = null, User? user = null) + { + string progressString = ""; + if (quest.QuestType == QuestType.Progressive) + { + progressString = $"\r\n当前进度:{quest.Progress}/{quest.MaxProgress}"; + } + + string str = $"{quest.Id}. {quest.Name}\r\n" + + $"{quest.Description}\r\n" + + (quest.QuestType == QuestType.Continuous ? $"需要时间:{quest.EstimatedMinutes} 分钟\r\n" : "") + + (quest.StartTime.HasValue ? $"开始时间:{quest.StartTime.Value.ToString(General.GeneralDateTimeFormatChinese)}" + + (quest.Status == QuestState.InProgress && quest.QuestType == QuestType.Continuous ? + $"\r\n预计在 {Math.Max(Math.Round((quest.StartTime.Value.AddMinutes(quest.EstimatedMinutes) - DateTime.Now).TotalMinutes, MidpointRounding.ToPositiveInfinity), 1)} 分钟后完成" : "") + + "\r\n" + : "") + + $"完成奖励:{quest.AwardsString}\r\n" + + $"任务状态:"; + + if (activity != null && user != null && activity.QuestsAwardedUsers.TryGetValue(quest.Id, out HashSet? value) && (value?.Contains(user.Id) ?? false)) + { + str += CommonSet.GetQuestStatus(QuestState.Settled); + } + else + { + str += CommonSet.GetQuestStatus(quest.Status); + } + + return str + progressString + (quest.SettleTime.HasValue ? $"\r\n结算时间:{quest.SettleTime.Value.ToString(General.GeneralDateTimeFormatChinese)}" : ""); + } + public static void RefreshNotice() { Notices.LoadConfig(); diff --git a/OshimaWebAPI/Controllers/FunGameController.cs b/OshimaWebAPI/Controllers/FunGameController.cs index 18fda4f..aeafabe 100644 --- a/OshimaWebAPI/Controllers/FunGameController.cs +++ b/OshimaWebAPI/Controllers/FunGameController.cs @@ -4538,9 +4538,15 @@ namespace Oshima.FunGame.WebAPI.Controllers else if (quest.QuestType == QuestType.Immediate) { msgs.Add($"开始任务【{quest.Name}】成功!任务信息如下:\r\n{quest}"); - // TODO:实现任务逻辑 - quest.Status = QuestState.Completed; - msgs.Add("在任务过程中,你碰巧遇到了米莉,任务直接完成了!"); + if (FunGameService.ExecuteImmediateQuest(user, quest, out string result)) + { + quest.Status = QuestState.Completed; + msgs.Add(result); + } + else + { + msgs.Add("你的任务失败了,重新做一次吧……"); + } } else if (quest.QuestType == QuestType.Progressive) { @@ -6572,6 +6578,109 @@ namespace Oshima.FunGame.WebAPI.Controllers { User user = FunGameService.GetUser(pc); + FunGameService.GetEventCenter(user); + if (FunGameService.Activities.FirstOrDefault(a => a.Id == activityid) is Activity activity && activity.Quests.FirstOrDefault(q => q.Id == questid) is Quest quest) + { + if (quest.QuestType == QuestType.Immediate) + { + if (activity.HasUserAwarded(user.Id, quest)) + { + msg = "你已经结算过该任务的奖励了!请检查活动详情。"; + } + else if (quest.Status != QuestState.NotStarted) + { + msg = "现在还不可以做这个任务。"; + } + else if (FunGameService.ExecuteImmediateQuest(user, quest, out string result, activity)) + { + string awardString = FunGameService.SettleActivityQuest(user, activity, quest); + if (awardString != "") + { + msg = awardString; + activity.RegisterAwardedUser(user.Id, quest); + } + if (result != "") + { + msg = result + "\r\n" + msg; + } + if (msg == "") + { + msg = "任务无法进行,请联系服务器管理员。"; + } + } + } + else + { + msg = $"请根据任务要求完成任务:\r\n{quest}。"; + } + } + else + { + msg = "找不到符合条件的活动/任务。"; + } + + FunGameService.SetUserConfigAndReleaseSemaphoreSlim(userid, pc, user); + + return msg; + } + else + { + FunGameService.ReleaseUserSemaphoreSlim(userid); + return noSaved; + } + } + + [HttpPost("claimeventprize")] + public string ClaimEventPrize([FromQuery] long? uid = null, [FromQuery] long? aid = null, [FromQuery] long? qid = null) + { + long userid = uid ?? Convert.ToInt64("10" + Verification.CreateVerifyCode(VerifyCodeType.NumberVerifyCode, 11)); + long activityid = aid ?? 0; + long questid = qid ?? 0; + + PluginConfig pc = FunGameService.GetUserConfig(userid, out _); + + string msg = ""; + if (pc.Count > 0) + { + User user = FunGameService.GetUser(pc); + + FunGameService.GetEventCenter(user); + if (FunGameService.Activities.FirstOrDefault(a => a.Id == activityid) is Activity activity && activity.Quests.FirstOrDefault(q => q.Id == questid) is Quest quest) + { + if (quest.QuestType == QuestType.Progressive || quest.QuestType == QuestType.Continuous) + { + if (activity.HasUserAwarded(user.Id, quest)) + { + msg = "你已经结算过该任务的奖励了!请检查活动详情。"; + } + else if (quest.Status != QuestState.Completed) + { + msg = $"该任务还未完成。\r\n{quest}"; + } + else + { + string awardString = FunGameService.SettleActivityQuest(user, activity, quest); + if (awardString != "") + { + msg = awardString; + activity.RegisterAwardedUser(user.Id, quest); + } + else + { + msg = "无法领取该任务的奖励。"; + } + } + } + else + { + msg = "该任务只能通过【做活动任务】指令完成并领取奖励。"; + } + } + else + { + msg = "找不到符合条件的活动/任务。"; + } + FunGameService.SetUserConfigAndReleaseSemaphoreSlim(userid, pc, user); return msg; diff --git a/OshimaWebAPI/Services/RainBOTService.cs b/OshimaWebAPI/Services/RainBOTService.cs index f78923a..0e02003 100644 --- a/OshimaWebAPI/Services/RainBOTService.cs +++ b/OshimaWebAPI/Services/RainBOTService.cs @@ -2561,6 +2561,44 @@ namespace Oshima.FunGame.WebAPI.Services return result; } + if (e.Detail.StartsWith("做活动任务", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("做活动任务", "").Trim(); + string[] strings = detail.Split(" ", StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); + int aid = -1, qid = -1; + if (strings.Length > 0 && int.TryParse(strings[0].Trim(), out aid) && strings.Length > 1 && int.TryParse(strings[1].Trim(), out qid)) + { + if (aid != -1 && qid != -1) + { + string msg = Controller.PerformEvent(uid, aid, qid); + if (msg != "") + { + await SendAsync(e, "做活动任务", msg); + } + } + } + return result; + } + + if (e.Detail.StartsWith("领取奖励", StringComparison.CurrentCultureIgnoreCase)) + { + string detail = e.Detail.Replace("领取奖励", "").Trim(); + string[] strings = detail.Split(" ", StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); + int aid = -1, qid = -1; + if (strings.Length > 0 && int.TryParse(strings[0].Trim(), out aid) && strings.Length > 1 && int.TryParse(strings[1].Trim(), out qid)) + { + if (aid != -1 && qid != -1) + { + string msg = Controller.ClaimEventPrize(uid, aid, qid); + if (msg != "") + { + await SendAsync(e, "领取奖励", msg); + } + } + } + return result; + } + if (e.Detail.StartsWith("批量锁定", StringComparison.CurrentCultureIgnoreCase)) { string detail = e.Detail.Replace("批量锁定", "").Trim();