From 7cd12d50416672dfb6cbabeafd5a8975bc73781f Mon Sep 17 00:00:00 2001 From: NguyenVanDat Date: Tue, 9 Dec 2025 11:33:18 +0700 Subject: [PATCH] read dynamic task data --- .../Scripts/Task/ATaskTemplMan.cs | 125 ++++++++++++++++-- .../PerfectWorld/Scripts/Task/TaskClient.cs | 2 +- Assets/PerfectWorld/Scripts/Task/TaskTempl.cs | 5 + 3 files changed, 119 insertions(+), 13 deletions(-) diff --git a/Assets/PerfectWorld/Scripts/Task/ATaskTemplMan.cs b/Assets/PerfectWorld/Scripts/Task/ATaskTemplMan.cs index f248bad32b..b57e757c38 100644 --- a/Assets/PerfectWorld/Scripts/Task/ATaskTemplMan.cs +++ b/Assets/PerfectWorld/Scripts/Task/ATaskTemplMan.cs @@ -673,7 +673,7 @@ namespace BrewMonster.Scripts.Task // void ForceGiveUpTask(TaskInterface* pTask, unsigned long ulTask); // void ForceRemoveFinishTask(TaskInterface* pTask, unsigned long ulTask); public bool IsDynTasksVerified() { return m_bDynTasksVerified; } - // void SetDynTasksVerified(bool b) { m_bDynTasksVerified = b; } + void SetDynTasksVerified(bool b) { m_bDynTasksVerified = b; } // void OnDynTasksTimeMark(TaskInterface* pTask, unsigned long ulTimeMark, unsigned short version); public void OnDynTasksData(TaskInterface pTask, byte[] data, int sz, bool ended) { @@ -716,16 +716,20 @@ namespace BrewMonster.Scripts.Task // a_LogOutput(1, "[Dat Task] OnDynTasksData"); if (UnmarshalDynTasks(m_pDynTasksData, (int)m_ulDynTasksDataSize, false)) { - // if (m_pDynTasksData) - // { - // FILE* fp = fopen(m_szDynPackPath, "wb"); - // - // if (fp) - // { - // fwrite(m_pDynTasksData, 1, m_ulDynTasksDataSize, fp); - // fclose(fp); - // } - // } + if (m_pDynTasksData!=null && m_pDynTasksData.Length>0) + { + try + { + using (FileStream fs = new FileStream(m_szDynPackPath, FileMode.Create, FileAccess.Write)) + { + fs.Write(m_pDynTasksData, 0, (int)m_ulDynTasksDataSize); + } + } + catch (Exception ex) + { + BMLogger.LogError($"[ATaskTemplMan] Failed to write dyn tasks pack: {ex.Message}"); + } + } SetDynTasksVerified(true); pTask.InitActiveTaskList(); @@ -733,7 +737,7 @@ namespace BrewMonster.Scripts.Task } // LOG_DELETE_ARR(m_pDynTasksData); - m_pDynTasksData = 0; + m_pDynTasksData = null; m_ulDynTasksDataSize = 0; } } @@ -751,6 +755,53 @@ namespace BrewMonster.Scripts.Task // bool IsTaskToPush(int id); // void ClearTasksToPush() { m_TasksToPush.clear(); } // bool HasTaskToPush() { return !m_TasksToPush.empty(); } + + void UpdateDynDataNPCService() + { + // assert(m_pEleDataMan); + + DATA_TYPE dt = default; + NPC_TASK_IN_SERVICE service = (NPC_TASK_IN_SERVICE)m_pEleDataMan.get_data_ptr( + DYN_TASK_VERIFY_SVR, + ID_SPACE.ID_SPACE_ESSENCE, + ref dt + ); + + if (dt != DATA_TYPE.DT_NPC_TASK_IN_SERVICE) + { + BMLogger.LogError($"UpdateDynDataNPCService, wrong service, dt = {dt}"); + return; + } + + NPC_TASK_OUT_SERVICE deliver = (NPC_TASK_OUT_SERVICE)m_pEleDataMan.get_data_ptr( + DYN_TASK_DELIVER_SVR, + ID_SPACE.ID_SPACE_ESSENCE, + ref dt + ); + + if (dt != DATA_TYPE.DT_NPC_TASK_OUT_SERVICE) + { + BMLogger.LogError($"UpdateDynDataNPCService, wrong service, dt = {dt}"); + return; + } + + deliver.id_tasks ??= new uint[256]; + service.id_tasks ??= new uint[256]; + + deliver.id_tasks.AsSpan().Clear(); + service.id_tasks.AsSpan().Clear(); + + foreach (var kv in m_DynTaskMap) + { + ATaskTempl p = kv.Value; + + if (p != null && p.m_FixedData.m_DynTaskType != (byte)DynTaskType.enumDTTGiftCard) + { + mount_task_out_service(p, ref deliver); + mount_task_in_service(p, ref service); + } + } + } #else void CheckDeathTrig(TaskInterface* pTask); void OnTaskCheckAllTimeLimits(unsigned long ulCurTime); @@ -838,6 +889,7 @@ namespace BrewMonster.Scripts.Task return false; } + BMLogger.LogError($" [ATaskTemplMan] UnmarshalDynTasks, wrong header: pack_size {header.pack_size} ____ data_size {data_size}"); if (header.pack_size != data_size) { // TaskInterface::WriteLog(0, 0, 0, "UnmarshalDynTasks, wrong header"); @@ -867,6 +919,55 @@ namespace BrewMonster.Scripts.Task // assert(p == data + data_size); return true; } + + void mount_task_out_service(ATaskTempl task, ref NPC_TASK_OUT_SERVICE svr) + { + if (task.IsAutoDeliver()) + return; + + if (task.m_pParent != null && !task.m_pParent.m_FixedData.m_bChooseOne) + return; + + uint[] tasks = svr.id_tasks; + for (int i = 0; i < tasks.Length; i++) + { + if (tasks[i] != 0) + continue; + + tasks[i] = task.GetID(); + break; + } + + ATaskTempl child = task.m_pFirstChild; + while (child != null) + { + mount_task_out_service(child,ref svr); + child = child.m_pNextSibling; + } + } + + void mount_task_in_service(ATaskTempl task,ref NPC_TASK_IN_SERVICE svr) + { + if ((TaskFinishType)task.m_FixedData.m_enumFinishType == TaskFinishType.enumTFTNPC) + { + uint[] tasks = svr.id_tasks; + for (int i = 0; i < tasks.Length; i++) + { + if (tasks[i] != 0) + continue; + + tasks[i] = task.GetID(); + break; + } + } + + ATaskTempl child = task.m_pFirstChild; + while (child != null) + { + mount_task_in_service(child, ref svr); + child = child.m_pNextSibling; + } + } } [ StructLayout(LayoutKind.Sequential, Pack = 1) ] diff --git a/Assets/PerfectWorld/Scripts/Task/TaskClient.cs b/Assets/PerfectWorld/Scripts/Task/TaskClient.cs index 04ad38acb5..4bf6ebe2a9 100644 --- a/Assets/PerfectWorld/Scripts/Task/TaskClient.cs +++ b/Assets/PerfectWorld/Scripts/Task/TaskClient.cs @@ -376,7 +376,7 @@ namespace BrewMonster.Scripts.Task { byte[] dynData = new byte[sz - Marshal.SizeOf()]; Array.Copy(pBuf, Marshal.SizeOf(), dynData, 0, dynData.Length); - pMan.OnDynTasksData(pTask, dynData, (uint)dynData.Length, pNotify.task != 0); + pMan.OnDynTasksData(pTask, dynData, dynData.Length, pNotify.task != 0); } return; } diff --git a/Assets/PerfectWorld/Scripts/Task/TaskTempl.cs b/Assets/PerfectWorld/Scripts/Task/TaskTempl.cs index fa0c1759a7..23320eb30f 100644 --- a/Assets/PerfectWorld/Scripts/Task/TaskTempl.cs +++ b/Assets/PerfectWorld/Scripts/Task/TaskTempl.cs @@ -5037,5 +5037,10 @@ namespace BrewMonster.Scripts.Task // return p - pData; } + + public bool IsAutoDeliver() + { + return m_FixedData.m_bDeathTrig || m_FixedData.m_bAutoDeliver; + } } } \ No newline at end of file