14 Commits
2.8.0 ... 2.9.0

Author SHA1 Message Date
HolographicHat
849f379ca5 3.8 2023-07-06 14:31:55 +08:00
HolographicHat
29c57cbc1e Merge pull request #62 from Lightczx/master
Improve export experience for Snap Hutao
2023-06-29 21:30:58 +08:00
DismissedLight
8fdb10898a Improve export experience for Snap Hutao 2023-06-29 14:38:19 +08:00
HolographicHat
f4f1f14651 Merge pull request #61 from prpjzz/master
Add Readme_EN.md
2023-06-22 15:03:23 +08:00
prpjzz
390af6cd85 Update Tutorial_EN.md 2023-06-19 22:00:38 +07:00
prpjzz
a78f36dfa8 Update README_EN.md 2023-06-19 21:56:51 +07:00
prpjzz
e3d7152da2 Update Tutorial_EN.md 2023-06-19 21:14:20 +07:00
prpjzz
60a4dd04c4 Merge branch 'HolographicHat:master' into master 2023-06-19 18:49:45 +07:00
prpjzz
d9034ec635 Update Tutorial_EN.md 2023-05-03 14:06:04 +07:00
prpjzz
f742cf37d5 Create Tutorial_EN.md 2023-05-03 13:27:26 +07:00
prpjzz
4136a1b0c4 Update README_EN.md 2023-05-03 13:26:38 +07:00
prpjzz
e039d2f944 Update README_EN.md 2023-05-03 13:26:21 +07:00
prpjzz
0e23a05a78 Update README_EN.md 2023-05-03 13:25:26 +07:00
prpjzz
5f5a0614a6 Update README_EN.md 2023-05-03 13:20:02 +07:00
12 changed files with 125 additions and 47 deletions

View File

