mirror of
https://github.com/EggLinks/DanhengServer-OpenSource.git
synced 2026-01-02 20:26:03 +08:00
125 lines
4.8 KiB
C#
125 lines
4.8 KiB
C#
using EggLink.DanhengServer.Data;
|
|
using EggLink.DanhengServer.Enums.Rogue;
|
|
using EggLink.DanhengServer.GameServer.Game.Player;
|
|
using EggLink.DanhengServer.GameServer.Server.Packet.Send.RogueCommon;
|
|
|
|
namespace EggLink.DanhengServer.GameServer.Game.Rogue.Event;
|
|
|
|
public class RogueEventManager(PlayerInstance player, BaseRogueInstance rogueInstance)
|
|
{
|
|
public static Dictionary<DialogueEventCostTypeEnum, RogueEventCostHandler> CostHandler = [];
|
|
public static Dictionary<DialogueEventTypeEnum, RogueEventEffectHandler> EffectHandler = [];
|
|
public PlayerInstance Player = player;
|
|
public BaseRogueInstance Rogue = rogueInstance;
|
|
public List<RogueEventInstance> RunningEvent = [];
|
|
|
|
public void OnNextRoom()
|
|
{
|
|
RunningEvent.Clear(); // Clear all running events
|
|
}
|
|
|
|
public async ValueTask AddEvent(RogueEventInstance eventInstance)
|
|
{
|
|
RunningEvent.Add(eventInstance);
|
|
foreach (var option in eventInstance.Options)
|
|
{
|
|
GameData.DialogueEventData.TryGetValue(option.OptionId, out var dialogueEvent);
|
|
if (dialogueEvent == null) continue;
|
|
|
|
var param = dialogueEvent.RogueEffectParamList;
|
|
|
|
// Init option
|
|
if (EffectHandler.TryGetValue(dialogueEvent.RogueEffectType, out var effectHandler))
|
|
effectHandler.Init(Rogue, eventInstance, param, option);
|
|
}
|
|
|
|
await Player.SendPacket(new PacketSyncRogueCommonDialogueDataScNotify(eventInstance));
|
|
}
|
|
|
|
public void RemoveEvent(RogueEventInstance eventInstance)
|
|
{
|
|
RunningEvent.Remove(eventInstance);
|
|
}
|
|
|
|
public async ValueTask FinishEvent(RogueEventInstance eventInstance)
|
|
{
|
|
await eventInstance.Finish();
|
|
}
|
|
|
|
public async ValueTask NpcDisappear(RogueEventInstance eventInstance)
|
|
{
|
|
RunningEvent.Remove(eventInstance);
|
|
await Player.SceneInstance!.RemoveEntity(eventInstance.EventEntity);
|
|
}
|
|
|
|
public RogueEventInstance? FindEvent(int optionId)
|
|
{
|
|
return RunningEvent.FirstOrDefault(eventInstance => eventInstance.Options.Exists(x => x.OptionId == optionId));
|
|
}
|
|
|
|
public async ValueTask TriggerEvent(RogueEventInstance? eventInstance, int eventId)
|
|
{
|
|
GameData.DialogueEventData.TryGetValue(eventId, out var dialogueEvent);
|
|
if (dialogueEvent == null) return;
|
|
|
|
var param = dialogueEvent.RogueEffectParamList;
|
|
|
|
// Handle cost
|
|
if (CostHandler.TryGetValue(dialogueEvent.CostType, out var costHandler))
|
|
await costHandler.Handle(Rogue, eventInstance, dialogueEvent.CostParamList);
|
|
|
|
// Handle option
|
|
if (EffectHandler.TryGetValue(dialogueEvent.RogueEffectType, out var effectHandler))
|
|
await effectHandler.Handle(Rogue, eventInstance, param, null);
|
|
}
|
|
|
|
public async ValueTask SelectOption(RogueEventInstance eventInstance, int optionId)
|
|
{
|
|
eventInstance.SelectedOptionId = optionId;
|
|
var option = eventInstance.Options.Find(x => x.OptionId == optionId);
|
|
if (option == null)
|
|
{
|
|
await Player.SendPacket(new PacketSelectRogueCommonDialogueOptionScRsp());
|
|
return;
|
|
}
|
|
|
|
GameData.DialogueEventData.TryGetValue(option.OptionId, out var dialogueEvent);
|
|
if (dialogueEvent == null)
|
|
{
|
|
await Player.SendPacket(new PacketSelectRogueCommonDialogueOptionScRsp());
|
|
return;
|
|
}
|
|
|
|
await Player.SendPacket(new PacketSyncRogueCommonDialogueDataScNotify(eventInstance));
|
|
|
|
var param = dialogueEvent.RogueEffectParamList;
|
|
if (option.ArgId > 0)
|
|
{
|
|
GameData.DialogueDynamicContentData.TryGetValue(dialogueEvent.DynamicContentID, out var dynamicContent);
|
|
if (dynamicContent != null)
|
|
{
|
|
dynamicContent.TryGetValue(option.ArgId, out var content);
|
|
if (content != null)
|
|
{
|
|
if (content.DynamicParamType == DialogueDynamicParamTypeEnum.ReplaceAll)
|
|
param = content.DynamicParamList;
|
|
else
|
|
param[content.DynamicParamList[0] - 1] = content.DynamicParamList[1];
|
|
}
|
|
}
|
|
}
|
|
|
|
// Handle cost
|
|
if (CostHandler.TryGetValue(dialogueEvent.CostType, out var costHandler))
|
|
await costHandler.Handle(Rogue, eventInstance, dialogueEvent.CostParamList);
|
|
|
|
// Handle option
|
|
if (EffectHandler.TryGetValue(dialogueEvent.RogueEffectType, out var effectHandler))
|
|
await effectHandler.Handle(Rogue, eventInstance, param, option);
|
|
|
|
// send rsp
|
|
await Player.SendPacket(new PacketSyncRogueCommonDialogueOptionFinishScNotify(eventInstance));
|
|
option.IsSelected = true;
|
|
await Player.SendPacket(new PacketSelectRogueCommonDialogueOptionScRsp(eventInstance));
|
|
}
|
|
} |