read dynamic task data
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user