Feature:Asynchronous Operation & Formatting Code

- Now the async operation is enabled!
- Code formatted by Resharper plugin <3
This commit is contained in:
Somebody
2024-07-22 17:12:03 +08:00
parent e983375620
commit 87d228eb79
793 changed files with 34764 additions and 40190 deletions

View File

@@ -1,217 +1,192 @@
using EggLink.DanhengServer.Data;
using EggLink.DanhengServer.Database;
using EggLink.DanhengServer.Database.Message;
using EggLink.DanhengServer.Enums;
using EggLink.DanhengServer.Game.Player;
using EggLink.DanhengServer.Proto;
using EggLink.DanhengServer.Server.Packet.Send.Player;
using EggLink.DanhengServer.Util;
using Microsoft.EntityFrameworkCore.Storage;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EggLink.DanhengServer.Game.Message
namespace EggLink.DanhengServer.Game.Message;
public class MessageManager(PlayerInstance player) : BasePlayerManager(player)
{
public class MessageManager(PlayerInstance player) : BasePlayerManager(player)
public MessageData Data { get; } = DatabaseHelper.Instance!.GetInstanceOrCreateNew<MessageData>(player.Uid);
public List<MessageSectionData> PendingMessagePerformSectionList { get; private set; } = [];
#region Get
public MessageSectionData? GetMessageSectionData(int sectionId)
{
public MessageData Data { get; private set; } = DatabaseHelper.Instance!.GetInstanceOrCreateNew<MessageData>(player.Uid);
public List<MessageSectionData> PendingMessagePerformSectionList { get; private set; } = [];
GameData.MessageSectionConfigData.TryGetValue(sectionId, out var sectionConfig);
if (sectionConfig == null) return null;
var groupId = sectionConfig.GroupID;
if (!Data.Groups.TryGetValue(groupId, out var group)) return null;
return group.Sections.FirstOrDefault(m => m.SectionId == sectionId);
}
#region Get
public MessageSectionData? GetMessageSectionData(int sectionId)
{
GameData.MessageSectionConfigData.TryGetValue(sectionId, out var sectionConfig);
if (sectionConfig == null)
public List<MessageGroup> GetMessageGroup(int contactId)
{
GameData.MessageContactsConfigData.TryGetValue(contactId, out var contactConfig);
if (contactConfig == null) return [];
var result = new List<MessageGroup>();
foreach (var item in contactConfig.Groups)
if (Data.Groups.TryGetValue(item.ID, out var group))
{
return null;
}
var groupId = sectionConfig.GroupID;
if (!Data.Groups.TryGetValue(groupId, out var group))
{
return null;
}
return group.Sections.FirstOrDefault(m => m.SectionId == sectionId);
}
public List<MessageGroup> GetMessageGroup(int contactId)
{
GameData.MessageContactsConfigData.TryGetValue(contactId, out var contactConfig);
if (contactConfig == null)
{
return [];
}
var result = new List<MessageGroup>();
foreach (var item in contactConfig.Groups)
{
if (Data.Groups.TryGetValue(item.ID, out var group))
var groupInfo = new MessageGroup
{
var groupInfo = new MessageGroup
{
Id = (uint)item.ID,
Status = group.Status,
RefreshTime = group.RefreshTime,
};
foreach (var section in group.Sections)
{
var sectionInfo = new MessageSection
{
Id = (uint)section.SectionId,
Status = section.Status,
};
sectionInfo.ToChooseItemId.AddRange(section.ToChooseItemId.Select(m => (uint)m));
sectionInfo.ItemList.AddRange(section.Items.Select(m => new MessageItem()
{
ItemId = (uint)m.ItemId,
}));
groupInfo.MessageSectionList.Add(sectionInfo);
}
groupInfo.MessageSectionId = (uint)group.CurrentSectionId;
result.Add(groupInfo);
}
else
{
result.Add(new MessageGroup
{
Id = (uint)item.ID,
Status = MessageGroupStatus.MessageGroupNone,
RefreshTime = 0,
});
}
}
return result;
}
#endregion
#region Action
public void AddMessageSection(int sectionId)
{
GameData.MessageSectionConfigData.TryGetValue(sectionId, out var sectionConfig);
if (sectionConfig == null) return;
foreach (var item in sectionConfig.StartMessageItemIDList)
{
AddMessageItem(item);
}
}
public void AddMessageItem(int itemId, bool sendPacket = true)
{
GameData.MessageItemConfigData.TryGetValue(itemId, out var itemConfig);
if (itemConfig == null) return;
var groupId = itemConfig.GroupID;
var sectionId = itemConfig.SectionID;
if (!Data.Groups.TryGetValue(groupId, out var group))
{
group = new MessageGroupData
{
GroupId = groupId,
CurrentSectionId = sectionId,
RefreshTime = Extensions.GetUnixSec(),
Status = MessageGroupStatus.MessageGroupDoing,
Id = (uint)item.ID,
Status = group.Status,
RefreshTime = group.RefreshTime
};
foreach (var section in group.Sections)
{
var sectionInfo = new MessageSection
{
Id = (uint)section.SectionId,
Status = section.Status
};
sectionInfo.ToChooseItemId.AddRange(section.ToChooseItemId.Select(m => (uint)m));
sectionInfo.ItemList.AddRange(section.Items.Select(m => new MessageItem
{
ItemId = (uint)m.ItemId
}));
groupInfo.MessageSectionList.Add(sectionInfo);
}
groupInfo.MessageSectionId = (uint)group.CurrentSectionId;
result.Add(groupInfo);
}
else
{
result.Add(new MessageGroup
{
Id = (uint)item.ID,
Status = MessageGroupStatus.MessageGroupNone,
RefreshTime = 0
});
}
return result;
}
#endregion
#region Action
public async ValueTask AddMessageSection(int sectionId)
{
GameData.MessageSectionConfigData.TryGetValue(sectionId, out var sectionConfig);
if (sectionConfig == null) return;
foreach (var item in sectionConfig.StartMessageItemIDList) await AddMessageItem(item);
}
public async ValueTask AddMessageItem(int itemId, bool sendPacket = true)
{
GameData.MessageItemConfigData.TryGetValue(itemId, out var itemConfig);
if (itemConfig == null) return;
var groupId = itemConfig.GroupID;
var sectionId = itemConfig.SectionID;
if (!Data.Groups.TryGetValue(groupId, out var group))
{
group = new MessageGroupData
{
GroupId = groupId,
CurrentSectionId = sectionId,
RefreshTime = Extensions.GetUnixSec(),
Status = MessageGroupStatus.MessageGroupDoing
};
group.Sections.Add(new MessageSectionData
{
SectionId = sectionId,
Status = MessageSectionStatus.MessageSectionDoing,
ToChooseItemId = itemConfig.NextItemIDList
});
Data.Groups.Add(groupId, group);
}
else
{
group.CurrentSectionId = sectionId;
group.RefreshTime = Extensions.GetUnixSec();
group.Status = MessageGroupStatus.MessageGroupDoing;
if (!group.Sections.Any(m => m.SectionId == sectionId)) // new section
{
group.Sections.Add(new MessageSectionData
{
SectionId = sectionId,
Status = MessageSectionStatus.MessageSectionDoing,
ToChooseItemId = itemConfig.NextItemIDList,
ToChooseItemId = itemConfig.NextItemIDList
});
Data.Groups.Add(groupId, group);
}
else
{
group.CurrentSectionId = sectionId;
group.RefreshTime = Extensions.GetUnixSec();
group.Status = MessageGroupStatus.MessageGroupDoing;
if (!group.Sections.Any(m => m.SectionId == sectionId)) // new section
{
group.Sections.Add(new MessageSectionData
{
SectionId = sectionId,
Status = MessageSectionStatus.MessageSectionDoing,
ToChooseItemId = itemConfig.NextItemIDList,
});
if (itemConfig.NextItemIDList.Count == 1)
{
FinishMessageItem(itemConfig.NextItemIDList[0], false);
}
}
else // old
{
group.Sections.First(m => m.SectionId == sectionId).Status = MessageSectionStatus.MessageSectionDoing;
}
if (itemConfig.NextItemIDList.Count == 1) await FinishMessageItem(itemConfig.NextItemIDList[0], false);
}
// sync
if (sendPacket)
else // old
{
var notify = new PacketPlayerSyncScNotify(group, group.Sections.First(m => m.SectionId == sectionId));
Player.SendPacket(notify);
group.Sections.First(m => m.SectionId == sectionId).Status = MessageSectionStatus.MessageSectionDoing;
}
}
public void FinishSection(int sectionId, bool sendPacket = true)
// sync
if (sendPacket)
{
GameData.MessageSectionConfigData.TryGetValue(sectionId, out var sectionConfig);
if (sectionConfig == null) return;
var groupId = sectionConfig.GroupID;
if (!Data.Groups.TryGetValue(groupId, out var group)) return;
var section = group.Sections.First(m => m.SectionId == sectionId);
if (section.Status != MessageSectionStatus.MessageSectionDoing) return;
section.Status = MessageSectionStatus.MessageSectionFinish;
if (group.Sections.All(m => m.Status == MessageSectionStatus.MessageSectionFinish))
{
group.Status = MessageGroupStatus.MessageGroupFinish;
}
// sync
if (sendPacket)
{
var notify = new PacketPlayerSyncScNotify(group, section);
Player.SendPacket(notify);
}
// broadcast to mission system
Player.MissionManager!.HandleFinishType(Enums.MissionFinishTypeEnum.MessagePerformSectionFinish);
Player.MissionManager!.HandleFinishType(Enums.MissionFinishTypeEnum.MessageSectionFinish);
var notify = new PacketPlayerSyncScNotify(group, group.Sections.First(m => m.SectionId == sectionId));
await Player.SendPacket(notify);
}
public void FinishMessageItem(int itemId, bool sendPacket = true)
{
GameData.MessageItemConfigData.TryGetValue(itemId, out var itemConfig);
if (itemConfig == null) return;
var groupId = itemConfig.GroupID;
var sectionId = itemConfig.SectionID;
if (!Data.Groups.TryGetValue(groupId, out var group)) return;
var section = group.Sections.First(m => m.SectionId == sectionId);
if (section.Status != MessageSectionStatus.MessageSectionDoing) return;
//if (!section.ToChooseItemId.Contains(itemId)) return;
section.ToChooseItemId.Clear();
section.Items.Add(new MessageItemData
{
ItemId = itemId,
});
section.ToChooseItemId.AddRange(itemConfig.NextItemIDList);
group.RefreshTime = Extensions.GetUnixSec();
if (section.ToChooseItemId.Count == 1) // if only one item, auto finish
{
FinishMessageItem(section.ToChooseItemId[0], false);
}
if (sendPacket)
{
// sync
var notify = new PacketPlayerSyncScNotify(group, section);
Player.SendPacket(notify);
}
}
#endregion
}
}
public async ValueTask FinishSection(int sectionId, bool sendPacket = true)
{
GameData.MessageSectionConfigData.TryGetValue(sectionId, out var sectionConfig);
if (sectionConfig == null) return;
var groupId = sectionConfig.GroupID;
if (!Data.Groups.TryGetValue(groupId, out var group)) return;
var section = group.Sections.First(m => m.SectionId == sectionId);
if (section.Status != MessageSectionStatus.MessageSectionDoing) return;
section.Status = MessageSectionStatus.MessageSectionFinish;
if (group.Sections.All(m => m.Status == MessageSectionStatus.MessageSectionFinish))
group.Status = MessageGroupStatus.MessageGroupFinish;
// sync
if (sendPacket)
{
var notify = new PacketPlayerSyncScNotify(group, section);
await Player.SendPacket(notify);
}
// broadcast to mission system
await Player.MissionManager!.HandleFinishType(MissionFinishTypeEnum.MessagePerformSectionFinish);
await Player.MissionManager!.HandleFinishType(MissionFinishTypeEnum.MessageSectionFinish);
}
public async ValueTask FinishMessageItem(int itemId, bool sendPacket = true)
{
GameData.MessageItemConfigData.TryGetValue(itemId, out var itemConfig);
if (itemConfig == null) return;
var groupId = itemConfig.GroupID;
var sectionId = itemConfig.SectionID;
if (!Data.Groups.TryGetValue(groupId, out var group)) return;
var section = group.Sections.First(m => m.SectionId == sectionId);
if (section.Status != MessageSectionStatus.MessageSectionDoing) return;
//if (!section.ToChooseItemId.Contains(itemId)) return;
section.ToChooseItemId.Clear();
section.Items.Add(new MessageItemData
{
ItemId = itemId
});
section.ToChooseItemId.AddRange(itemConfig.NextItemIDList);
group.RefreshTime = Extensions.GetUnixSec();
if (section.ToChooseItemId.Count == 1) // if only one item, auto finish
await FinishMessageItem(section.ToChooseItemId[0], false);
if (sendPacket)
{
// sync
var notify = new PacketPlayerSyncScNotify(group, section);
await Player.SendPacket(notify);
}
}
#endregion
}