using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MHFQuestToMH2Dos { public static class ModifyQuest { /// /// Dos中无意义数据 /// const int cNon0x00For2DosPtr = 19; /// /// MHF任务信息偏移 /// const int cQuestMHFOffset = 12; /// /// 2Dos任务信息偏移 /// const int cQuest2DosOffset = 8; /// /// 任务信息长度 /// const int cQuestInfoLenght = 64; /// /// 任务_类型 偏移 /// const int cQuestInfo_Type_Offset = 0; /// /// 任务_类型 长度 /// const int cQuestInfo_Type_Lenght = 1; /// /// 任务_类型 偏移 /// const int cQuestInfo_TargetMap_Offset = 32; /// /// 任务_类型 长度 /// const int cQuestInfo_TargetMapID_Lenght = 1; public static bool ModifyQuset(byte[] src, out byte[] target) { target = null; if (!ModifyFileOffset(src, out byte[] Setp1out)) return false; if (!ModifyQuestMap(Setp1out, out byte[] Setp2out)) return false; target = Setp2out; return true; } public static bool ModifyFileOffset(byte[] src, out byte[] target) { try { //加载数据 target = new byte[src.Length]; for (int i = 0; i < src.Length; i++) target[i] = src[i]; //从前4字节取出指针 定位任务信息位置 int _QuestInfoPtr = HexHelper.bytesToInt(target, 4, 0x00); //----Step---- 清除对于2Dos来说 无意义的数据 target[cNon0x00For2DosPtr] = 0x00; //----Step---- 前移任务数据4字节 (MHF比2Dos后移了4字节,MHF:+12 2Dos: +8) //MHF偏移12的位置 long QuestInfoPtr_MHFTarget = _QuestInfoPtr + cQuestMHFOffset; //目标2Dos偏移8的位置 long QuestInfoPtr_2DosTarget = _QuestInfoPtr + cQuest2DosOffset; //取出原始数据 byte[] temp = new byte[cQuestInfoLenght]; for (int i = 0; i < cQuestInfoLenght; i++) { temp[i] = target[QuestInfoPtr_MHFTarget + i]; } //清理原始数据 for (int i = 0; i < cQuestInfoLenght; i++) { target[QuestInfoPtr_MHFTarget + i] = 0x00; } //将temp数据往前位移4字节 for (int i = 0; i < cQuestInfoLenght; i++) { target[QuestInfoPtr_2DosTarget + i] = temp[i]; } return true; } catch (Exception ex) { Console.WriteLine(ex); target = null; return false; } } public static bool ModifyQuestMap(byte[] src, out byte[] target) { try { //加载数据 target = new byte[src.Length]; for (int i = 0; i < src.Length; i++) target[i] = src[i]; //从前4字节取出指针 定位任务信息位置 int _QuestInfoPtr = HexHelper.bytesToInt(target, 4, 0x00); //----Step---- 读取任务数据 //任务类型 int _QuestType = HexHelper.bytesToInt(target, cQuestInfo_Type_Lenght, _QuestInfoPtr + cQuestInfo_Type_Offset); int _QuestTargetMapID = HexHelper.bytesToInt(target, cQuestInfo_TargetMapID_Lenght, _QuestInfoPtr + cQuestInfo_TargetMap_Offset); return true; } catch (Exception ex) { Console.WriteLine(ex); target = null; return false; } } } }