补全做活动任务、领活动奖励

This commit is contained in:
milimoe 2026-04-10 00:14:47 +08:00
parent 5aa1701d85
commit b344b9b20b
Signed by: milimoe
GPG Key ID: 9554D37E4B8991D0
4 changed files with 247 additions and 6 deletions

View File

@ -163,8 +163,8 @@
{"公告", "查看系统公告"}, {"公告", "查看系统公告"},
{"活动", "查看活动中心"}, {"活动", "查看活动中心"},
{"查活动 <活动序号>", "查看指定活动详情"}, {"查活动 <活动序号>", "查看指定活动详情"},
{"做活动任务 <活动序号> <任务序号>", "开始指定活动任务"}, {"做活动任务 <活动序号> <任务序号>", "做指定的活动任务"},
{"领取奖励 <活动序号>", "领取活动的奖励"}, {"领取奖励 <活动序号> <任务序号>", "领取活动任务的奖励"},
}; };
public static Dictionary<string, string> StoreHelp { get; } = new() { public static Dictionary<string, string> StoreHelp { get; } = new() {

View File

@ -2607,7 +2607,7 @@ namespace Oshima.FunGame.OshimaServers.Service
if (userActivities.Values.FirstOrDefault(a => a.Id == id) is Activity userActivity) if (userActivities.Values.FirstOrDefault(a => a.Id == id) is Activity userActivity)
{ {
if (result != "") result += "\r\n"; if (result != "") result += "\r\n";
result += userActivity.ToString(true, true); result += GetActivityString(userActivity, true, true);
} }
} }
return result; return result;
@ -4973,6 +4973,100 @@ namespace Oshima.FunGame.OshimaServers.Service
return builder.ToString().Trim(); 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<long>? 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() public static void RefreshNotice()
{ {
Notices.LoadConfig(); Notices.LoadConfig();

View File

@ -4538,9 +4538,15 @@ namespace Oshima.FunGame.WebAPI.Controllers
else if (quest.QuestType == QuestType.Immediate) else if (quest.QuestType == QuestType.Immediate)
{ {
msgs.Add($"开始任务【{quest.Name}】成功!任务信息如下:\r\n{quest}"); msgs.Add($"开始任务【{quest.Name}】成功!任务信息如下:\r\n{quest}");
// TODO实现任务逻辑 if (FunGameService.ExecuteImmediateQuest(user, quest, out string result))
quest.Status = QuestState.Completed; {
msgs.Add("在任务过程中,你碰巧遇到了米莉,任务直接完成了!"); quest.Status = QuestState.Completed;
msgs.Add(result);
}
else
{
msgs.Add("你的任务失败了,重新做一次吧……");
}
} }
else if (quest.QuestType == QuestType.Progressive) else if (quest.QuestType == QuestType.Progressive)
{ {
@ -6572,6 +6578,109 @@ namespace Oshima.FunGame.WebAPI.Controllers
{ {
User user = FunGameService.GetUser(pc); 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); FunGameService.SetUserConfigAndReleaseSemaphoreSlim(userid, pc, user);
return msg; return msg;

View File

@ -2561,6 +2561,44 @@ namespace Oshima.FunGame.WebAPI.Services
return result; 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)) if (e.Detail.StartsWith("批量锁定", StringComparison.CurrentCultureIgnoreCase))
{ {
string detail = e.Detail.Replace("批量锁定", "").Trim(); string detail = e.Detail.Replace("批量锁定", "").Trim();