mirror of
https://github.com/project-redbud/FunGame-Core.git
synced 2025-12-05 00:06:02 +00:00
活动、任务、活动中心优化
This commit is contained in:
parent
9b1a62c6bf
commit
155b846aa5
@ -1,17 +1,29 @@
|
||||
using System.Text;
|
||||
using Milimoe.FunGame.Core.Interface.Entity;
|
||||
using Milimoe.FunGame.Core.Library.Common.Event;
|
||||
using Milimoe.FunGame.Core.Library.Constant;
|
||||
|
||||
namespace Milimoe.FunGame.Core.Entity
|
||||
{
|
||||
public class Activity(long id, string name, DateTime startTime, DateTime endTime)
|
||||
public class Activity : BaseEntity
|
||||
{
|
||||
public long Id { get; set; } = id;
|
||||
public string Name { get; set; } = name;
|
||||
public DateTime StartTime { get; set; } = startTime;
|
||||
public DateTime EndTime { get; set; } = endTime;
|
||||
public DateTime? StartTime { get; set; } = null;
|
||||
public DateTime? EndTime { get; set; } = null;
|
||||
public string Description { get; set; } = "";
|
||||
public ActivityState Status { get; private set; } = ActivityState.Future;
|
||||
public HashSet<Quest> Quests { get; set; } = [];
|
||||
public long Predecessor { get; set; } = -1;
|
||||
public ActivityState PredecessorStatus { get; set; } = ActivityState.Future;
|
||||
|
||||
public Activity(long id, string name, DateTime? startTime = null, DateTime? endTime = null)
|
||||
{
|
||||
Id = id;
|
||||
Name = name;
|
||||
StartTime = startTime;
|
||||
EndTime = endTime;
|
||||
}
|
||||
|
||||
public Activity() { }
|
||||
|
||||
// 事件
|
||||
public event Action<ActivityEventArgs>? UserAccess;
|
||||
@ -31,17 +43,25 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
{
|
||||
ActivityState newState;
|
||||
DateTime now = DateTime.Now;
|
||||
DateTime upComingTime = StartTime.AddHours(-6);
|
||||
DateTime? upComingTime = StartTime?.AddHours(-6);
|
||||
|
||||
if (now < upComingTime)
|
||||
if (Predecessor != -1 && PredecessorStatus != ActivityState.Ended)
|
||||
{
|
||||
// 如果有前置活动且前置活动未结束,则当前活动状态为未来
|
||||
newState = ActivityState.Future;
|
||||
Status = newState;
|
||||
return;
|
||||
}
|
||||
|
||||
if (upComingTime != null && now < upComingTime)
|
||||
{
|
||||
newState = ActivityState.Future;
|
||||
}
|
||||
else if (now >= upComingTime && now < StartTime)
|
||||
else if (upComingTime != null && now >= upComingTime && now < StartTime)
|
||||
{
|
||||
newState = ActivityState.Upcoming;
|
||||
}
|
||||
else if (now >= StartTime && now < EndTime)
|
||||
else if ((StartTime is null || now >= StartTime) && (EndTime is null || now < EndTime))
|
||||
{
|
||||
newState = ActivityState.InProgress;
|
||||
}
|
||||
@ -93,17 +113,10 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
UpdateState();
|
||||
StringBuilder builder = new();
|
||||
|
||||
builder.AppendLine($"☆--- [{Name}] ---☆");
|
||||
string status = Status switch
|
||||
{
|
||||
ActivityState.Future => "预告中",
|
||||
ActivityState.Upcoming => "即将开始",
|
||||
ActivityState.InProgress => "进行中",
|
||||
_ => "已结束"
|
||||
};
|
||||
builder.AppendLine($"活动状态:{status}");
|
||||
builder.AppendLine($"开始时间:{StartTime.ToString(General.GeneralDateTimeFormatChinese)}");
|
||||
builder.AppendLine($"结束时间:{EndTime.ToString(General.GeneralDateTimeFormatChinese)}");
|
||||
builder.AppendLine($"☆--- {Name} ---☆");
|
||||
builder.AppendLine($"{Description}");
|
||||
builder.AppendLine($"活动状态:{CommonSet.GetActivityStatus(Status)}");
|
||||
builder.AppendLine(GetTimeString());
|
||||
|
||||
if (showQuests && Quests.Count > 0)
|
||||
{
|
||||
@ -114,9 +127,53 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
return builder.ToString().Trim();
|
||||
}
|
||||
|
||||
public string GetTimeString(bool full = true)
|
||||
{
|
||||
if (Predecessor != -1 && PredecessorStatus != ActivityState.Ended)
|
||||
{
|
||||
return $"在前置活动结束后开启";
|
||||
}
|
||||
if (full)
|
||||
{
|
||||
if (StartTime != null && EndTime != null)
|
||||
{
|
||||
return $"开始时间:{StartTime.Value.ToString(General.GeneralDateTimeFormatChinese)}\r\n结束时间:{EndTime.Value.ToString(General.GeneralDateTimeFormatChinese)}";
|
||||
}
|
||||
else if (StartTime != null && EndTime is null)
|
||||
{
|
||||
return $"活动时间:{StartTime.Value.ToString(General.GeneralDateTimeFormatChinese)} 起";
|
||||
}
|
||||
else if (StartTime is null && EndTime != null)
|
||||
{
|
||||
return $"活动将在 {EndTime.Value.ToString(General.GeneralDateTimeFormatChinese)} 结束";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (StartTime != null && EndTime != null)
|
||||
{
|
||||
return $"活动时间:{StartTime.Value.ToString(General.GeneralDateTimeFormatChinese)} - {EndTime.Value.ToString(General.GeneralDateTimeFormatChinese)}";
|
||||
}
|
||||
else if (StartTime != null && EndTime is null)
|
||||
{
|
||||
return $"活动时间:{StartTime.Value.ToString(General.GeneralDateTimeFormatChinese)} 起";
|
||||
}
|
||||
else if (StartTime is null && EndTime != null)
|
||||
{
|
||||
return $"截止于 {EndTime.Value.ToString(General.GeneralDateTimeFormatChinese)}";
|
||||
}
|
||||
}
|
||||
return "活动时间:长期";
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return ToString(true);
|
||||
}
|
||||
|
||||
public override bool Equals(IBaseEntity? other)
|
||||
{
|
||||
return other is Activity && GetIdName() == other?.GetIdName();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -6,7 +6,7 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
public class Quest : BaseEntity
|
||||
{
|
||||
public string Description { get; set; } = "";
|
||||
public QuestState Status { get; set; } = 0;
|
||||
public QuestState Status { get; set; } = QuestState.NotStarted;
|
||||
public long CharacterId { get; set; } = 0;
|
||||
public long RegionId { get; set; } = 0;
|
||||
public double CreditsAward { get; set; } = 0;
|
||||
@ -28,7 +28,12 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
}
|
||||
foreach (Item item in Awards)
|
||||
{
|
||||
awards.Add($"[{ItemSet.GetQualityTypeName(item.QualityType)}|{ItemSet.GetItemTypeName(item.ItemType)}] {item.Name} * {AwardsCount[item.Name]}");
|
||||
int count = 1;
|
||||
if (AwardsCount.TryGetValue(item.Name, out int value))
|
||||
{
|
||||
count = value;
|
||||
}
|
||||
awards.Add($"[{ItemSet.GetQualityTypeName(item.QualityType)}|{ItemSet.GetItemTypeName(item.ItemType)}] {item.Name} * {count}");
|
||||
}
|
||||
return string.Join(",", awards);
|
||||
}
|
||||
|
||||
@ -9,8 +9,8 @@ namespace Milimoe.FunGame.Core.Library.Common.Event
|
||||
public long QuestId { get; } = questId;
|
||||
public Activity Activity { get; } = activity;
|
||||
public ActivityState ActivityState { get; } = activity.Status;
|
||||
public DateTime StartTime { get; } = activity.StartTime;
|
||||
public DateTime EndTime { get; } = activity.EndTime;
|
||||
public DateTime? StartTime { get; } = activity.StartTime;
|
||||
public DateTime? EndTime { get; } = activity.EndTime;
|
||||
public bool AllowAccess { get; set; } = false;
|
||||
}
|
||||
}
|
||||
|
||||
88
Library/Common/JsonConverter/ActivityConverter.cs
Normal file
88
Library/Common/JsonConverter/ActivityConverter.cs
Normal file
@ -0,0 +1,88 @@
|
||||
using System.Text.Json;
|
||||
using Milimoe.FunGame.Core.Api.Utility;
|
||||
using Milimoe.FunGame.Core.Entity;
|
||||
using Milimoe.FunGame.Core.Library.Common.Architecture;
|
||||
using Milimoe.FunGame.Core.Library.Constant;
|
||||
|
||||
namespace Milimoe.FunGame.Core.Library.Common.JsonConverter
|
||||
{
|
||||
public class ActivityConverter : BaseEntityConverter<Activity>
|
||||
{
|
||||
public override Activity NewInstance()
|
||||
{
|
||||
return new Activity();
|
||||
}
|
||||
|
||||
public override void ReadPropertyName(ref Utf8JsonReader reader, string propertyName, JsonSerializerOptions options, ref Activity result, Dictionary<string, object> convertingContext)
|
||||
{
|
||||
switch (propertyName)
|
||||
{
|
||||
case nameof(Activity.Id):
|
||||
result.Id = reader.GetInt64();
|
||||
break;
|
||||
case nameof(Activity.Guid):
|
||||
result.Guid = NetworkUtility.JsonDeserialize<Guid>(ref reader, options);
|
||||
break;
|
||||
case nameof(Activity.Name):
|
||||
result.Name = reader.GetString() ?? "";
|
||||
break;
|
||||
case nameof(Activity.Description):
|
||||
result.Description = reader.GetString() ?? "";
|
||||
break;
|
||||
case nameof(Activity.StartTime):
|
||||
string startTimeStr = reader.GetString() ?? "";
|
||||
if (DateTime.TryParseExact(startTimeStr, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime startTime))
|
||||
{
|
||||
result.StartTime = startTime;
|
||||
}
|
||||
result.UpdateState();
|
||||
break;
|
||||
case nameof(Activity.EndTime):
|
||||
string endTimeStr = reader.GetString() ?? "";
|
||||
if (DateTime.TryParseExact(endTimeStr, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime endTime))
|
||||
{
|
||||
result.EndTime = endTime;
|
||||
}
|
||||
result.UpdateState();
|
||||
break;
|
||||
case nameof(Activity.Quests):
|
||||
List<Quest> quests = NetworkUtility.JsonDeserialize<List<Quest>>(ref reader, options) ?? [];
|
||||
foreach (Quest quest in quests)
|
||||
{
|
||||
result.Quests.Add(quest);
|
||||
}
|
||||
break;
|
||||
case nameof(Activity.Predecessor):
|
||||
result.Predecessor = reader.GetInt64();
|
||||
result.UpdateState();
|
||||
break;
|
||||
case nameof(Activity.PredecessorStatus):
|
||||
result.PredecessorStatus = (ActivityState)reader.GetInt32();
|
||||
result.UpdateState();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public override void Write(Utf8JsonWriter writer, Activity value, JsonSerializerOptions options)
|
||||
{
|
||||
writer.WriteStartObject();
|
||||
|
||||
writer.WriteNumber(nameof(Activity.Id), value.Id);
|
||||
if (value.Guid != Guid.Empty)
|
||||
{
|
||||
writer.WritePropertyName(nameof(Activity.Guid));
|
||||
JsonSerializer.Serialize(writer, value.Guid, options);
|
||||
}
|
||||
writer.WriteString(nameof(Activity.Name), value.Name);
|
||||
writer.WriteString(nameof(Activity.Description), value.Description);
|
||||
if (value.StartTime != null) writer.WriteString(nameof(Activity.StartTime), value.StartTime.Value.ToString(General.GeneralDateTimeFormat));
|
||||
if (value.EndTime != null) writer.WriteString(nameof(Activity.EndTime), value.EndTime.Value.ToString(General.GeneralDateTimeFormat));
|
||||
writer.WritePropertyName(nameof(Activity.Quests));
|
||||
JsonSerializer.Serialize(writer, value.Quests, options);
|
||||
writer.WriteNumber(nameof(Activity.Predecessor), value.Predecessor);
|
||||
writer.WriteNumber(nameof(Activity.PredecessorStatus), (int)value.PredecessorStatus);
|
||||
|
||||
writer.WriteEndObject();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,4 @@
|
||||
|
||||
using Milimoe.FunGame.Core.Model;
|
||||
using Milimoe.FunGame.Core.Model;
|
||||
|
||||
/**
|
||||
* 此文件用于保存字符串常量(String Set)
|
||||
@ -33,6 +32,17 @@ namespace Milimoe.FunGame.Core.Library.Constant
|
||||
_ => "未开始"
|
||||
};
|
||||
}
|
||||
|
||||
public static string GetActivityStatus(ActivityState status)
|
||||
{
|
||||
return status switch
|
||||
{
|
||||
ActivityState.Future => "预告中",
|
||||
ActivityState.Upcoming => "即将开始",
|
||||
ActivityState.InProgress => "进行中",
|
||||
_ => "已结束"
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@ -38,7 +38,7 @@ namespace Milimoe.FunGame.Core.Model
|
||||
|
||||
public void AddOrUpdateEvent(string name, IEnumerable<Activity> activities)
|
||||
{
|
||||
Events[name] = new(activities);
|
||||
Events[name] = [.. activities];
|
||||
}
|
||||
|
||||
public bool RemoveEvent(string name)
|
||||
|
||||
@ -22,7 +22,7 @@ namespace Milimoe.FunGame.Core.Service
|
||||
Converters = { new DateTimeConverter(), new DataTableConverter(), new DataSetConverter(), new UserConverter(), new RoomConverter(),
|
||||
new CharacterConverter(), new MagicResistanceConverter(), new EquipSlotConverter(), new SkillConverter(), new EffectConverter(), new ItemConverter(),
|
||||
new InventoryConverter(), new NormalAttackConverter(), new ClubConverter(), new GoodsConverter(), new StoreConverter(),
|
||||
new NovelOptionConverter(), new NovelNodeConverter(), new ShieldConverter(), new RoundRecordConverter()
|
||||
new NovelOptionConverter(), new NovelNodeConverter(), new ShieldConverter(), new RoundRecordConverter(), new ActivityConverter()
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user