mirror of
https://github.com/wangdage12/Snap.Hutao.git
synced 2026-02-18 02:42:15 +08:00
Compare commits
5 Commits
1.18.1.0_T
...
0c775a5d3d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0c775a5d3d | ||
|
|
00cd5a8c07 | ||
|
|
d93ae2bb83 | ||
|
|
2f148488f4 | ||
|
|
df92894307 |
45
README.md
45
README.md
@@ -4,7 +4,7 @@
|
||||
**中文**
|
||||
胡桃工具箱是一款以 MIT 协议开源的原神工具箱,专为现代化 Windows 平台设计,旨在改善桌面端玩家的游戏体验。
|
||||
|
||||
该版本注入功能暂不可用,并且由于缺失资源和开发能力,不建议长期使用
|
||||
自带的注入功能只有FPS调整,只保证FPS调整长期可用,你可以使用`注入选项`下方的第三方工具来使用更多功能,本项目提供的所有注入功能都不会影响游戏的公平性。
|
||||
|
||||
有条件的话可以加入discord服务器:https://discord.gg/ucH3mgeWpQ
|
||||
|
||||
@@ -15,8 +15,6 @@ Snap Hutao is an open-source Genshin Impact toolkit under MIT license, designed
|
||||
|
||||
## 🚀 安装 / Installation
|
||||
|
||||
> 如果你的设备不支持ipv6,请下载末尾带有`ipv4`的压缩包,正常情况下请尽量下载普通包(服务器速度快)
|
||||
|
||||
目前 Sanp.Hutao.Rev 更新了打包方式,并采用了标准现代的 msi 安装,方便程序获取管理员权限和更多的功能设置,不再需要原 Depolyment
|
||||
|
||||
只有`.msi`安装包安装的可以和之前的版本共存,如果通过`.msix`安装包安装则可能出现`0x80073CF3`,备份旧版本数据文件夹后卸载旧版本即可继续安装,将旧版本数据文件夹里面的文件复制到该版本的数据文件夹中即可恢复数据
|
||||
@@ -34,7 +32,7 @@ Snap Hutao is an open-source Genshin Impact toolkit under MIT license, designed
|
||||
|
||||
**目前元数据的编写进度:**
|
||||
|
||||
| 项目(V6.2) | 是否完成 |
|
||||
| 项目(V6.3) | 是否完成 |
|
||||
| ----------- | ----------- |
|
||||
| 总体数据 | ✔️ |
|
||||
|
||||
@@ -52,40 +50,55 @@ Snap Hutao is an open-source Genshin Impact toolkit under MIT license, designed
|
||||
https://deepwiki.com/DGP-Studio/Snap.Hutao
|
||||
|
||||
https://deepwiki.com/DGP-Studio/Snap.Hutao.Server
|
||||
|
||||
**该项目所需的其他仓库,欢迎贡献或者自部署**
|
||||
|
||||
- 元数据:[Snap.Metadata](https://github.com/wangdage12/Snap.Metadata)
|
||||
- 服务端:[Snap.Server](https://github.com/wangdage12/Snap.Server)
|
||||
- Web管理后台和官网:[Snap.Server.Web](https://github.com/wangdage12/Snap.Server.Web)
|
||||
|
||||
## 打包测试
|
||||
|
||||
由于采用了 wix 进行打包程序,VS 需要安装 **HeatWave for VS2022**(2026兼容)。需要 msi 安装包时,右键选中 Snap.Hutao.Installer 生成后即可在目标目录找到。默认目录:Snap.Hutao.Installer\bin\x64\Release\en-US\Snap.Hutao.Installer.msi
|
||||
|
||||
### 资源
|
||||
## 资源和服务器状态
|
||||
|
||||
> 注意:普通包的资源服务器只能使用ipv6连接,也就是说,你的电脑必须有ipv6,并且建议你手动配置DNS为`223.5.5.5`
|
||||
> 如果你的设备不支持ipv6,请下载末尾带有`ipv4`的压缩包
|
||||
> 由于数据文件夹中有元数据的仓库和图片缓存,才得以恢复资源文件
|
||||
> 如果你发现之前版本可以显示的图片不能显示了,请查找旧数据文件夹
|
||||
> `C:\Users\<用户名>\AppData\Local\Packages\xxxDGPStudio.SnapHutao_xxx\LocalCache\ImageCache`
|
||||
> 并将`ImageCache`文件夹提供给我,我会尽力恢复资源
|
||||
|
||||
[服务器状态页面](http://serverjp.wdg.cloudns.ch:3001/status/hts)
|
||||
<a href="https://uptimerobot.com" target="_blank" rel="noopener">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)"
|
||||
srcset="https://raw.githubusercontent.com/wangdage12/wangdage12/main/assets/uptimerobot-logo.svg">
|
||||
<img alt="logo"
|
||||
src="https://raw.githubusercontent.com/wangdage12/wangdage12/main/assets/uptimerobot-logo-dark.svg" width="300">
|
||||
</picture>
|
||||
</a>
|
||||
|
||||
我们将使用[UptimeRobot](https://uptimerobot.com)赞助的监控服务作为新的服务器状态页面,它有更多的功能
|
||||
|
||||
[新服务器状态页面](https://stats.uptimerobot.com/fHxWxdxK61)
|
||||
|
||||
[旧服务器状态页面](http://serverjp.wdg.cloudns.ch:3001/status/hts)
|
||||
|
||||
---
|
||||
|
||||
**元数据仓库:**
|
||||
https://github.com/wangdage12/Snap.Metadata
|
||||
|
||||
镜像:
|
||||
仓库镜像:
|
||||

|
||||
|
||||
http://htgit.wdg.cloudns.ch/wdg1122/Snap.Metadata
|
||||
|
||||
---
|
||||
|
||||
**临时API:**
|
||||
**API:**
|
||||
|
||||

|
||||
|
||||
https://htserver.wdg.cloudns.ch/api/
|
||||
|
||||
|
||||
---
|
||||
|
||||
**临时资源站:**
|
||||
**图片资源站:**
|
||||
|
||||
https://htserver.wdg.cloudns.ch/
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<Package
|
||||
Name="Snap.Hutao"
|
||||
Manufacturer="Millennium Science Technology R-D Inst"
|
||||
Version="1.18.1.0"
|
||||
Version="1.18.2.0"
|
||||
UpgradeCode="121203be-60cb-408f-92cc-7080f6598e68"
|
||||
Scope="perMachine">
|
||||
|
||||
|
||||
@@ -126,6 +126,9 @@ internal static class AvatarIds
|
||||
public static readonly AvatarId Nefer = 10000122;
|
||||
public static readonly AvatarId Durin = 10000123;
|
||||
public static readonly AvatarId Jahoda = 10000124;
|
||||
public static readonly AvatarId Columbina = 10000125;
|
||||
public static readonly AvatarId Zibai = 10000126;
|
||||
public static readonly AvatarId Illuga = 10000127;
|
||||
|
||||
private static readonly FrozenSet<AvatarId> StandardWishIds =
|
||||
[
|
||||
|
||||
@@ -22,9 +22,8 @@ internal static class WeaponIds
|
||||
11401U, 11402U, 11403U, 11405U,
|
||||
12401U, 12402U, 12403U, 12405U,
|
||||
13401U, 13407U,
|
||||
14401U, 14402U, 14403U, 14409U,
|
||||
15401U, 15402U, 15403U, 15405U,
|
||||
15434U
|
||||
14401U, 14402U, 14403U, 14409U, 14433U, 14434U,
|
||||
15401U, 15402U, 15403U, 15405U, 15434U
|
||||
];
|
||||
|
||||
public static readonly FrozenSet<WeaponId> OrangeStandardWishIds =
|
||||
@@ -34,7 +33,8 @@ internal static class WeaponIds
|
||||
13502U, 13505U,
|
||||
14501U, 14502U,
|
||||
15501U, 15502U,
|
||||
15515U, 11518U
|
||||
15515U, 11518U,
|
||||
14522U, 11519U
|
||||
];
|
||||
|
||||
public static bool IsOrangeStandardWish(in WeaponId weaponId)
|
||||
|
||||
@@ -47,6 +47,9 @@ internal sealed partial class HutaoAsAService : IHutaoAsAService
|
||||
}
|
||||
}
|
||||
|
||||
// Filter announcements by Distribution
|
||||
array = [.. array.Where(a => string.IsNullOrEmpty(a.Distribution) || a.Distribution == "Snap Hutao")]; // 请自行修改发行版名称
|
||||
|
||||
foreach (HutaoAnnouncement item in array)
|
||||
{
|
||||
item.DismissCommand = dismissCommand;
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<UseWinUI>true</UseWinUI>
|
||||
<UseWPF>False</UseWPF>
|
||||
<!-- 配置版本号 -->
|
||||
<Version>1.18.1.0</Version>
|
||||
<Version>1.18.2.0</Version>
|
||||
|
||||
<UseWindowsForms>False</UseWindowsForms>
|
||||
<ImplicitUsings>False</ImplicitUsings>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
// Copyright (c) DGP Studio. All rights reserved.
|
||||
// Copyright (c) Millennium-Science-Technology-R-D-Inst. All rights reserved.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
using Snap.Hutao.Core.ExceptionService;
|
||||
@@ -129,12 +130,39 @@ internal sealed partial class LaunchGameViewModel : Abstraction.ViewModel, IView
|
||||
await HandleGamePathEntryChangeAsync().ConfigureAwait(false);
|
||||
Shared.ResumeLaunchExecutionAsync(this).SafeForget();
|
||||
|
||||
// 初始化第三方工具列表
|
||||
// 初始化第三方工具列表(不阻塞页面加载)
|
||||
_ = InitializeThirdPartyToolsInBackgroundAsync(token);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private async Task InitializeThirdPartyToolsInBackgroundAsync(CancellationToken token)
|
||||
{
|
||||
try
|
||||
{
|
||||
ImmutableArray<ToolInfo> tools = await InitializeThirdPartyToolsAsync().ConfigureAwait(false);
|
||||
SentrySdk.AddBreadcrumb($"Initialized {tools.Length} third party tools", category: "ThirdPartyTool");
|
||||
thirdPartyToolsField.Value = tools;
|
||||
// Yield to let navigation/UI finish first.
|
||||
await Task.Yield();
|
||||
|
||||
if (token.IsCancellationRequested || IsViewUnloaded.Value)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ImmutableArray<ToolInfo> tools = await InitializeThirdPartyToolsAsync(token).ConfigureAwait(false);
|
||||
|
||||
if (token.IsCancellationRequested || IsViewUnloaded.Value)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
await taskContext.SwitchToMainThreadAsync();
|
||||
if (!token.IsCancellationRequested && !IsViewUnloaded.Value)
|
||||
{
|
||||
thirdPartyToolsField.Value = tools;
|
||||
}
|
||||
}
|
||||
catch (OperationCanceledException)
|
||||
{
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -142,7 +170,8 @@ internal sealed partial class LaunchGameViewModel : Abstraction.ViewModel, IView
|
||||
SentrySdk.CaptureException(ex);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
|
||||
}
|
||||
|
||||
[Command("IdentifyMonitorsCommand")]
|
||||
@@ -337,7 +366,7 @@ internal sealed partial class LaunchGameViewModel : Abstraction.ViewModel, IView
|
||||
}
|
||||
}
|
||||
|
||||
private async ValueTask<ImmutableArray<ToolInfo>> InitializeThirdPartyToolsAsync()
|
||||
private async ValueTask<ImmutableArray<ToolInfo>> InitializeThirdPartyToolsAsync(CancellationToken token)
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -345,11 +374,18 @@ internal sealed partial class LaunchGameViewModel : Abstraction.ViewModel, IView
|
||||
IThirdPartyToolService thirdPartyToolService = serviceProvider.GetRequiredService<IThirdPartyToolService>();
|
||||
SentrySdk.AddBreadcrumb("Got IThirdPartyToolService instance", category: "ThirdPartyTool");
|
||||
|
||||
// Note: service API is not cancellable; we only honor cancellation before/after the call.
|
||||
token.ThrowIfCancellationRequested();
|
||||
ImmutableArray<ToolInfo> tools = await thirdPartyToolService.GetToolsAsync().ConfigureAwait(false);
|
||||
SentrySdk.AddBreadcrumb($"Got {tools.Length} tools from service", category: "ThirdPartyTool");
|
||||
token.ThrowIfCancellationRequested();
|
||||
|
||||
SentrySdk.AddBreadcrumb($"Got {tools.Length} tools from service", category: "ThirdPartyTool");
|
||||
return tools;
|
||||
}
|
||||
catch (OperationCanceledException)
|
||||
{
|
||||
return ImmutableArray<ToolInfo>.Empty;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
SentrySdk.AddBreadcrumb($"Failed to initialize third party tools: {ex.Message}", category: "ThirdPartyTool");
|
||||
|
||||
@@ -16,4 +16,6 @@ internal class UploadAnnouncement
|
||||
public string Link { get; set; } = default!;
|
||||
|
||||
public string? MaxPresentVersion { get; set; }
|
||||
|
||||
public string? Distribution { get; set; }
|
||||
}
|
||||
Reference in New Issue
Block a user