mirror of
https://github.com/EggLinks/DanhengServer-OpenSource.git
synced 2026-01-02 20:26:03 +08:00
460 lines
19 KiB
C#
460 lines
19 KiB
C#
using EggLink.DanhengServer.Data.Config.Task;
|
|
using EggLink.DanhengServer.Data.Config;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Numerics;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using EggLink.DanhengServer.Game.Player;
|
|
using EggLink.DanhengServer.Game.Scene.Entity;
|
|
using EggLink.DanhengServer.Enums;
|
|
using EggLink.DanhengServer.Data.Excel;
|
|
using EggLink.DanhengServer.Enums.Task;
|
|
using EggLink.DanhengServer.Enums.Scene;
|
|
using EggLink.DanhengServer.Proto;
|
|
|
|
namespace EggLink.DanhengServer.GameServer.Game.Task
|
|
{
|
|
public class LevelTask(PlayerInstance player)
|
|
{
|
|
public PlayerInstance Player { get; } = player;
|
|
|
|
#region Manage
|
|
|
|
public void TriggerInitAct(LevelInitSequeceConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
foreach (var task in act.TaskList)
|
|
{
|
|
TriggerTask(task, subMission, group);
|
|
}
|
|
}
|
|
|
|
public void TriggerStartAct(LevelStartSequeceConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
foreach (var task in act.TaskList)
|
|
{
|
|
TriggerTask(task, subMission, group);
|
|
}
|
|
}
|
|
|
|
private void TriggerTask(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
try
|
|
{
|
|
var methodName = act.Type.Replace("RPG.GameCore.", "");
|
|
|
|
var method = GetType().GetMethod(methodName);
|
|
if (method != null)
|
|
{
|
|
_ = method.Invoke(this, [act, subMission, group]);
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Task
|
|
|
|
public void PlayMessage(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
if (act is PlayMessage message)
|
|
{
|
|
Player.MessageManager!.AddMessageSection(message.MessageSectionID);
|
|
}
|
|
}
|
|
|
|
public void DestroyProp(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
if (act is DestroyProp destroyProp)
|
|
{
|
|
foreach (var entity in Player.SceneInstance!.Entities.Values)
|
|
{
|
|
if (entity is EntityProp prop && prop.GroupID == destroyProp.GroupID.GetValue() && prop.InstId == destroyProp.ID.GetValue())
|
|
{
|
|
Player.SceneInstance.RemoveEntity(entity);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void TriggerCustomString(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
if (act is TriggerCustomString triggerCustomString)
|
|
{
|
|
foreach (var groupInfo in Player.SceneInstance?.FloorInfo?.Groups ?? [])
|
|
{
|
|
if (groupInfo.Value.PropTriggerCustomString.TryGetValue(triggerCustomString.CustomString.Value, out var list))
|
|
{
|
|
foreach (var id in list)
|
|
{
|
|
foreach (var entity in Player.SceneInstance?.Entities.Values.ToList() ?? [])
|
|
{
|
|
if (entity is EntityProp prop && prop.GroupID == groupInfo.Key && prop.InstId == id)
|
|
{
|
|
prop.SetState(PropStateEnum.Closed);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Player.MissionManager?.HandleFinishType(MissionFinishTypeEnum.PropState);
|
|
}
|
|
}
|
|
|
|
public void EnterMap(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
if (act is EnterMap enterMap)
|
|
{
|
|
Player.EnterMissionScene(enterMap.EntranceID, enterMap.GroupID, enterMap.AnchorID, true);
|
|
}
|
|
}
|
|
|
|
public void EnterMapByCondition(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
if (act is EnterMapByCondition enterMapByCondition)
|
|
{
|
|
Player.EnterMissionScene(enterMapByCondition.EntranceID.GetValue(), 0, 0, true);
|
|
}
|
|
}
|
|
|
|
public void TriggerPerformance(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
if (act is TriggerPerformance triggerPerformance)
|
|
{
|
|
if (triggerPerformance.PerformanceType == ELevelPerformanceTypeEnum.E)
|
|
{
|
|
Player.TaskManager?.PerformanceTrigger.TriggerPerformanceE(triggerPerformance.PerformanceID, subMission);
|
|
}
|
|
else if (triggerPerformance.PerformanceType == ELevelPerformanceTypeEnum.D)
|
|
{
|
|
Player.TaskManager?.PerformanceTrigger.TriggerPerformanceD(triggerPerformance.PerformanceID, subMission);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void PredicateTaskList(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
if (act is PredicateTaskList predicateTaskList)
|
|
{
|
|
// handle predicateCondition
|
|
var methodName = predicateTaskList.Predicate.Type.Replace("RPG.GameCore.", "");
|
|
|
|
var method = GetType().GetMethod(methodName);
|
|
if (method != null)
|
|
{
|
|
var resp = method.Invoke(this, [predicateTaskList.Predicate, subMission, group]);
|
|
if (resp is bool result && result)
|
|
{
|
|
foreach (var task in predicateTaskList.SuccessTaskList)
|
|
{
|
|
TriggerTask(task, subMission, group);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
foreach (var task in predicateTaskList.FailedTaskList)
|
|
{
|
|
TriggerTask(task, subMission, group);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void ChangePropState(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
if (subMission.SubMissionInfo?.FinishType == MissionFinishTypeEnum.PropState)
|
|
{
|
|
foreach (var entity in Player.SceneInstance!.Entities.Values)
|
|
{
|
|
if (entity is EntityProp prop && prop.GroupID == subMission.SubMissionInfo.ParamInt1 && prop.InstId == subMission.SubMissionInfo.ParamInt2)
|
|
{
|
|
try
|
|
{
|
|
if (prop.Excel.PropStateList.Contains(PropStateEnum.Closed))
|
|
{
|
|
prop.SetState(PropStateEnum.Closed);
|
|
}
|
|
else
|
|
{
|
|
prop.SetState(prop.Excel.PropStateList[prop.Excel.PropStateList.IndexOf(prop.State) + 1]);
|
|
|
|
// Elevator
|
|
foreach (var id in prop.PropInfo.UnlockControllerID)
|
|
{
|
|
foreach (var entity2 in Player.SceneInstance!.Entities.Values)
|
|
{
|
|
if (entity2 is EntityProp prop2 && prop2.GroupID == id.Key && id.Value.Contains(prop2.InstId))
|
|
{
|
|
prop2.SetState(PropStateEnum.Closed);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void CreateTrialPlayer(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
if (subMission.SubMissionInfo?.FinishType == MissionFinishTypeEnum.GetTrialAvatar)
|
|
{
|
|
Player.LineupManager!.AddAvatarToCurTeam(subMission.SubMissionInfo.ParamInt1);
|
|
}
|
|
|
|
if (subMission.SubMissionInfo?.FinishType == MissionFinishTypeEnum.GetTrialAvatarList)
|
|
{
|
|
subMission.SubMissionInfo.ParamIntList?.ForEach(x => Player.LineupManager!.AddAvatarToCurTeam(x));
|
|
}
|
|
}
|
|
|
|
public void ReplaceTrialPlayer(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
if (subMission.SubMissionInfo?.FinishType == MissionFinishTypeEnum.GetTrialAvatar)
|
|
{
|
|
var ids = Player.LineupManager!.GetCurLineup()?.BaseAvatars?.ToList() ?? [];
|
|
ids.ForEach(x => Player.LineupManager!.RemoveAvatarFromCurTeam(x.BaseAvatarId, false));
|
|
Player.LineupManager!.AddAvatarToCurTeam(subMission.SubMissionInfo.ParamInt1);
|
|
}
|
|
|
|
if (subMission.SubMissionInfo?.FinishType == MissionFinishTypeEnum.GetTrialAvatarList)
|
|
{
|
|
var ids = Player.LineupManager!.GetCurLineup()?.BaseAvatars?.ToList() ?? [];
|
|
ids.ForEach(x => Player.LineupManager!.RemoveAvatarFromCurTeam(x.BaseAvatarId, false));
|
|
subMission.SubMissionInfo.ParamIntList?.ForEach(x => Player.LineupManager!.AddAvatarToCurTeam(x));
|
|
}
|
|
}
|
|
|
|
public void ReplaceVirtualTeam(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
if (!(Player.LineupManager!.GetCurLineup()?.IsExtraLineup() == true))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (subMission.SubMissionInfo?.FinishType == MissionFinishTypeEnum.GetTrialAvatar)
|
|
{
|
|
var ids = Player.LineupManager!.GetCurLineup()?.BaseAvatars?.ToList() ?? [];
|
|
ids.ForEach(x => Player.LineupManager!.RemoveAvatarFromCurTeam(x.BaseAvatarId, false)); ;
|
|
Player.LineupManager!.AddAvatarToCurTeam(subMission.SubMissionInfo.ParamInt1);
|
|
}
|
|
|
|
if (subMission.SubMissionInfo?.FinishType == MissionFinishTypeEnum.GetTrialAvatarList)
|
|
{
|
|
var ids = Player.LineupManager!.GetCurLineup()?.BaseAvatars?.ToList() ?? [];
|
|
ids.ForEach(x => Player.LineupManager!.RemoveAvatarFromCurTeam(x.BaseAvatarId, false));
|
|
subMission.SubMissionInfo.ParamIntList?.ForEach(x => Player.LineupManager!.AddAvatarToCurTeam(x));
|
|
}
|
|
}
|
|
|
|
public void CreateHeroTrialPlayer(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
if (subMission.SubMissionInfo?.FinishType == MissionFinishTypeEnum.GetTrialAvatar)
|
|
{
|
|
Player.LineupManager!.AddAvatarToCurTeam(subMission.SubMissionInfo.ParamInt1);
|
|
}
|
|
|
|
if (subMission.SubMissionInfo?.FinishType == MissionFinishTypeEnum.GetTrialAvatarList)
|
|
{
|
|
List<int> list = [.. subMission.SubMissionInfo.ParamIntList];
|
|
|
|
if (list.Count > 0)
|
|
{
|
|
if (Player.Data.CurrentGender == Gender.Man)
|
|
{
|
|
foreach (var avatar in subMission.SubMissionInfo?.ParamIntList ?? [])
|
|
{
|
|
if (avatar > 10000) // else is Base Avatar
|
|
{
|
|
if (avatar.ToString().EndsWith("8002") ||
|
|
avatar.ToString().EndsWith("8004") ||
|
|
avatar.ToString().EndsWith("8006"))
|
|
{
|
|
list.Remove(avatar);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
foreach (var avatar in subMission.SubMissionInfo?.ParamIntList ?? [])
|
|
{
|
|
if (avatar > 10000) // else is Base Avatar
|
|
{
|
|
if (avatar.ToString().EndsWith("8001") ||
|
|
avatar.ToString().EndsWith("8003") ||
|
|
avatar.ToString().EndsWith("8005"))
|
|
{
|
|
list.Remove(avatar);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
list.ForEach(x => Player.LineupManager!.AddAvatarToCurTeam(x));
|
|
}
|
|
}
|
|
|
|
public void DestroyTrialPlayer(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
if (subMission.SubMissionInfo?.FinishType == MissionFinishTypeEnum.DelTrialAvatar)
|
|
{
|
|
Player.LineupManager!.RemoveAvatarFromCurTeam(subMission.SubMissionInfo.ParamInt1);
|
|
}
|
|
}
|
|
|
|
public void ChangeGroupState(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
if (group != null)
|
|
{
|
|
foreach (var entity in Player.SceneInstance?.Entities.Values.ToList() ?? [])
|
|
{
|
|
if (entity is EntityProp prop && prop.GroupID == group.Id)
|
|
{
|
|
if (prop.Excel.PropStateList.Contains(PropStateEnum.Open))
|
|
{
|
|
prop.SetState(PropStateEnum.Open);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void TriggerEntityServerEvent(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
if (group != null)
|
|
{
|
|
foreach (var entity in Player.SceneInstance?.Entities.Values.ToList() ?? [])
|
|
{
|
|
if (entity is EntityProp prop && prop.GroupID == group.Id)
|
|
{
|
|
if (prop.Excel.PropStateList.Contains(PropStateEnum.Open) && (prop.State == PropStateEnum.Closed || prop.State == PropStateEnum.Locked))
|
|
{
|
|
prop.SetState(PropStateEnum.Open);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void TriggerEntityEvent(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
if (act is TriggerEntityEvent triggerEntityEvent)
|
|
{
|
|
if (group != null)
|
|
{
|
|
foreach (var entity in Player.SceneInstance?.Entities.Values.ToList() ?? [])
|
|
{
|
|
if (entity is EntityProp prop && prop.GroupID == group.Id && prop.InstId == triggerEntityEvent.InstanceID.GetValue())
|
|
{
|
|
if (prop.Excel.PropStateList.Contains(PropStateEnum.Closed))
|
|
{
|
|
prop.SetState(PropStateEnum.Closed);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void PropSetupUITrigger(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
if (act is PropSetupUITrigger propSetupUITrigger)
|
|
{
|
|
foreach (var task in propSetupUITrigger.ButtonCallback)
|
|
{
|
|
TriggerTask(task, subMission, group);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void PropStateExecute(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
if (act is PropStateExecute propStateExecute)
|
|
{
|
|
// handle targetType
|
|
var methodName = propStateExecute.TargetType.Type.Replace("RPG.GameCore.", "");
|
|
|
|
var method = GetType().GetMethod(methodName);
|
|
if (method != null)
|
|
{
|
|
var resp = method.Invoke(this, [propStateExecute.TargetType, subMission, group]);
|
|
if (resp is EntityProp result && result != null)
|
|
{
|
|
result.SetState(propStateExecute.State);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Task Condition
|
|
|
|
public bool ByCompareSubMissionState(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
if (act is ByCompareSubMissionState compare)
|
|
{
|
|
var mission = Player.MissionManager!.GetSubMissionStatus(compare.SubMissionID);
|
|
return mission.ToStateEnum() == compare.SubMissionState;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public bool ByCompareFloorSavedValue(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
if (act is ByCompareFloorSavedValue compare)
|
|
{
|
|
var value = Player.SceneData!.FloorSavedData.GetValueOrDefault(Player.Data.FloorId, []);
|
|
return compare.CompareType switch
|
|
{
|
|
CompareTypeEnum.Equal => value.GetValueOrDefault(compare.Name, 0) == compare.CompareValue,
|
|
CompareTypeEnum.Greater => value.GetValueOrDefault(compare.Name, 0) > compare.CompareValue,
|
|
CompareTypeEnum.Less => value.GetValueOrDefault(compare.Name, 0) < compare.CompareValue,
|
|
CompareTypeEnum.GreaterEqual => value.GetValueOrDefault(compare.Name, 0) >= compare.CompareValue,
|
|
CompareTypeEnum.LessEqual => value.GetValueOrDefault(compare.Name, 0) <= compare.CompareValue,
|
|
CompareTypeEnum.NotEqual => value.GetValueOrDefault(compare.Name, 0) != compare.CompareValue,
|
|
_ => false,
|
|
};
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Prop Target
|
|
|
|
public EntityProp? TargetFetchAdvPropEx(TargetEvaluator act, SubMissionExcel subMission, GroupInfo? group = null)
|
|
{
|
|
if (act is TargetFetchAdvPropEx fetch)
|
|
{
|
|
if (fetch.FetchType != TargetFetchAdvPropFetchTypeEnum.SinglePropByPropID) return null;
|
|
foreach (var entity in Player.SceneInstance!.Entities.Values)
|
|
{
|
|
if (entity is EntityProp prop && prop.GroupID == fetch.SinglePropID.GroupID.GetValue() && prop.InstId == fetch.SinglePropID.ID.GetValue())
|
|
{
|
|
return prop;
|
|
}
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|