Merge pull request 'feature/quest_sytem' (#17) from feature/quest_sytem into develop

Reviewed-on: https://git.brew.monster/Unity/perfect-world-unity/pulls/17
This commit is contained in:
datnv
2025-09-30 02:20:02 +00:00
12 changed files with 514 additions and 37 deletions
Binary file not shown.
@@ -1,7 +1,9 @@
using System.Collections.Generic;
using BrewMonster;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using BrewMonster;
using Unity.VisualScripting;
namespace ModelRenderer.Scripts.GameData
{
@@ -41,6 +43,10 @@ namespace ModelRenderer.Scripts.GameData
public Dictionary<int, uint> recipe_index_id_map = new Dictionary<int, uint>();
public Dictionary<uint, object> recipe_id_data_map = new Dictionary<uint, object>();
public Dictionary<uint, DATA_TYPE> addon_id_data_type_map = new Dictionary<uint, DATA_TYPE>();
public Dictionary<int, uint> addon_index_id_map = new Dictionary<int, uint>();
public Dictionary<uint, object> addon_id_data_map = new Dictionary<uint, object>();
public EQUIPMENT_ADDON[] equipment_addon_array = new EQUIPMENT_ADDON[0];
public WEAPON_MAJOR_TYPE[] weapon_major_type_array = new WEAPON_MAJOR_TYPE[0];
public WEAPON_SUB_TYPE[] weapon_sub_type_array = new WEAPON_SUB_TYPE[0];
@@ -1406,7 +1412,17 @@ namespace ModelRenderer.Scripts.GameData
case ID_SPACE.ID_SPACE_ESSENCE:
essence_id_data_type_map[id] = type;
break;
case ID_SPACE.ID_SPACE_ADDON:
addon_id_data_type_map[id] = type;
break;
//case ID_SPACE.ID_SPACE_TALK:
// add_id_index_talk(id, type, pos, start);
// break;
//case ID_SPACE.ID_SPACE_FACE:
// add_id_index_face(id, type, pos, start);
// break;
//case ID_SPACE.ID_SPACE_RECIPE:
// add_id_index_recipe(id, type, pos, start);
case ID_SPACE.ID_SPACE_CONFIG:
config_id_data_type_map[id] = type;
break;
@@ -1453,6 +1469,10 @@ namespace ModelRenderer.Scripts.GameData
id = recipe_index_id_map[index];
dataType = recipe_id_data_type_map[id];
break;
case ID_SPACE.ID_SPACE_ADDON:
id = addon_index_id_map[index];
dataType = addon_id_data_type_map[id];
break;
default:
break;
@@ -1501,6 +1521,17 @@ namespace ModelRenderer.Scripts.GameData
{
case ID_SPACE.ID_SPACE_ESSENCE:
return essence_id_data_type_map.Count;
case ID_SPACE.ID_SPACE_ADDON:
return addon_id_data_type_map.Count;
// case ID_SPACE.ID_SPACE_TALK:
// return talk_id_index_map.Count;
// case ID_SPACE.ID_SPACE_FACE:
// return face_id_index_map.Count;
// case ID_SPACE.ID_SPACE_RECIPE:
// return recipe_id_index_map.Count;
case ID_SPACE.ID_SPACE_CONFIG:
return config_id_data_type_map.Count;
@@ -1536,6 +1567,12 @@ namespace ModelRenderer.Scripts.GameData
return configType;
}
break;
case ID_SPACE.ID_SPACE_ADDON:
if (addon_id_data_type_map.TryGetValue(id, out DATA_TYPE addonType))
{
return addonType;
}
break;
case ID_SPACE.ID_SPACE_TALK:
if (talk_id_data_type_map.TryGetValue(id, out DATA_TYPE talkType))
@@ -1606,11 +1643,116 @@ namespace ModelRenderer.Scripts.GameData
}
break;
case ID_SPACE.ID_SPACE_ADDON:
if (addon_id_data_map.TryGetValue(id, out data))
{
dataType = addon_id_data_type_map[id];
return data;
}
break;
default:
return null;
}
return null;
}
//public uint get_first_data_id(ID_SPACE idspace,ref DATA_TYPE datatype)
//{
// uint id = 0;
// switch (idspace)
// {
// case ID_SPACE.ID_SPACE_ESSENCE:
// if (essence_id_data_type_map.Count==0)
// {
// id = 0;
// datatype = DATA_TYPE.DT_INVALID;
// }
// else
// {
// var firstElement = essence_id_data_type_map.FirstOrDefault();
// id = firstElement.Key;
// datatype = firstElement.Value;
// }
// break;
// case ID_SPACE.ID_SPACE_ADDON:
// addon_id_index_itr = addon_id_index_map.begin();
// if (addon_id_index_itr == addon_id_index_map.end())
// {
// id = 0;
// datatype = DT_INVALID;
// }
// else
// {
// id = addon_id_index_itr->first;
// datatype = (addon_id_index_itr->second).type;
// }
// break;
// case ID_SPACE.ID_SPACE_TALK:
// talk_id_index_itr = talk_id_index_map.begin();
// if (talk_id_index_itr == talk_id_index_map.end())
// {
// id = 0;
// datatype = DT_INVALID;
// }
// else
// {
// id = talk_id_index_itr->first;
// datatype = (talk_id_index_itr->second).type;
// }
// break;
// case ID_SPACE.ID_SPACE_FACE:
// face_id_index_itr = face_id_index_map.begin();
// if (face_id_index_itr == face_id_index_map.end())
// {
// id = 0;
// datatype = DT_INVALID;
// }
// else
// {
// id = face_id_index_itr->first;
// datatype = (face_id_index_itr->second).type;
// }
// break;
// case ID_SPACE.ID_SPACE_RECIPE:
// recipe_id_index_itr = recipe_id_index_map.begin();
// if (recipe_id_index_itr == recipe_id_index_map.end())
// {
// id = 0;
// datatype = DT_INVALID;
// }
// else
// {
// id = recipe_id_index_itr->first;
// datatype = (recipe_id_index_itr->second).type;
// }
// break;
// case ID_SPACE.ID_SPACE_CONFIG:
// config_id_index_itr = config_id_index_map.begin();
// if (config_id_index_itr == config_id_index_map.end())
// {
// id = 0;
// datatype = DT_INVALID;
// }
// else
// {
// id = config_id_index_itr->first;
// datatype = (config_id_index_itr->second).type;
// }
// break;
// default:
// id = 0;
// datatype = DATA_TYPE.DT_INVALID;
// break;
// }
// return id;
//}
}
}
@@ -49,7 +49,7 @@ namespace BrewMonster.UI
#if UNITY_EDITOR
if (Input.GetKeyUp(KeyCode.LeftAlt))
{
_usernameInputField.text = "test025";
_usernameInputField.text = "test004";
_passwordInputField.text = "123456";
}
#endif
@@ -129,11 +129,13 @@ namespace BrewMonster.UI
private async void OnEnterWorldComplete()
{
await Task.Delay(2000);
// Request all known packages: 0=Inventory,1=Equipment,2=Task
UnityGameSession.RequestAllInventoriesAsync(() => { Logger.Log("Sent Inventory Detail Requests (all packs)"); }, 0, 1, 2);
await Task.Delay(2000);
UnityGameSession.c2s_CmdGetAllData(true, true, false);
EC_Game.Init();
}
//private void OnInventoryReceived(List<InventoryItem> inventoryData)
+11 -11
View File
@@ -215,7 +215,7 @@ public class CECHostPlayer : EC_Player
case int value when value == EC_MsgDef.MSG_HST_TASKDATA:
{
OnMsgHstTaskData(Msg);
Debug.LogError("[Dat]- OnMsgHstTaskData");
Debug.Log("[Dat]- OnMsgHstTaskData");
break;
}
case int value when value == EC_MsgDef.MSG_HST_ITEMOPERATION:
@@ -423,18 +423,18 @@ public class CECHostPlayer : EC_Player
//pData += iStorageTasksListSize;
//A3DRELEASE(m_pTaskInterface);
return;
var m_pTaskInterface = new CECTaskInterface(this);
//todo
//var m_pTaskInterface = new CECTaskInterface(this);
if (!m_pTaskInterface.Init(null, 0, null, 0,
null, 0, null, 0, null, 0))
{
//a_LogOutput(1, "CECHostPlayer::OnMsgHstTaskData, failed to initialize task interface");
return;
}
//if (!m_pTaskInterface.Init(null, 0, null, 0,
// null, 0, null, 0, null, 0))
//{
// //a_LogOutput(1, "CECHostPlayer::OnMsgHstTaskData, failed to initialize task interface");
// return;
//}
//m_pTaskInterface.CheckPQEnterWorldInit();
m_pTaskInterface.CheckPQEnterWorldInit();
//// check if player has equipped goblin
//if (m_pEquipPack->GetItem(EQUIPIVTR_GOBLIN) != NULL)
+8
View File
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 7c78d146782232847ac2e4a6cec64dbf
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
+36
View File
@@ -0,0 +1,36 @@
using ModelRenderer.Scripts.GameData;
using PerfectWorld.Scripts.Task;
using UnityEngine;
namespace BrewMonster.Network
{
public static class EC_Game
{
#region Fields
private static ATaskTemplMan m_pTaskMan; // Task template manager
private static elementdataman m_pElementDataMan; // global element templates manager
#endregion
#region Properties
public static ATaskTemplMan GetTaskTemplateMan() { return m_pTaskMan; }
public static elementdataman GetElementDataMan() { return m_pElementDataMan; }
#endregion
#region Public Methods
public static bool Init()
{
m_pElementDataMan = elementdataman.Instance;
// Load task templates
if (m_pTaskMan == null) m_pTaskMan = new ATaskTemplMan();
m_pTaskMan.Init(m_pElementDataMan);
if (!m_pTaskMan.InitStorageTask())
{
Debug.LogError("[Dat]- CECGame::Init, Storage task Init Failed!");
return false;
}
return true;
}
#endregion
}
}
+2
View File
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: e9b6b5b70c94a5c4e9dbaa1b2e1c323c
+64 -7
View File
@@ -1,3 +1,4 @@
using BrewMonster;
using ModelRenderer.Scripts.GameData;
using System.Collections.Generic;
using System.IO;
@@ -28,6 +29,10 @@ namespace PerfectWorld.Scripts.Task
private Dictionary<ulong, ATaskTempl> m_DeathTrigMap = new Dictionary<ulong, ATaskTempl>();
private Dictionary<ulong, ATaskTempl> m_PQTemplMap = new Dictionary<ulong, ATaskTempl>();
private Dictionary<uint, uint> m_StorageEssenseMap = new Dictionary<uint, uint>();
private Dictionary<uint, uint> m_WeightEssenseMap = new Dictionary<uint, uint>();
private Dictionary<int, int> m_StorageTaskMap = new Dictionary<int, int>();
private List<ATaskTempl> m_SkillTaskLst = new List<ATaskTempl>();
private List<ATaskTempl> m_TmLmtChkLst = new List<ATaskTempl>();
@@ -44,10 +49,8 @@ namespace PerfectWorld.Scripts.Task
public bool LoadTasksFromPack(string szPackPath, bool bLoadDescript)
{
//TaskInterface::WriteLog(0, 0, 2, "LoadPack begin");
Debug.Log("[Dat]- szPackPath: " + szPackPath);
FileStream fs = new FileStream(szPackPath, FileMode.Open, FileAccess.Read);
if (fs == null) return false;
TASK_PACK_HEADER tph;
// fread(&tph, sizeof(tph), 1, fp);
@@ -177,10 +180,10 @@ namespace PerfectWorld.Scripts.Task
if (pTask.m_bAutoDeliver && pTask.m_bDisplayInExclusiveUI)
m_ExlusiveAwardTaskMap[pTask.m_ID] = pTask;
//#if _TASK_CLIENT
// if (pTask.m_ulDelvNPC != 0 && pTask.m_bCanSeekOut)
// m_TasksCanSeekOut.Add(pTask);
//#endif
//#if _TASK_CLIENT
// if (pTask.m_ulDelvNPC != 0 && pTask.m_bCanSeekOut)
// m_TasksCanSeekOut.Add(pTask);
//#endif
AddTaskToMap(pTask);
}
@@ -213,5 +216,59 @@ namespace PerfectWorld.Scripts.Task
}
}
public bool InitStorageTask()
{
m_StorageEssenseMap.Clear();
m_WeightEssenseMap.Clear();
DATA_TYPE dt;
//ID_SPACE.ID_SPACE_ESSENCE
foreach (var pair in m_pEleDataMan.essence_id_data_type_map)
{
if (pair.Value == DATA_TYPE.DT_NPC_TASK_OUT_SERVICE)
{
dt = pair.Value;
NPC_TASK_OUT_SERVICE pData = (NPC_TASK_OUT_SERVICE)m_pEleDataMan.get_data_ptr(pair.Key, ID_SPACE.ID_SPACE_ESSENCE, ref dt);
if (pData.storage_id == 0) continue;
if (pData.storage_id > CECTaskInterface.TASK_STORAGE_COUNT) return false;
if (m_StorageEssenseMap.ContainsKey(pData.storage_id)) return false;
m_StorageEssenseMap[pData.storage_id] = pData.id;
for (var i = 0; i < pData.id_tasks.Length; i++)
{
if (pData.id_tasks[i] > 0)
{
m_StorageTaskMap[(int)pData.id_tasks[i]] = (int)pData.storage_id;
}
}
}
}
// ID_SPACE_CONFIG
foreach (var pair in m_pEleDataMan.config_id_data_type_map)
{
if (pair.Value == DATA_TYPE.DT_NPC_TASK_OUT_SERVICE)
{
dt = pair.Value;
NPC_TASK_OUT_SERVICE pData = (NPC_TASK_OUT_SERVICE)m_pEleDataMan.get_data_ptr(pair.Key, ID_SPACE.ID_SPACE_ESSENCE, ref dt);
if (pData.storage_id == 0) continue;
if (pData.storage_id > CECTaskInterface.TASK_STORAGE_COUNT) return false;
if (m_StorageEssenseMap.ContainsKey(pData.storage_id)) return false;
m_StorageEssenseMap[pData.storage_id] = pData.id;
for (var i = 0; i < pData.id_tasks.Length; i++)
{
if (pData.id_tasks[i] > 0)
{
m_StorageTaskMap[(int)pData.id_tasks[i]] = (int)pData.storage_id;
}
}
}
}
return true;
}
}
}
+63 -14
View File
@@ -1,11 +1,29 @@
using BrewMonster.Network;
using System.Collections.Generic;
using UnityEngine;
namespace PerfectWorld.Scripts.Task
{
public class CECTaskInterface : TaskInterface
{
public const int TASK_MAX_DELIVER_COUNT = 5;
public const int TASK_STORAGE_COUNT = 32;
public const int TASK_STORAGE_LEN = 10;
public const float TASK_STORAGE_WHELL_SCALE = 10000;
public const int TASK_ACTIVE_LIST_HEADER_LEN = 8;
public const int TASK_ACTIVE_LIST_MAX_LEN = 175;
public const int TASK_FINISHED_LIST_MAX_LEN = 2040;
public const int TASK_DATA_BUF_MAX_LEN = 32;
public const int TASK_FINISH_TIME_MAX_LEN = 1700;
public const int TASK_FINISH_COUNT_MAX_LEN = 730;
// µ±Ç°¼¤»îµÄÈÎÎñÁÐ±í»º³åÇø´óС
public int TASK_ACTIVE_LIST_BUF_SIZE =>
(TASK_ACTIVE_LIST_MAX_LEN * TASK_DATA_BUF_MAX_LEN + TASK_ACTIVE_LIST_HEADER_LEN);
CECHostPlayer m_pHost;
object[] m_pActiveListBuf; // Active task list buffer
ActiveTaskList m_pActiveListBuf; // Active task list buffer
object[] m_pFinishedListBuf; // Finished task list buffer
object[] m_pFinishedTimeListBuf; // Finished time list buffer
object[] m_pFinishedCountListBuf;// Finished count list buffer
@@ -29,11 +47,11 @@ namespace PerfectWorld.Scripts.Task
public bool Init(object[] pActiveListBuf, int iActiveListLen, object[] pFinishedListBuf, int iFinishedListLen, object[] pFinishedTimeListBuf, int iFinishedTimeListLen, object[] pFinishedCountListBuf, int iFinishedCountListLen, object[] pStorageTaskListBuf, int iStorageTaskListLen)
{
//if (!(m_pActiveListBuf = a_malloc(TASK_ACTIVE_LIST_BUF_SIZE)))
//{
// glb_ErrorOutput(ECERR_NOTENOUGHMEMORY, "CECTaskInterface::Init", __LINE__);
// return false;
//}
// if (!(m_pActiveListBuf = a_malloc(TASK_ACTIVE_LIST_BUF_SIZE)))
// {
// glb_ErrorOutput(ECERR_NOTENOUGHMEMORY, "CECTaskInterface::Init", __LINE__);
// return false;
// }
//if (!(m_pFinishedListBuf = a_malloc(TASK_FINISHED_LIST_BUF_SIZE)))
//{
@@ -92,17 +110,45 @@ namespace PerfectWorld.Scripts.Task
//if (iStorageTaskListLen < TASK_STORAGE_LIST_BUF_SIZE)
// memset((BYTE*)m_pStorageTaskListBuf + iStorageTaskListLen, 0, TASK_STORAGE_LIST_BUF_SIZE - iStorageTaskListLen);
//ATaskTemplMan pTaskMan = GetTaskTemplMan();
//pTaskMan.Release();
//pTaskMan.LoadTasksFromPack("data\\tasks.data", true);
//pTaskMan.LoadNPCInfoFromPack("data\\task_npc.data");
//pTaskMan.VerifyDynTasksPack("userdata\\dyn_tasks.data");
//InitActiveTaskList();
Debug.Log("[Dat]- Init GetTaskTemplMan");
ATaskTemplMan pTaskMan = GetTaskTemplMan();
if (pTaskMan == null)
{
Debug.LogError("[Dat]- fail to create ATaskTemplMan");
return false;
}
pTaskMan.Release();
// pTaskMan.LoadTasksFromPack("data\\tasks.data", true);
// pTaskMan.LoadNPCInfoFromPack("data\\task_npc.data");
// pTaskMan.VerifyDynTasksPack("userdata\\dyn_tasks.data");
// InitActiveTaskList();
//m_bForceNavigateFinish = false;
return true;
}
public void CheckPQEnterWorldInit()
{
return;
ActiveTaskList pList = GetActiveTaskList();
List<ActiveTaskEntry> aEntries = new List<ActiveTaskEntry>(pList.m_TaskEntries);
for(var i = 0; i < pList.m_uTaskCount; i++)
{
var CurEntry = aEntries[i];
if (CurEntry.m_ulTemplAddr == 0)
continue;
ATaskTempl pTempl = CurEntry.GetTempl();
if (pTempl == null || !pTempl.m_bPQTask)
continue;
pTempl.IncValidCount();
// _notify_svr(this, TASK_CLT_NOTIFY_PQ_CHECK_INIT, CurEntry.m_ID);
}
}
public static void WriteLog(int nPlayerId, int nTaskId, int nType, string szLog)
{
@@ -111,8 +157,11 @@ namespace PerfectWorld.Scripts.Task
private ATaskTemplMan GetTaskTemplMan()
{
//return g_pGame->GetTaskTemplateMan();
return null;
return EC_Game.GetTaskTemplateMan();
}
private ActiveTaskList GetActiveTaskList()
{
return m_pActiveListBuf;
}
}
}
+176
View File
@@ -0,0 +1,176 @@
using System;
using System.Runtime.InteropServices;
using PerfectWorld.Scripts.Task;
using UnityEngine;
public class TaskProcess
{
}
[Flags]
public enum TaskState : byte
{
TASK_STATE_FINISHED = 0x01, // Is finished
TASK_STATE_SUCCESS = 0x02, // Is successful
TASK_STATE_GIVEUP = 0x04, // Is given up
TASK_STATE_ERR_REPORTED = 0x08, // Error has been reported to client
TASK_STATE_AWARD_NOTIFY_TEAM = 0x10, // Award has been notified to team
TASK_STATE_CONTRIBUTION_FINISH = 0x20 // Contribution finished
}
// Cur Size 21 bytes
public class TASK_ENTRY_FIXED_DATA
{
public ushort m_ID; // ID
public char m_ParentIndex; // Parent node index
public char m_PrevSblIndex; // Previous sibling node index
public char m_NextSblIndex; // Next sibling node index
public char m_ChildIndex; // Child node index
public char m_uState; // Task state
public ulong m_ulTaskTime; // Timestamp
public ushort m_uCapTaskId; // Captain task ID
public ulong m_ulTemplAddr; // Template address
public ulong m_ulCapTemplAddr; // Captain task template address
};
// ´óСΪTASK_DATA_BUF_MAX_LEN
public class ActiveTaskEntry : TASK_ENTRY_FIXED_DATA
{
// Buffer union simplified (C# does not support union directly)
public byte[] m_BufData; // Raw data buffer
public ushort[] m_wMonsterNum; // Monster numbers
public int m_iUsefulData1;
public char m_iUsefulData2;
// bool IsFinished() const { return (m_uState & TASK_STATE_FINISHED) != 0; }
// bool IsSuccess() const { return (m_uState & TASK_STATE_SUCCESS) != 0; }
// bool IsGiveUp() const { return (m_uState & TASK_STATE_GIVEUP) != 0; }
// bool IsErrReported() const { return (m_uState & TASK_STATE_ERR_REPORTED) != 0; }
// bool IsAwardNotifyTeam() const { return (m_uState & TASK_STATE_AWARD_NOTIFY_TEAM) != 0; }
// bool IsContributionFinish() const { return (m_uState & TASK_STATE_CONTRIBUTION_FINISH) != 0; }
// --- State check methods ---
public bool IsFinished() => (m_uState & (byte)TaskState.TASK_STATE_FINISHED) != 0;
public bool IsSuccess() => (m_uState & (byte)TaskState.TASK_STATE_SUCCESS) != 0;
public bool IsGiveUp() => (m_uState & (byte)TaskState.TASK_STATE_GIVEUP) != 0;
public bool IsErrReported() => (m_uState & (byte)TaskState.TASK_STATE_ERR_REPORTED) != 0;
public bool IsAwardNotifyTeam() => (m_uState & (byte)TaskState.TASK_STATE_AWARD_NOTIFY_TEAM) != 0;
public bool IsContributionFinish() => (m_uState & (byte)TaskState.TASK_STATE_CONTRIBUTION_FINISH) != 0;
// void SetFinished() { m_uState |= TASK_STATE_FINISHED; }
// void ClearFinished() { m_uState &= ~TASK_STATE_FINISHED; }
// void SetSuccess() { m_uState |= TASK_STATE_SUCCESS; }
// void ClearSuccess() { m_uState &= ~TASK_STATE_SUCCESS; }
// void SetGiveUp() { m_uState |= TASK_STATE_GIVEUP; }
// void ClearGiveUp() { m_uState &= ~TASK_STATE_GIVEUP; }
// void SetErrReported() { m_uState |= TASK_STATE_ERR_REPORTED; }
// void ClearErrReported() { m_uState &= ~TASK_STATE_ERR_REPORTED; }
// void SetAwardNotifyTeam() { m_uState |= TASK_STATE_AWARD_NOTIFY_TEAM; }
// void ClearAwardNotifyTeam() { m_uState &= ~TASK_STATE_AWARD_NOTIFY_TEAM; }
// void SetContributionFinish() { m_uState |= TASK_STATE_CONTRIBUTION_FINISH; }
// void ClearContributionFinish() { m_uState &= ~TASK_STATE_CONTRIBUTION_FINISH; }
//
public ATaskTempl GetTempl()
{
if (m_ulTemplAddr == 0) return null;
return Marshal.PtrToStructure<ATaskTempl>(
new IntPtr(unchecked((long)m_ulTemplAddr))
);
// return reinterpret_cast<const ATaskTempl*>(m_ulTemplAddr);
}
// const ATaskTempl* GetCap() const { return reinterpret_cast<const ATaskTempl*>(m_ulCapTemplAddr); }
// const ATaskTempl* GetCapOrSelf() const
// {
// if (m_ulCapTemplAddr) return GetCap();
// else return GetTempl();
// }
// bool HasParent() const { return m_ParentIndex != 0xff; }
// bool HasChildren() const { return m_ChildIndex != 0xff; }
// bool IsValid(unsigned char uIndex, unsigned char uMaxCount) const
// {
// if (m_ParentIndex != 0xff)
// {
// if (m_ParentIndex >= uIndex || m_ParentIndex >= uMaxCount)
// return false;
// }
//
// if (m_PrevSblIndex != 0xff)
// {
// if (m_PrevSblIndex >= uIndex || m_PrevSblIndex >= uMaxCount)
// return false;
// }
//
// if (m_NextSblIndex != 0xff)
// {
// if (m_NextSblIndex <= uIndex || m_NextSblIndex >= uMaxCount)
// return false;
// }
//
// if (m_ChildIndex != 0xff)
// {
// if (m_ChildIndex <= uIndex || m_ChildIndex >= uMaxCount)
// return false;
// }
//
// return true;
// }
};
public class ActiveTaskList
{
// --- Header Fields ---
public byte[] header = new byte[CECTaskInterface.TASK_ACTIVE_LIST_HEADER_LEN];
public byte m_uTaskCount; // number of tasks
public byte m_uUsedCount; // used count
public ushort m_Version; // version
public byte m_uTopShowTaskCount; // top show task count
public byte m_uListState; // list state
public byte m_uTopHideTaskCount; // top hide task count
private byte _flags; // simulate bitfield (1 bit + 7 bits)
public bool m_uMaxSimultaneousCount
{
get => (_flags & 0x01) != 0;
set
{
if (value) _flags |= 0x01;
else _flags &= unchecked((byte)~0x01);
}
}
public byte m_uTitleTaskCount
{
get => (byte)((_flags & 0xFE) >> 1);
set => _flags = (byte)((_flags & 0x01) | ((value & 0x7F) << 1));
}
public ActiveTaskEntry[] m_TaskEntries = new ActiveTaskEntry[CECTaskInterface.TASK_ACTIVE_LIST_MAX_LEN];
// void UpdateTaskMask(unsigned long& ulMask) const;
// void UpdateUsedCount();
// void RealignTask(ActiveTaskEntry* pEntry, unsigned char uReserve);
// void ClearTask(TaskInterface* pTask, ActiveTaskEntry* pEntry, bool bRemoveItem);
// void RecursiveClearTask(TaskInterface* pTask, ActiveTaskEntry* pEntry, bool bRemoveItem, bool bRemoveAcquired, bool bClearTask);
// void ClearChildrenOf(TaskInterface* pTask, ActiveTaskEntry* pParent, bool bRemoveItem = true);
// ActiveTaskEntry* GetEntry(unsigned long ulId)
// {
// for (unsigned char i = 0; i < m_uTaskCount; i++)
// if (m_TaskEntries[i].m_ID == ulId)
// return &m_TaskEntries[i];
//
// return NULL;
// }
// void RemoveAll()
// {
// unsigned short ver = m_Version;
// memset(this, 0, sizeof(*this));
// m_Version = ver;
// }
// bool IsValid() const { return m_uTaskCount <= TASK_ACTIVE_LIST_MAX_LEN; }
// bool IsTimeMarkUpdate() const { return (m_uListState & TLIST_STATE_UPDATE_TIME_MARK) != 0; }
// void SetTimeMarkUpdate() { m_uListState |= TLIST_STATE_UPDATE_TIME_MARK; }
// void ClearTimeMarkUpdate() { m_uListState &= ~TLIST_STATE_UPDATE_TIME_MARK; }
// int GetMaxSimultaneousCount() {return m_uMaxSimultaneousCount ? TASK_MAX_SIMULTANEOUS_COUT : TASK_DEFAULT_MAX_SIMULTANEOUS_COUT;}
// void ExpandMaxSimultaneousCount() {m_uMaxSimultaneousCount = 1;}
};
+2
View File
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 624d08204f26c7c49bc8b1885be16f22
+3
View File
@@ -146,6 +146,7 @@ namespace PerfectWorld.Scripts.Task
public class ATaskTempl : ATaskTemplFixedData
{
const int MAX_TASK_NAME_LEN = 30;
public byte m_uValidCount;
public bool LoadFromBinFile(FileStream fp)
{
LoadBinary(fp);
@@ -533,6 +534,8 @@ namespace PerfectWorld.Scripts.Task
}
return new string(chars);
}
public void IncValidCount() { m_uValidCount++; }
}
}