Add information about the third anniversary event (#62)

* Add information about the third anniversary event
This commit is contained in:
qmengz
2025-11-08 11:44:00 +08:00
committed by GitHub
parent f09d959220
commit 16bd4077dd
4 changed files with 175 additions and 106 deletions

View File

@@ -285,6 +285,12 @@ namespace EpinelPS.Data
[LoadRecord("PassMissionTable.json", "Id")] [LoadRecord("PassMissionTable.json", "Id")]
public readonly Dictionary<int, PassMissionRecord> PassMissionTable = []; public readonly Dictionary<int, PassMissionRecord> PassMissionTable = [];
// Daily Mission Event Data Tables
[LoadRecord("DailyMissionEventSettingTable.json", "Id")]
public readonly Dictionary<int, DailyMissionEventSettingRecord_Raw> DailyMissionEventSettingTable = [];
[LoadRecord("DailyEventTable.json", "Id")]
public readonly Dictionary<int, DailyEventRecord> DailyEventTable = [];
static async Task<GameData> BuildAsync() static async Task<GameData> BuildAsync()
{ {
await Load(); await Load();

View File

@@ -5,17 +5,13 @@ using Newtonsoft.Json;
namespace EpinelPS.LobbyServer.Event namespace EpinelPS.LobbyServer.Event
{ {
public static class EventHelper public class EventHelper
{ {
private static readonly ILog log = LogManager.GetLogger(typeof(EventHelper)); private static readonly ILog log = LogManager.GetLogger(typeof(EventHelper));
public static void AddEvents(ref ResGetEventList response) public static void AddEvents(ref ResGetEventList response)
{ {
// TODO List<LobbyPrivateBannerRecord> lobbyPrivateBanners = GetLobbyPrivateBannerData();
List<LobbyPrivateBannerRecord> lobbyPrivateBanners = []; //[.. GameData.Instance.LobbyPrivateBannerTable.Values.Where(b => b.StartDate <= DateTime.UtcNow && b.EndDate >= DateTime.UtcNow)];
Logging.WriteLine($"Found {lobbyPrivateBanners.Count} active lobby private banners.", LogType.Debug);
log.Debug($"Active lobby private banners: {JsonConvert.SerializeObject(lobbyPrivateBanners)}");
if (lobbyPrivateBanners.Count == 0) if (lobbyPrivateBanners.Count == 0)
{ {
// No active lobby private banners // No active lobby private banners
@@ -24,60 +20,28 @@ namespace EpinelPS.LobbyServer.Event
} }
var eventManagers = GameData.Instance.eventManagers.Values.ToList(); var eventManagers = GameData.Instance.eventManagers.Values.ToList();
foreach (var banner in lobbyPrivateBanners) foreach (var banner in lobbyPrivateBanners)
{ {
// Get all events (including child events) associated with this banner // Get all events (including child events) associated with this banner
List<NetEventData> events = GetEventData(banner, eventManagers); List<NetEventData> events = GetEventData(banner, eventManagers);
log.Debug($"Banner EventId: {banner.EventId} has {events.Count} associated events: {JsonConvert.SerializeObject(events)}"); log.Debug($"Banner EventId: {banner.EventId} has {events.Count} associated events: {JsonConvert.SerializeObject(events)}");
if (events.Count == 0) AddEvents(ref response, events);
{
Logging.WriteLine($"No events found for Banner EventId: {banner.EventId}", LogType.Warning);
continue;
}
foreach (var ev in events)
{
// Avoid adding duplicate events
if (!response.EventList.Any(e => e.Id == ev.Id))
{
response.EventList.Add(ev);
}
else
{
log.Debug($"Skipping duplicate event Id: {ev.Id}");
}
}
// Additionally, get any gacha events associated with this banner // Additionally, get any gacha events associated with this banner
List<NetEventData> gachaEvents = GetGachaEventData(banner, eventManagers); List<EventSystemType> systemTypes = [EventSystemType.PickupGachaEvent, EventSystemType.BoxGachaEvent, EventSystemType.LoginEvent];
List<NetEventData> gachaEvents = GetEventDataBySystemTypes(banner, eventManagers, systemTypes);
log.Debug($"Banner EventId: {banner.EventId} has {gachaEvents.Count} associated gacha events: {JsonConvert.SerializeObject(gachaEvents)}"); log.Debug($"Banner EventId: {banner.EventId} has {gachaEvents.Count} associated gacha events: {JsonConvert.SerializeObject(gachaEvents)}");
if (gachaEvents.Count == 0) AddEvents(ref response, gachaEvents);
{
Logging.WriteLine($"No gacha events found for Banner EventId: {banner.EventId}", LogType.Warning);
continue;
}
foreach (var gachaEvent in gachaEvents)
{
// Avoid adding duplicate events
if (!response.EventList.Any(e => e.Id == gachaEvent.Id))
{
response.EventList.Add(gachaEvent);
}
else
{
log.Debug($"Skipping duplicate gacha event Id: {gachaEvent.Id}");
}
}
} }
// add daily mission events
List<NetEventData> dailyMissionEvents = GetDailyMissionEventData(eventManagers);
log.Debug($"Found {dailyMissionEvents.Count} associated daily mission events: {JsonConvert.SerializeObject(dailyMissionEvents)}");
AddEvents(ref response, dailyMissionEvents);
} }
public static void AddJoinedGachaEvents(ref ResGetJoinedEvent response) public static void AddJoinedEvents(ref ResGetJoinedEvent response)
{ {
List<LobbyPrivateBannerRecord> lobbyPrivateBanners = [];//[.. GameData.Instance.LobbyPrivateBannerTable.Values.Where(b => b.StartDate <= DateTime.UtcNow && b.EndDate >= DateTime.UtcNow)]; List<LobbyPrivateBannerRecord> lobbyPrivateBanners = GetLobbyPrivateBannerData();
Logging.WriteLine($"Found {lobbyPrivateBanners.Count} active lobby private banners.", LogType.Debug);
log.Debug($"Active lobby private banners: {JsonConvert.SerializeObject(lobbyPrivateBanners)}");
if (lobbyPrivateBanners.Count == 0) if (lobbyPrivateBanners.Count == 0)
{ {
// No active lobby private banners // No active lobby private banners
@@ -88,30 +52,21 @@ namespace EpinelPS.LobbyServer.Event
var eventManagers = GameData.Instance.eventManagers.Values.ToList(); var eventManagers = GameData.Instance.eventManagers.Values.ToList();
foreach (var banner in lobbyPrivateBanners) foreach (var banner in lobbyPrivateBanners)
{ {
List<NetEventData> gachaEvents = GetGachaEventData(banner, eventManagers); // add gacha events
List<EventSystemType> systemTypes = [EventSystemType.PickupGachaEvent, EventSystemType.BoxGachaEvent, EventSystemType.LoginEvent];
List<NetEventData> gachaEvents = GetEventDataBySystemTypes(banner, eventManagers, systemTypes);
log.Debug($"Banner EventId: {banner.EventId} has {gachaEvents.Count} associated gacha events: {JsonConvert.SerializeObject(gachaEvents)}"); log.Debug($"Banner EventId: {banner.EventId} has {gachaEvents.Count} associated gacha events: {JsonConvert.SerializeObject(gachaEvents)}");
if (gachaEvents.Count == 0) AddJoinedEvents(ref response, gachaEvents);
{
Logging.WriteLine($"No gacha events found for Banner EventId: {banner.EventId}", LogType.Warning); // add challenge events
continue; List<NetEventData> challengeEvents = GetChallengeEventData(banner, eventManagers);
} log.Debug($"Banner EventId: {banner.EventId} has {challengeEvents.Count} associated challenge events: {JsonConvert.SerializeObject(challengeEvents)}");
foreach (var gachaEvent in gachaEvents) AddJoinedEvents(ref response, challengeEvents);
{
// Avoid adding duplicate events
if (!response.EventWithJoinData.Any(e => e.EventData.Id == gachaEvent.Id))
{
response.EventWithJoinData.Add(new NetEventWithJoinData()
{
EventData = gachaEvent,
JoinAt = 0
});
}
else
{
log.Debug($"Skipping duplicate gacha event Id: {gachaEvent.Id}");
}
}
} }
// add daily mission events
List<NetEventData> dailyMissionEvents = GetDailyMissionEventData(eventManagers);
log.Debug($"Found {dailyMissionEvents.Count} associated daily mission events: {JsonConvert.SerializeObject(dailyMissionEvents)}");
AddJoinedEvents(ref response, dailyMissionEvents);
} }
private static List<NetEventData> GetEventData(LobbyPrivateBannerRecord banner, List<EventManagerRecord> eventManagers) private static List<NetEventData> GetEventData(LobbyPrivateBannerRecord banner, List<EventManagerRecord> eventManagers)
@@ -125,33 +80,33 @@ namespace EpinelPS.LobbyServer.Event
} }
// Add the main event associated with the banner // Add the main event associated with the banner
var mainEvent = eventManagers.First(em => em.Id == banner.EventId); var mainEvent = eventManagers.First(em => em.Id == banner.EventId);
/* events.Add(new NetEventData() events.Add(new NetEventData()
{ {
Id = mainEvent.Id, Id = mainEvent.Id,
EventSystemType = (int)mainEvent.EventSystemType, EventSystemType = (int)mainEvent.EventSystemType,
EventStartDate = banner.StartDate.Ticks, // EventStartDate = banner.StartDate.Ticks,
EventVisibleDate = banner.StartDate.Ticks, // EventVisibleDate = banner.StartDate.Ticks,
EventDisableDate = banner.EndDate.Ticks, // EventDisableDate = banner.EndDate.Ticks,
EventEndDate = banner.EndDate.Ticks // EventEndDate = banner.EndDate.Ticks
});*/ });
// Add child events associated with the main event // Add child events associated with the main event
var childEvents = eventManagers.Where(em => em.ParentsEventId == banner.EventId || em.SetField == banner.EventId).ToList(); var childEvents = eventManagers.Where(em => em.ParentsEventId == banner.EventId || em.SetField == banner.EventId).ToList();
foreach (var childEvent in childEvents) foreach (var childEvent in childEvents)
{ {
/* events.Add(new NetEventData() events.Add(new NetEventData()
{ {
Id = childEvent.Id, Id = childEvent.Id,
EventSystemType = (int)childEvent.EventSystemType, EventSystemType = (int)childEvent.EventSystemType,
EventStartDate = banner.StartDate.Ticks, // EventStartDate = banner.StartDate.Ticks,
EventVisibleDate = banner.StartDate.Ticks, // EventVisibleDate = banner.StartDate.Ticks,
EventDisableDate = banner.EndDate.Ticks, // EventDisableDate = banner.EndDate.Ticks,
EventEndDate = banner.EndDate.Ticks // EventEndDate = banner.EndDate.Ticks
});*/ });
} }
return events; return events;
} }
private static List<NetEventData> GetGachaEventData(LobbyPrivateBannerRecord banner, List<EventManagerRecord> eventManagers) private static List<NetEventData> GetEventDataBySystemTypes(LobbyPrivateBannerRecord banner, List<EventManagerRecord> eventManagers, List<EventSystemType> systemTypes)
{ {
List<NetEventData> events = []; List<NetEventData> events = [];
// Find all event banner resource tables associated with this banner's EventId // Find all event banner resource tables associated with this banner's EventId
@@ -166,10 +121,10 @@ namespace EpinelPS.LobbyServer.Event
return events; return events;
} }
// Find all gacha events (PickupGachaEvent or BoxGachaEvent) that use these banner resource tables // Find all events matching the banner resource tables and specified system types
var gachaEvents = eventManagers.Where(em => var gachaEvents = eventManagers.Where(em =>
eventBannerResourceTables.Contains(em.EventBannerResourceTable) eventBannerResourceTables.Contains(em.EventBannerResourceTable)
&& (em.EventSystemType == EventSystemType.PickupGachaEvent || em.EventSystemType == EventSystemType.BoxGachaEvent)).ToList(); && systemTypes.Contains(em.EventSystemType)).ToList();
log.Debug($"Found {gachaEvents.Count} gacha events from banner resource tables: {JsonConvert.SerializeObject(gachaEvents)}"); log.Debug($"Found {gachaEvents.Count} gacha events from banner resource tables: {JsonConvert.SerializeObject(gachaEvents)}");
if (gachaEvents.Count == 0) if (gachaEvents.Count == 0)
{ {
@@ -184,10 +139,131 @@ namespace EpinelPS.LobbyServer.Event
{ {
Id = gachaEvent.Id, Id = gachaEvent.Id,
EventSystemType = (int)gachaEvent.EventSystemType, EventSystemType = (int)gachaEvent.EventSystemType,
//EventStartDate = banner.StartDate.Ticks, // EventStartDate = banner.StartDate.Ticks,
//EventVisibleDate = banner.StartDate.Ticks, // EventVisibleDate = banner.StartDate.Ticks,
////EventDisableDate = banner.EndDate.Ticks, // EventDisableDate = banner.EndDate.Ticks,
//EventEndDate = banner.EndDate.Ticks // EventEndDate = banner.EndDate.Ticks
});
}
return events;
}
private static List<NetEventData> GetChallengeEventData(LobbyPrivateBannerRecord banner, List<EventManagerRecord> eventManagers)
{
List<NetEventData> events = [];
// Find all challenge events (ChallengeModeEvent) associated with this banner's EventId
var challengeEvents = eventManagers.Where(em =>
em.ParentsEventId == banner.EventId && em.EventSystemType == EventSystemType.ChallengeModeEvent).ToList();
log.Debug($"Found {challengeEvents.Count} challenge events from banner resource tables: {JsonConvert.SerializeObject(challengeEvents)}");
if (challengeEvents.Count == 0)
{
Logging.WriteLine($"No challenge events found for Banner EventId: {banner.EventId}", LogType.Warning);
return events;
}
// Add each challenge event to the list
foreach (var challengeEvent in challengeEvents)
{
events.Add(new NetEventData()
{
Id = challengeEvent.Id,
EventSystemType = (int)challengeEvent.EventSystemType,
// EventStartDate = banner.StartDate.Ticks,
// EventVisibleDate = banner.StartDate.Ticks,
// EventDisableDate = banner.EndDate.Ticks,
// EventEndDate = banner.EndDate.Ticks
});
}
return events;
}
/// <summary>
/// Get active lobby private banner data
/// </summary>
/// <returns>List of active lobby private banners</returns>
public static List<LobbyPrivateBannerRecord> GetLobbyPrivateBannerData()
{
List<LobbyPrivateBannerRecord> lobbyPrivateBanners = [];
// lobbyPrivateBanners = [.. GameData.Instance.LobbyPrivateBannerTable.Values.Where(b => b.StartDate <= DateTime.UtcNow && b.EndDate >= DateTime.UtcNow)];
lobbyPrivateBanners.Add(new LobbyPrivateBannerRecord() { Id = 10093, PrivateBannerShowDuration = 8, EventId = 82700 });
Logging.WriteLine($"Found {lobbyPrivateBanners.Count} active lobby private banners.", LogType.Debug);
log.Debug($"Active lobby private banners: {JsonConvert.SerializeObject(lobbyPrivateBanners)}");
return lobbyPrivateBanners;
}
private static void AddEvents(ref ResGetEventList response, List<NetEventData> eventDatas)
{
foreach (var eventData in eventDatas)
{
// if (eventData.Id == 70115) continue;
// Avoid adding duplicate events
if (!response.EventList.Any(e => e.Id == eventData.Id))
{
if (eventData.EventStartDate == 0) eventData.EventStartDate = DateTime.UtcNow.AddDays(-1).Ticks;
if (eventData.EventVisibleDate == 0) eventData.EventVisibleDate = DateTime.UtcNow.AddDays(-1).Ticks;
if (eventData.EventDisableDate == 0) eventData.EventDisableDate = DateTime.UtcNow.AddDays(30).Ticks;
if (eventData.EventEndDate == 0) eventData.EventEndDate = DateTime.UtcNow.AddDays(30).Ticks;
response.EventList.Add(eventData);
}
else
{
log.Debug($"Skipping duplicate event Id: {eventData.Id}");
}
}
}
private static void AddJoinedEvents(ref ResGetJoinedEvent response, List<NetEventData> eventDatas)
{
foreach (var eventData in eventDatas)
{
if (eventData.Id == 70115) continue;
// Avoid adding duplicate events
if (!response.EventWithJoinData.Any(e => e.EventData.Id == eventData.Id))
{
if (eventData.EventStartDate == 0) eventData.EventStartDate = DateTime.UtcNow.AddDays(-1).Ticks;
if (eventData.EventVisibleDate == 0) eventData.EventVisibleDate = DateTime.UtcNow.AddDays(-1).Ticks;
if (eventData.EventDisableDate == 0) eventData.EventDisableDate = DateTime.UtcNow.AddDays(30).Ticks;
if (eventData.EventEndDate == 0) eventData.EventEndDate = DateTime.UtcNow.AddDays(30).Ticks;
response.EventWithJoinData.Add(new NetEventWithJoinData()
{
EventData = eventData,
JoinAt = 0
});
}
else
{
log.Debug($"Skipping duplicate event Id: {eventData.Id}");
}
}
}
private static List<NetEventData> GetDailyMissionEventData(List<EventManagerRecord> eventManagers)
{
List<NetEventData> events = [];
var dailyEventIds = GameData.Instance.DailyMissionEventSettingTable.Values.Select(de => de.EventId).ToList();
log.Debug($"Daily Mission Event IDs: {JsonConvert.SerializeObject(dailyEventIds)}");
var dailyEvents = eventManagers.Where(em => dailyEventIds.Contains(em.Id)).ToList();
log.Debug($"Found {dailyEvents.Count} daily events: {JsonConvert.SerializeObject(dailyEvents)}");
if (dailyEvents.Count == 0)
{
Logging.WriteLine("No daily events found.", LogType.Warning);
return events;
}
// Add each daily event to the list
foreach (var dailyEvent in dailyEvents)
{
events.Add(new NetEventData()
{
Id = dailyEvent.Id,
EventSystemType = (int)dailyEvent.EventSystemType,
EventStartDate = DateTime.UtcNow.Ticks,
EventVisibleDate = DateTime.UtcNow.Ticks,
EventDisableDate = DateTime.UtcNow.AddDays(30).Ticks,
EventEndDate = DateTime.UtcNow.AddDays(30).Ticks
}); });
} }
return events; return events;

