From 3b4f934a446329ca9b515861fa75efffbda390b7 Mon Sep 17 00:00:00 2001
From: sin365 <353374337@qq.com>
Date: Wed, 16 Aug 2023 12:57:36 +0800
Subject: [PATCH] =?UTF-8?q?=E5=BD=92=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
MHQuestHelperLib.sln | 13 ++
MHQuestHelperLib/HexHelper.cs | 232 +++++++++++++++++++++++
MHQuestHelperLib/MH2Tools.cs | 88 +++++++++
MHQuestHelperLib/MHQuestHelperLib.csproj | 9 +
4 files changed, 342 insertions(+)
create mode 100644 MHQuestHelperLib.sln
create mode 100644 MHQuestHelperLib/HexHelper.cs
create mode 100644 MHQuestHelperLib/MH2Tools.cs
create mode 100644 MHQuestHelperLib/MHQuestHelperLib.csproj
diff --git a/MHQuestHelperLib.sln b/MHQuestHelperLib.sln
new file mode 100644
index 0000000..6f2b83d
--- /dev/null
+++ b/MHQuestHelperLib.sln
@@ -0,0 +1,13 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.4.33403.182
+MinimumVisualStudioVersion = 10.0.40219.1
+Global
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {47F1902A-A0BD-41C7-A5CB-82671CC3E518}
+ EndGlobalSection
+EndGlobal
diff --git a/MHQuestHelperLib/HexHelper.cs b/MHQuestHelperLib/HexHelper.cs
new file mode 100644
index 0000000..23f9b94
--- /dev/null
+++ b/MHQuestHelperLib/HexHelper.cs
@@ -0,0 +1,232 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Http.Headers;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MHQuestHelperLib
+{
+ public class HexHelper
+ {
+
+ public static byte[] CopyByteArr(byte[] src)
+ {
+ byte[] target = new byte[src.Length];
+ //加载数据
+ target = new byte[src.Length];
+ for (int i = 0; i < src.Length; i++)
+ target[i] = src[i];
+ return target;
+ }
+
+ ///
+ /// 读取byte[]数据
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static byte[] ReadBytes(byte[] src, int lenght, int offset = 0)
+ {
+ byte[] data = new byte[lenght];
+ for (int i = 0; i < lenght; i++)
+ {
+ data[i] = src[offset + i];
+ }
+ return data;
+ }
+
+ /**
+ * byte[]转换int byte高位在前
+ */
+ public static int bytesToInt(byte[] src,int lenght, int offset = 0)
+ {
+ if (lenght == 1)
+ return src[offset + 0];
+
+ byte[] data = new byte[lenght];
+ for (int i = 0; i < lenght; i++)
+ {
+ data[i] = src[offset + i];
+ }
+
+ if(lenght == 2)
+ return BitConverter.ToInt16(data, 0);
+ else //if (lenght == 4)
+ return BitConverter.ToInt32(data, 0);
+ }
+
+ /**
+ * byte[]转换int byte高位在前
+ */
+ public static uint bytesToUInt(byte[] src, int lenght, int offset = 0)
+ {
+ if (lenght == 1)
+ return src[offset + 0];
+
+ byte[] data = new byte[lenght];
+ for (int i = 0; i < lenght; i++)
+ {
+ data[i] = src[offset + i];
+ }
+
+ if (lenght == 2)
+ return BitConverter.ToUInt16(data, 0);
+ else //if (lenght == 4)
+ return BitConverter.ToUInt32(data, 0);
+ }
+
+ /**
+ * int 转 byte[] byte高位在前
+ */
+ public static byte[] intToBytes(int value)
+ {
+ return BitConverter.GetBytes(value);
+ }
+
+ /**
+ * 从字节读取字符串
+ */
+ public static string ReadBytesToString(byte[] src, int Start, Encoding encoding = null)
+ {
+ List bytes = new List();
+
+ int index = 0;
+ while (true)
+ {
+ bytes.Add(src[Start + index]);
+
+ if (src[Start + index + 1] == 0x00)
+ break;
+
+ index++;
+ }
+ if (encoding == null)
+ encoding = Encoding.GetEncoding("Shift-JIS");
+ string str = encoding.GetString(bytes.ToArray());
+ return str;
+ }
+
+
+ /**
+ * 从字节读取字符串
+ */
+ public static string ReadBytesToString(byte[] src, Encoding encoding = null)
+ {
+ if (encoding == null)
+ encoding = Encoding.GetEncoding("Shift-JIS");
+ string str = encoding.GetString(src.ToArray());
+ return str;
+ }
+
+
+ /**
+ * 写入int到byte[] byte高位在前
+ */
+ public static void ModifyIntHexToBytes(byte[] srcdata, int targetvalue,int startoffset, int srclenght)
+ {
+ byte[] targetVal = intToBytes(targetvalue);
+
+ //抹去数据
+ for (int i = 0; i < srclenght; i++)
+ srcdata[startoffset + i] = 0x00;
+
+ for (int i = 0; i < targetVal.Length && i < srclenght; i++)
+ srcdata[startoffset + i] = targetVal[i];
+ }
+
+
+ /**
+ * 写入byte[]到byte[] byte高位在前
+ */
+ public static void ModifyDataToBytes(byte[] srcdata, byte[] targetVal, int startoffset)
+ {
+ //抹去数据
+ for (int i = 0; i < targetVal.Length; i++)
+ srcdata[startoffset + i] = 0x00;
+
+ for (int i = 0; i < targetVal.Length && i < targetVal.Length; i++)
+ srcdata[startoffset + i] = targetVal[i];
+ }
+
+
+
+ /**
+ * 对比数据
+ */
+ public static bool CheckDataEquals(byte[] srcdata, byte[] targetVal, int startoffset)
+ {
+ byte[] temp = new byte[targetVal.Length];
+ for (int i = 0; i < targetVal.Length && i < targetVal.Length; i++)
+ temp[i] = srcdata[startoffset + i];
+
+ return Array.Equals(targetVal, temp);
+ }
+
+ ///
+ /// 另一种16进制转10进制的处理方式,Multiplier参与*16的循环很巧妙,对Multiplier的处理很推荐,逻辑统一
+ ///
+ ///
+ ///
+ public static int HexaToDecimal(string HexaDecimalString)
+ {
+ int Decimal = 0;
+ int Multiplier = 1;
+
+ for (int i = HexaDecimalString.Length - 1; i >= 0; i--)
+ {
+ Decimal += HexaToDecimal(HexaDecimalString[i]) * Multiplier;
+ Multiplier *= 16;
+ }
+ return Decimal;
+ }
+
+ static int HexaToDecimal(char c)
+ {
+ switch (c)
+ {
+ case '0':
+ return 0;
+ case '1':
+ return 1;
+ case '2':
+ return 2;
+ case '3':
+ return 3;
+ case '4':
+ return 4;
+ case '5':
+ return 5;
+ case '6':
+ return 6;
+ case '7':
+ return 7;
+ case '8':
+ return 8;
+ case '9':
+ return 9;
+ case 'A':
+ case 'a':
+ return 10;
+ case 'B':
+ case 'b':
+ return 11;
+ case 'C':
+ case 'c':
+ return 12;
+ case 'D':
+ case 'd':
+ return 13;
+ case 'E':
+ case 'e':
+ return 14;
+ case 'F':
+ case 'f':
+ return 15;
+ }
+ return -1;
+ }
+ }
+}
diff --git a/MHQuestHelperLib/MH2Tools.cs b/MHQuestHelperLib/MH2Tools.cs
new file mode 100644
index 0000000..fdae1e6
--- /dev/null
+++ b/MHQuestHelperLib/MH2Tools.cs
@@ -0,0 +1,88 @@
+namespace MHQuestHelperLib
+{
+ public class MH2Tools
+ {
+ #region 公开属性
+ public int QuestInfoPtr => GetQuestInfoPtr();
+ public int CharactorScenePtr => GetCharactorScenePtr();
+ public int BOSSInFoPtr => GetBOSSInFoPtr();
+ public int QuestRewardPtr => GetQuestRewardPtr();
+ public int SuppliesItemPtr => GetSuppliesItemPtr();
+ public int ItemPointPtr => GetItemPointPtr();
+ public int FishGroupPtr => GetFishGroupPtr();
+ #endregion
+
+ byte[] target;
+ public MH2Tools(byte[] src)
+ {
+ target = HexHelper.CopyByteArr(src);//加载数据
+ }
+ #region 指针查询类
+ ///
+ /// 任务信息指针
+ ///
+ ///
+ int GetQuestInfoPtr()
+ {
+ //从前4字节取出指针 定位任务信息位置
+ return HexHelper.bytesToInt(target, 4, 0x00);
+ }
+ ///
+ /// 任务信息指针
+ ///
+ ///
+ int GetCharactorScenePtr()
+ {
+ return HexHelper.bytesToInt(target, 4, 0x04);
+ }
+ ///
+ /// BOSS(头部信息,指针
+ ///
+ ///
+ int GetBOSSInFoPtr()
+ {
+ return HexHelper.bytesToInt(target, 4, 0x18);
+ }
+ ///
+ /// 取报酬组头部信息
+ ///
+ ///
+ int GetQuestRewardPtr()
+ {
+ return HexHelper.bytesToInt(target, 4, 0x0C);
+ }
+ ///
+ /// 支援道具指针
+ ///
+ ///
+ int GetSuppliesItemPtr()
+ {
+ return HexHelper.bytesToInt(target, 4, 0x08);
+ }
+ ///
+ /// 采集点指针
+ ///
+ ///
+ int GetItemPointPtr()
+ {
+ return HexHelper.bytesToInt(target, 4, 0x38);
+ }
+ ///
+ /// 鱼群指针
+ ///
+ ///
+ int GetFishGroupPtr()
+ {
+ return HexHelper.bytesToInt(target, 4, 0x40);
+ }
+ #endregion
+
+ #region 读取类
+
+ #endregion
+
+ #region 操作类
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/MHQuestHelperLib/MHQuestHelperLib.csproj b/MHQuestHelperLib/MHQuestHelperLib.csproj
new file mode 100644
index 0000000..cfadb03
--- /dev/null
+++ b/MHQuestHelperLib/MHQuestHelperLib.csproj
@@ -0,0 +1,9 @@
+
+
+
+ net7.0
+ enable
+ enable
+
+
+