@@ -16,12 +16,8 @@
- Support for exporting to [Cocogoat](https://cocogoat.work/achievement), [Snap·HuTao](https://github.com/DGP-Studio/Snap.HuTao), [Paimon.moe](https://paimon.moe/achievement/), [Seelie.me](https://seelie.me/achievements)、[XunKong](https://github.com/xunkong/xunkong) and form files (csv) - Support for exporting to [Cocogoat](https://cocogoat.work/achievement), [Snap·HuTao](https://github.com/DGP-Studio/Snap.HuTao), [Paimon.moe](https://paimon.moe/achievement/), [Seelie.me](https://seelie.me/achievements)、[XunKong](https://github.com/xunkong/xunkong) and form files (csv)
- There are no requirements for window size, game language, etc. - There are no requirements for window size, game language, etc.
## How to use: ## Instructions for Use:
The first time you open it, you need to set the path that contains the Genshin main program (YuanShen.exe / GenshinIimpact.exe) → [Tutorial_EN.md](Tutorial_EN.md)
![alt](https://upload-bbs.mihoyo.com/upload/2022/04/06/165631158/e540a5a6d50cd5fdee19665435548e00_514247033566841954.jpg)
After setting up, wait for the game to start.
When you see the door, press in to enter the game, the game will automatically exit.
After the game exits, enter a number inside the program to select the site/application to export to
## Download: [Here](https://github.com/HolographicHat/YaeAchievement/releases/latest) ## Download: [Here](https://github.com/HolographicHat/YaeAchievement/releases/latest)
@@ -30,7 +26,8 @@ After the game exits, enter a number inside the program to select the site/appli
## Frequently asked questions ## Frequently asked questions
0. Q: Unable to start 0. Q: Unable to start
A: Download and install [.NET Runtime 6](https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-7.0.3-windows-x64-installer) A: Download and install [.NET Runtime 7](https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-7.0.7-windows-x64-installer) or ` winget install Microsoft.DotNet.Runtime.7`
1. Q: Error while Genshin started: Data Exception (31-4302) 1. Q: Error while Genshin started: Data Exception (31-4302)
A: Don't place software in the directory containing Genshin Impact. A: Don't place software in the directory containing Genshin Impact.

73
Tutorial_EN.md Normal file
View File

@@ -0,0 +1,73 @@
## Instructions for Use
1.Download YaeAchievementLatest Version
Click Herehttps://github.com/HolographicHat/YaeAchievement/releases
Click on the file named "YaeAchievement.exe" in the red box to automatically pop up and download.It is recommended that you save this file in a desktop or other easy-to-see folder.
![image](https://github.com/prpjzz/yae-markdown-en/blob/main/image/Guide1.png)
2.Install .NET Runtime 7 (this step can be ignored if the runtime is already installed)
Click Herehttps://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-7.0.7-windows-x64-installer .
Or `winget install Microsoft.DotNet.Runtime.7` if you use Windows 11 or have Winget installed.
The browser automatically pops up and downloads when you enter the web page, as well as saving files in a desktop or other easy-to-see folder.
When you open a file with the name dotnet-runtime-x.x.x-win-x64.exe after the download is complete, an installation window pops up, as shown below.
![image](https://github.com/prpjzz/yae-markdown-en/blob/main/image/Guide2.png)
Just click Install.
3.The actions required to open the main program and the options for the achievement export
Double-click the file named "YaeAchievement.exe" downloaded in the first step to open it successfully, indicating that the original god is starting, as shown below.
![image](https://github.com/prpjzz/yae-markdown-en/blob/main/image/Guide3.png)
Once the primordial startup is complete, click to enter the game.
When you click into the game, the tool prompts you to choose which tool to export, as shown below.
![image](https://github.com/prpjzz/yae-markdown-en/blob/main/image/Guide4.png)
For global user, you should select [3] Seelie.me or [4] Export to csv file。
After selecting, each page exports the tool as follows:
#### Snap.Hutao
![image](https://github.com/prpjzz/yae-markdown-en/blob/main/image/Guide5.png)
#### Seelie.me
At this point, Yae Achievement will remind that performance data has been exported. Please find the file named export-20xxxxxxxxxxxx-seelie.json in the Yae Achievement save directory.
![image](https://github.com/prpjzz/yae-markdown-en/blob/main/image/Guide6.png)
Then click on the URL: https://seelie.me/settings, enter the website and select Import Account, as illustrated in the figure below.
![image](https://github.com/prpjzz/yae-markdown-en/blob/main/image/Guide7.png)
After clicking Import, select a file named export-20xxxxxxxxxxxx-seelie.json, as shown in the figure below.
![image](https://github.com/prpjzz/yae-markdown-en/blob/main/image/Guide8.png)
When the prompt as shown in the image below pops up, the import process succeeds.
![image](https://github.com/prpjzz/yae-markdown-en/blob/main/image/Guide9.png)
At this time, you can select the Achievements in the left column to view the imported performance data.
### For the introduction of different tools, please visit the official page of each tool to see:
1. [Snap·HuTao](https://github.com/DGP-Studio/Snap.HuTao)
2. [Paimon.moe](https://paimon.moe/achievement/)
3. [Seelie.me](https://seelie.me/achievements)

View File

@@ -8,8 +8,8 @@ using std::to_string;
HWND unityWnd = nullptr; HWND unityWnd = nullptr;
HANDLE hPipe = nullptr; HANDLE hPipe = nullptr;
// Allow Protocol: GetPlayerToken, PlayerLogin, AchievementAllDataNotify, Ping // Allow Protocol: GetPlayerToken, PlayerLogin, AchievementAllDataNotify, Ping, PlayerForceExit
std::set<UINT16> PacketWhitelist = { 175, 196, 102, 172, 2678, 55, 48, 160 }; std::set<UINT16> PacketWhitelist = { 6929, 7187, 4356, 6011, 1268, 24845, 24404, 29313 };
bool OnPacket(KcpPacket* pkt) { bool OnPacket(KcpPacket* pkt) {
if (pkt->data == nullptr) return true; if (pkt->data == nullptr) return true;
@@ -30,7 +30,7 @@ bool OnPacket(KcpPacket* pkt) {
return false; return false;
} }
printf("Passed cmdid: %d\n", ReadMapped<UINT16>(data->vector, 2)); printf("Passed cmdid: %d\n", ReadMapped<UINT16>(data->vector, 2));
if (ReadMapped<UINT16>(data->vector, 2) == 2678) { if (ReadMapped<UINT16>(data->vector, 2) == 1268) {
auto headLength = ReadMapped<UINT16>(data->vector, 4); auto headLength = ReadMapped<UINT16>(data->vector, 4);
auto dataLength = ReadMapped<UINT32>(data->vector, 6); auto dataLength = ReadMapped<UINT32>(data->vector, 6);
auto iStr = Genshin::ToBase64String(data, 10 + headLength, dataLength, nullptr); auto iStr = Genshin::ToBase64String(data, 10 + headLength, dataLength, nullptr);

View File

@@ -1 +1 @@
DO_API(0x92e180, 0x92e1f0, Il2CppString*, il2cpp_string_new, (const char* str)); DO_API(0x941c20, 0x93e230, Il2CppString*, il2cpp_string_new, (const char* str));

View File

@@ -2,30 +2,30 @@ using namespace Genshin;
// DO_APP_FUNC(CN_OFFSET, OS_OFFSET, RETURN, FUNC_NAME, (ARGS...)); // DO_APP_FUNC(CN_OFFSET, OS_OFFSET, RETURN, FUNC_NAME, (ARGS...));
DO_APP_FUNC(0x68df290, 0x6822570, Il2CppString*, ToBase64String, (ByteArray* value, int offset, int length, void* method)); DO_APP_FUNC(0x728b850, 0x7247520, Il2CppString*, ToBase64String, (ByteArray* value, int offset, int length, void* method));
DO_APP_FUNC(0x272fe00, 0x26df410, void, SetVersion, (void* obj, Il2CppString* value, void* method)); DO_APP_FUNC(0x215d110, 0x214d7a0, void, SetVersion, (void* obj, Il2CppString* value, void* method));
DO_APP_FUNC(0x710a730, 0x70401b0, ByteArray*, RecordUserData, (int32_t nType)); DO_APP_FUNC(0x7b4dc00, 0x7afe4e0, ByteArray*, RecordUserData, (int32_t nType));
DO_APP_FUNC(0x26a7940, 0x2658ae0, void, XorEncrypt, (ByteArray** data, int length, void* method)); DO_APP_FUNC(0x166e5d0, 0x1662f60, void, XorEncrypt, (ByteArray** data, int length, void* method));
DO_APP_FUNC(0x19d99a0, 0x19b12f0, int, KcpSend, (void* client, KcpPacket* pkt, void* method)); DO_APP_FUNC(0xf71860, 0xf69870, int, KcpSend, (void* client, KcpPacket* pkt, void* method));
DO_APP_FUNC(0x306e0e0, 0x3001bf0, bool, KcpRecv, (void* client, ClientKcpEvent* evt, void* method)); DO_APP_FUNC(0x433e670, 0x4315590, bool, KcpRecv, (void* client, ClientKcpEvent* evt, void* method));
DO_APP_FUNC(0x6b832c0, 0x6ac2040, LPVOID, GetDefaultEncoding, ()); DO_APP_FUNC(0x75627b0, 0x751a960, LPVOID, GetDefaultEncoding, ());
DO_APP_FUNC(0x6b82b50, 0x6ac18d0, Il2CppString*, GetString, (LPVOID encoding, LPVOID bytes)); DO_APP_FUNC(0x7561ff0, 0x751a1c0, Il2CppString*, GetString, (LPVOID encoding, LPVOID bytes));
DO_APP_FUNC(0x6b81980, 0x6ac0760, ByteArray*, GetBytes, (LPVOID encoding, LPVOID str)); DO_APP_FUNC(0x7560d90, 0x7518f90, ByteArray*, GetBytes, (LPVOID encoding, LPVOID str));
DO_APP_FUNC(0x18a0490, 0x187a070, VOID, RequestLogin, (LPVOID obj, LPVOID token, UINT uid)); DO_APP_FUNC(0x1349850, 0x13415f0, VOID, RequestLogin, (LPVOID obj, LPVOID token, UINT uid));
DO_APP_FUNC(0x3669cd0, 0x1b323c0, VOID, SetChecksum, (LPVOID obj, Il2CppString* value)); DO_APP_FUNC(0x11ab1d0, 0x3e9f710, VOID, SetChecksum, (LPVOID obj, Il2CppString* value));
DO_APP_FUNC(0xed5d70, 0xecc910, VOID, ForceQuit, (LPVOID obj)); DO_APP_FUNC(0xd4e730, 0xd49dd0, VOID, ForceQuit, (LPVOID obj));
DO_APP_FUNC(0x57fb490, 0x574b7f0, LPVOID, GetSingletonManager, ()); DO_APP_FUNC(0x607fbf0, 0x6044870, LPVOID, GetSingletonManager, ());
DO_APP_FUNC(0x57fb1c0, 0x574b520, LPVOID, GetSingletonInstance, (LPVOID obj, Il2CppString* value)); DO_APP_FUNC(0x607f920, 0x60445a0, LPVOID, GetSingletonInstance, (LPVOID obj, Il2CppString* value));

View File

@@ -1,3 +1,3 @@
using namespace Genshin; using namespace Genshin;
DO_UNI_FUNC(0x1003e0, 0x1003e0, ByteArray*, UnityEngine_RecordUserData, (int32_t nType)); DO_UNI_FUNC(0x100560, 0x100560, ByteArray*, UnityEngine_RecordUserData, (int32_t nType));

4
res/App.Designer.cs generated
View File

@@ -157,7 +157,7 @@ namespace YaeAchievement.res {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Please update SnapGenshin and retry.. /// Looks up a localized string similar to Please update Snap Hutao and retry..
/// </summary> /// </summary>
internal static string ExportToSnapGenshinNeedUpdate { internal static string ExportToSnapGenshinNeedUpdate {
get { get {
@@ -166,7 +166,7 @@ namespace YaeAchievement.res {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Successfully exported to snap genshin.. /// Looks up a localized string similar to Successfully exported to Snap Hutao..
/// </summary> /// </summary>
internal static string ExportToSnapGenshinSuccess { internal static string ExportToSnapGenshinSuccess {
get { get {

View File

@@ -41,10 +41,10 @@ Input a number (0-5): </value>
<value>{0}</value> <value>{0}</value>
</data> </data>
<data name="ExportToSnapGenshinSuccess" xml:space="preserve"> <data name="ExportToSnapGenshinSuccess" xml:space="preserve">
<value>Successfully exported to snap genshin.</value> <value>Successfully exported to Snap Hutao.</value>
</data> </data>
<data name="ExportToSnapGenshinNeedUpdate" xml:space="preserve"> <data name="ExportToSnapGenshinNeedUpdate" xml:space="preserve">
<value>Please update SnapGenshin and retry.</value> <value>Please update Snap Hutao and retry.</value>
</data> </data>
<data name="ExportToFileSuccess" xml:space="preserve"> <data name="ExportToFileSuccess" xml:space="preserve">
<value>Successfully exported to {0}</value> <value>Successfully exported to {0}</value>

View File

@@ -20,7 +20,7 @@
<data name="ExportChoose" xml:space="preserve"> <data name="ExportChoose" xml:space="preserve">
<value>导出至: <value>导出至:
[0] 椰羊 (https://cocogoat.work/achievement, 默认) [0] 椰羊 (https://cocogoat.work/achievement, 默认)
[1] Snap.HuTao [1] Snap Hutao
[2] Paimon.moe [2] Paimon.moe
[3] Seelie.me [3] Seelie.me
[4] 表格文件 [4] 表格文件
@@ -36,10 +36,10 @@
<value>在小程序导入页面输入以下代码: {0}</value> <value>在小程序导入页面输入以下代码: {0}</value>
</data> </data>
<data name="ExportToSnapGenshinSuccess" xml:space="preserve"> <data name="ExportToSnapGenshinSuccess" xml:space="preserve">
<value>在 SnapHutao 进行下一步操作</value> <value>在 Snap Hutao 进行下一步操作</value>
</data> </data>
<data name="ExportToSnapGenshinNeedUpdate" xml:space="preserve"> <data name="ExportToSnapGenshinNeedUpdate" xml:space="preserve">
<value>更新 SnapHutao 最新版本后重试</value> <value>更新/安装 Snap Hutao 最新版本后重试</value>
</data> </data>
<data name="ExportToFileSuccess" xml:space="preserve"> <data name="ExportToFileSuccess" xml:space="preserve">
<value>成就数据已导出至 {0}</value> <value>成就数据已导出至 {0}</value>

View File

@@ -9,13 +9,13 @@ message Achievement {
FINISHED = 2; FINISHED = 2;
REWARD_TAKEN = 3; REWARD_TAKEN = 3;
} }
uint32 timestamp = 15; uint32 timestamp = 3;
uint32 current = 5; uint32 current = 9;
uint32 total = 14; uint32 total = 11;
uint32 id = 3; uint32 id = 14;
Status status = 10; Status status = 10;
} }
message AchievementAllDataNotify { message AchievementAllDataNotify {
repeated Achievement list = 4; repeated Achievement list = 3;
} }

View File

@@ -77,10 +77,18 @@ public static class Export {
} }
private static void ToHuTao(AchievementAllDataNotify data) { private static void ToHuTao(AchievementAllDataNotify data) {
if (CheckWinUIAppScheme("hutao"))
{
Utils.CopyToClipboard(JsonSerializer.Serialize(ExportToUIAFApp(data))); Utils.CopyToClipboard(JsonSerializer.Serialize(ExportToUIAFApp(data)));
Utils.ShellOpen("hutao://achievement/import"); Utils.ShellOpen("hutao://achievement/import");
Console.WriteLine(App.ExportToSnapGenshinSuccess); Console.WriteLine(App.ExportToSnapGenshinSuccess);
} }
else
{
Console.WriteLine(App.ExportToSnapGenshinNeedUpdate);
Utils.ShellOpen("ms-windows-store://pdp/?productid=9PH4NXJ2JN52");
}
}
// ReSharper disable once InconsistentNaming // ReSharper disable once InconsistentNaming
private static void ToUIAFJson(AchievementAllDataNotify data) { private static void ToUIAFJson(AchievementAllDataNotify data) {
@@ -161,7 +169,7 @@ public static class Export {
} }
private static void ToXunkong(AchievementAllDataNotify data) { private static void ToXunkong(AchievementAllDataNotify data) {
if (CheckXunkongScheme()) { if (CheckWinUIAppScheme("xunkong")) {
Utils.CopyToClipboard(JsonSerializer.Serialize(ExportToUIAFApp(data))); Utils.CopyToClipboard(JsonSerializer.Serialize(ExportToUIAFApp(data)));
Utils.ShellOpen("xunkong://import-achievement?caller=YaeAchievement&from=clipboard"); Utils.ShellOpen("xunkong://import-achievement?caller=YaeAchievement&from=clipboard");
Console.WriteLine(App.ExportToXunkongSuccess); Console.WriteLine(App.ExportToXunkongSuccess);
@@ -203,8 +211,8 @@ public static class Export {
}; };
} }
private static bool CheckXunkongScheme() { private static bool CheckWinUIAppScheme(string protocol) {
return (string?)Registry.ClassesRoot.OpenSubKey("xunkong")?.GetValue("") == "URL:xunkong"; return (string?)Registry.ClassesRoot.OpenSubKey(protocol)?.GetValue("") == $"URL:{protocol}";
} }
private static string JoinToString(this IEnumerable<object> list, string separator) { private static string JoinToString(this IEnumerable<object> list, string separator) {

View File

@@ -20,8 +20,8 @@ public static class GlobalVars {
public static readonly string CachePath = Path.Combine(DataPath, "cache"); public static readonly string CachePath = Path.Combine(DataPath, "cache");
public static readonly string LibFilePath = Path.Combine(DataPath, "YaeAchievement.dll"); public static readonly string LibFilePath = Path.Combine(DataPath, "YaeAchievement.dll");
public const uint AppVersionCode = 38; public const uint AppVersionCode = 39;
public const string AppVersionName = "2.8"; public const string AppVersionName = "2.9";
public const string PipeName = "YaeAchievementPipe"; public const string PipeName = "YaeAchievementPipe";
public const string BucketHost = "https://cn-cd-1259389942.file.myqcloud.com"; public const string BucketHost = "https://cn-cd-1259389942.file.myqcloud.com";