View File

@@ -7,26 +7,12 @@ namespace EpinelPS.LobbyServer.Event
{ {
protected override async Task HandleAsync() protected override async Task HandleAsync()
{ {
ReqGetJoinedEvent req = await ReadData<ReqGetJoinedEvent>(); await ReadData<ReqGetJoinedEvent>();
//types are defined in EventTypes.cs //types are defined in EventTypes.cs
ResGetJoinedEvent response = new(); ResGetJoinedEvent response = new();
response.EventWithJoinData.Add(new NetEventWithJoinData()
{
EventData = new NetEventData()
{
Id = 20001,
EventSystemType = (int)EventSystemType.PickupGachaEvent,
EventVisibleDate = DateTime.UtcNow.Subtract(TimeSpan.FromDays(7)).Ticks,
EventStartDate = DateTime.UtcNow.Subtract(TimeSpan.FromDays(1)).Ticks,
EventEndDate = DateTime.Now.AddDays(20).Ticks,
EventDisableDate = DateTime.Now.AddDays(20).Ticks
},
JoinAt = 0
});
// add gacha events from active lobby banners // add gacha events from active lobby banners
EventHelper.AddJoinedGachaEvents(ref response); EventHelper.AddJoinedEvents(ref response);
await WriteDataAsync(response); await WriteDataAsync(response);
} }

View File

@@ -1,4 +1,5 @@
using EpinelPS.Data; using EpinelPS.Data;
using EpinelPS.LobbyServer.Event;
using EpinelPS.Utils; using EpinelPS.Utils;
using log4net; using log4net;
using Newtonsoft.Json; using Newtonsoft.Json;
@@ -17,7 +18,7 @@ namespace EpinelPS.LobbyServer.Pass
ResGetActiveEventPassData response = new(); // fields PassList = NetPassInfo ResGetActiveEventPassData response = new(); // fields PassList = NetPassInfo
List<LobbyPrivateBannerRecord> lobbyPrivateBanners = [];//[.. GameData.Instance.LobbyPrivateBannerTable.Values.Where(b => b.PrivateBannerShowDuration <= DateTime.UtcNow && b.EndDate >= DateTime.UtcNow)]; List<LobbyPrivateBannerRecord> lobbyPrivateBanners = [];//[.. GameData.Instance.LobbyPrivateBannerTable.Values.Where(b => b.PrivateBannerShowDuration <= DateTime.UtcNow && b.EndDate >= DateTime.UtcNow)];
lobbyPrivateBanners = EventHelper.GetLobbyPrivateBannerData();
// TODO: PrivateBannerShowDuration // TODO: PrivateBannerShowDuration
log.Debug($"Active lobby private banners: {JsonConvert.SerializeObject(lobbyPrivateBanners)}"); log.Debug($"Active lobby private banners: {JsonConvert.SerializeObject(lobbyPrivateBanners)}");
if (lobbyPrivateBanners.Count <= 0) if (lobbyPrivateBanners.Count <= 0)