read dynamic task data

This commit is contained in:
NguyenVanDat
2025-12-09 11:33:18 +07:00
parent 3de0b5537d
commit 7cd12d5041
3 changed files with 119 additions and 13 deletions
+113 -12
View File
@@ -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) ]
@@ -376,7 +376,7 @@ namespace BrewMonster.Scripts.Task
{
byte[] dynData = new byte[sz - Marshal.SizeOf<task_notify_base>()];
Array.Copy(pBuf, Marshal.SizeOf<task_notify_base>(), dynData, 0, dynData.Length);
pMan.OnDynTasksData(pTask, dynData, (uint)dynData.Length, pNotify.task != 0);
pMan.OnDynTasksData(pTask, dynData, dynData.Length, pNotify.task != 0);
}
return;
}
@@ -5037,5 +5037,10 @@ namespace BrewMonster.Scripts.Task
// return p - pData;
}
public bool IsAutoDeliver()
{
return m_FixedData.m_bDeathTrig || m_FixedData.m_bAutoDeliver;
}
}
}