mirror of
https://github.com/project-redbud/FunGame-Core.git
synced 2025-12-05 08:09:02 +00:00
活动、任务、活动中心优化
This commit is contained in:
parent
9b1a62c6bf
commit
155b846aa5
@ -1,17 +1,29 @@
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
|
using Milimoe.FunGame.Core.Interface.Entity;
|
||||||
using Milimoe.FunGame.Core.Library.Common.Event;
|
using Milimoe.FunGame.Core.Library.Common.Event;
|
||||||
using Milimoe.FunGame.Core.Library.Constant;
|
using Milimoe.FunGame.Core.Library.Constant;
|
||||||
|
|
||||||
namespace Milimoe.FunGame.Core.Entity
|
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 DateTime? StartTime { get; set; } = null;
|
||||||
public string Name { get; set; } = name;
|
public DateTime? EndTime { get; set; } = null;
|
||||||
public DateTime StartTime { get; set; } = startTime;
|
public string Description { get; set; } = "";
|
||||||
public DateTime EndTime { get; set; } = endTime;
|
|
||||||
public ActivityState Status { get; private set; } = ActivityState.Future;
|
public ActivityState Status { get; private set; } = ActivityState.Future;
|
||||||
public HashSet<Quest> Quests { get; set; } = [];
|
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;
|
public event Action<ActivityEventArgs>? UserAccess;
|
||||||
@ -31,17 +43,25 @@ namespace Milimoe.FunGame.Core.Entity
|
|||||||
{
|
{
|
||||||
ActivityState newState;
|
ActivityState newState;
|
||||||
DateTime now = DateTime.Now;
|
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;
|
newState = ActivityState.Future;
|
||||||
}
|
}
|
||||||
else if (now >= upComingTime && now < StartTime)
|
else if (upComingTime != null && now >= upComingTime && now < StartTime)
|
||||||
{
|
{
|
||||||
newState = ActivityState.Upcoming;
|
newState = ActivityState.Upcoming;
|
||||||
}
|
}
|
||||||
else if (now >= StartTime && now < EndTime)
|
else if ((StartTime is null || now >= StartTime) && (EndTime is null || now < EndTime))
|
||||||
{
|
{
|
||||||
newState = ActivityState.InProgress;
|
newState = ActivityState.InProgress;
|
||||||
}
|
}
|
||||||
@ -93,17 +113,10 @@ namespace Milimoe.FunGame.Core.Entity
|
|||||||
UpdateState();
|
UpdateState();
|
||||||
StringBuilder builder = new();
|
StringBuilder builder = new();
|
||||||
|
|
||||||
builder.AppendLine($"☆--- [{Name}] ---☆");
|
builder.AppendLine($"☆--- {Name} ---☆");
|
||||||
string status = Status switch
|
builder.AppendLine($"{Description}");
|
||||||
{
|
builder.AppendLine($"活动状态:{CommonSet.GetActivityStatus(Status)}");
|
||||||
ActivityState.Future => "预告中",
|
builder.AppendLine(GetTimeString());
|
||||||
ActivityState.Upcoming => "即将开始",
|
|
||||||
ActivityState.InProgress => "进行中",
|
|
||||||
_ => "已结束"
|
|
||||||
};
|
|
||||||
builder.AppendLine($"活动状态:{status}");
|
|
||||||
builder.AppendLine($"开始时间:{StartTime.ToString(General.GeneralDateTimeFormatChinese)}");
|
|
||||||
builder.AppendLine($"结束时间:{EndTime.ToString(General.GeneralDateTimeFormatChinese)}");
|
|
||||||
|
|
||||||
if (showQuests && Quests.Count > 0)
|
if (showQuests && Quests.Count > 0)
|
||||||
{
|
{
|
||||||
@ -114,9 +127,53 @@ namespace Milimoe.FunGame.Core.Entity
|
|||||||
return builder.ToString().Trim();
|
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()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
return ToString(true);
|
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 class Quest : BaseEntity
|
||||||
{
|
{
|
||||||
public string Description { get; set; } = "";
|
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 CharacterId { get; set; } = 0;
|
||||||
public long RegionId { get; set; } = 0;
|
public long RegionId { get; set; } = 0;
|
||||||
public double CreditsAward { get; set; } = 0;
|
public double CreditsAward { get; set; } = 0;
|
||||||
@ -28,7 +28,12 @@ namespace Milimoe.FunGame.Core.Entity
|
|||||||
}
|
}
|
||||||
foreach (Item item in Awards)
|
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);
|
return string.Join(",", awards);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,8 +9,8 @@ namespace Milimoe.FunGame.Core.Library.Common.Event
|
|||||||
public long QuestId { get; } = questId;
|
public long QuestId { get; } = questId;
|
||||||
public Activity Activity { get; } = activity;
|
public Activity Activity { get; } = activity;
|
||||||
public ActivityState ActivityState { get; } = activity.Status;
|
public ActivityState ActivityState { get; } = activity.Status;
|
||||||
public DateTime StartTime { get; } = activity.StartTime;
|
public DateTime? StartTime { get; } = activity.StartTime;
|
||||||
public DateTime EndTime { get; } = activity.EndTime;
|
public DateTime? EndTime { get; } = activity.EndTime;
|
||||||
public bool AllowAccess { get; set; } = false;
|
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)
|
* 此文件用于保存字符串常量(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>
|
/// <summary>
|
||||||
|
|||||||
@ -38,7 +38,7 @@ namespace Milimoe.FunGame.Core.Model
|
|||||||
|
|
||||||
public void AddOrUpdateEvent(string name, IEnumerable<Activity> activities)
|
public void AddOrUpdateEvent(string name, IEnumerable<Activity> activities)
|
||||||
{
|
{
|
||||||
Events[name] = new(activities);
|
Events[name] = [.. activities];
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool RemoveEvent(string name)
|
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(),
|
Converters = { new DateTimeConverter(), new DataTableConverter(), new DataSetConverter(), new UserConverter(), new RoomConverter(),
|
||||||
new CharacterConverter(), new MagicResistanceConverter(), new EquipSlotConverter(), new SkillConverter(), new EffectConverter(), new ItemConverter(),
|
new CharacterConverter(), new MagicResistanceConverter(), new EquipSlotConverter(), new SkillConverter(), new EffectConverter(), new ItemConverter(),
|
||||||
new InventoryConverter(), new NormalAttackConverter(), new ClubConverter(), new GoodsConverter(), new StoreConverter(),
|
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