Files
DanhengServer-OpenSource/GameServer/Game/Task/LevelTask.cs
Somebody c7779ad005 Fix PropStateExecute Task Bug
- The PropStateExecute task will not be handled correctly
2024-07-19 20:25:19 +08:00

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
}
}