mirror of
https://github.com/NuclearPowered/Reactor.git
synced 2026-10-20 21:35:55 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c91706bd67 | ||
|
|
25964208ac | ||
|
|
d50b40ab35 | ||
|
|
e27a79249e | ||
|
|
2c1eeaff9d | ||
|
|
7d3ffa3975 | ||
|
|
2b357512c4 | ||
|
|
32875a2d3d | ||
|
|
de3b20e205 | ||
|
|
bbdbd5bec8 | ||
|
|
f55036efbc | ||
|
|
809b8957a4 | ||
|
|
27e8cb12e5 | ||
|
|
127f48fb1f | ||
|
|
86b5a29b4e | ||
|
|
21c0e61f57 | ||
|
|
84837fd42c | ||
|
|
f80b6a5330 | ||
|
|
014b6e3227 | ||
|
|
787b54b8da | ||
|
|
5db20ca9de | ||
|
|
d82268b88a | ||
|
|
710ca79fa5 | ||
|
|
632a6f8ca1 | ||
|
|
1f2e2402e8 | ||
|
|
6eb0bf19c3 | ||
|
|
f63569d2e0 | ||
|
|
c84d36a3f6 | ||
|
|
89146cea4f | ||
|
|
8553a2aa83 | ||
|
|
30027d89ea | ||
|
|
375a4170e7 | ||
|
|
4deb5f88b9 |
No files matched your search
+11
-11
@@ -4,14 +4,14 @@ on: ["push", "pull_request"]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-24.04
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
|
||||
- uses: actions/cache@v3
|
||||
- uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
~/.nuget/packages
|
||||
@@ -21,36 +21,36 @@ jobs:
|
||||
${{ runner.os }}-nuget-
|
||||
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v2
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
dotnet-version: 6.x
|
||||
dotnet-version: 8.0.x
|
||||
|
||||
- name: Run the Cake script
|
||||
uses: cake-build/cake-action@v1
|
||||
uses: cake-build/cake-action@v3
|
||||
with:
|
||||
verbosity: Diagnostic
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: Reactor.dll
|
||||
path: Reactor/bin/Release/net6.0/Reactor.dll
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: Reactor.nupkg
|
||||
path: Reactor/bin/Release/Reactor.*.nupkg
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: Reactor.Networking.Shared.nupkg
|
||||
path: Reactor.Networking.Shared/bin/Release/*.nupkg
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: Reactor.Debugger.dll
|
||||
path: Reactor.Debugger/bin/Release/net6.0/Reactor.Debugger.dll
|
||||
|
||||
- uses: softprops/action-gh-release@v1
|
||||
- uses: softprops/action-gh-release@v2
|
||||
if: github.ref_type == 'tag'
|
||||
with:
|
||||
draft: true
|
||||
|
||||
@@ -9,14 +9,15 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: actions/cache@v3
|
||||
- uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
~/Unity/Hub/Editor
|
||||
~/.config/unityhub
|
||||
key: unity-2020.3.22f1
|
||||
~/.local/share/unity3d/Unity/Unity_lic.ulf
|
||||
key: unity-${{ hashFiles('./Reactor.Assets/ProjectSettings/ProjectVersion.txt') }}
|
||||
|
||||
- name: Setup Unity
|
||||
uses: js6pak/setup-unity@master
|
||||
@@ -25,17 +26,17 @@ jobs:
|
||||
unity-modules: windows-mono android
|
||||
|
||||
- name: Activate Unity
|
||||
uses: js6pak/activate-unity@master
|
||||
with:
|
||||
unity-username: ${{ secrets.UNITY_USERNAME }}
|
||||
unity-password: ${{ secrets.UNITY_PASSWORD }}
|
||||
unity-authenticator-key: ${{ secrets.UNITY_AUTHENTICATOR_KEY }}
|
||||
env:
|
||||
UNITY_USERNAME: ${{ secrets.UNITY_USERNAME }}
|
||||
UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
|
||||
run: |
|
||||
/opt/unityhub/UnityLicensingClient_V1/Unity.Licensing.Client --activate-ulf --username "$UNITY_USERNAME" --password "$UNITY_PASSWORD"
|
||||
|
||||
- name: Build
|
||||
working-directory: ./Reactor.Assets
|
||||
run: bash ./build.sh
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: bundles
|
||||
path: ./Reactor/Assets/*.bundle
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
<Project>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="BepInEx.Unity.IL2CPP" Version="6.0.0-be.663" Private="false" ExcludeAssets="runtime;native" />
|
||||
<PackageReference Include="AmongUs.GameLibs.Steam" Version="2022.12.8" PrivateAssets="all" />
|
||||
<PackageReference Include="BepInEx.Unity.IL2CPP" Version="6.0.0-be.733" Private="false" ExcludeAssets="runtime;native" />
|
||||
<PackageReference Include="AmongUs.GameLibs.Steam" Version="2025.3.25" PrivateAssets="all" />
|
||||
|
||||
<PackageReference Include="BepInEx.AutoPlugin" Version="1.1.0" PrivateAssets="all" />
|
||||
<PackageReference Include="BepInEx.IL2CPP.MSBuild" Version="2.0.1" PrivateAssets="all" ExcludeAssets="runtime" />
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
|
||||
|
||||
<VersionPrefix>2.1.0</VersionPrefix>
|
||||
<VersionPrefix>2.4.0</VersionPrefix>
|
||||
<VersionSuffix>dev</VersionSuffix>
|
||||
|
||||
<Authors>NuclearPowered</Authors>
|
||||
@@ -16,6 +16,11 @@
|
||||
<RepositoryType>git</RepositoryType>
|
||||
<RepositoryUrl>https://github.com/NuclearPowered/Reactor</RepositoryUrl>
|
||||
<PackageLicenseExpression>LGPL-3.0-or-later</PackageLicenseExpression>
|
||||
|
||||
<!-- SourceLink -->
|
||||
<EmbedUntrackedSources>true</EmbedUntrackedSources>
|
||||
<IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion>
|
||||
<ContinuousIntegrationBuild Condition="'$(GITHUB_ACTIONS)' == 'true'">true</ContinuousIntegrationBuild>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
@@ -30,7 +35,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="StyleCop.Analyzers" Version="1.2.0-beta.435" PrivateAssets="all" />
|
||||
<PackageReference Include="StyleCop.Analyzers" Version="1.2.0-beta.556" PrivateAssets="all" />
|
||||
<AdditionalFiles Include="$(MSBuildThisFileDirectory)\stylecop.json" Link="stylecop.json" Visible="false" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup>
|
||||
|
||||
@@ -69,14 +69,14 @@ internal static class Build
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetTargetName(BuildTarget target)
|
||||
private static string GetTargetName(BuildTarget target, bool includeArchitecture = false)
|
||||
{
|
||||
return target switch
|
||||
{
|
||||
BuildTarget.StandaloneWindows => "win-x86",
|
||||
BuildTarget.StandaloneWindows64 => "win-x64",
|
||||
BuildTarget.StandaloneWindows => includeArchitecture ? "win-x86" : "win",
|
||||
BuildTarget.StandaloneWindows64 => includeArchitecture ? "win-x64" : "win",
|
||||
BuildTarget.Android => "android",
|
||||
BuildTarget.StandaloneLinux64 => "linux-x64",
|
||||
BuildTarget.StandaloneLinux64 => includeArchitecture ? "linux-x64" : "linux",
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(target), target, null),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"com.unity.2d.sprite": "1.0.0",
|
||||
"com.unity.ide.rider": "2.0.7",
|
||||
"com.unity.ide.visualstudio": "2.0.16",
|
||||
"com.unity.ide.rider": "3.0.31",
|
||||
"com.unity.ide.visualstudio": "2.0.22",
|
||||
"com.unity.ide.vscode": "1.2.5",
|
||||
"com.unity.toolchain.linux-x86_64": "2.0.2",
|
||||
"com.unity.toolchain.linux-x86_64": "2.0.9",
|
||||
"com.unity.modules.ai": "1.0.0",
|
||||
"com.unity.modules.androidjni": "1.0.0",
|
||||
"com.unity.modules.animation": "1.0.0",
|
||||
|
||||
@@ -8,22 +8,22 @@
|
||||
},
|
||||
"com.unity.ext.nunit": {
|
||||
"version": "1.0.6",
|
||||
"depth": 2,
|
||||
"depth": 1,
|
||||
"source": "registry",
|
||||
"dependencies": {},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.ide.rider": {
|
||||
"version": "2.0.7",
|
||||
"version": "3.0.31",
|
||||
"depth": 0,
|
||||
"source": "registry",
|
||||
"dependencies": {
|
||||
"com.unity.test-framework": "1.1.1"
|
||||
"com.unity.ext.nunit": "1.0.6"
|
||||
},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.ide.visualstudio": {
|
||||
"version": "2.0.16",
|
||||
"version": "2.0.22",
|
||||
"depth": 0,
|
||||
"source": "registry",
|
||||
"dependencies": {
|
||||
@@ -39,23 +39,23 @@
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.sysroot": {
|
||||
"version": "2.0.3",
|
||||
"version": "2.0.10",
|
||||
"depth": 1,
|
||||
"source": "registry",
|
||||
"dependencies": {},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.sysroot.linux-x86_64": {
|
||||
"version": "2.0.2",
|
||||
"version": "2.0.9",
|
||||
"depth": 1,
|
||||
"source": "registry",
|
||||
"dependencies": {
|
||||
"com.unity.sysroot": "2.0.3"
|
||||
"com.unity.sysroot": "2.0.10"
|
||||
},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.test-framework": {
|
||||
"version": "1.1.29",
|
||||
"version": "1.1.33",
|
||||
"depth": 1,
|
||||
"source": "registry",
|
||||
"dependencies": {
|
||||
@@ -66,12 +66,12 @@
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.toolchain.linux-x86_64": {
|
||||
"version": "2.0.2",
|
||||
"version": "2.0.9",
|
||||
"depth": 0,
|
||||
"source": "registry",
|
||||
"dependencies": {
|
||||
"com.unity.sysroot": "2.0.3",
|
||||
"com.unity.sysroot.linux-x86_64": "2.0.2"
|
||||
"com.unity.sysroot": "2.0.10",
|
||||
"com.unity.sysroot.linux-x86_64": "2.0.9"
|
||||
},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
m_EditorVersion: 2020.3.22f1
|
||||
m_EditorVersionWithRevision: 2020.3.22f1 (e1a7f79fd887)
|
||||
m_EditorVersion: 2020.3.45f1
|
||||
m_EditorVersionWithRevision: 2020.3.45f1 (660cd1701bd5)
|
||||
@@ -1,12 +1,12 @@
|
||||
#!/bin/bash
|
||||
|
||||
UNITY_VERSION=2020.3.22f1
|
||||
UNITY_VERSION=2020.3.45f1
|
||||
|
||||
if [[ ! -v UNITY_PATH ]]; then
|
||||
if command -v unityhub &>/dev/null; then
|
||||
echo "Trying to get unity path from unityhub..."
|
||||
|
||||
UNITYHUB_INSTALL_PATH=$(unityhub --headless install-path)
|
||||
UNITYHUB_INSTALL_PATH=$(unityhub -- --headless install-path)
|
||||
UNITY_PATH="$UNITYHUB_INSTALL_PATH/$UNITY_VERSION/Editor/Unity"
|
||||
|
||||
if [[ ! -f $UNITY_PATH ]]; then
|
||||
@@ -22,4 +22,4 @@ fi
|
||||
echo "UNITY_PATH = $UNITY_PATH"
|
||||
|
||||
rm Library -rf # TODO figure out why having Library cached makes invalid bundles in batchmode
|
||||
$UNITY_PATH -batchmode -nographics -quit -logFile "-" -projectPath $pwd -executeMethod Build.BuildAssetBundles
|
||||
"$UNITY_PATH" -batchmode -nographics -quit -logFile "-" -projectPath "$PWD" -executeMethod Build.BuildAssetBundles
|
||||
@@ -16,7 +16,7 @@ namespace Reactor.Benchmarks;
|
||||
[StopOnFirstError, Config(typeof(Config))]
|
||||
public class AssetBundleBenchmarks
|
||||
{
|
||||
private class Config : ManualConfig
|
||||
private sealed class Config : ManualConfig
|
||||
{
|
||||
public Config()
|
||||
{
|
||||
@@ -29,7 +29,7 @@ public class AssetBundleBenchmarks
|
||||
|
||||
public static IEnumerable<string> ValuesForAssetBundleName()
|
||||
{
|
||||
yield return $"default-{AssetBundleManager.TargetName}{AssetBundleManager.BundleExtension}";
|
||||
yield return $"{AssetBundleManager.GetFileName("default", false)}";
|
||||
// yield return "submerged";
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ public class AssetBundleBenchmarks
|
||||
|
||||
private AssetBundle LoadAll(AssetBundle assetBundle)
|
||||
{
|
||||
if (assetBundle == null) throw new ArgumentNullException(nameof(assetBundle));
|
||||
ArgumentNullException.ThrowIfNull(assetBundle);
|
||||
|
||||
assetBundle.LoadAllAssets();
|
||||
return assetBundle;
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Reactor\Reactor.csproj" Private="false" />
|
||||
<PackageReference Include="BenchmarkDotNet" Version="0.13.2" />
|
||||
<PackageReference Include="BenchmarkDotNet" Version="0.13.10" />
|
||||
</ItemGroup>
|
||||
|
||||
<Import Project="../AmongUs.props" />
|
||||
|
||||
@@ -4,28 +4,26 @@
|
||||
"net6.0": {
|
||||
"AmongUs.GameLibs.Steam": {
|
||||
"type": "Direct",
|
||||
"requested": "[2022.12.8, )",
|
||||
"resolved": "2022.12.8",
|
||||
"contentHash": "IJsIi89xUYRvA54YtNVEJjf25hhF3LWzkNBslKCNDUpL1aQ/PhNyO4j18pO71DCgW/qr1P1j8+CwByuBLsInNA=="
|
||||
"requested": "[2025.3.25, )",
|
||||
"resolved": "2025.3.25",
|
||||
"contentHash": "2QxQXgZDcQOdAIDXrNLrQ7veEzD6EBzuaRjzSbHptWUPUsuVc3I5Ur3xMkPPwmSGsDHjLuAGE84yRjV6oJxGxw=="
|
||||
},
|
||||
"BenchmarkDotNet": {
|
||||
"type": "Direct",
|
||||
"requested": "[0.13.2, )",
|
||||
"resolved": "0.13.2",
|
||||
"contentHash": "82IflYxY8qnQXEA3kXtqC9pntrkJYJZbQ9PV7hEV/XcfCtOdwLz84ilyO8tLRVbiliWttvmt/v44P+visN+fPQ==",
|
||||
"requested": "[0.13.10, )",
|
||||
"resolved": "0.13.10",
|
||||
"contentHash": "p/LrTtR5TlwhZIvy2hG9VzTFWEDPS90r3QP9Q9pL4/B1iXzC/JNrpYyCWW3Xeg4vuiq/qV8hvJkJmT1sj+5LSw==",
|
||||
"dependencies": {
|
||||
"BenchmarkDotNet.Annotations": "0.13.2",
|
||||
"CommandLineParser": "2.4.3",
|
||||
"BenchmarkDotNet.Annotations": "0.13.10",
|
||||
"CommandLineParser": "2.9.1",
|
||||
"Gee.External.Capstone": "2.3.0",
|
||||
"Iced": "1.17.0",
|
||||
"Microsoft.CodeAnalysis.CSharp": "3.0.0",
|
||||
"Microsoft.CodeAnalysis.CSharp": "4.1.0",
|
||||
"Microsoft.Diagnostics.Runtime": "2.2.332302",
|
||||
"Microsoft.Diagnostics.Tracing.TraceEvent": "3.0.2",
|
||||
"Microsoft.DotNet.PlatformAbstractions": "3.1.6",
|
||||
"Perfolizer": "0.2.1",
|
||||
"System.Management": "6.0.0",
|
||||
"System.Reflection.Emit": "4.7.0",
|
||||
"System.Reflection.Emit.Lightweight": "4.7.0",
|
||||
"System.Threading.Tasks.Extensions": "4.5.4"
|
||||
"Perfolizer": "[0.2.1]",
|
||||
"System.Management": "5.0.0"
|
||||
}
|
||||
},
|
||||
"BepInEx.AutoPlugin": {
|
||||
@@ -42,68 +40,120 @@
|
||||
},
|
||||
"BepInEx.Unity.IL2CPP": {
|
||||
"type": "Direct",
|
||||
"requested": "[6.0.0-be.663, )",
|
||||
"resolved": "6.0.0-be.663",
|
||||
"contentHash": "J+mZ4svyTt4ZYbUoPwpVtF5QCGfzC42VuYJ7z1K6Qt8YlBEZx3rnmUmaEnoJIqN5wN7BSnQgzEmrRfdbrgtTnA==",
|
||||
"requested": "[6.0.0-be.733, )",
|
||||
"resolved": "6.0.0-be.733",
|
||||
"contentHash": "lnoGaPHjIdGfEiKtf89knaTdLXe4IUqVLdoYqW8NYhhNqgxa3oNwScjTmuYQpa4Leew3937+slq2WIjvX/DUwQ==",
|
||||
"dependencies": {
|
||||
"BepInEx.Core": "6.0.0-be.663",
|
||||
"BepInEx.Unity.Common": "6.0.0-be.663",
|
||||
"HarmonyX": "2.10.1",
|
||||
"Iced": "1.17.0",
|
||||
"Il2CppInterop.Generator": "1.4.0",
|
||||
"Il2CppInterop.HarmonySupport": "1.4.0",
|
||||
"Il2CppInterop.Runtime": "1.4.0",
|
||||
"MonoMod.RuntimeDetour": "22.5.1.1",
|
||||
"Samboy063.Cpp2IL.Core": "2022.0.7.2"
|
||||
"BepInEx.Core": "6.0.0-be.733",
|
||||
"BepInEx.Unity.Common": "6.0.0-be.733",
|
||||
"HarmonyX": "2.10.2",
|
||||
"Iced": "1.21.0",
|
||||
"Il2CppInterop.Generator": "1.4.6-ci.426",
|
||||
"Il2CppInterop.HarmonySupport": "1.4.6-ci.426",
|
||||
"Il2CppInterop.Runtime": "1.4.6-ci.426",
|
||||
"MonoMod.RuntimeDetour": "22.7.31.1",
|
||||
"Samboy063.Cpp2IL.Core": "2022.1.0-pre-release.18"
|
||||
}
|
||||
},
|
||||
"StyleCop.Analyzers": {
|
||||
"type": "Direct",
|
||||
"requested": "[1.2.0-beta.435, )",
|
||||
"resolved": "1.2.0-beta.435",
|
||||
"contentHash": "TADk7vdGXtfTnYCV7GyleaaRTQjfoSfZXprQrVMm7cSJtJbFc1QIbWPyLvrgrfGdfHbGmUPvaN4ODKNxg2jgPQ==",
|
||||
"requested": "[1.2.0-beta.556, )",
|
||||
"resolved": "1.2.0-beta.556",
|
||||
"contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==",
|
||||
"dependencies": {
|
||||
"StyleCop.Analyzers.Unstable": "1.2.0.435"
|
||||
"StyleCop.Analyzers.Unstable": "1.2.0.556"
|
||||
}
|
||||
},
|
||||
"AssetRipper.VersionUtilities": {
|
||||
"AsmResolver": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.2.1",
|
||||
"contentHash": "knQ/W1YwTZS2AbdaZh+nhyyBEZQPQDcahhSOnh88i+cdg4/FEoFJiCwaavgFvCMNuUeHTbcZc4qttF8WQ8xLIA=="
|
||||
"resolved": "6.0.0-beta.1",
|
||||
"contentHash": "M5btCR/rmrx32jZsoN6CLQ/VQk8lN8hvPb6lgojua7pjNoo7StAl92koMC8qz4vzZyH2CNqxLSDoswRvyyK/vA=="
|
||||
},
|
||||
"AsmResolver.DotNet": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0-beta.1",
|
||||
"contentHash": "PTq8nNQvhgTxF1iARCknffCsu7Iq9B0kN7TVC8iMaU7uEYog3xvVqH/0+TreY8GW74/+MqhZt/yEFsvS4oAduQ==",
|
||||
"dependencies": {
|
||||
"AsmResolver.PE": "6.0.0-beta.1"
|
||||
}
|
||||
},
|
||||
"AsmResolver.PE": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0-beta.1",
|
||||
"contentHash": "KadLvx/zzFCJyF+E4jG6jPE1d0iJquzL6+hm8GBivBAs6nwHC8s6g4c857QwQCzXMWza6Vz5Q+3hFiNuOfKaWQ==",
|
||||
"dependencies": {
|
||||
"AsmResolver.PE.File": "6.0.0-beta.1"
|
||||
}
|
||||
},
|
||||
"AsmResolver.PE.File": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0-beta.1",
|
||||
"contentHash": "+lusB9UMHevI5aQsu73NQ1ctPMLFvyHAsEf8vjaJ/py+kX1DkU0JkbERtBRmaf58/hBZ7cyrE7gFnjoo7Bbg7A==",
|
||||
"dependencies": {
|
||||
"AsmResolver": "6.0.0-beta.1"
|
||||
}
|
||||
},
|
||||
"AssetRipper.CIL": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.1.0",
|
||||
"contentHash": "nSz1cBjgVeKv+esfDtyQGC1mY9b4C4NFStytdoa9DMozDC8uth6930kAsuWZEivj9GqWSqENnaQUGnl23WpmnQ==",
|
||||
"dependencies": {
|
||||
"AsmResolver.DotNet": "6.0.0-beta.1"
|
||||
}
|
||||
},
|
||||
"AssetRipper.Gee.External.Capstone": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.3.2",
|
||||
"contentHash": "wOr5PQPL/2ZfD7+ebt6cpRbUhSzSY5nlHGHjjzuQRiU5zkQlqQNwWDLX0M3smrm5IkaDvONkmDjFMKTlZJmyuQ=="
|
||||
},
|
||||
"AssetRipper.Primitives": {
|
||||
"type": "Transitive",
|
||||
"resolved": "3.1.3",
|
||||
"contentHash": "djZbN/+EXmI+Oia9Pm0LyjZVCPLf60TPSL5rGb7mBEYM5F4CN3nPFXvl2yA5LanPZoHS1Yq7PghGUmkP7Pv9RQ=="
|
||||
},
|
||||
"BenchmarkDotNet.Annotations": {
|
||||
"type": "Transitive",
|
||||
"resolved": "0.13.2",
|
||||
"contentHash": "+SGOYyXT6fiagbtrni38B8BqBgjruYKU3PfROI0lDIYo8jQ+APUmLKMEswK7zwR5fEOCrDmoAHSH6oykBkqPgA=="
|
||||
"resolved": "0.13.10",
|
||||
"contentHash": "abYKp+P5NBuam7q0w7AFgOYF3nqAvKBw6MLq96Kjk1WdaRDNpgBc6uCgOP4pVIH/g0IF9d4ubnFLBwiJuIAHMw=="
|
||||
},
|
||||
"BepInEx.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0-be.663",
|
||||
"contentHash": "yTlqwieyV3FCzSo4tfiIlS7pTqVtEZwrwHnograkWO4loECeYpShcpoCoxnhQ0vkWsnWGThMK7NodHhjZ+jQDA==",
|
||||
"resolved": "6.0.0-be.733",
|
||||
"contentHash": "uRzpyUdU3L8Y4ZW+ZnF73orq0E40MjGK6XcPzm24CrrWB5bUshwdrtFQfrwZB6jcZVNVV6PXE92hScEI+Jaoqw==",
|
||||
"dependencies": {
|
||||
"HarmonyX": "2.10.1",
|
||||
"MonoMod.Utils": "22.5.1.1",
|
||||
"HarmonyX": "2.10.2",
|
||||
"MonoMod.Utils": "22.7.31.1",
|
||||
"SemanticVersioning": "2.0.2"
|
||||
}
|
||||
},
|
||||
"BepInEx.Unity.Common": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0-be.663",
|
||||
"contentHash": "kxv0yXJQ7YPzUQzlwkpVzmTkdd87kVcQhMjkrwqpowJ0Yx5vEwPUrRyG/pwMH5/cK+2WHCn/2akGWrW0C4vUAQ==",
|
||||
"resolved": "6.0.0-be.733",
|
||||
"contentHash": "KfdiHVSOPnIbDEF7zLPTSXDjKqIEq7SgffqFFKIxOBkCws7LdtSRQsamUcxdD0H8yopcgdlqobIp6t8e4M/k9Q==",
|
||||
"dependencies": {
|
||||
"AssetRipper.VersionUtilities": "1.2.1",
|
||||
"MonoMod.Utils": "22.5.1.1"
|
||||
"AssetRipper.Primitives": "3.1.3",
|
||||
"MonoMod.Utils": "22.7.31.1"
|
||||
}
|
||||
},
|
||||
"CommandLineParser": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.4.3",
|
||||
"contentHash": "U2FC9Y8NyIxxU6MpFFdWWu1xwiqz/61v/Doou7kmVjpeIEMLWyiNNkzNlSE84kyJ0O1LKApuEj5z48Ow0Hi4OQ=="
|
||||
"resolved": "2.9.1",
|
||||
"contentHash": "OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA=="
|
||||
},
|
||||
"Disarm": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.1.0-master.34",
|
||||
"contentHash": "sxzTci5eSdl+sFoaGsMZIp7X/eB5ZzplM3CppvD1CWoiZ8rSa43XGLC19G5e8n6mjutNBfN9yL+RER5PCspHFg=="
|
||||
},
|
||||
"Gee.External.Capstone": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.3.0",
|
||||
"contentHash": "2ap/rYmjtzCOT8hxrnEW/QeiOt+paD8iRrIcdKX0cxVwWLFa1e+JDBNeECakmccXrSFeBQuu5AV8SNkipFMMMw=="
|
||||
},
|
||||
"HarmonyX": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.10.1",
|
||||
"contentHash": "9LodMC9Y0u1TW96eKJoWrFJFpmzbgojEO38/Q+e7c1mFPhmHt8xcR8qhI06iF1rf0Dnsk+hqENFVSgbtwl/bEw==",
|
||||
"resolved": "2.10.2",
|
||||
"contentHash": "/5WwkxXX8mPsRuigQt957rJGx1f0dDQxk+bvk4yYITKFjXas9Em+O71zEP8X0ym8OFQQ2XH/2SxS4NC7vEC+Xg==",
|
||||
"dependencies": {
|
||||
"MonoMod.RuntimeDetour": "22.3.23.4",
|
||||
"System.Reflection.Emit": "4.7.0"
|
||||
@@ -111,13 +161,13 @@
|
||||
},
|
||||
"Iced": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.17.0",
|
||||
"contentHash": "8x+HCVTl/HHTGpscH3vMBhV8sknN/muZFw9s3TsI8SA6+c43cOTCi2+jE4KsU8pNLbJ++iF2ZFcpcXHXtDglnw=="
|
||||
"resolved": "1.21.0",
|
||||
"contentHash": "dv5+81Q1TBQvVMSOOOmRcjJmvWcX3BZPZsIq31+RLc5cNft0IHAyNlkdb7ZarOWG913PyBoFDsDXoCIlKmLclg=="
|
||||
},
|
||||
"Il2CppInterop.Common": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.4.0",
|
||||
"contentHash": "xl60qoa1nImG6qgOQcjSDW46nLQHoRvSWE7QTDQz7XeMsGwOxAbgDtOvJ4gOvoLijTU79gFZYe8H1CM7TcTQ5g==",
|
||||
"resolved": "1.4.6-ci.426",
|
||||
"contentHash": "pI0kU0qqJKMP6z9eFz4+WJtGIwklfPxW2yWEY9vKnrN9bbYMusK3v5uFWV8al7S/HPSATV5jNWH1hyTvP7kglA==",
|
||||
"dependencies": {
|
||||
"Iced": "1.17.0",
|
||||
"Microsoft.Extensions.Logging.Abstractions": "6.0.1",
|
||||
@@ -126,41 +176,31 @@
|
||||
},
|
||||
"Il2CppInterop.Generator": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.4.0",
|
||||
"contentHash": "Q4QqkwQroDwwqB17/DRF6hbHQRIuyLksgxVUEDvXZ3T+ogkrZB9h0Ev36alN0f6e7fcZPRkMrpXOAYwZzPiZag==",
|
||||
"resolved": "1.4.6-ci.426",
|
||||
"contentHash": "kecdx/vbNl0RtfzfYW592jU8PMyq1JbzpvoJSvqwO+tV6icp9SljXy6yG8bT/wt0gaPj9mFUNDTe2Wu6M6XGZQ==",
|
||||
"dependencies": {
|
||||
"Il2CppInterop.Common": "1.4.0",
|
||||
"Il2CppInterop.Common": "1.4.6-ci.426",
|
||||
"Mono.Cecil": "0.11.3"
|
||||
}
|
||||
},
|
||||
"Il2CppInterop.HarmonySupport": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.4.0",
|
||||
"contentHash": "Uz4w5PbQ3kLXqUrsQxR35f7xMpfnxLiXthVtNaT3fvHXC8B7arjuBZXeCbcozr6dXFJBDa5W0EElBmH0fWoASg==",
|
||||
"resolved": "1.4.6-ci.426",
|
||||
"contentHash": "rd2T5o6SybIc12hmX3HktTF5n27hFb0w4mNSExq7h1YsmrNlt7x+Ac1MBnnB0JwPLIg7w8LjnKjoIX6Gf626ng==",
|
||||
"dependencies": {
|
||||
"HarmonyX": "2.10.0",
|
||||
"Il2CppInterop.Runtime": "1.4.0"
|
||||
"Il2CppInterop.Runtime": "1.4.6-ci.426"
|
||||
}
|
||||
},
|
||||
"Il2CppInterop.Runtime": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.4.0",
|
||||
"contentHash": "ScgsFlbJ3gj5f69As/GT8pSO2WlS7cOeS/n3h4gBqJ01Eq/Lm+s3FBrGpEiuIWALOgmtQYimhjWVpxRt7LYtGw==",
|
||||
"resolved": "1.4.6-ci.426",
|
||||
"contentHash": "0O0oI7gOqJixrsjvh1firhuGYK3Yr0uDLp6Q+t5CfcTMmeEX8Plk3pqAP9ZYyilBvh7uW0gv4Golqz08L1GXug==",
|
||||
"dependencies": {
|
||||
"Iced": "1.17.0",
|
||||
"Il2CppInterop.Common": "1.4.0"
|
||||
"Il2CppInterop.Common": "1.4.6-ci.426"
|
||||
}
|
||||
},
|
||||
"IndexRange": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.0.0",
|
||||
"contentHash": "6TgS1JLSUkpmPLfXBPaAgB39ZUix8E4soXWk2XSDcscVe84i1JKzIAtA7jHbRHSkOOrcr6YA0MpLCeq98y9mYQ=="
|
||||
},
|
||||
"js6pak.Gee.External.Capstone": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.1.0",
|
||||
"contentHash": "YYpq7NM50bSSVUDjXyV/eiITk6syXqItPjKBOb3jEWS6RFsk0DNhpWMPW6b3hKDmArARuWDU6S2pVu1IeVrvIA=="
|
||||
},
|
||||
"Microsoft.Bcl.AsyncInterfaces": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.1.0",
|
||||
@@ -168,29 +208,29 @@
|
||||
},
|
||||
"Microsoft.CodeAnalysis.Analyzers": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.6.2-beta2",
|
||||
"contentHash": "rg5Ql73AmGCMG5Q40Kzbndq7C7S4XvsJA+2QXfZBCy2dRqD+a7BSbx/3942EoRUJ/8Wh9+kLg2G2qC46o3f1Aw=="
|
||||
"resolved": "3.3.3",
|
||||
"contentHash": "j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ=="
|
||||
},
|
||||
"Microsoft.CodeAnalysis.Common": {
|
||||
"type": "Transitive",
|
||||
"resolved": "3.0.0",
|
||||
"contentHash": "HEnLZ9Op5IoXeuokhfSLIXstXfEyPzXhQ/xsnvUmxzb+7YpwuLk57txArzGs/Wne5bWmU7Uey4Q1jUZ3++heqg==",
|
||||
"resolved": "4.1.0",
|
||||
"contentHash": "bNzTyxP3iD5FPFHfVDl15Y6/wSoI7e3MeV0lOaj9igbIKTjgrmuw6LoVJ06jUNFA7+KaDC/OIsStWl/FQJz6sQ==",
|
||||
"dependencies": {
|
||||
"Microsoft.CodeAnalysis.Analyzers": "2.6.2-beta2",
|
||||
"System.Collections.Immutable": "1.5.0",
|
||||
"System.Memory": "4.5.1",
|
||||
"System.Reflection.Metadata": "1.6.0",
|
||||
"System.Runtime.CompilerServices.Unsafe": "4.5.0",
|
||||
"System.Text.Encoding.CodePages": "4.5.0",
|
||||
"System.Threading.Tasks.Extensions": "4.5.0"
|
||||
"Microsoft.CodeAnalysis.Analyzers": "3.3.3",
|
||||
"System.Collections.Immutable": "5.0.0",
|
||||
"System.Memory": "4.5.4",
|
||||
"System.Reflection.Metadata": "5.0.0",
|
||||
"System.Runtime.CompilerServices.Unsafe": "5.0.0",
|
||||
"System.Text.Encoding.CodePages": "4.5.1",
|
||||
"System.Threading.Tasks.Extensions": "4.5.4"
|
||||
}
|
||||
},
|
||||
"Microsoft.CodeAnalysis.CSharp": {
|
||||
"type": "Transitive",
|
||||
"resolved": "3.0.0",
|
||||
"contentHash": "hWFUxc0iUbVvIKWJODErOeOa5GiqZuEcetxaCfHqZ04zHy0ZCLx3v4/TdF/6Erx1mXPHfoT2Tiz5rZCQZ6OyxQ==",
|
||||
"resolved": "4.1.0",
|
||||
"contentHash": "sbu6kDGzo9bfQxuqWpeEE7I9P30bSuZEnpDz9/qz20OU6pm79Z63+/BsAzO2e/R/Q97kBrpj647wokZnEVr97w==",
|
||||
"dependencies": {
|
||||
"Microsoft.CodeAnalysis.Common": "[3.0.0]"
|
||||
"Microsoft.CodeAnalysis.Common": "[4.1.0]"
|
||||
}
|
||||
},
|
||||
"Microsoft.Diagnostics.NETCore.Client": {
|
||||
@@ -290,14 +330,23 @@
|
||||
},
|
||||
"Microsoft.NETCore.Platforms": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.0.0",
|
||||
"contentHash": "VdLJOCXhZaEMY7Hm2GKiULmn7IEPFE4XC5LPSfBVCUIA8YLZVh846gtfBJalsPQF2PlzdD7ecX7DZEulJ402ZQ=="
|
||||
"resolved": "5.0.0",
|
||||
"contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ=="
|
||||
},
|
||||
"Microsoft.NETCore.Targets": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.1.0",
|
||||
"contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg=="
|
||||
},
|
||||
"Microsoft.Win32.Registry": {
|
||||
"type": "Transitive",
|
||||
"resolved": "5.0.0",
|
||||
"contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
|
||||
"dependencies": {
|
||||
"System.Security.AccessControl": "5.0.0",
|
||||
"System.Security.Principal.Windows": "5.0.0"
|
||||
}
|
||||
},
|
||||
"Mono.Cecil": {
|
||||
"type": "Transitive",
|
||||
"resolved": "0.11.4",
|
||||
@@ -305,11 +354,11 @@
|
||||
},
|
||||
"MonoMod.RuntimeDetour": {
|
||||
"type": "Transitive",
|
||||
"resolved": "22.5.1.1",
|
||||
"contentHash": "WG5zLRuAr8KJEnIkKTuIG1OJCrGIT3pjvnAD43E0FDchHf3Dp985MF/8tmIQvAzCZV87JNs6QKeGGqmwDmpXpw==",
|
||||
"resolved": "22.7.31.1",
|
||||
"contentHash": "nxVJTvQbWAujaogt5XX3eAy7d22t66Z88aWg9sirPLO9rR/6yNCHAyZpgxXrOsIobZVW0IEZPqNMOBhgke25/w==",
|
||||
"dependencies": {
|
||||
"Mono.Cecil": "0.11.4",
|
||||
"MonoMod.Utils": "22.5.1.1",
|
||||
"MonoMod.Utils": "22.7.31.1",
|
||||
"System.Collections.NonGeneric": "4.3.0",
|
||||
"System.ComponentModel.TypeConverter": "4.3.0",
|
||||
"System.IO.FileSystem.Primitives": "4.3.0",
|
||||
@@ -320,8 +369,8 @@
|
||||
},
|
||||
"MonoMod.Utils": {
|
||||
"type": "Transitive",
|
||||
"resolved": "22.5.1.1",
|
||||
"contentHash": "vBObO1atXxhi2C4AuC53y87Bqeogi9xIrD1Ym3YWr5uxc8Nrm8SrsFeD1i3x04R999+XQ3FdeHrbXScyWYEHqQ==",
|
||||
"resolved": "22.7.31.1",
|
||||
"contentHash": "nI0E1oadXS1iMbfwfCzYF08C1jRQR9cnnHv66a4BSPd4sGu2p6g4BmctCWsdAB6oGKkSJUhcfHfxcfTsDyB94Q==",
|
||||
"dependencies": {
|
||||
"Mono.Cecil": "0.11.4",
|
||||
"System.Collections.NonGeneric": "4.3.0",
|
||||
@@ -440,47 +489,51 @@
|
||||
},
|
||||
"Samboy063.Cpp2IL.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.0.7.2",
|
||||
"contentHash": "e17CAhKSxdAp7vFcYEVxjSc7t7rcvVGBipGhgE9tAjRXY85wZXLlHEVO0AEvMRkLmf9U+if4wK/nZEC1AX6VqQ==",
|
||||
"resolved": "2022.1.0-pre-release.18",
|
||||
"contentHash": "eX9d1IK05jWaEaeuMAE0L5WYHT7thtxz+aWLL/CAaCzZ0TzRPD+WFTjJ0KQO0YWBVO300CX3GwmPmf7TNO+wUg==",
|
||||
"dependencies": {
|
||||
"HarmonyX": "2.5.5",
|
||||
"Iced": "1.11.1",
|
||||
"IndexRange": "1.0.0",
|
||||
"Mono.Cecil": "0.11.4",
|
||||
"Samboy063.LibCpp2IL": "2022.0.7.2",
|
||||
"System.Runtime.InteropServices": "4.3.0",
|
||||
"System.ValueTuple": "4.5.0",
|
||||
"js6pak.Gee.External.Capstone": "2.1.0"
|
||||
"AsmResolver.DotNet": "6.0.0-beta.1",
|
||||
"AssetRipper.CIL": "1.1.0",
|
||||
"AssetRipper.Gee.External.Capstone": "2.3.2",
|
||||
"Disarm": "2022.1.0-master.34",
|
||||
"Iced": "1.21.0",
|
||||
"Samboy063.LibCpp2IL": "2022.1.0-pre-release.18",
|
||||
"StableNameDotNet": "0.1.0-pre-release.15"
|
||||
}
|
||||
},
|
||||
"Samboy063.LibCpp2IL": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.0.7.2",
|
||||
"contentHash": "DpVeU0dQkUJCpbw0f1xKOG8vimdK2oYhrVABC7HDE3/ikGjhnMZd3i5b1joKDHZ+AiL90TWOaEXPcy24rCZ0dA==",
|
||||
"resolved": "2022.1.0-pre-release.18",
|
||||
"contentHash": "9zJdTAeErpwJpYDHYwwI0MAC1OyBEfC1ce7dpAOYRUUYCfeaKVWxnSCcyaoY6HDzIoxPkhbfllbwOe49ZmUYuQ==",
|
||||
"dependencies": {
|
||||
"IndexRange": "1.0.0",
|
||||
"Samboy063.WasmDisassembler": "2022.0.2"
|
||||
"AssetRipper.Primitives": "3.1.2",
|
||||
"Samboy063.WasmDisassembler": "2022.1.0-pre-release.15"
|
||||
}
|
||||
},
|
||||
"Samboy063.WasmDisassembler": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.0.2",
|
||||
"contentHash": "2uu+xBb7M3HKfBx9tAY6jiDieAf0hRnQjSmGX+7IdE6i24dYsx6TYgtrLvRx5lOuF2M8DijZ5H8yQ1pcuCs2SA=="
|
||||
"resolved": "2022.1.0-pre-release.15",
|
||||
"contentHash": "e6qw81SHS+fS7iZ3qfqZBavVarYbkPElNgDCANF6dNFTYq5+hc80am+4FqQDl+ZVNS47bZDZobxIzHhmriCXGg=="
|
||||
},
|
||||
"SemanticVersioning": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.0.2",
|
||||
"contentHash": "4EQgYdNZ92SyaO7YFk6olVnebF5V+jrHyMUjvPq89tLeMo8NSfgDF+6Zwq/lgh9j/0yfQp9Lkm0ZA0rUATCZFA=="
|
||||
},
|
||||
"StableNameDotNet": {
|
||||
"type": "Transitive",
|
||||
"resolved": "0.1.0-pre-release.15",
|
||||
"contentHash": "aIkEOo8V76vE+9CppHpTFLGXalBw6TAl4/tb6vadmS+gHJMshTVehzQv9cJXy4xZDdANV1uGMRaUFZERcDA2xQ=="
|
||||
},
|
||||
"StyleCop.Analyzers.Unstable": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.2.0.435",
|
||||
"contentHash": "ouwPWZxbOV3SmCZxIRqHvljkSzkCyi1tDoMzQtDb/bRP8ctASV/iRJr+A2Gdj0QLaLmWnqTWDrH82/iP+X80Lg=="
|
||||
"resolved": "1.2.0.556",
|
||||
"contentHash": "zvn9Mqs/ox/83cpYPignI8hJEM2A93s2HkHs8HYMOAQW0PkampyoErAiIyKxgTLqbbad29HX/shv/6LGSjPJNQ=="
|
||||
},
|
||||
"System.CodeDom": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0",
|
||||
"contentHash": "CPc6tWO1LAer3IzfZufDBRL+UZQcj5uS207NHALQzP84Vp/z6wF0Aa0YZImOQY8iStY0A2zI/e3ihKNPfUm8XA=="
|
||||
"resolved": "5.0.0",
|
||||
"contentHash": "JPJArwA1kdj8qDAkY2XGjSWoYnqiM7q/3yRNkt6n28Mnn95MuEGkZXUbPBf7qc3IjwrGY5ttQon7yqHZyQJmOQ=="
|
||||
},
|
||||
"System.Collections": {
|
||||
"type": "Transitive",
|
||||
@@ -696,16 +749,18 @@
|
||||
},
|
||||
"System.Management": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0",
|
||||
"contentHash": "sHsESYMmPDhQuOC66h6AEOs/XowzKsbT9srMbX71TCXP58hkpn1BqBjdmKj1+DCA/WlBETX1K5WjQHwmV0Txrg==",
|
||||
"resolved": "5.0.0",
|
||||
"contentHash": "MF1CHaRcC+MLFdnDthv4/bKWBZnlnSpkGqa87pKukQefgEdwtb9zFW6zs0GjPp73qtpYYg4q6PEKbzJbxCpKfw==",
|
||||
"dependencies": {
|
||||
"System.CodeDom": "6.0.0"
|
||||
"Microsoft.NETCore.Platforms": "5.0.0",
|
||||
"Microsoft.Win32.Registry": "5.0.0",
|
||||
"System.CodeDom": "5.0.0"
|
||||
}
|
||||
},
|
||||
"System.Memory": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.5.3",
|
||||
"contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA=="
|
||||
"resolved": "4.5.4",
|
||||
"contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw=="
|
||||
},
|
||||
"System.Net.Http": {
|
||||
"type": "Transitive",
|
||||
@@ -791,8 +846,8 @@
|
||||
},
|
||||
"System.Reflection.Metadata": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.6.0",
|
||||
"contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ=="
|
||||
"resolved": "5.0.0",
|
||||
"contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ=="
|
||||
},
|
||||
"System.Reflection.Primitives": {
|
||||
"type": "Transitive",
|
||||
@@ -879,6 +934,15 @@
|
||||
"System.Runtime.Extensions": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Security.AccessControl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "5.0.0",
|
||||
"contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "5.0.0",
|
||||
"System.Security.Principal.Windows": "5.0.0"
|
||||
}
|
||||
},
|
||||
"System.Security.Cryptography.Algorithms": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
@@ -1023,6 +1087,11 @@
|
||||
"runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Security.Principal.Windows": {
|
||||
"type": "Transitive",
|
||||
"resolved": "5.0.0",
|
||||
"contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA=="
|
||||
},
|
||||
"System.Text.Encoding": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
@@ -1035,11 +1104,11 @@
|
||||
},
|
||||
"System.Text.Encoding.CodePages": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.5.0",
|
||||
"contentHash": "S0wEUiKcLvRlkFUXca8uio1UQ5bYQzYgOmOKtCqaBQC3GR9AJjh43otcM32IGsAyvadFTaAMw9Irm6dS4Evfng==",
|
||||
"resolved": "4.5.1",
|
||||
"contentHash": "4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "2.0.0",
|
||||
"System.Runtime.CompilerServices.Unsafe": "4.5.0"
|
||||
"Microsoft.NETCore.Platforms": "2.1.2",
|
||||
"System.Runtime.CompilerServices.Unsafe": "4.5.2"
|
||||
}
|
||||
},
|
||||
"System.Threading": {
|
||||
@@ -1066,15 +1135,10 @@
|
||||
"resolved": "4.5.4",
|
||||
"contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg=="
|
||||
},
|
||||
"System.ValueTuple": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.5.0",
|
||||
"contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ=="
|
||||
},
|
||||
"reactor": {
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"BepInEx.Unity.IL2CPP": "[6.0.0-be.663, )"
|
||||
"BepInEx.Unity.IL2CPP": "[6.0.0-be.733, )"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
using System;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.IO;
|
||||
using System.IO.Pipes;
|
||||
using InnerNet;
|
||||
using Reactor.Debugger.AutoJoin.Messages;
|
||||
using Reactor.Utilities;
|
||||
|
||||
namespace Reactor.Debugger.AutoJoin;
|
||||
|
||||
internal sealed class AutoJoinClientConnection : AutoJoinConnection
|
||||
{
|
||||
public const string PipeName = "Reactor.Debugger.AutoJoin";
|
||||
|
||||
private AutoJoinClientConnection(NamedPipeClientStream pipe) : base(pipe)
|
||||
{
|
||||
}
|
||||
|
||||
protected override void Handle(BinaryReader reader, MessageType messageType)
|
||||
{
|
||||
switch (messageType)
|
||||
{
|
||||
case MessageType.JoinGame:
|
||||
{
|
||||
Handle(JoinGameMessage.Deserialize(reader));
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
throw new ArgumentOutOfRangeException(nameof(messageType), messageType, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void Handle(in JoinGameMessage message)
|
||||
{
|
||||
var (address, port, gameCode) = message;
|
||||
|
||||
Dispatcher.Instance.Enqueue(() =>
|
||||
{
|
||||
var gameCodeText = gameCode == InnerNetServer.LocalGameId ? "<local>" : GameCode.IntToGameName(gameCode);
|
||||
Info($"Joining {gameCodeText} on {address}:{port}");
|
||||
|
||||
if (gameCode == InnerNetServer.LocalGameId)
|
||||
{
|
||||
AmongUsClient.Instance.NetworkMode = NetworkModes.LocalGame;
|
||||
AmongUsClient.Instance.GameId = gameCode;
|
||||
AmongUsClient.Instance.StartCoroutine(AmongUsClient.Instance.CoConnectToGameServer(MatchMakerModes.Client, address, port, null));
|
||||
}
|
||||
else
|
||||
{
|
||||
AmongUsClient.Instance.StartCoroutine(AmongUsClient.Instance.CoJoinOnlineGameDirect(gameCode, address, port, null));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void SendRequestJoin()
|
||||
{
|
||||
Write(default(RequestJoinGameMessage));
|
||||
}
|
||||
|
||||
public static bool TryConnect([NotNullWhen(true)] out AutoJoinClientConnection? client)
|
||||
{
|
||||
var pipeClient = new NamedPipeClientStream(".", PipeName, PipeDirection.InOut, PipeOptions.Asynchronous);
|
||||
|
||||
try
|
||||
{
|
||||
pipeClient.Connect(100);
|
||||
|
||||
client = new AutoJoinClientConnection(pipeClient);
|
||||
return true;
|
||||
}
|
||||
catch (TimeoutException)
|
||||
{
|
||||
pipeClient.Dispose();
|
||||
|
||||
client = null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.IO.Pipes;
|
||||
using System.Threading.Tasks;
|
||||
using Reactor.Debugger.AutoJoin.Messages;
|
||||
|
||||
namespace Reactor.Debugger.AutoJoin;
|
||||
|
||||
internal abstract class AutoJoinConnection : IDisposable
|
||||
{
|
||||
private readonly BinaryWriter _writer;
|
||||
|
||||
protected AutoJoinConnection(PipeStream pipe)
|
||||
{
|
||||
_writer = new BinaryWriter(pipe);
|
||||
|
||||
Task.Run(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
var reader = new BinaryReader(pipe);
|
||||
|
||||
while (pipe.IsConnected)
|
||||
{
|
||||
try
|
||||
{
|
||||
var messageType = (MessageType) reader.ReadByte();
|
||||
Debug($"Received {messageType}");
|
||||
Handle(reader, messageType);
|
||||
}
|
||||
catch (EndOfStreamException)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
pipe.Dispose();
|
||||
Disconnected?.Invoke();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Error(e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public event Action? Disconnected;
|
||||
|
||||
protected abstract void Handle(BinaryReader reader, MessageType messageType);
|
||||
|
||||
public void Write<T>(in T message) where T : IMessage<T>
|
||||
{
|
||||
Debug($"Writing {message}");
|
||||
_writer.Write(message);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_writer.Dispose();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,113 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.IO.Pipes;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using InnerNet;
|
||||
using Reactor.Debugger.AutoJoin.Messages;
|
||||
|
||||
namespace Reactor.Debugger.AutoJoin;
|
||||
|
||||
internal sealed class AutoJoinConnectionListener : IDisposable
|
||||
{
|
||||
private readonly CancellationTokenSource _cancellationTokenSource = new();
|
||||
private readonly Mutex _mutex;
|
||||
|
||||
private AutoJoinConnectionListener(Mutex mutex)
|
||||
{
|
||||
_mutex = mutex;
|
||||
|
||||
Task.Run(async () =>
|
||||
{
|
||||
while (!_cancellationTokenSource.IsCancellationRequested)
|
||||
{
|
||||
try
|
||||
{
|
||||
Info("Listening for connections");
|
||||
|
||||
var pipeServer = new NamedPipeServerStream(
|
||||
AutoJoinClientConnection.PipeName,
|
||||
PipeDirection.InOut,
|
||||
NamedPipeServerStream.MaxAllowedServerInstances,
|
||||
PipeTransmissionMode.Byte,
|
||||
PipeOptions.Asynchronous
|
||||
);
|
||||
|
||||
try
|
||||
{
|
||||
await pipeServer.WaitForConnectionAsync(_cancellationTokenSource.Token);
|
||||
}
|
||||
catch (OperationCanceledException)
|
||||
{
|
||||
pipeServer.Dispose();
|
||||
break;
|
||||
}
|
||||
|
||||
Info("Client connected");
|
||||
|
||||
var client = new AutoJoinServerConnection(pipeServer);
|
||||
Clients.Add(client);
|
||||
client.Disconnected += () =>
|
||||
{
|
||||
Clients.Remove(client);
|
||||
client.Dispose();
|
||||
};
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Error(e);
|
||||
}
|
||||
}
|
||||
|
||||
Info("Stopped");
|
||||
Stopped?.Invoke();
|
||||
});
|
||||
}
|
||||
|
||||
public event Action? Stopped;
|
||||
|
||||
public List<AutoJoinServerConnection> Clients { get; } = new();
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_cancellationTokenSource.Cancel();
|
||||
_cancellationTokenSource.Dispose();
|
||||
|
||||
foreach (var client in Clients)
|
||||
{
|
||||
client.Dispose();
|
||||
}
|
||||
|
||||
Clients.Clear();
|
||||
|
||||
_mutex.Dispose();
|
||||
}
|
||||
|
||||
public void SendJoinMe(InnerNetClient innerNetClient)
|
||||
{
|
||||
var joinGameMessage = JoinGameMessage.From(innerNetClient);
|
||||
|
||||
foreach (var client in Clients)
|
||||
{
|
||||
client.Write(joinGameMessage);
|
||||
}
|
||||
}
|
||||
|
||||
public static bool TryStart([NotNullWhen(true)] out AutoJoinConnectionListener? connectionListener)
|
||||
{
|
||||
var mutex = new Mutex(false, $@"Global\{AutoJoinClientConnection.PipeName}");
|
||||
|
||||
if (mutex.WaitOne(100))
|
||||
{
|
||||
connectionListener = new AutoJoinConnectionListener(mutex);
|
||||
return true;
|
||||
}
|
||||
|
||||
mutex.Dispose();
|
||||
|
||||
connectionListener = null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
using HarmonyLib;
|
||||
using InnerNet;
|
||||
|
||||
namespace Reactor.Debugger.AutoJoin;
|
||||
|
||||
internal static class AutoJoinConnectionManager
|
||||
{
|
||||
public static AutoJoinConnectionListener? Server { get; set; }
|
||||
public static AutoJoinClientConnection? Client { get; set; }
|
||||
|
||||
public static void StartOrConnect()
|
||||
{
|
||||
if (AutoJoinConnectionListener.TryStart(out var connectionListener))
|
||||
{
|
||||
Info("Started an AutoJoin session");
|
||||
Server = connectionListener;
|
||||
Server.Stopped += () =>
|
||||
{
|
||||
if (Server == connectionListener)
|
||||
{
|
||||
Server = null;
|
||||
}
|
||||
};
|
||||
}
|
||||
else if (AutoJoinClientConnection.TryConnect(out var client))
|
||||
{
|
||||
Info("Connected to an AutoJoin session");
|
||||
Client = client;
|
||||
client.Disconnected += () =>
|
||||
{
|
||||
if (Client == client)
|
||||
{
|
||||
Client = null;
|
||||
|
||||
Info("Disconnected from an AutoJoin session, trying to reconnect");
|
||||
StartOrConnect();
|
||||
}
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
Error("Failed to start or connect to an AutoJoin session");
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(InnerNetClient), nameof(InnerNetClient.Start))]
|
||||
public static class ConnectPatch
|
||||
{
|
||||
public static void Postfix(InnerNetClient __instance)
|
||||
{
|
||||
if (!DebuggerConfig.JoinGameOnStart.Value) return;
|
||||
|
||||
if (__instance.TryCast<AmongUsClient>() is { } amongUsClient)
|
||||
{
|
||||
if (Server != null)
|
||||
{
|
||||
amongUsClient.StartCoroutine(amongUsClient.CoCreateOnlineGame());
|
||||
}
|
||||
else if (Client is { } client)
|
||||
{
|
||||
client.SendRequestJoin();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.IO.Pipes;
|
||||
using Reactor.Debugger.AutoJoin.Messages;
|
||||
|
||||
namespace Reactor.Debugger.AutoJoin;
|
||||
|
||||
internal sealed class AutoJoinServerConnection : AutoJoinConnection
|
||||
{
|
||||
public AutoJoinServerConnection(NamedPipeServerStream pipe) : base(pipe)
|
||||
{
|
||||
}
|
||||
|
||||
protected override void Handle(BinaryReader reader, MessageType messageType)
|
||||
{
|
||||
switch (messageType)
|
||||
{
|
||||
case MessageType.RequestJoinGame:
|
||||
{
|
||||
Handle(RequestJoinGameMessage.Deserialize(reader));
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
throw new ArgumentOutOfRangeException(nameof(messageType), messageType, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void Handle(in RequestJoinGameMessage message)
|
||||
{
|
||||
if (AmongUsClient.Instance.AmConnected)
|
||||
{
|
||||
Write(JoinGameMessage.From(AmongUsClient.Instance));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Reactor.Debugger.AutoJoin.Messages;
|
||||
|
||||
internal static class Extensions
|
||||
{
|
||||
public static void Write<T>(this BinaryWriter writer, in T message) where T : IMessage<T>
|
||||
{
|
||||
writer.Write((byte) T.Type);
|
||||
message.Serialize(writer);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
#pragma warning disable CA2252 // TODO Remove after BepInEx updates the .NET version
|
||||
using System.IO;
|
||||
|
||||
namespace Reactor.Debugger.AutoJoin.Messages;
|
||||
|
||||
internal interface IMessage<TSelf> where TSelf : IMessage<TSelf>
|
||||
{
|
||||
static abstract MessageType Type { get; }
|
||||
|
||||
void Serialize(BinaryWriter writer);
|
||||
|
||||
static abstract TSelf Deserialize(BinaryReader reader);
|
||||
|
||||
string ToString();
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
using System.IO;
|
||||
using InnerNet;
|
||||
|
||||
namespace Reactor.Debugger.AutoJoin.Messages;
|
||||
|
||||
internal readonly record struct JoinGameMessage(
|
||||
string Address,
|
||||
ushort Port,
|
||||
int GameCode
|
||||
) : IMessage<JoinGameMessage>
|
||||
{
|
||||
public static MessageType Type => MessageType.JoinGame;
|
||||
|
||||
public void Serialize(BinaryWriter writer)
|
||||
{
|
||||
writer.Write(Address);
|
||||
writer.Write(Port);
|
||||
writer.Write(GameCode);
|
||||
}
|
||||
|
||||
public static JoinGameMessage Deserialize(BinaryReader reader)
|
||||
{
|
||||
return new JoinGameMessage
|
||||
{
|
||||
Address = reader.ReadString(),
|
||||
Port = reader.ReadUInt16(),
|
||||
GameCode = reader.ReadInt32(),
|
||||
};
|
||||
}
|
||||
|
||||
public static JoinGameMessage From(InnerNetClient innerNetClient)
|
||||
{
|
||||
return new JoinGameMessage
|
||||
{
|
||||
Address = innerNetClient.networkAddress,
|
||||
Port = (ushort) innerNetClient.networkPort,
|
||||
GameCode = innerNetClient.GameId,
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace Reactor.Debugger.AutoJoin.Messages;
|
||||
|
||||
internal enum MessageType : byte
|
||||
{
|
||||
JoinGame,
|
||||
RequestJoinGame,
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Reactor.Debugger.AutoJoin.Messages;
|
||||
|
||||
internal readonly record struct RequestJoinGameMessage : IMessage<RequestJoinGameMessage>
|
||||
{
|
||||
public static MessageType Type => MessageType.RequestJoinGame;
|
||||
|
||||
public void Serialize(BinaryWriter writer)
|
||||
{
|
||||
}
|
||||
|
||||
public static RequestJoinGameMessage Deserialize(BinaryReader reader)
|
||||
{
|
||||
return default;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
using BepInEx.Configuration;
|
||||
|
||||
namespace Reactor.Debugger;
|
||||
|
||||
internal static class DebuggerConfig
|
||||
{
|
||||
public const string FeaturesSection = "Features";
|
||||
public const string AutoJoinSection = "AutoJoin";
|
||||
|
||||
public static ConfigEntry<bool> DisableGameEnd { get; private set; } = null!;
|
||||
public static ConfigEntry<bool> RedirectLogger { get; private set; } = null!;
|
||||
public static ConfigEntry<bool> AutoPlayAgain { get; private set; } = null!;
|
||||
public static ConfigEntry<bool> DisableTimeout { get; private set; } = null!;
|
||||
|
||||
public static ConfigEntry<bool> JoinGameOnStart { get; private set; } = null!;
|
||||
|
||||
public static void Bind(ConfigFile config)
|
||||
{
|
||||
DisableGameEnd = config.Bind(FeaturesSection, nameof(DisableGameEnd), false, "Stops the game from ending regardless of conditions");
|
||||
RedirectLogger = config.Bind(FeaturesSection, nameof(RedirectLogger), false, "Redirect base game Logger calls into BepInEx logging");
|
||||
AutoPlayAgain = config.Bind(FeaturesSection, nameof(AutoPlayAgain), true, "Automatically calls Play Again after game ends");
|
||||
DisableTimeout = config.Bind(FeaturesSection, nameof(DisableTimeout), false, "Disable the network disconnection timeout");
|
||||
|
||||
JoinGameOnStart = config.Bind(AutoJoinSection, nameof(JoinGameOnStart), false, "Automatically hosts/joins a game on start");
|
||||
}
|
||||
}
|
||||
@@ -1,16 +1,10 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using AmongUs.Data;
|
||||
using AmongUs.GameOptions;
|
||||
global using static Reactor.Utilities.Logger<Reactor.Debugger.DebuggerPlugin>;
|
||||
using BepInEx;
|
||||
using BepInEx.Unity.IL2CPP;
|
||||
using HarmonyLib;
|
||||
using Il2CppInterop.Runtime.Attributes;
|
||||
using Il2CppInterop.Runtime.InteropTypes.Arrays;
|
||||
using InnerNet;
|
||||
using Reactor.Utilities.Attributes;
|
||||
using Reactor.Utilities.ImGui;
|
||||
using UnityEngine;
|
||||
using Reactor.Debugger.AutoJoin;
|
||||
using Reactor.Debugger.Patches;
|
||||
using Reactor.Debugger.Window;
|
||||
|
||||
namespace Reactor.Debugger;
|
||||
|
||||
@@ -20,100 +14,17 @@ namespace Reactor.Debugger;
|
||||
public partial class DebuggerPlugin : BasePlugin
|
||||
{
|
||||
public Harmony Harmony { get; } = new(Id);
|
||||
public DebuggerComponent Component { get; private set; } = null!;
|
||||
|
||||
public override void Load()
|
||||
{
|
||||
Component = this.AddComponent<DebuggerComponent>();
|
||||
DebuggerConfig.Bind(Config);
|
||||
|
||||
GameOptionsData.MaxImpostors = GameOptionsData.RecommendedImpostors = Enumerable.Repeat((int) byte.MaxValue, byte.MaxValue).ToArray();
|
||||
GameOptionsData.MinPlayers = Enumerable.Repeat(1, 4).ToArray();
|
||||
this.AddComponent<DebuggerWindow>();
|
||||
|
||||
GameOptionsPatches.Initialize();
|
||||
|
||||
Harmony.PatchAll();
|
||||
}
|
||||
|
||||
[RegisterInIl2Cpp]
|
||||
public class DebuggerComponent : MonoBehaviour
|
||||
{
|
||||
[HideFromIl2Cpp]
|
||||
public bool DisableGameEnd { get; set; }
|
||||
|
||||
[HideFromIl2Cpp]
|
||||
public DragWindow TestWindow { get; }
|
||||
|
||||
public DebuggerComponent(IntPtr ptr) : base(ptr)
|
||||
{
|
||||
TestWindow = new DragWindow(new Rect(20, 20, 0, 0), "Debugger", () =>
|
||||
{
|
||||
GUILayout.Label("Name: " + DataManager.Player.Customization.Name);
|
||||
DisableGameEnd = GUILayout.Toggle(DisableGameEnd, "Disable game end");
|
||||
|
||||
if (ShipStatus.Instance && AmongUsClient.Instance.AmHost)
|
||||
{
|
||||
if (GUILayout.Button("Force game end"))
|
||||
{
|
||||
ShipStatus.Instance.enabled = false;
|
||||
GameManager.Instance.RpcEndGame(GameOverReason.ImpostorDisconnect, false);
|
||||
}
|
||||
|
||||
if (GUILayout.Button("Call a meeting"))
|
||||
{
|
||||
PlayerControl.LocalPlayer.CmdReportDeadBody(null);
|
||||
}
|
||||
}
|
||||
|
||||
if (TutorialManager.InstanceExists && PlayerControl.LocalPlayer)
|
||||
{
|
||||
var data = PlayerControl.LocalPlayer.Data;
|
||||
|
||||
var newIsImpostor = GUILayout.Toggle(data.Role.IsImpostor, "Is Impostor");
|
||||
if (data.Role.IsImpostor != newIsImpostor)
|
||||
{
|
||||
PlayerControl.LocalPlayer.RpcSetRole(newIsImpostor ? RoleTypes.Impostor : RoleTypes.Crewmate);
|
||||
}
|
||||
|
||||
if (GUILayout.Button("Spawn a dummy"))
|
||||
{
|
||||
var playerControl = Instantiate(TutorialManager.Instance.PlayerPrefab);
|
||||
var i = playerControl.PlayerId = (byte) GameData.Instance.GetAvailableId();
|
||||
GameData.Instance.AddPlayer(playerControl);
|
||||
AmongUsClient.Instance.Spawn(playerControl, -2, SpawnFlags.None);
|
||||
playerControl.transform.position = PlayerControl.LocalPlayer.transform.position;
|
||||
playerControl.GetComponent<DummyBehaviour>().enabled = true;
|
||||
playerControl.NetTransform.enabled = false;
|
||||
playerControl.SetName($"{TranslationController.Instance.GetString(StringNames.Dummy, Array.Empty<Il2CppSystem.Object>())} {i}");
|
||||
var color = (byte) (i % Palette.PlayerColors.Length);
|
||||
playerControl.SetColor(color);
|
||||
playerControl.SetHat(HatManager.Instance.allHats[i % HatManager.Instance.allHats.Count].ProdId, playerControl.Data.DefaultOutfit.ColorId);
|
||||
playerControl.SetPet(HatManager.Instance.allPets[i % HatManager.Instance.allPets.Count].ProdId);
|
||||
playerControl.SetSkin(HatManager.Instance.allSkins[i % HatManager.Instance.allSkins.Count].ProdId, color);
|
||||
GameData.Instance.RpcSetTasks(playerControl.PlayerId, new Il2CppStructArray<byte>(0));
|
||||
}
|
||||
}
|
||||
|
||||
if (PlayerControl.LocalPlayer)
|
||||
{
|
||||
var position = PlayerControl.LocalPlayer.transform.position;
|
||||
GUILayout.Label($"x: {position.x}");
|
||||
GUILayout.Label($"y: {position.y}");
|
||||
}
|
||||
})
|
||||
{
|
||||
Enabled = false,
|
||||
};
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
if (Input.GetKeyDown(KeyCode.F1))
|
||||
{
|
||||
TestWindow.Enabled = !TestWindow.Enabled;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnGUI()
|
||||
{
|
||||
TestWindow.OnGUI();
|
||||
}
|
||||
AutoJoinConnectionManager.StartOrConnect();
|
||||
}
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
using System.Linq;
|
||||
using AmongUs.GameOptions;
|
||||
using HarmonyLib;
|
||||
using Il2CppInterop.Runtime.InteropTypes.Arrays;
|
||||
using Reactor.Utilities;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Reactor.Debugger;
|
||||
|
||||
internal static class Patches
|
||||
{
|
||||
[HarmonyPatch(typeof(GameStartManager), nameof(GameStartManager.Update))]
|
||||
public static class UpdatePatch
|
||||
{
|
||||
public static void Prefix(GameStartManager __instance)
|
||||
{
|
||||
__instance.MinPlayers = 1;
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(GameStartManager), nameof(GameStartManager.Update))]
|
||||
public static class CountdownPatch
|
||||
{
|
||||
public static void Prefix(GameStartManager __instance)
|
||||
{
|
||||
__instance.countDownTimer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(StatsManager), nameof(StatsManager.AmBanned), MethodType.Getter)]
|
||||
public static class AmBannedPatch
|
||||
{
|
||||
public static void Postfix(out bool __result)
|
||||
{
|
||||
__result = false;
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch]
|
||||
[HarmonyPriority(Priority.First)]
|
||||
public static class CheckEndCriteriaPatch
|
||||
{
|
||||
[HarmonyPatch(typeof(LogicGameFlow), nameof(LogicGameFlow.CheckEndCriteria))]
|
||||
[HarmonyPatch(typeof(LogicGameFlowNormal), nameof(LogicGameFlow.CheckEndCriteria))]
|
||||
[HarmonyPatch(typeof(LogicGameFlowHnS), nameof(LogicGameFlow.CheckEndCriteria))]
|
||||
public static bool Prefix()
|
||||
{
|
||||
return !PluginSingleton<DebuggerPlugin>.Instance.Component.DisableGameEnd;
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(GameSettingMenu), nameof(GameSettingMenu.Start))]
|
||||
public static class GameSettingMenuPatch
|
||||
{
|
||||
public static void Prefix(GameSettingMenu __instance)
|
||||
{
|
||||
// Unlocks map/impostor amount changing in online (for testing on your custom servers)
|
||||
__instance.HideForOnline = new Il2CppReferenceArray<Transform>(0);
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(GameOptionsMenu), nameof(GameOptionsMenu.Start))]
|
||||
[HarmonyPriority(Priority.First)]
|
||||
public static class GameOptionsMenuPatch
|
||||
{
|
||||
public static void Postfix(GameOptionsMenu __instance)
|
||||
{
|
||||
if (GameOptionsManager.Instance.CurrentGameOptions.GameMode != GameModes.Normal) return;
|
||||
|
||||
__instance.Children
|
||||
.Single(o => o.Title == StringNames.GameNumImpostors)
|
||||
.Cast<NumberOption>()
|
||||
.ValidRange = new FloatRange(0, byte.MaxValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
using HarmonyLib;
|
||||
|
||||
namespace Reactor.Debugger.Patches;
|
||||
|
||||
[HarmonyPatch(typeof(EndGameNavigation), nameof(EndGameNavigation.ShowDefaultNavigation))]
|
||||
internal static class AutoPlayAgainPatch
|
||||
{
|
||||
public static void Postfix(EndGameNavigation __instance)
|
||||
{
|
||||
if (!DebuggerConfig.AutoPlayAgain.Value) return;
|
||||
|
||||
__instance.NextGame();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
using HarmonyLib;
|
||||
|
||||
namespace Reactor.Debugger.Patches;
|
||||
|
||||
[HarmonyPatch]
|
||||
[HarmonyPriority(Priority.First)]
|
||||
internal static class DisableGameEndPatch
|
||||
{
|
||||
private static bool Enabled => DebuggerConfig.DisableGameEnd.Value;
|
||||
|
||||
[HarmonyPatch(typeof(LogicGameFlow), nameof(LogicGameFlow.CheckEndCriteria))]
|
||||
[HarmonyPatch(typeof(LogicGameFlowNormal), nameof(LogicGameFlow.CheckEndCriteria))]
|
||||
[HarmonyPatch(typeof(LogicGameFlowHnS), nameof(LogicGameFlow.CheckEndCriteria))]
|
||||
public static bool Prefix()
|
||||
{
|
||||
return !Enabled;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
using HarmonyLib;
|
||||
using Hazel.Udp;
|
||||
|
||||
namespace Reactor.Debugger.Patches;
|
||||
|
||||
[HarmonyPatch]
|
||||
internal static class DisableTimeoutPatch
|
||||
{
|
||||
private static bool Enabled => DebuggerConfig.DisableTimeout.Value;
|
||||
|
||||
[HarmonyPatch(typeof(UdpConnection), nameof(UdpConnection.HandleKeepAlive))]
|
||||
[HarmonyPrefix]
|
||||
public static bool DisableKeepAlive()
|
||||
{
|
||||
return !Enabled;
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(UnityUdpClientConnection), nameof(UnityUdpClientConnection.ConnectAsync))]
|
||||
[HarmonyPostfix]
|
||||
public static void DisableTimeout(UnityUdpClientConnection __instance)
|
||||
{
|
||||
if (!Enabled) return;
|
||||
|
||||
__instance.DisconnectTimeoutMs = int.MaxValue;
|
||||
__instance.ResendLimit = 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
using System.Linq;
|
||||
using AmongUs.GameOptions;
|
||||
using HarmonyLib;
|
||||
using Il2CppInterop.Runtime;
|
||||
using Il2CppInterop.Runtime.InteropTypes.Arrays;
|
||||
using Il2CppSystem.Reflection;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Reactor.Debugger.Patches;
|
||||
|
||||
[HarmonyPatch]
|
||||
internal static class GameOptionsPatches
|
||||
{
|
||||
public static void Initialize()
|
||||
{
|
||||
var maxImpostors = (Il2CppStructArray<int>) Enumerable.Repeat((int) byte.MaxValue, byte.MaxValue).ToArray();
|
||||
NormalGameOptionsV09.MaxImpostors = maxImpostors;
|
||||
NormalGameOptionsV09.MaxImpostors = maxImpostors;
|
||||
|
||||
var minPlayers = (Il2CppStructArray<int>) Enumerable.Repeat(1, byte.MaxValue).ToArray();
|
||||
NormalGameOptionsV09.MinPlayers = minPlayers;
|
||||
NormalGameOptionsV09.MinPlayers = minPlayers;
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(GameSettingMenu), nameof(GameSettingMenu.Start))]
|
||||
[HarmonyPrefix]
|
||||
public static void UnlockAllOptions(GameSettingMenu __instance)
|
||||
{
|
||||
__instance.GameSettingsTab.HideForOnline = new Il2CppReferenceArray<Transform>(0);
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(NumberOption), nameof(NumberOption.SetUpFromData))]
|
||||
[HarmonyPostfix]
|
||||
public static void UnlockOptionRange(NumberOption __instance)
|
||||
{
|
||||
__instance.ValidRange.min = float.MinValue;
|
||||
__instance.ValidRange.max = float.MaxValue;
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(CreateOptionsPicker), nameof(CreateOptionsPicker.SetImpostorButtons))]
|
||||
public static class DisableImpostorCountReset
|
||||
{
|
||||
private static readonly MethodInfo _refreshMethod = Il2CppType.Of<CreateOptionsPicker>().GetMethod("Refresh", BindingFlags.Public | BindingFlags.Instance);
|
||||
|
||||
public static bool Prefix()
|
||||
{
|
||||
foreach (var stackFrame in new Il2CppSystem.Diagnostics.StackTrace().GetFrames())
|
||||
{
|
||||
if (_refreshMethod.Equals(stackFrame.GetMethod()))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(CrewVisualizer), nameof(CrewVisualizer.SetCrewSize))]
|
||||
[HarmonyPrefix]
|
||||
public static void SetCrewSizePatch(int numPlayers, ref int numImpostors)
|
||||
{
|
||||
if (numImpostors >= numPlayers)
|
||||
{
|
||||
numImpostors = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
using HarmonyLib;
|
||||
|
||||
namespace Reactor.Debugger.Patches;
|
||||
|
||||
[HarmonyPatch(typeof(GameStartManager))]
|
||||
internal static class GameStartManagerPatches
|
||||
{
|
||||
[HarmonyPatch(nameof(GameStartManager.Start))]
|
||||
[HarmonyPrefix]
|
||||
public static void StartPatch(GameStartManager __instance)
|
||||
{
|
||||
__instance.MinPlayers = 1;
|
||||
}
|
||||
|
||||
[HarmonyPatch(nameof(GameStartManager.Update))]
|
||||
[HarmonyPrefix]
|
||||
public static void UpdatePatch(GameStartManager __instance)
|
||||
{
|
||||
__instance.countDownTimer = 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
using System;
|
||||
using System.Net;
|
||||
using HarmonyLib;
|
||||
using InnerNet;
|
||||
|
||||
namespace Reactor.Debugger.Patches;
|
||||
|
||||
[HarmonyPatch]
|
||||
internal static class RandomizeFreeplayServerPortPatch
|
||||
{
|
||||
private static ushort? _lastPort;
|
||||
|
||||
[HarmonyPatch(typeof(InnerNetServer), nameof(InnerNetServer.StartAsLocalServer))]
|
||||
public static class StartServerPatch
|
||||
{
|
||||
public static void Prefix(InnerNetServer __instance)
|
||||
{
|
||||
var port = (ushort) Random.Shared.Next(1024, IPEndPoint.MaxPort);
|
||||
_lastPort = port;
|
||||
__instance.Port = port;
|
||||
}
|
||||
|
||||
public static void Postfix(InnerNetServer __instance)
|
||||
{
|
||||
__instance.Port = Constants.GamePlayPort;
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(InnerNetClient), nameof(InnerNetClient.SetEndpoint))]
|
||||
[HarmonyPrefix]
|
||||
public static void SetEndpointPatch(InnerNetClient __instance, string addr, ref ushort port)
|
||||
{
|
||||
if (_lastPort != null && __instance.NetworkMode == NetworkModes.FreePlay)
|
||||
{
|
||||
port = _lastPort.Value;
|
||||
_lastPort = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
using System.Globalization;
|
||||
using System.Text;
|
||||
using BepInEx.Logging;
|
||||
using HarmonyLib;
|
||||
using Il2CppInterop.Runtime.InteropTypes.Arrays;
|
||||
|
||||
namespace Reactor.Debugger.Patches;
|
||||
|
||||
[HarmonyPatch(typeof(Logger))]
|
||||
internal static class RedirectLoggerPatch
|
||||
{
|
||||
private static readonly ManualLogSource _log = BepInEx.Logging.Logger.CreateLogSource("Among Us");
|
||||
|
||||
private static bool Enabled => DebuggerConfig.RedirectLogger.Value;
|
||||
|
||||
private static void Log(Logger logger, LogLevel level, Il2CppStringArray? path, Il2CppSystem.Object message, UnityEngine.Object? context = null)
|
||||
{
|
||||
var finalMessage = new StringBuilder();
|
||||
|
||||
if (logger.category != Logger.Category.None) finalMessage.Append(CultureInfo.InvariantCulture, $"[{logger.category}] ");
|
||||
if (logger.subCategories != null)
|
||||
{
|
||||
foreach (var subCategory in logger.subCategories)
|
||||
{
|
||||
finalMessage.Append(CultureInfo.InvariantCulture, $"[{subCategory}] ");
|
||||
}
|
||||
}
|
||||
|
||||
if (path != null)
|
||||
{
|
||||
foreach (var p in path)
|
||||
{
|
||||
finalMessage.Append(CultureInfo.InvariantCulture, $"[{p}] ");
|
||||
}
|
||||
}
|
||||
|
||||
if (context != null) finalMessage.Append(CultureInfo.InvariantCulture, $"[{context.name} ({context.GetIl2CppType().FullName})] ");
|
||||
finalMessage.Append(message.ToString());
|
||||
|
||||
_log.Log(level, finalMessage);
|
||||
}
|
||||
|
||||
[HarmonyPatch(nameof(Logger.Debug), typeof(Il2CppSystem.Object), typeof(UnityEngine.Object))]
|
||||
[HarmonyPrefix]
|
||||
public static bool DebugPatch(Logger __instance, Il2CppSystem.Object message, UnityEngine.Object? context)
|
||||
{
|
||||
if (!Enabled) return true;
|
||||
Log(__instance, LogLevel.Debug, null, message, context);
|
||||
return false;
|
||||
}
|
||||
|
||||
[HarmonyPatch(nameof(Logger.Info), typeof(Il2CppSystem.Object), typeof(UnityEngine.Object))]
|
||||
[HarmonyPrefix]
|
||||
public static bool InfoPatch(Logger __instance, Il2CppSystem.Object message, UnityEngine.Object? context)
|
||||
{
|
||||
if (!Enabled) return true;
|
||||
Log(__instance, LogLevel.Info, null, message, context);
|
||||
return false;
|
||||
}
|
||||
|
||||
[HarmonyPatch(nameof(Logger.Warning), typeof(Il2CppSystem.Object), typeof(UnityEngine.Object))]
|
||||
[HarmonyPrefix]
|
||||
public static bool WarningPatch(Logger __instance, Il2CppSystem.Object message, UnityEngine.Object? context)
|
||||
{
|
||||
if (!Enabled) return true;
|
||||
Log(__instance, LogLevel.Warning, null, message, context);
|
||||
return false;
|
||||
}
|
||||
|
||||
[HarmonyPatch(nameof(Logger.Error), typeof(Il2CppSystem.Object), typeof(UnityEngine.Object))]
|
||||
[HarmonyPrefix]
|
||||
public static bool ErrorPatch(Logger __instance, Il2CppSystem.Object message, UnityEngine.Object? context)
|
||||
{
|
||||
if (!Enabled) return true;
|
||||
Log(__instance, LogLevel.Error, null, message, context);
|
||||
return false;
|
||||
}
|
||||
|
||||
[HarmonyPatch(nameof(Logger.Debug), typeof(Il2CppStringArray), typeof(Il2CppSystem.Object), typeof(UnityEngine.Object))]
|
||||
[HarmonyPrefix]
|
||||
public static bool DebugPatch(Logger __instance, Il2CppStringArray? path, Il2CppSystem.Object message, UnityEngine.Object? context)
|
||||
{
|
||||
if (!Enabled) return true;
|
||||
Log(__instance, LogLevel.Debug, path, message, context);
|
||||
return false;
|
||||
}
|
||||
|
||||
[HarmonyPatch(nameof(Logger.Info), typeof(Il2CppStringArray), typeof(Il2CppSystem.Object), typeof(UnityEngine.Object))]
|
||||
[HarmonyPrefix]
|
||||
public static bool InfoPatch(Logger __instance, Il2CppStringArray? path, Il2CppSystem.Object message, UnityEngine.Object? context)
|
||||
{
|
||||
if (!Enabled) return true;
|
||||
Log(__instance, LogLevel.Info, path, message, context);
|
||||
return false;
|
||||
}
|
||||
|
||||
[HarmonyPatch(nameof(Logger.Warning), typeof(Il2CppStringArray), typeof(Il2CppSystem.Object), typeof(UnityEngine.Object))]
|
||||
[HarmonyPrefix]
|
||||
public static bool WarningPatch(Logger __instance, Il2CppStringArray? path, Il2CppSystem.Object message, UnityEngine.Object? context)
|
||||
{
|
||||
if (!Enabled) return true;
|
||||
Log(__instance, LogLevel.Warning, path, message, context);
|
||||
return false;
|
||||
}
|
||||
|
||||
[HarmonyPatch(nameof(Logger.Error), typeof(Il2CppStringArray), typeof(Il2CppSystem.Object), typeof(UnityEngine.Object))]
|
||||
[HarmonyPrefix]
|
||||
public static bool ErrorPatch(Logger __instance, Il2CppStringArray? path, Il2CppSystem.Object message, UnityEngine.Object? context)
|
||||
{
|
||||
if (!Enabled) return true;
|
||||
Log(__instance, LogLevel.Error, path, message, context);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using Il2CppInterop.Runtime;
|
||||
using InnerNet;
|
||||
|
||||
namespace Reactor.Debugger.Utilities;
|
||||
|
||||
internal static class Extensions
|
||||
{
|
||||
public static IEnumerator CoCreateLocalGame(this AmongUsClient client, bool isFreePlay = false)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (isFreePlay)
|
||||
{
|
||||
client.NetworkMode = NetworkModes.FreePlay;
|
||||
|
||||
InnerNetServer.Instance.StartAsLocalServer();
|
||||
|
||||
client.MainMenuScene = "MainMenu";
|
||||
client.OnlineScene = "Tutorial";
|
||||
}
|
||||
else
|
||||
{
|
||||
client.NetworkMode = NetworkModes.LocalGame;
|
||||
|
||||
InnerNetServer.Instance.StartAsServer();
|
||||
|
||||
client.MainMenuScene = "MatchMaking";
|
||||
client.OnlineScene = "OnlineGame";
|
||||
}
|
||||
|
||||
client.SetEndpoint(Constants.LocalNetAddress, Constants.GamePlayPort, false);
|
||||
}
|
||||
catch (Il2CppException e)
|
||||
{
|
||||
Error(e);
|
||||
DisconnectPopup.Instance.ShowCustom(e.Message[..e.Message.IndexOf("\n--- BEGIN IL2CPP STACK TRACE ---\n", StringComparison.Ordinal)]);
|
||||
MatchMaker.Instance.NotConnecting();
|
||||
yield break;
|
||||
}
|
||||
|
||||
client.Connect(MatchMakerModes.HostAndClient, null);
|
||||
|
||||
yield return client.WaitForConnectionOrFail();
|
||||
|
||||
DestroyableSingleton<MatchMaker>.Instance.NotConnecting();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Linq;
|
||||
using AmongUs.Data;
|
||||
using BepInEx.Unity.IL2CPP.Utils;
|
||||
using Il2CppInterop.Runtime.Attributes;
|
||||
using Il2CppInterop.Runtime.InteropTypes;
|
||||
using Reactor.Debugger.Utilities;
|
||||
using Reactor.Debugger.Window.Tabs;
|
||||
using Reactor.Utilities.Attributes;
|
||||
using Reactor.Utilities.ImGui;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Reactor.Debugger.Window;
|
||||
|
||||
[RegisterInIl2Cpp]
|
||||
internal sealed class DebuggerWindow : MonoBehaviour
|
||||
{
|
||||
private readonly DragWindow _window;
|
||||
|
||||
[HideFromIl2Cpp]
|
||||
public BaseTab[] Tabs { get; } =
|
||||
{
|
||||
new ConfigTab(),
|
||||
new GameTab(),
|
||||
new AutoJoinTab(),
|
||||
};
|
||||
|
||||
[HideFromIl2Cpp]
|
||||
public BaseTab SelectedTab { get; private set; }
|
||||
|
||||
public DebuggerWindow(IntPtr ptr) : base(ptr)
|
||||
{
|
||||
SelectedTab = Tabs[0];
|
||||
|
||||
_window = new DragWindow(new Rect(20, 20, 0, 0), "Reactor.Debugger", () =>
|
||||
{
|
||||
var clientName = DataManager.Player.Customization.Name;
|
||||
if (AmongUsClient.Instance && AmongUsClient.Instance.AmHost) clientName += " (host)";
|
||||
GUILayout.Label("Name: " + clientName);
|
||||
|
||||
if (GUILayout.Button("Hard crash"))
|
||||
{
|
||||
static unsafe void Corrupt(Il2CppObjectBase o)
|
||||
{
|
||||
var x = (IntPtr*) o.Pointer;
|
||||
x[0] = (IntPtr) 0xF00;
|
||||
}
|
||||
|
||||
static IEnumerator CoCrash()
|
||||
{
|
||||
if (!PlayerControl.LocalPlayer || !ShipStatus.Instance)
|
||||
{
|
||||
yield return AmongUsClient.Instance.CoCreateLocalGame(true);
|
||||
|
||||
while (!PlayerControl.LocalPlayer || !ShipStatus.Instance)
|
||||
{
|
||||
yield return null;
|
||||
}
|
||||
}
|
||||
|
||||
var usable = FindObjectsOfType<MonoBehaviour>().First(x => x.TryCast<IUsable>() != null);
|
||||
if (!usable)
|
||||
{
|
||||
Error("Failed to find an IUsable to crash with");
|
||||
yield break;
|
||||
}
|
||||
|
||||
var cloned = Instantiate(usable, PlayerControl.LocalPlayer.transform.position, default);
|
||||
|
||||
Warning($"Crashing with {cloned.name}");
|
||||
|
||||
Corrupt(cloned);
|
||||
}
|
||||
|
||||
this.StartCoroutine(CoCrash());
|
||||
}
|
||||
|
||||
GUILayout.BeginHorizontal();
|
||||
{
|
||||
foreach (var tab in Tabs)
|
||||
{
|
||||
if (GUILayout.Toggle(tab == SelectedTab, tab.Name, new GUIStyle(GUI.skin.button)))
|
||||
{
|
||||
SelectedTab = tab;
|
||||
}
|
||||
}
|
||||
}
|
||||
GUILayout.EndHorizontal();
|
||||
|
||||
GUILayout.Space(5f);
|
||||
|
||||
SelectedTab.OnGUI();
|
||||
})
|
||||
{
|
||||
Enabled = false,
|
||||
};
|
||||
}
|
||||
|
||||
public void Update()
|
||||
{
|
||||
if (Input.GetKeyDown(KeyCode.F1))
|
||||
{
|
||||
_window.Enabled = !_window.Enabled;
|
||||
}
|
||||
}
|
||||
|
||||
public void OnGUI()
|
||||
{
|
||||
_window.OnGUI();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
using BepInEx.Unity.IL2CPP.Utils;
|
||||
using Reactor.Debugger.AutoJoin;
|
||||
using Reactor.Debugger.Utilities;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Reactor.Debugger.Window.Tabs;
|
||||
|
||||
internal sealed class AutoJoinTab : BaseTab
|
||||
{
|
||||
public override string Name => "AutoJoin";
|
||||
|
||||
public override void OnGUI()
|
||||
{
|
||||
if (AutoJoinConnectionManager.Server is { } server)
|
||||
{
|
||||
GUILayout.Label($"Hosting ({server.Clients.Count} clients)");
|
||||
|
||||
if (GUILayout.Button("Stop"))
|
||||
{
|
||||
server.Dispose();
|
||||
}
|
||||
|
||||
if (AmongUsClient.Instance)
|
||||
{
|
||||
if (GUILayout.Button("Create an online game"))
|
||||
{
|
||||
AmongUsClient.Instance.StartCoroutine(AmongUsClient.Instance.CoCreateOnlineGame());
|
||||
}
|
||||
|
||||
if (GUILayout.Button("Create a local game"))
|
||||
{
|
||||
AmongUsClient.Instance.StartCoroutine(AmongUsClient.Instance.CoCreateLocalGame());
|
||||
}
|
||||
|
||||
if (
|
||||
AmongUsClient.Instance.AmConnected &&
|
||||
AmongUsClient.Instance.NetworkMode != NetworkModes.FreePlay &&
|
||||
GUILayout.Button("Join me")
|
||||
)
|
||||
{
|
||||
server.SendJoinMe(AmongUsClient.Instance);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (AutoJoinConnectionManager.Client is { } client)
|
||||
{
|
||||
GUILayout.Label("Connected");
|
||||
|
||||
if (GUILayout.Button("Disconnect"))
|
||||
{
|
||||
AutoJoinConnectionManager.Client = null;
|
||||
client.Dispose();
|
||||
}
|
||||
|
||||
if (GUILayout.Button("Request join"))
|
||||
{
|
||||
client.SendRequestJoin();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (GUILayout.Button("Connect"))
|
||||
{
|
||||
AutoJoinConnectionManager.StartOrConnect();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
namespace Reactor.Debugger.Window.Tabs;
|
||||
|
||||
internal abstract class BaseTab
|
||||
{
|
||||
public abstract string Name { get; }
|
||||
|
||||
public abstract void OnGUI();
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
using System.Linq;
|
||||
using BepInEx.Configuration;
|
||||
using Reactor.Utilities;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Reactor.Debugger.Window.Tabs;
|
||||
|
||||
internal sealed class ConfigTab : BaseTab
|
||||
{
|
||||
public override string Name => "Config";
|
||||
|
||||
public override void OnGUI()
|
||||
{
|
||||
var configs = PluginSingleton<ReactorPlugin>.Instance.Config.Concat(PluginSingleton<DebuggerPlugin>.Instance.Config);
|
||||
|
||||
foreach (var section in configs.GroupBy(e => e.Key.Section))
|
||||
{
|
||||
GUILayout.Label(section.Key);
|
||||
|
||||
foreach (var (definition, entry) in section)
|
||||
{
|
||||
if (entry is ConfigEntry<bool> booleanEntry)
|
||||
{
|
||||
booleanEntry.Value = GUILayout.Toggle(booleanEntry.Value, definition.Key);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
using AmongUs.GameOptions;
|
||||
using Il2CppInterop.Runtime.InteropTypes.Arrays;
|
||||
using UnityEngine;
|
||||
using Object = UnityEngine.Object;
|
||||
|
||||
namespace Reactor.Debugger.Window.Tabs;
|
||||
|
||||
internal sealed class GameTab : BaseTab
|
||||
{
|
||||
public override string Name => "Game";
|
||||
|
||||
public override void OnGUI()
|
||||
{
|
||||
var localPlayer = PlayerControl.LocalPlayer;
|
||||
if (!localPlayer)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var amHost = AmongUsClient.Instance.AmHost;
|
||||
|
||||
var position = localPlayer.transform.position;
|
||||
GUILayout.Label($"Position: ({position.x:F3}, {position.y:F3})");
|
||||
|
||||
var physics = localPlayer.MyPhysics;
|
||||
GUILayout.Label($"Speed: {physics.Speed}");
|
||||
physics.Speed = GUILayout.HorizontalSlider(physics.Speed, 0, 25);
|
||||
|
||||
localPlayer.Collider.enabled = GUILayout.Toggle(localPlayer.Collider.enabled, "Collisions");
|
||||
|
||||
if (ShipStatus.Instance)
|
||||
{
|
||||
if (amHost && GUILayout.Button("Force game end"))
|
||||
{
|
||||
ShipStatus.Instance.enabled = false;
|
||||
GameManager.Instance.RpcEndGame(GameOverReason.ImpostorDisconnect, false);
|
||||
}
|
||||
|
||||
if (MeetingHud.Instance)
|
||||
{
|
||||
if (GUILayout.Button("Stop the meeting"))
|
||||
{
|
||||
MeetingHud.Instance.RpcClose();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (GUILayout.Button("Call a meeting"))
|
||||
{
|
||||
localPlayer.CmdReportDeadBody(null);
|
||||
}
|
||||
}
|
||||
|
||||
if (TutorialManager.InstanceExists)
|
||||
{
|
||||
var newIsImpostor = GUILayout.Toggle(localPlayer.Data.Role.IsImpostor, "Is Impostor");
|
||||
if (localPlayer.Data.Role.IsImpostor != newIsImpostor)
|
||||
{
|
||||
localPlayer.RpcSetRole(newIsImpostor ? RoleTypes.Impostor : RoleTypes.Crewmate);
|
||||
}
|
||||
|
||||
if (GUILayout.Button("Spawn a dummy"))
|
||||
{
|
||||
SpawnDummy();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void SpawnDummy()
|
||||
{
|
||||
var playerControl = Object.Instantiate(AmongUsClient.Instance.PlayerPrefab);
|
||||
var playerId = playerControl.PlayerId = (byte) GameData.Instance.GetAvailableId();
|
||||
|
||||
var data = GameData.Instance.AddDummy(playerControl);
|
||||
AmongUsClient.Instance.Spawn(data);
|
||||
AmongUsClient.Instance.Spawn(playerControl);
|
||||
playerControl.isDummy = true;
|
||||
|
||||
playerControl.transform.position = PlayerControl.LocalPlayer.transform.position;
|
||||
playerControl.GetComponent<DummyBehaviour>().enabled = true;
|
||||
playerControl.NetTransform.enabled = false;
|
||||
|
||||
playerControl.SetName($"{TranslationController.Instance.GetString(StringNames.Dummy)} {playerId}");
|
||||
|
||||
var color = (byte) (playerId % Palette.PlayerColors.Length);
|
||||
playerControl.SetColor(color);
|
||||
playerControl.SetHat(HatManager.Instance.allHats[playerId % HatManager.Instance.allHats.Count].ProdId, playerControl.Data.DefaultOutfit.ColorId);
|
||||
playerControl.SetPet(HatManager.Instance.allPets[playerId % HatManager.Instance.allPets.Count].ProdId);
|
||||
playerControl.SetSkin(HatManager.Instance.allSkins[playerId % HatManager.Instance.allSkins.Count].ProdId, color);
|
||||
playerControl.SetVisor(HatManager.Instance.allVisors[playerId % HatManager.Instance.allVisors.Count].ProdId, color);
|
||||
playerControl.SetNamePlate(HatManager.Instance.allNamePlates[playerId % HatManager.Instance.allNamePlates.Count].ProdId);
|
||||
data.PlayerLevel = playerId;
|
||||
|
||||
data.RpcSetTasks(new Il2CppStructArray<byte>(0));
|
||||
}
|
||||
}
|
||||
@@ -4,9 +4,9 @@
|
||||
"net6.0": {
|
||||
"AmongUs.GameLibs.Steam": {
|
||||
"type": "Direct",
|
||||
"requested": "[2022.12.8, )",
|
||||
"resolved": "2022.12.8",
|
||||
"contentHash": "IJsIi89xUYRvA54YtNVEJjf25hhF3LWzkNBslKCNDUpL1aQ/PhNyO4j18pO71DCgW/qr1P1j8+CwByuBLsInNA=="
|
||||
"requested": "[2025.3.25, )",
|
||||
"resolved": "2025.3.25",
|
||||
"contentHash": "2QxQXgZDcQOdAIDXrNLrQ7veEzD6EBzuaRjzSbHptWUPUsuVc3I5Ur3xMkPPwmSGsDHjLuAGE84yRjV6oJxGxw=="
|
||||
},
|
||||
"BepInEx.AutoPlugin": {
|
||||
"type": "Direct",
|
||||
@@ -22,58 +22,105 @@
|
||||
},
|
||||
"BepInEx.Unity.IL2CPP": {
|
||||
"type": "Direct",
|
||||
"requested": "[6.0.0-be.663, )",
|
||||
"resolved": "6.0.0-be.663",
|
||||
"contentHash": "J+mZ4svyTt4ZYbUoPwpVtF5QCGfzC42VuYJ7z1K6Qt8YlBEZx3rnmUmaEnoJIqN5wN7BSnQgzEmrRfdbrgtTnA==",
|
||||
"requested": "[6.0.0-be.733, )",
|
||||
"resolved": "6.0.0-be.733",
|
||||
"contentHash": "lnoGaPHjIdGfEiKtf89knaTdLXe4IUqVLdoYqW8NYhhNqgxa3oNwScjTmuYQpa4Leew3937+slq2WIjvX/DUwQ==",
|
||||
"dependencies": {
|
||||
"BepInEx.Core": "6.0.0-be.663",
|
||||
"BepInEx.Unity.Common": "6.0.0-be.663",
|
||||
"HarmonyX": "2.10.1",
|
||||
"Iced": "1.17.0",
|
||||
"Il2CppInterop.Generator": "1.4.0",
|
||||
"Il2CppInterop.HarmonySupport": "1.4.0",
|
||||
"Il2CppInterop.Runtime": "1.4.0",
|
||||
"MonoMod.RuntimeDetour": "22.5.1.1",
|
||||
"Samboy063.Cpp2IL.Core": "2022.0.7.2"
|
||||
"BepInEx.Core": "6.0.0-be.733",
|
||||
"BepInEx.Unity.Common": "6.0.0-be.733",
|
||||
"HarmonyX": "2.10.2",
|
||||
"Iced": "1.21.0",
|
||||
"Il2CppInterop.Generator": "1.4.6-ci.426",
|
||||
"Il2CppInterop.HarmonySupport": "1.4.6-ci.426",
|
||||
"Il2CppInterop.Runtime": "1.4.6-ci.426",
|
||||
"MonoMod.RuntimeDetour": "22.7.31.1",
|
||||
"Samboy063.Cpp2IL.Core": "2022.1.0-pre-release.18"
|
||||
}
|
||||
},
|
||||
"StyleCop.Analyzers": {
|
||||
"type": "Direct",
|
||||
"requested": "[1.2.0-beta.435, )",
|
||||
"resolved": "1.2.0-beta.435",
|
||||
"contentHash": "TADk7vdGXtfTnYCV7GyleaaRTQjfoSfZXprQrVMm7cSJtJbFc1QIbWPyLvrgrfGdfHbGmUPvaN4ODKNxg2jgPQ==",
|
||||
"requested": "[1.2.0-beta.556, )",
|
||||
"resolved": "1.2.0-beta.556",
|
||||
"contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==",
|
||||
"dependencies": {
|
||||
"StyleCop.Analyzers.Unstable": "1.2.0.435"
|
||||
"StyleCop.Analyzers.Unstable": "1.2.0.556"
|
||||
}
|
||||
},
|
||||
"AssetRipper.VersionUtilities": {
|
||||
"AsmResolver": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.2.1",
|
||||
"contentHash": "knQ/W1YwTZS2AbdaZh+nhyyBEZQPQDcahhSOnh88i+cdg4/FEoFJiCwaavgFvCMNuUeHTbcZc4qttF8WQ8xLIA=="
|
||||
"resolved": "6.0.0-beta.1",
|
||||
"contentHash": "M5btCR/rmrx32jZsoN6CLQ/VQk8lN8hvPb6lgojua7pjNoo7StAl92koMC8qz4vzZyH2CNqxLSDoswRvyyK/vA=="
|
||||
},
|
||||
"AsmResolver.DotNet": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0-beta.1",
|
||||
"contentHash": "PTq8nNQvhgTxF1iARCknffCsu7Iq9B0kN7TVC8iMaU7uEYog3xvVqH/0+TreY8GW74/+MqhZt/yEFsvS4oAduQ==",
|
||||
"dependencies": {
|
||||
"AsmResolver.PE": "6.0.0-beta.1"
|
||||
}
|
||||
},
|
||||
"AsmResolver.PE": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0-beta.1",
|
||||
"contentHash": "KadLvx/zzFCJyF+E4jG6jPE1d0iJquzL6+hm8GBivBAs6nwHC8s6g4c857QwQCzXMWza6Vz5Q+3hFiNuOfKaWQ==",
|
||||
"dependencies": {
|
||||
"AsmResolver.PE.File": "6.0.0-beta.1"
|
||||
}
|
||||
},
|
||||
"AsmResolver.PE.File": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0-beta.1",
|
||||
"contentHash": "+lusB9UMHevI5aQsu73NQ1ctPMLFvyHAsEf8vjaJ/py+kX1DkU0JkbERtBRmaf58/hBZ7cyrE7gFnjoo7Bbg7A==",
|
||||
"dependencies": {
|
||||
"AsmResolver": "6.0.0-beta.1"
|
||||
}
|
||||
},
|
||||
"AssetRipper.CIL": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.1.0",
|
||||
"contentHash": "nSz1cBjgVeKv+esfDtyQGC1mY9b4C4NFStytdoa9DMozDC8uth6930kAsuWZEivj9GqWSqENnaQUGnl23WpmnQ==",
|
||||
"dependencies": {
|
||||
"AsmResolver.DotNet": "6.0.0-beta.1"
|
||||
}
|
||||
},
|
||||
"AssetRipper.Gee.External.Capstone": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.3.2",
|
||||
"contentHash": "wOr5PQPL/2ZfD7+ebt6cpRbUhSzSY5nlHGHjjzuQRiU5zkQlqQNwWDLX0M3smrm5IkaDvONkmDjFMKTlZJmyuQ=="
|
||||
},
|
||||
"AssetRipper.Primitives": {
|
||||
"type": "Transitive",
|
||||
"resolved": "3.1.3",
|
||||
"contentHash": "djZbN/+EXmI+Oia9Pm0LyjZVCPLf60TPSL5rGb7mBEYM5F4CN3nPFXvl2yA5LanPZoHS1Yq7PghGUmkP7Pv9RQ=="
|
||||
},
|
||||
"BepInEx.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0-be.663",
|
||||
"contentHash": "yTlqwieyV3FCzSo4tfiIlS7pTqVtEZwrwHnograkWO4loECeYpShcpoCoxnhQ0vkWsnWGThMK7NodHhjZ+jQDA==",
|
||||
"resolved": "6.0.0-be.733",
|
||||
"contentHash": "uRzpyUdU3L8Y4ZW+ZnF73orq0E40MjGK6XcPzm24CrrWB5bUshwdrtFQfrwZB6jcZVNVV6PXE92hScEI+Jaoqw==",
|
||||
"dependencies": {
|
||||
"HarmonyX": "2.10.1",
|
||||
"MonoMod.Utils": "22.5.1.1",
|
||||
"HarmonyX": "2.10.2",
|
||||
"MonoMod.Utils": "22.7.31.1",
|
||||
"SemanticVersioning": "2.0.2"
|
||||
}
|
||||
},
|
||||
"BepInEx.Unity.Common": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0-be.663",
|
||||
"contentHash": "kxv0yXJQ7YPzUQzlwkpVzmTkdd87kVcQhMjkrwqpowJ0Yx5vEwPUrRyG/pwMH5/cK+2WHCn/2akGWrW0C4vUAQ==",
|
||||
"resolved": "6.0.0-be.733",
|
||||
"contentHash": "KfdiHVSOPnIbDEF7zLPTSXDjKqIEq7SgffqFFKIxOBkCws7LdtSRQsamUcxdD0H8yopcgdlqobIp6t8e4M/k9Q==",
|
||||
"dependencies": {
|
||||
"AssetRipper.VersionUtilities": "1.2.1",
|
||||
"MonoMod.Utils": "22.5.1.1"
|
||||
"AssetRipper.Primitives": "3.1.3",
|
||||
"MonoMod.Utils": "22.7.31.1"
|
||||
}
|
||||
},
|
||||
"Disarm": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.1.0-master.34",
|
||||
"contentHash": "sxzTci5eSdl+sFoaGsMZIp7X/eB5ZzplM3CppvD1CWoiZ8rSa43XGLC19G5e8n6mjutNBfN9yL+RER5PCspHFg=="
|
||||
},
|
||||
"HarmonyX": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.10.1",
|
||||
"contentHash": "9LodMC9Y0u1TW96eKJoWrFJFpmzbgojEO38/Q+e7c1mFPhmHt8xcR8qhI06iF1rf0Dnsk+hqENFVSgbtwl/bEw==",
|
||||
"resolved": "2.10.2",
|
||||
"contentHash": "/5WwkxXX8mPsRuigQt957rJGx1f0dDQxk+bvk4yYITKFjXas9Em+O71zEP8X0ym8OFQQ2XH/2SxS4NC7vEC+Xg==",
|
||||
"dependencies": {
|
||||
"MonoMod.RuntimeDetour": "22.3.23.4",
|
||||
"System.Reflection.Emit": "4.7.0"
|
||||
@@ -81,13 +128,13 @@
|
||||
},
|
||||
"Iced": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.17.0",
|
||||
"contentHash": "8x+HCVTl/HHTGpscH3vMBhV8sknN/muZFw9s3TsI8SA6+c43cOTCi2+jE4KsU8pNLbJ++iF2ZFcpcXHXtDglnw=="
|
||||
"resolved": "1.21.0",
|
||||
"contentHash": "dv5+81Q1TBQvVMSOOOmRcjJmvWcX3BZPZsIq31+RLc5cNft0IHAyNlkdb7ZarOWG913PyBoFDsDXoCIlKmLclg=="
|
||||
},
|
||||
"Il2CppInterop.Common": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.4.0",
|
||||
"contentHash": "xl60qoa1nImG6qgOQcjSDW46nLQHoRvSWE7QTDQz7XeMsGwOxAbgDtOvJ4gOvoLijTU79gFZYe8H1CM7TcTQ5g==",
|
||||
"resolved": "1.4.6-ci.426",
|
||||
"contentHash": "pI0kU0qqJKMP6z9eFz4+WJtGIwklfPxW2yWEY9vKnrN9bbYMusK3v5uFWV8al7S/HPSATV5jNWH1hyTvP7kglA==",
|
||||
"dependencies": {
|
||||
"Iced": "1.17.0",
|
||||
"Microsoft.Extensions.Logging.Abstractions": "6.0.1",
|
||||
@@ -96,41 +143,31 @@
|
||||
},
|
||||
"Il2CppInterop.Generator": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.4.0",
|
||||
"contentHash": "Q4QqkwQroDwwqB17/DRF6hbHQRIuyLksgxVUEDvXZ3T+ogkrZB9h0Ev36alN0f6e7fcZPRkMrpXOAYwZzPiZag==",
|
||||
"resolved": "1.4.6-ci.426",
|
||||
"contentHash": "kecdx/vbNl0RtfzfYW592jU8PMyq1JbzpvoJSvqwO+tV6icp9SljXy6yG8bT/wt0gaPj9mFUNDTe2Wu6M6XGZQ==",
|
||||
"dependencies": {
|
||||
"Il2CppInterop.Common": "1.4.0",
|
||||
"Il2CppInterop.Common": "1.4.6-ci.426",
|
||||
"Mono.Cecil": "0.11.3"
|
||||
}
|
||||
},
|
||||
"Il2CppInterop.HarmonySupport": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.4.0",
|
||||
"contentHash": "Uz4w5PbQ3kLXqUrsQxR35f7xMpfnxLiXthVtNaT3fvHXC8B7arjuBZXeCbcozr6dXFJBDa5W0EElBmH0fWoASg==",
|
||||
"resolved": "1.4.6-ci.426",
|
||||
"contentHash": "rd2T5o6SybIc12hmX3HktTF5n27hFb0w4mNSExq7h1YsmrNlt7x+Ac1MBnnB0JwPLIg7w8LjnKjoIX6Gf626ng==",
|
||||
"dependencies": {
|
||||
"HarmonyX": "2.10.0",
|
||||
"Il2CppInterop.Runtime": "1.4.0"
|
||||
"Il2CppInterop.Runtime": "1.4.6-ci.426"
|
||||
}
|
||||
},
|
||||
"Il2CppInterop.Runtime": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.4.0",
|
||||
"contentHash": "ScgsFlbJ3gj5f69As/GT8pSO2WlS7cOeS/n3h4gBqJ01Eq/Lm+s3FBrGpEiuIWALOgmtQYimhjWVpxRt7LYtGw==",
|
||||
"resolved": "1.4.6-ci.426",
|
||||
"contentHash": "0O0oI7gOqJixrsjvh1firhuGYK3Yr0uDLp6Q+t5CfcTMmeEX8Plk3pqAP9ZYyilBvh7uW0gv4Golqz08L1GXug==",
|
||||
"dependencies": {
|
||||
"Iced": "1.17.0",
|
||||
"Il2CppInterop.Common": "1.4.0"
|
||||
"Il2CppInterop.Common": "1.4.6-ci.426"
|
||||
}
|
||||
},
|
||||
"IndexRange": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.0.0",
|
||||
"contentHash": "6TgS1JLSUkpmPLfXBPaAgB39ZUix8E4soXWk2XSDcscVe84i1JKzIAtA7jHbRHSkOOrcr6YA0MpLCeq98y9mYQ=="
|
||||
},
|
||||
"js6pak.Gee.External.Capstone": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.1.0",
|
||||
"contentHash": "YYpq7NM50bSSVUDjXyV/eiITk6syXqItPjKBOb3jEWS6RFsk0DNhpWMPW6b3hKDmArARuWDU6S2pVu1IeVrvIA=="
|
||||
},
|
||||
"Microsoft.Extensions.Logging.Abstractions": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.1",
|
||||
@@ -153,11 +190,11 @@
|
||||
},
|
||||
"MonoMod.RuntimeDetour": {
|
||||
"type": "Transitive",
|
||||
"resolved": "22.5.1.1",
|
||||
"contentHash": "WG5zLRuAr8KJEnIkKTuIG1OJCrGIT3pjvnAD43E0FDchHf3Dp985MF/8tmIQvAzCZV87JNs6QKeGGqmwDmpXpw==",
|
||||
"resolved": "22.7.31.1",
|
||||
"contentHash": "nxVJTvQbWAujaogt5XX3eAy7d22t66Z88aWg9sirPLO9rR/6yNCHAyZpgxXrOsIobZVW0IEZPqNMOBhgke25/w==",
|
||||
"dependencies": {
|
||||
"Mono.Cecil": "0.11.4",
|
||||
"MonoMod.Utils": "22.5.1.1",
|
||||
"MonoMod.Utils": "22.7.31.1",
|
||||
"System.Collections.NonGeneric": "4.3.0",
|
||||
"System.ComponentModel.TypeConverter": "4.3.0",
|
||||
"System.IO.FileSystem.Primitives": "4.3.0",
|
||||
@@ -168,8 +205,8 @@
|
||||
},
|
||||
"MonoMod.Utils": {
|
||||
"type": "Transitive",
|
||||
"resolved": "22.5.1.1",
|
||||
"contentHash": "vBObO1atXxhi2C4AuC53y87Bqeogi9xIrD1Ym3YWr5uxc8Nrm8SrsFeD1i3x04R999+XQ3FdeHrbXScyWYEHqQ==",
|
||||
"resolved": "22.7.31.1",
|
||||
"contentHash": "nI0E1oadXS1iMbfwfCzYF08C1jRQR9cnnHv66a4BSPd4sGu2p6g4BmctCWsdAB6oGKkSJUhcfHfxcfTsDyB94Q==",
|
||||
"dependencies": {
|
||||
"Mono.Cecil": "0.11.4",
|
||||
"System.Collections.NonGeneric": "4.3.0",
|
||||
@@ -280,42 +317,46 @@
|
||||
},
|
||||
"Samboy063.Cpp2IL.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.0.7.2",
|
||||
"contentHash": "e17CAhKSxdAp7vFcYEVxjSc7t7rcvVGBipGhgE9tAjRXY85wZXLlHEVO0AEvMRkLmf9U+if4wK/nZEC1AX6VqQ==",
|
||||
"resolved": "2022.1.0-pre-release.18",
|
||||
"contentHash": "eX9d1IK05jWaEaeuMAE0L5WYHT7thtxz+aWLL/CAaCzZ0TzRPD+WFTjJ0KQO0YWBVO300CX3GwmPmf7TNO+wUg==",
|
||||
"dependencies": {
|
||||
"HarmonyX": "2.5.5",
|
||||
"Iced": "1.11.1",
|
||||
"IndexRange": "1.0.0",
|
||||
"Mono.Cecil": "0.11.4",
|
||||
"Samboy063.LibCpp2IL": "2022.0.7.2",
|
||||
"System.Runtime.InteropServices": "4.3.0",
|
||||
"System.ValueTuple": "4.5.0",
|
||||
"js6pak.Gee.External.Capstone": "2.1.0"
|
||||
"AsmResolver.DotNet": "6.0.0-beta.1",
|
||||
"AssetRipper.CIL": "1.1.0",
|
||||
"AssetRipper.Gee.External.Capstone": "2.3.2",
|
||||
"Disarm": "2022.1.0-master.34",
|
||||
"Iced": "1.21.0",
|
||||
"Samboy063.LibCpp2IL": "2022.1.0-pre-release.18",
|
||||
"StableNameDotNet": "0.1.0-pre-release.15"
|
||||
}
|
||||
},
|
||||
"Samboy063.LibCpp2IL": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.0.7.2",
|
||||
"contentHash": "DpVeU0dQkUJCpbw0f1xKOG8vimdK2oYhrVABC7HDE3/ikGjhnMZd3i5b1joKDHZ+AiL90TWOaEXPcy24rCZ0dA==",
|
||||
"resolved": "2022.1.0-pre-release.18",
|
||||
"contentHash": "9zJdTAeErpwJpYDHYwwI0MAC1OyBEfC1ce7dpAOYRUUYCfeaKVWxnSCcyaoY6HDzIoxPkhbfllbwOe49ZmUYuQ==",
|
||||
"dependencies": {
|
||||
"IndexRange": "1.0.0",
|
||||
"Samboy063.WasmDisassembler": "2022.0.2"
|
||||
"AssetRipper.Primitives": "3.1.2",
|
||||
"Samboy063.WasmDisassembler": "2022.1.0-pre-release.15"
|
||||
}
|
||||
},
|
||||
"Samboy063.WasmDisassembler": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.0.2",
|
||||
"contentHash": "2uu+xBb7M3HKfBx9tAY6jiDieAf0hRnQjSmGX+7IdE6i24dYsx6TYgtrLvRx5lOuF2M8DijZ5H8yQ1pcuCs2SA=="
|
||||
"resolved": "2022.1.0-pre-release.15",
|
||||
"contentHash": "e6qw81SHS+fS7iZ3qfqZBavVarYbkPElNgDCANF6dNFTYq5+hc80am+4FqQDl+ZVNS47bZDZobxIzHhmriCXGg=="
|
||||
},
|
||||
"SemanticVersioning": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.0.2",
|
||||
"contentHash": "4EQgYdNZ92SyaO7YFk6olVnebF5V+jrHyMUjvPq89tLeMo8NSfgDF+6Zwq/lgh9j/0yfQp9Lkm0ZA0rUATCZFA=="
|
||||
},
|
||||
"StableNameDotNet": {
|
||||
"type": "Transitive",
|
||||
"resolved": "0.1.0-pre-release.15",
|
||||
"contentHash": "aIkEOo8V76vE+9CppHpTFLGXalBw6TAl4/tb6vadmS+gHJMshTVehzQv9cJXy4xZDdANV1uGMRaUFZERcDA2xQ=="
|
||||
},
|
||||
"StyleCop.Analyzers.Unstable": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.2.0.435",
|
||||
"contentHash": "ouwPWZxbOV3SmCZxIRqHvljkSzkCyi1tDoMzQtDb/bRP8ctASV/iRJr+A2Gdj0QLaLmWnqTWDrH82/iP+X80Lg=="
|
||||
"resolved": "1.2.0.556",
|
||||
"contentHash": "zvn9Mqs/ox/83cpYPignI8hJEM2A93s2HkHs8HYMOAQW0PkampyoErAiIyKxgTLqbbad29HX/shv/6LGSjPJNQ=="
|
||||
},
|
||||
"System.Collections": {
|
||||
"type": "Transitive",
|
||||
@@ -859,15 +900,10 @@
|
||||
"System.Runtime": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.ValueTuple": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.5.0",
|
||||
"contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ=="
|
||||
},
|
||||
"reactor": {
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"BepInEx.Unity.IL2CPP": "[6.0.0-be.663, )"
|
||||
"BepInEx.Unity.IL2CPP": "[6.0.0-be.733, )"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,6 +25,8 @@ public partial class ExamplePlugin : BasePlugin
|
||||
|
||||
public override void Load()
|
||||
{
|
||||
ReactorCredits.Register<ExamplePlugin>(ReactorCredits.AlwaysShow);
|
||||
|
||||
this.AddComponent<ExampleComponent>();
|
||||
|
||||
_helloStringName = CustomStringName.CreateAndRegister("Hello!");
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
"net6.0": {
|
||||
"AmongUs.GameLibs.Steam": {
|
||||
"type": "Direct",
|
||||
"requested": "[2022.12.8, )",
|
||||
"resolved": "2022.12.8",
|
||||
"contentHash": "IJsIi89xUYRvA54YtNVEJjf25hhF3LWzkNBslKCNDUpL1aQ/PhNyO4j18pO71DCgW/qr1P1j8+CwByuBLsInNA=="
|
||||
"requested": "[2025.3.25, )",
|
||||
"resolved": "2025.3.25",
|
||||
"contentHash": "2QxQXgZDcQOdAIDXrNLrQ7veEzD6EBzuaRjzSbHptWUPUsuVc3I5Ur3xMkPPwmSGsDHjLuAGE84yRjV6oJxGxw=="
|
||||
},
|
||||
"BepInEx.AutoPlugin": {
|
||||
"type": "Direct",
|
||||
@@ -22,58 +22,105 @@
|
||||
},
|
||||
"BepInEx.Unity.IL2CPP": {
|
||||
"type": "Direct",
|
||||
"requested": "[6.0.0-be.663, )",
|
||||
"resolved": "6.0.0-be.663",
|
||||
"contentHash": "J+mZ4svyTt4ZYbUoPwpVtF5QCGfzC42VuYJ7z1K6Qt8YlBEZx3rnmUmaEnoJIqN5wN7BSnQgzEmrRfdbrgtTnA==",
|
||||
"requested": "[6.0.0-be.733, )",
|
||||
"resolved": "6.0.0-be.733",
|
||||
"contentHash": "lnoGaPHjIdGfEiKtf89knaTdLXe4IUqVLdoYqW8NYhhNqgxa3oNwScjTmuYQpa4Leew3937+slq2WIjvX/DUwQ==",
|
||||
"dependencies": {
|
||||
"BepInEx.Core": "6.0.0-be.663",
|
||||
"BepInEx.Unity.Common": "6.0.0-be.663",
|
||||
"HarmonyX": "2.10.1",
|
||||
"Iced": "1.17.0",
|
||||
"Il2CppInterop.Generator": "1.4.0",
|
||||
"Il2CppInterop.HarmonySupport": "1.4.0",
|
||||
"Il2CppInterop.Runtime": "1.4.0",
|
||||
"MonoMod.RuntimeDetour": "22.5.1.1",
|
||||
"Samboy063.Cpp2IL.Core": "2022.0.7.2"
|
||||
"BepInEx.Core": "6.0.0-be.733",
|
||||
"BepInEx.Unity.Common": "6.0.0-be.733",
|
||||
"HarmonyX": "2.10.2",
|
||||
"Iced": "1.21.0",
|
||||
"Il2CppInterop.Generator": "1.4.6-ci.426",
|
||||
"Il2CppInterop.HarmonySupport": "1.4.6-ci.426",
|
||||
"Il2CppInterop.Runtime": "1.4.6-ci.426",
|
||||
"MonoMod.RuntimeDetour": "22.7.31.1",
|
||||
"Samboy063.Cpp2IL.Core": "2022.1.0-pre-release.18"
|
||||
}
|
||||
},
|
||||
"StyleCop.Analyzers": {
|
||||
"type": "Direct",
|
||||
"requested": "[1.2.0-beta.435, )",
|
||||
"resolved": "1.2.0-beta.435",
|
||||
"contentHash": "TADk7vdGXtfTnYCV7GyleaaRTQjfoSfZXprQrVMm7cSJtJbFc1QIbWPyLvrgrfGdfHbGmUPvaN4ODKNxg2jgPQ==",
|
||||
"requested": "[1.2.0-beta.556, )",
|
||||
"resolved": "1.2.0-beta.556",
|
||||
"contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==",
|
||||
"dependencies": {
|
||||
"StyleCop.Analyzers.Unstable": "1.2.0.435"
|
||||
"StyleCop.Analyzers.Unstable": "1.2.0.556"
|
||||
}
|
||||
},
|
||||
"AssetRipper.VersionUtilities": {
|
||||
"AsmResolver": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.2.1",
|
||||
"contentHash": "knQ/W1YwTZS2AbdaZh+nhyyBEZQPQDcahhSOnh88i+cdg4/FEoFJiCwaavgFvCMNuUeHTbcZc4qttF8WQ8xLIA=="
|
||||
"resolved": "6.0.0-beta.1",
|
||||
"contentHash": "M5btCR/rmrx32jZsoN6CLQ/VQk8lN8hvPb6lgojua7pjNoo7StAl92koMC8qz4vzZyH2CNqxLSDoswRvyyK/vA=="
|
||||
},
|
||||
"AsmResolver.DotNet": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0-beta.1",
|
||||
"contentHash": "PTq8nNQvhgTxF1iARCknffCsu7Iq9B0kN7TVC8iMaU7uEYog3xvVqH/0+TreY8GW74/+MqhZt/yEFsvS4oAduQ==",
|
||||
"dependencies": {
|
||||
"AsmResolver.PE": "6.0.0-beta.1"
|
||||
}
|
||||
},
|
||||
"AsmResolver.PE": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0-beta.1",
|
||||
"contentHash": "KadLvx/zzFCJyF+E4jG6jPE1d0iJquzL6+hm8GBivBAs6nwHC8s6g4c857QwQCzXMWza6Vz5Q+3hFiNuOfKaWQ==",
|
||||
"dependencies": {
|
||||
"AsmResolver.PE.File": "6.0.0-beta.1"
|
||||
}
|
||||
},
|
||||
"AsmResolver.PE.File": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0-beta.1",
|
||||
"contentHash": "+lusB9UMHevI5aQsu73NQ1ctPMLFvyHAsEf8vjaJ/py+kX1DkU0JkbERtBRmaf58/hBZ7cyrE7gFnjoo7Bbg7A==",
|
||||
"dependencies": {
|
||||
"AsmResolver": "6.0.0-beta.1"
|
||||
}
|
||||
},
|
||||
"AssetRipper.CIL": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.1.0",
|
||||
"contentHash": "nSz1cBjgVeKv+esfDtyQGC1mY9b4C4NFStytdoa9DMozDC8uth6930kAsuWZEivj9GqWSqENnaQUGnl23WpmnQ==",
|
||||
"dependencies": {
|
||||
"AsmResolver.DotNet": "6.0.0-beta.1"
|
||||
}
|
||||
},
|
||||
"AssetRipper.Gee.External.Capstone": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.3.2",
|
||||
"contentHash": "wOr5PQPL/2ZfD7+ebt6cpRbUhSzSY5nlHGHjjzuQRiU5zkQlqQNwWDLX0M3smrm5IkaDvONkmDjFMKTlZJmyuQ=="
|
||||
},
|
||||
"AssetRipper.Primitives": {
|
||||
"type": "Transitive",
|
||||
"resolved": "3.1.3",
|
||||
"contentHash": "djZbN/+EXmI+Oia9Pm0LyjZVCPLf60TPSL5rGb7mBEYM5F4CN3nPFXvl2yA5LanPZoHS1Yq7PghGUmkP7Pv9RQ=="
|
||||
},
|
||||
"BepInEx.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0-be.663",
|
||||
"contentHash": "yTlqwieyV3FCzSo4tfiIlS7pTqVtEZwrwHnograkWO4loECeYpShcpoCoxnhQ0vkWsnWGThMK7NodHhjZ+jQDA==",
|
||||
"resolved": "6.0.0-be.733",
|
||||
"contentHash": "uRzpyUdU3L8Y4ZW+ZnF73orq0E40MjGK6XcPzm24CrrWB5bUshwdrtFQfrwZB6jcZVNVV6PXE92hScEI+Jaoqw==",
|
||||
"dependencies": {
|
||||
"HarmonyX": "2.10.1",
|
||||
"MonoMod.Utils": "22.5.1.1",
|
||||
"HarmonyX": "2.10.2",
|
||||
"MonoMod.Utils": "22.7.31.1",
|
||||
"SemanticVersioning": "2.0.2"
|
||||
}
|
||||
},
|
||||
"BepInEx.Unity.Common": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0-be.663",
|
||||
"contentHash": "kxv0yXJQ7YPzUQzlwkpVzmTkdd87kVcQhMjkrwqpowJ0Yx5vEwPUrRyG/pwMH5/cK+2WHCn/2akGWrW0C4vUAQ==",
|
||||
"resolved": "6.0.0-be.733",
|
||||
"contentHash": "KfdiHVSOPnIbDEF7zLPTSXDjKqIEq7SgffqFFKIxOBkCws7LdtSRQsamUcxdD0H8yopcgdlqobIp6t8e4M/k9Q==",
|
||||
"dependencies": {
|
||||
"AssetRipper.VersionUtilities": "1.2.1",
|
||||
"MonoMod.Utils": "22.5.1.1"
|
||||
"AssetRipper.Primitives": "3.1.3",
|
||||
"MonoMod.Utils": "22.7.31.1"
|
||||
}
|
||||
},
|
||||
"Disarm": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.1.0-master.34",
|
||||
"contentHash": "sxzTci5eSdl+sFoaGsMZIp7X/eB5ZzplM3CppvD1CWoiZ8rSa43XGLC19G5e8n6mjutNBfN9yL+RER5PCspHFg=="
|
||||
},
|
||||
"HarmonyX": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.10.1",
|
||||
"contentHash": "9LodMC9Y0u1TW96eKJoWrFJFpmzbgojEO38/Q+e7c1mFPhmHt8xcR8qhI06iF1rf0Dnsk+hqENFVSgbtwl/bEw==",
|
||||
"resolved": "2.10.2",
|
||||
"contentHash": "/5WwkxXX8mPsRuigQt957rJGx1f0dDQxk+bvk4yYITKFjXas9Em+O71zEP8X0ym8OFQQ2XH/2SxS4NC7vEC+Xg==",
|
||||
"dependencies": {
|
||||
"MonoMod.RuntimeDetour": "22.3.23.4",
|
||||
"System.Reflection.Emit": "4.7.0"
|
||||
@@ -81,13 +128,13 @@
|
||||
},
|
||||
"Iced": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.17.0",
|
||||
"contentHash": "8x+HCVTl/HHTGpscH3vMBhV8sknN/muZFw9s3TsI8SA6+c43cOTCi2+jE4KsU8pNLbJ++iF2ZFcpcXHXtDglnw=="
|
||||
"resolved": "1.21.0",
|
||||
"contentHash": "dv5+81Q1TBQvVMSOOOmRcjJmvWcX3BZPZsIq31+RLc5cNft0IHAyNlkdb7ZarOWG913PyBoFDsDXoCIlKmLclg=="
|
||||
},
|
||||
"Il2CppInterop.Common": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.4.0",
|
||||
"contentHash": "xl60qoa1nImG6qgOQcjSDW46nLQHoRvSWE7QTDQz7XeMsGwOxAbgDtOvJ4gOvoLijTU79gFZYe8H1CM7TcTQ5g==",
|
||||
"resolved": "1.4.6-ci.426",
|
||||
"contentHash": "pI0kU0qqJKMP6z9eFz4+WJtGIwklfPxW2yWEY9vKnrN9bbYMusK3v5uFWV8al7S/HPSATV5jNWH1hyTvP7kglA==",
|
||||
"dependencies": {
|
||||
"Iced": "1.17.0",
|
||||
"Microsoft.Extensions.Logging.Abstractions": "6.0.1",
|
||||
@@ -96,41 +143,31 @@
|
||||
},
|
||||
"Il2CppInterop.Generator": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.4.0",
|
||||
"contentHash": "Q4QqkwQroDwwqB17/DRF6hbHQRIuyLksgxVUEDvXZ3T+ogkrZB9h0Ev36alN0f6e7fcZPRkMrpXOAYwZzPiZag==",
|
||||
"resolved": "1.4.6-ci.426",
|
||||
"contentHash": "kecdx/vbNl0RtfzfYW592jU8PMyq1JbzpvoJSvqwO+tV6icp9SljXy6yG8bT/wt0gaPj9mFUNDTe2Wu6M6XGZQ==",
|
||||
"dependencies": {
|
||||
"Il2CppInterop.Common": "1.4.0",
|
||||
"Il2CppInterop.Common": "1.4.6-ci.426",
|
||||
"Mono.Cecil": "0.11.3"
|
||||
}
|
||||
},
|
||||
"Il2CppInterop.HarmonySupport": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.4.0",
|
||||
"contentHash": "Uz4w5PbQ3kLXqUrsQxR35f7xMpfnxLiXthVtNaT3fvHXC8B7arjuBZXeCbcozr6dXFJBDa5W0EElBmH0fWoASg==",
|
||||
"resolved": "1.4.6-ci.426",
|
||||
"contentHash": "rd2T5o6SybIc12hmX3HktTF5n27hFb0w4mNSExq7h1YsmrNlt7x+Ac1MBnnB0JwPLIg7w8LjnKjoIX6Gf626ng==",
|
||||
"dependencies": {
|
||||
"HarmonyX": "2.10.0",
|
||||
"Il2CppInterop.Runtime": "1.4.0"
|
||||
"Il2CppInterop.Runtime": "1.4.6-ci.426"
|
||||
}
|
||||
},
|
||||
"Il2CppInterop.Runtime": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.4.0",
|
||||
"contentHash": "ScgsFlbJ3gj5f69As/GT8pSO2WlS7cOeS/n3h4gBqJ01Eq/Lm+s3FBrGpEiuIWALOgmtQYimhjWVpxRt7LYtGw==",
|
||||
"resolved": "1.4.6-ci.426",
|
||||
"contentHash": "0O0oI7gOqJixrsjvh1firhuGYK3Yr0uDLp6Q+t5CfcTMmeEX8Plk3pqAP9ZYyilBvh7uW0gv4Golqz08L1GXug==",
|
||||
"dependencies": {
|
||||
"Iced": "1.17.0",
|
||||
"Il2CppInterop.Common": "1.4.0"
|
||||
"Il2CppInterop.Common": "1.4.6-ci.426"
|
||||
}
|
||||
},
|
||||
"IndexRange": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.0.0",
|
||||
"contentHash": "6TgS1JLSUkpmPLfXBPaAgB39ZUix8E4soXWk2XSDcscVe84i1JKzIAtA7jHbRHSkOOrcr6YA0MpLCeq98y9mYQ=="
|
||||
},
|
||||
"js6pak.Gee.External.Capstone": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.1.0",
|
||||
"contentHash": "YYpq7NM50bSSVUDjXyV/eiITk6syXqItPjKBOb3jEWS6RFsk0DNhpWMPW6b3hKDmArARuWDU6S2pVu1IeVrvIA=="
|
||||
},
|
||||
"Microsoft.Extensions.Logging.Abstractions": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.1",
|
||||
@@ -153,11 +190,11 @@
|
||||
},
|
||||
"MonoMod.RuntimeDetour": {
|
||||
"type": "Transitive",
|
||||
"resolved": "22.5.1.1",
|
||||
"contentHash": "WG5zLRuAr8KJEnIkKTuIG1OJCrGIT3pjvnAD43E0FDchHf3Dp985MF/8tmIQvAzCZV87JNs6QKeGGqmwDmpXpw==",
|
||||
"resolved": "22.7.31.1",
|
||||
"contentHash": "nxVJTvQbWAujaogt5XX3eAy7d22t66Z88aWg9sirPLO9rR/6yNCHAyZpgxXrOsIobZVW0IEZPqNMOBhgke25/w==",
|
||||
"dependencies": {
|
||||
"Mono.Cecil": "0.11.4",
|
||||
"MonoMod.Utils": "22.5.1.1",
|
||||
"MonoMod.Utils": "22.7.31.1",
|
||||
"System.Collections.NonGeneric": "4.3.0",
|
||||
"System.ComponentModel.TypeConverter": "4.3.0",
|
||||
"System.IO.FileSystem.Primitives": "4.3.0",
|
||||
@@ -168,8 +205,8 @@
|
||||
},
|
||||
"MonoMod.Utils": {
|
||||
"type": "Transitive",
|
||||
"resolved": "22.5.1.1",
|
||||
"contentHash": "vBObO1atXxhi2C4AuC53y87Bqeogi9xIrD1Ym3YWr5uxc8Nrm8SrsFeD1i3x04R999+XQ3FdeHrbXScyWYEHqQ==",
|
||||
"resolved": "22.7.31.1",
|
||||
"contentHash": "nI0E1oadXS1iMbfwfCzYF08C1jRQR9cnnHv66a4BSPd4sGu2p6g4BmctCWsdAB6oGKkSJUhcfHfxcfTsDyB94Q==",
|
||||
"dependencies": {
|
||||
"Mono.Cecil": "0.11.4",
|
||||
"System.Collections.NonGeneric": "4.3.0",
|
||||
@@ -280,42 +317,46 @@
|
||||
},
|
||||
"Samboy063.Cpp2IL.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.0.7.2",
|
||||
"contentHash": "e17CAhKSxdAp7vFcYEVxjSc7t7rcvVGBipGhgE9tAjRXY85wZXLlHEVO0AEvMRkLmf9U+if4wK/nZEC1AX6VqQ==",
|
||||
"resolved": "2022.1.0-pre-release.18",
|
||||
"contentHash": "eX9d1IK05jWaEaeuMAE0L5WYHT7thtxz+aWLL/CAaCzZ0TzRPD+WFTjJ0KQO0YWBVO300CX3GwmPmf7TNO+wUg==",
|
||||
"dependencies": {
|
||||
"HarmonyX": "2.5.5",
|
||||
"Iced": "1.11.1",
|
||||
"IndexRange": "1.0.0",
|
||||
"Mono.Cecil": "0.11.4",
|
||||
"Samboy063.LibCpp2IL": "2022.0.7.2",
|
||||
"System.Runtime.InteropServices": "4.3.0",
|
||||
"System.ValueTuple": "4.5.0",
|
||||
"js6pak.Gee.External.Capstone": "2.1.0"
|
||||
"AsmResolver.DotNet": "6.0.0-beta.1",
|
||||
"AssetRipper.CIL": "1.1.0",
|
||||
"AssetRipper.Gee.External.Capstone": "2.3.2",
|
||||
"Disarm": "2022.1.0-master.34",
|
||||
"Iced": "1.21.0",
|
||||
"Samboy063.LibCpp2IL": "2022.1.0-pre-release.18",
|
||||
"StableNameDotNet": "0.1.0-pre-release.15"
|
||||
}
|
||||
},
|
||||
"Samboy063.LibCpp2IL": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.0.7.2",
|
||||
"contentHash": "DpVeU0dQkUJCpbw0f1xKOG8vimdK2oYhrVABC7HDE3/ikGjhnMZd3i5b1joKDHZ+AiL90TWOaEXPcy24rCZ0dA==",
|
||||
"resolved": "2022.1.0-pre-release.18",
|
||||
"contentHash": "9zJdTAeErpwJpYDHYwwI0MAC1OyBEfC1ce7dpAOYRUUYCfeaKVWxnSCcyaoY6HDzIoxPkhbfllbwOe49ZmUYuQ==",
|
||||
"dependencies": {
|
||||
"IndexRange": "1.0.0",
|
||||
"Samboy063.WasmDisassembler": "2022.0.2"
|
||||
"AssetRipper.Primitives": "3.1.2",
|
||||
"Samboy063.WasmDisassembler": "2022.1.0-pre-release.15"
|
||||
}
|
||||
},
|
||||
"Samboy063.WasmDisassembler": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.0.2",
|
||||
"contentHash": "2uu+xBb7M3HKfBx9tAY6jiDieAf0hRnQjSmGX+7IdE6i24dYsx6TYgtrLvRx5lOuF2M8DijZ5H8yQ1pcuCs2SA=="
|
||||
"resolved": "2022.1.0-pre-release.15",
|
||||
"contentHash": "e6qw81SHS+fS7iZ3qfqZBavVarYbkPElNgDCANF6dNFTYq5+hc80am+4FqQDl+ZVNS47bZDZobxIzHhmriCXGg=="
|
||||
},
|
||||
"SemanticVersioning": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.0.2",
|
||||
"contentHash": "4EQgYdNZ92SyaO7YFk6olVnebF5V+jrHyMUjvPq89tLeMo8NSfgDF+6Zwq/lgh9j/0yfQp9Lkm0ZA0rUATCZFA=="
|
||||
},
|
||||
"StableNameDotNet": {
|
||||
"type": "Transitive",
|
||||
"resolved": "0.1.0-pre-release.15",
|
||||
"contentHash": "aIkEOo8V76vE+9CppHpTFLGXalBw6TAl4/tb6vadmS+gHJMshTVehzQv9cJXy4xZDdANV1uGMRaUFZERcDA2xQ=="
|
||||
},
|
||||
"StyleCop.Analyzers.Unstable": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.2.0.435",
|
||||
"contentHash": "ouwPWZxbOV3SmCZxIRqHvljkSzkCyi1tDoMzQtDb/bRP8ctASV/iRJr+A2Gdj0QLaLmWnqTWDrH82/iP+X80Lg=="
|
||||
"resolved": "1.2.0.556",
|
||||
"contentHash": "zvn9Mqs/ox/83cpYPignI8hJEM2A93s2HkHs8HYMOAQW0PkampyoErAiIyKxgTLqbbad29HX/shv/6LGSjPJNQ=="
|
||||
},
|
||||
"System.Collections": {
|
||||
"type": "Transitive",
|
||||
@@ -859,15 +900,10 @@
|
||||
"System.Runtime": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.ValueTuple": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.5.0",
|
||||
"contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ=="
|
||||
},
|
||||
"reactor": {
|
||||
"type": "Project",
|
||||
"dependencies": {
|
||||
"BepInEx.Unity.IL2CPP": "[6.0.0-be.663, )"
|
||||
"BepInEx.Unity.IL2CPP": "[6.0.0-be.733, )"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -94,18 +94,18 @@ public readonly struct Mod : IEquatable<Mod>
|
||||
var clientMissing = hostMods.Where(mod => mod.IsRequiredOnAllClients && !clientMods.Contains(mod)).ToArray();
|
||||
var hostMissing = clientMods.Where(mod => mod.IsRequiredOnAllClients && !hostMods.Contains(mod)).ToArray();
|
||||
|
||||
if (clientMissing.Any() || hostMissing.Any())
|
||||
if (clientMissing.Length != 0 || hostMissing.Length != 0)
|
||||
{
|
||||
var message = new StringBuilder();
|
||||
|
||||
if (clientMissing.Any())
|
||||
if (clientMissing.Length != 0)
|
||||
{
|
||||
message.Append("You are missing: ");
|
||||
message.AppendJoin(", ", clientMissing.Select(x => x.ToString()));
|
||||
message.AppendLine();
|
||||
}
|
||||
|
||||
if (hostMissing.Any())
|
||||
if (hostMissing.Length != 0)
|
||||
{
|
||||
message.Append("Host is missing: ");
|
||||
message.AppendJoin(", ", hostMissing.Select(x => x.ToString()));
|
||||
|
||||
@@ -27,4 +27,9 @@ public enum ModFlags : ushort
|
||||
/// Requires the host of the lobby to have the mod.
|
||||
/// </summary>
|
||||
RequireOnHost = 1 << 2,
|
||||
|
||||
/// <summary>
|
||||
/// Notifies the game server that the host has authority over game logic.
|
||||
/// </summary>
|
||||
DisableServerAuthority = 1 << 3,
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
||||
global using AmongUsClient_CoFindGame = AmongUsClient._CoFindGame_d__6;
|
||||
@@ -0,0 +1,35 @@
|
||||
using Reactor.Utilities.UI;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Reactor.Networking;
|
||||
|
||||
internal static class HandshakePopup
|
||||
{
|
||||
public const string Message =
|
||||
"""
|
||||
This server doesn't support Reactor's modded handshake.
|
||||
The lobbies shown could be incompatible with your current mods.
|
||||
For more info see <link=https://reactor.gg/handshake>reactor.gg/handshake</link>
|
||||
""";
|
||||
|
||||
private static ReactorPopup? _popup;
|
||||
|
||||
public static void Show()
|
||||
{
|
||||
if (_popup == null)
|
||||
{
|
||||
_popup = ReactorPopup.Create(nameof(HandshakePopup));
|
||||
_popup.Background.transform.localPosition = new Vector3(0, 0.20f, 0);
|
||||
_popup.Background.size = new Vector2(6.5f, 1.7f);
|
||||
_popup.BackButton.transform.SetLocalY(-0.2f);
|
||||
}
|
||||
|
||||
var message = ReactorConfig.HandshakePopupMessage.Value;
|
||||
if (string.IsNullOrEmpty(message))
|
||||
{
|
||||
message = Message;
|
||||
}
|
||||
|
||||
_popup.Show(message);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
using Reactor.Utilities.UI;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Reactor.Networking;
|
||||
|
||||
internal static class MakePublicDisallowedPopup
|
||||
{
|
||||
public const string Message =
|
||||
"""
|
||||
You can't make public lobbies on servers that don't support modded handshake.
|
||||
For more info see <link=https://reactor.gg/handshake>reactor.gg/handshake</link>
|
||||
""";
|
||||
|
||||
private static ReactorPopup? _popup;
|
||||
|
||||
public static void Show()
|
||||
{
|
||||
if (_popup == null)
|
||||
{
|
||||
_popup = ReactorPopup.Create(nameof(MakePublicDisallowedPopup));
|
||||
_popup.Background.transform.localPosition = new Vector3(0, 0.25f, 0);
|
||||
_popup.Background.size = new Vector2(7.5f, 1.5f);
|
||||
_popup.BackButton.transform.SetLocalY(-0.1f);
|
||||
}
|
||||
|
||||
var message = ReactorConfig.MakePublicDisallowedPopupMessage.Value;
|
||||
if (string.IsNullOrEmpty(message))
|
||||
{
|
||||
message = Message;
|
||||
}
|
||||
|
||||
_popup.Show(message);
|
||||
}
|
||||
}
|
||||
@@ -39,7 +39,8 @@ public static class ModList
|
||||
return _modByPluginType[pluginType];
|
||||
}
|
||||
|
||||
internal static bool IsAnyModIsRequiredOnAllClients { get; private set; }
|
||||
internal static bool IsAnyModRequiredOnAllClients { get; private set; }
|
||||
internal static bool IsAnyModDisableServerAuthority { get; private set; }
|
||||
|
||||
private static readonly Dictionary<uint, Mod> _modByNetId = new();
|
||||
private static readonly Dictionary<Mod, uint> _netIdByMod = new();
|
||||
@@ -100,7 +101,7 @@ public static class ModList
|
||||
.Select(pluginInfo => GetById(pluginInfo.Metadata.GUID))
|
||||
.OrderByDescending(x => x.Id == ReactorPlugin.Id)
|
||||
.ThenBy(x => x.Id, StringComparer.Ordinal)
|
||||
.ToHashSet();
|
||||
.ToArray();
|
||||
|
||||
_modByNetId.Clear();
|
||||
_netIdByMod.Clear();
|
||||
@@ -115,7 +116,8 @@ public static class ModList
|
||||
netId++;
|
||||
}
|
||||
|
||||
IsAnyModIsRequiredOnAllClients = Current.Any(m => m.IsRequiredOnAllClients);
|
||||
IsAnyModRequiredOnAllClients = Current.Any(m => m.IsRequiredOnAllClients);
|
||||
IsAnyModDisableServerAuthority = Current.Any(m => (m.Flags & ModFlags.DisableServerAuthority) != 0);
|
||||
|
||||
var debug = new StringBuilder("Mod list:");
|
||||
foreach (var mod in Current)
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using AmongUs.Data;
|
||||
using BepInEx.Unity.IL2CPP.Utils;
|
||||
using HarmonyLib;
|
||||
using Hazel;
|
||||
using Il2CppInterop.Runtime;
|
||||
@@ -8,6 +10,7 @@ using InnerNet;
|
||||
using Reactor.Networking.Extensions;
|
||||
using Reactor.Networking.Messages;
|
||||
using UnityEngine;
|
||||
using IEnumerator = System.Collections.IEnumerator;
|
||||
|
||||
namespace Reactor.Networking.Patches;
|
||||
|
||||
@@ -26,10 +29,10 @@ internal static class ClientPatches
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(InnerNetClient._HandleGameDataInner_d__39), nameof(InnerNetClient._HandleGameDataInner_d__39.MoveNext))]
|
||||
[HarmonyPatch(typeof(InnerNetClient._HandleGameDataInner_d__41), nameof(InnerNetClient._HandleGameDataInner_d__41.MoveNext))]
|
||||
public static class HandleGameDataInnerPatch
|
||||
{
|
||||
public static bool Prefix(InnerNetClient._HandleGameDataInner_d__39 __instance, ref bool __result)
|
||||
public static bool Prefix(InnerNetClient._HandleGameDataInner_d__41 __instance, ref bool __result)
|
||||
{
|
||||
var innerNetClient = __instance.__4__this;
|
||||
var reader = __instance.reader;
|
||||
@@ -84,23 +87,56 @@ internal static class ClientPatches
|
||||
|
||||
if (innerNetClient.AmHost)
|
||||
{
|
||||
if (reactorClientData == null && ModList.IsAnyModIsRequiredOnAllClients)
|
||||
if (reactorClientData == null && ModList.IsAnyModRequiredOnAllClients)
|
||||
{
|
||||
Warning("Kicking " + clientData.PlayerName + " for not having Reactor installed");
|
||||
IEnumerator CoKick()
|
||||
{
|
||||
var startTime = DateTimeOffset.UtcNow;
|
||||
string? playerName;
|
||||
|
||||
var chatText = clientData.PlayerName + " tried joining without Reactor installed";
|
||||
if (DataManager.Settings.Multiplayer.ChatMode == QuickChatModes.FreeChatOrQuickChat)
|
||||
PlayerControl.LocalPlayer.RpcSendChat(chatText);
|
||||
else
|
||||
HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, chatText);
|
||||
do
|
||||
{
|
||||
yield return null;
|
||||
|
||||
innerNetClient.KickPlayer(clientData.Id, false);
|
||||
if (DateTimeOffset.UtcNow - startTime > TimeSpan.FromSeconds(2))
|
||||
{
|
||||
playerName = "(unknown)";
|
||||
break;
|
||||
}
|
||||
|
||||
__result = false;
|
||||
return false;
|
||||
playerName = GameData.Instance.GetPlayerByClient(clientData)?.PlayerName;
|
||||
} while (string.IsNullOrEmpty(playerName));
|
||||
|
||||
Warning("Kicking " + playerName + " for not having Reactor installed");
|
||||
|
||||
const int ChatMessageLimit = 100;
|
||||
|
||||
var chatText = $"{playerName} tried joining without the following mods:";
|
||||
foreach (var mod in ModList.Current.Where(m => m.IsRequiredOnAllClients))
|
||||
{
|
||||
chatText += $"\n- {mod}";
|
||||
}
|
||||
|
||||
HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, chatText, false);
|
||||
|
||||
if (DataManager.Settings.Multiplayer.ChatMode == QuickChatModes.FreeChatOrQuickChat)
|
||||
{
|
||||
var truncatedChatText = chatText.Length > ChatMessageLimit
|
||||
? chatText[..(ChatMessageLimit - 3)] + "..."
|
||||
: chatText;
|
||||
|
||||
// Write SendChat directly instead of using RpcSendChat so we can call AddChat ourselves
|
||||
var messageWriter = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte) RpcCalls.SendChat);
|
||||
messageWriter.Write(truncatedChatText);
|
||||
messageWriter.EndMessage();
|
||||
}
|
||||
|
||||
innerNetClient.KickPlayer(clientData.Id, false);
|
||||
}
|
||||
|
||||
innerNetClient.StartCoroutine(CoKick());
|
||||
}
|
||||
|
||||
if (!Mod.Validate(reactorClientData?.Mods ?? Array.Empty<Mod>(), ModList.Current, out var reason))
|
||||
else if (!Mod.Validate(reactorClientData?.Mods ?? Array.Empty<Mod>(), ModList.Current, out var reason))
|
||||
{
|
||||
innerNetClient.KickWithReason(clientData.Id, reason);
|
||||
__result = false;
|
||||
@@ -125,18 +161,22 @@ internal static class ClientPatches
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(InnerNetClient._CoSendSceneChange_d__30), nameof(InnerNetClient._CoSendSceneChange_d__30.MoveNext))]
|
||||
[HarmonyPatch(typeof(InnerNetClient._CoSendSceneChange_d__32), nameof(InnerNetClient._CoSendSceneChange_d__32.MoveNext))]
|
||||
public static class CoSendSceneChangePatch
|
||||
{
|
||||
public static bool Prefix(InnerNetClient._CoSendSceneChange_d__30 __instance, ref bool __result)
|
||||
public static bool Prefix(InnerNetClient._CoSendSceneChange_d__32 __instance, ref bool __result)
|
||||
{
|
||||
if (ReactorConnection.Instance!.Syncer != Syncer.Host) return true;
|
||||
|
||||
var innerNetClient = __instance.__4__this;
|
||||
|
||||
if (__instance.__1__state == 2)
|
||||
// Check for the conditions when the scene change message should be sent
|
||||
if (!innerNetClient.AmHost &&
|
||||
innerNetClient.connection.State == ConnectionState.Connected &&
|
||||
innerNetClient.ClientId >= 0)
|
||||
{
|
||||
if (!innerNetClient.AmHost && innerNetClient.connection.State == ConnectionState.Connected)
|
||||
var clientData = innerNetClient.FindClientById(innerNetClient.ClientId);
|
||||
if (clientData != null)
|
||||
{
|
||||
var writer = MessageWriter.Get(SendOption.Reliable);
|
||||
writer.StartMessage(Tags.GameData);
|
||||
@@ -154,21 +194,25 @@ internal static class ClientPatches
|
||||
writer.EndMessage();
|
||||
innerNetClient.SendOrDisconnect(writer);
|
||||
writer.Recycle();
|
||||
}
|
||||
|
||||
__instance.__1__state = -1;
|
||||
__result = false;
|
||||
return false;
|
||||
// Create a new coroutine to let AmongUsClient handle scene changes too
|
||||
innerNetClient.StartCoroutine(innerNetClient.CoOnPlayerChangedScene(clientData, __instance.sceneName));
|
||||
|
||||
// Cancel this coroutine
|
||||
__instance.__1__state = -1;
|
||||
__result = false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(InnerNetClient._CoHandleSpawn_d__40), nameof(InnerNetClient._CoHandleSpawn_d__40.MoveNext))]
|
||||
[HarmonyPatch(typeof(InnerNetClient._CoHandleSpawn_d__42), nameof(InnerNetClient._CoHandleSpawn_d__42.MoveNext))]
|
||||
public static class CoHandleSpawnPatch
|
||||
{
|
||||
public static void Postfix(InnerNetClient._CoHandleSpawn_d__40 __instance, bool __result)
|
||||
public static void Postfix(InnerNetClient._CoHandleSpawn_d__42 __instance, bool __result)
|
||||
{
|
||||
if (ReactorConnection.Instance!.Syncer != Syncer.Host) return;
|
||||
|
||||
|
||||
@@ -5,7 +5,6 @@ using HarmonyLib;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Networking;
|
||||
using UnityEngine.UI;
|
||||
using Object = UnityEngine.Object;
|
||||
|
||||
namespace Reactor.Networking.Patches;
|
||||
|
||||
@@ -85,9 +84,9 @@ internal static class HttpPatches
|
||||
|
||||
if (__instance.GetMethod() == UnityWebRequest.UnityWebRequestMethod.Get)
|
||||
{
|
||||
if (responseHeader == null)
|
||||
if (responseHeader == null && ModList.IsAnyModRequiredOnAllClients)
|
||||
{
|
||||
DisconnectPopup.Instance.ShowCustom("This region doesn't support modded handshake.\nThe lobbies shown may not be compatible with your current mods.\nFor more info see https://reactor.gg/handshake");
|
||||
HandshakePopup.Show();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,31 +102,15 @@ internal static class HttpPatches
|
||||
public static void Postfix(GameStartManager __instance)
|
||||
{
|
||||
if (AmongUsClient.Instance.NetworkMode != NetworkModes.OnlineGame) return;
|
||||
if (ModList.IsAnyModIsRequiredOnAllClients && !IsCurrentRegionModded())
|
||||
if (ModList.IsAnyModRequiredOnAllClients && !IsCurrentRegionModded())
|
||||
{
|
||||
Warning("Vanilla region, locking public toggle");
|
||||
|
||||
__instance.MakePublicButtonBehaviour.enabled = false;
|
||||
var actionMapGlyphDisplay = __instance.MakePublicButton.GetComponentInChildren<ActionMapGlyphDisplay>(includeInactive: true);
|
||||
if (actionMapGlyphDisplay)
|
||||
{
|
||||
actionMapGlyphDisplay.gameObject.SetActive(value: false);
|
||||
}
|
||||
__instance.HostPublicButton.enabled = false;
|
||||
__instance.HostPrivateButton.transform.FindChild("Inactive").GetComponent<SpriteRenderer>().color = new Color(1, 1, 1, 0.5f);
|
||||
|
||||
__instance.MakePublicButton.color = new Color(1, 1, 1, 0.5f);
|
||||
__instance.MakePublicButton.sprite = __instance.PrivateGameImage;
|
||||
|
||||
var onClick = __instance.MakePublicButton.GetComponent<PassiveButton>().OnClick = new Button.ButtonClickedEvent();
|
||||
onClick.AddListener((Action) (() =>
|
||||
{
|
||||
var popup = Object.Instantiate(DiscordManager.Instance.discordPopup, Camera.main!.transform);
|
||||
var background = popup.transform.Find("Background").GetComponent<SpriteRenderer>();
|
||||
var size = background.size;
|
||||
size.x *= 2.5f;
|
||||
background.size = size;
|
||||
popup.TextAreaTMP.fontSizeMin = 2;
|
||||
popup.Show("You can't make public lobbies on regions that don't support modded handshake.\nFor more info see https://reactor.gg/handshake");
|
||||
}));
|
||||
var onClick = __instance.HostPrivateButton.OnClick = new Button.ButtonClickedEvent();
|
||||
onClick.AddListener((Action) MakePublicDisallowedPopup.Show);
|
||||
|
||||
if (AmongUsClient.Instance.AmHost && AmongUsClient.Instance.IsGamePublic)
|
||||
{
|
||||
|
||||
@@ -4,7 +4,7 @@ using InnerNet;
|
||||
|
||||
namespace Reactor.Networking.Patches;
|
||||
|
||||
internal class ReactorClientData
|
||||
internal sealed class ReactorClientData
|
||||
{
|
||||
public ClientData ClientData { get; }
|
||||
|
||||
|
||||
@@ -96,7 +96,7 @@ public abstract class UnsafeCustomRpc
|
||||
/// <param name="ackCallback">The callback to invoke when this packet is acknowledged.</param>
|
||||
public void UnsafeSend(InnerNetObject innerNetObject, object? data, bool immediately = false, int targetClientId = -1, Action? ackCallback = null)
|
||||
{
|
||||
if (innerNetObject == null) throw new ArgumentNullException(nameof(innerNetObject));
|
||||
ArgumentNullException.ThrowIfNull(innerNetObject);
|
||||
|
||||
if (Manager == null)
|
||||
{
|
||||
|
||||
@@ -5,7 +5,7 @@ namespace Reactor.Patches.Fixes;
|
||||
/// <summary>
|
||||
/// Fixes Game Lists not working on servers using legacy matchmaking.
|
||||
/// </summary>
|
||||
[HarmonyPatch(typeof(AmongUsClient._CoFindGame_d__3), nameof(AmongUsClient._CoFindGame_d__3.MoveNext))]
|
||||
[HarmonyPatch(typeof(AmongUsClient_CoFindGame), nameof(AmongUsClient_CoFindGame.MoveNext))]
|
||||
internal static class CoFindGamePatch
|
||||
{
|
||||
public static void Prefix()
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using HarmonyLib;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
@@ -8,14 +10,20 @@ namespace Reactor.Patches.Fixes;
|
||||
/// <summary>
|
||||
/// "Fixes" an issue where empty TextBoxes have wrong cursor positions.
|
||||
/// </summary>
|
||||
[HarmonyPatch(typeof(TextMeshProExtensions), nameof(TextMeshProExtensions.CursorPos))]
|
||||
[HarmonyPatch]
|
||||
internal static class CursorPosPatch
|
||||
{
|
||||
public static IEnumerable<MethodBase> TargetMethods()
|
||||
{
|
||||
return AccessTools.GetDeclaredMethods(typeof(TextMeshProExtensions)).Where(m => m.Name == nameof(TextMeshProExtensions.CursorPos));
|
||||
}
|
||||
|
||||
public static bool Prefix(TextMeshPro self, ref Vector2 __result)
|
||||
{
|
||||
if (self.textInfo == null || self.textInfo.lineCount == 0 || self.textInfo.lineInfo[0].characterCount <= 0)
|
||||
{
|
||||
__result = self.GetTextInfo(" ").lineInfo.First().lineExtents.max;
|
||||
self.text = string.Empty;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using HarmonyLib;
|
||||
|
||||
namespace Reactor.Patches.Miscellaneous;
|
||||
@@ -5,11 +7,25 @@ namespace Reactor.Patches.Miscellaneous;
|
||||
[HarmonyPatch]
|
||||
internal static class CustomServersPatch
|
||||
{
|
||||
private static bool IsCurrentServerOfficial()
|
||||
{
|
||||
const string Domain = "among.us";
|
||||
|
||||
return ServerManager.Instance.CurrentRegion?.TryCast<StaticHttpRegionInfo>() is { } regionInfo &&
|
||||
regionInfo.PingServer.EndsWith(Domain, StringComparison.Ordinal) &&
|
||||
regionInfo.Servers.All(serverInfo => serverInfo.Ip.EndsWith(Domain, StringComparison.Ordinal));
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(AuthManager._CoConnect_d__4), nameof(AuthManager._CoConnect_d__4.MoveNext))]
|
||||
[HarmonyPatch(typeof(AuthManager._CoWaitForNonce_d__6), nameof(AuthManager._CoWaitForNonce_d__6.MoveNext))]
|
||||
[HarmonyPrefix]
|
||||
public static bool DisableAuthServer(out bool __result)
|
||||
public static bool DisableAuthServer(ref bool __result)
|
||||
{
|
||||
if (IsCurrentServerOfficial())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
__result = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
using HarmonyLib;
|
||||
using Reactor.Networking;
|
||||
|
||||
namespace Reactor.Patches.Miscellaneous;
|
||||
|
||||
[HarmonyPatch]
|
||||
internal static class DisableServerAuthorityPatch
|
||||
{
|
||||
private const int DisableServerAuthorityFlag = 25;
|
||||
|
||||
public static bool Enabled => ModList.IsAnyModDisableServerAuthority || ReactorConfig.ForceDisableServerAuthority.Value;
|
||||
|
||||
[HarmonyPatch(typeof(Constants), nameof(Constants.GetBroadcastVersion))]
|
||||
[HarmonyPostfix]
|
||||
public static void GetBroadcastVersionPatch(ref int __result)
|
||||
{
|
||||
if (!Enabled) return;
|
||||
if (AmongUsClient.Instance.NetworkMode != NetworkModes.OnlineGame) return;
|
||||
|
||||
Debug("Sending the DisableServerAuthority flag");
|
||||
|
||||
var revision = __result % 50;
|
||||
if (revision < DisableServerAuthorityFlag)
|
||||
{
|
||||
__result += DisableServerAuthorityFlag;
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(Constants), nameof(Constants.IsVersionModded))]
|
||||
[HarmonyPrefix]
|
||||
public static bool IsVersionModdedPatch(ref bool __result)
|
||||
{
|
||||
if (Enabled)
|
||||
{
|
||||
__result = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -30,20 +30,17 @@ internal static class FreeNamePatch
|
||||
var editName = DestroyableSingleton<AccountManager>.Instance.accountTab.editNameScreen;
|
||||
var nameText = Object.Instantiate(editName.nameText.gameObject);
|
||||
|
||||
nameText.transform.localPosition += Vector3.up * 2.2f;
|
||||
nameText.transform.localPosition += Vector3.up * (AccountManager.Instance.isActiveAndEnabled ? 1.85f : 2.2f);
|
||||
|
||||
var textBox = nameText.GetComponent<TextBoxTMP>();
|
||||
textBox.outputText.alignment = TextAlignmentOptions.CenterGeoAligned;
|
||||
textBox.outputText.transform.position = nameText.transform.position;
|
||||
textBox.outputText.fontSize = 4f;
|
||||
|
||||
textBox.OnChange.AddListener((Action) (() =>
|
||||
{
|
||||
DataManager.Player.Customization.Name = textBox.text;
|
||||
}));
|
||||
textBox.OnEnter = textBox.OnFocusLost = textBox.OnChange;
|
||||
|
||||
textBox.Pipe.GetComponent<TextMeshPro>().fontSize = 4f;
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -56,10 +53,10 @@ internal static class FreeNamePatch
|
||||
"JoinGameButton",
|
||||
};
|
||||
|
||||
var yStart = Vector3.up;
|
||||
var yStart = Vector3.up * (AccountManager.Instance.isActiveAndEnabled ? 0.9f : 1.1f);
|
||||
var yOffset = Vector3.down * 1.5f;
|
||||
|
||||
var gameObjects = toMove.Select(x => GameObject.Find("NormalMenu/" + x)).ToList();
|
||||
var gameObjects = toMove.Select(x => GameObject.Find("NormalMenu/Buttons/" + x)).ToList();
|
||||
if (gameObjects.Any(x => x == null)) return false;
|
||||
|
||||
for (var i = 0; i < gameObjects.Count; i++)
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
using System;
|
||||
using HarmonyLib;
|
||||
using Reactor.Utilities;
|
||||
|
||||
namespace Reactor.Patches.Miscellaneous;
|
||||
|
||||
[HarmonyPatch(typeof(PingTracker), nameof(PingTracker.Update))]
|
||||
internal static class PingTrackerPatch
|
||||
{
|
||||
[HarmonyPostfix]
|
||||
[HarmonyPriority(Priority.Last)]
|
||||
public static void Postfix(PingTracker __instance)
|
||||
{
|
||||
var extraText = ReactorCredits.GetText(ReactorCredits.Location.PingTracker);
|
||||
if (extraText != null)
|
||||
{
|
||||
if (!__instance.text.text.EndsWith("\n", StringComparison.InvariantCulture)) __instance.text.text += "\n";
|
||||
__instance.text.text += extraText;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
using System;
|
||||
using BepInEx;
|
||||
using BepInEx.Unity.IL2CPP;
|
||||
using HarmonyLib;
|
||||
using Reactor.Utilities;
|
||||
using Reactor.Utilities.Extensions;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
@@ -25,66 +25,86 @@ public static class ReactorVersionShower
|
||||
/// </summary>
|
||||
public static event Action<TextMeshPro>? TextUpdated;
|
||||
|
||||
private static void SetMainMenuPositionFromAspect(float aspectRatio)
|
||||
{
|
||||
if (Text == null) return;
|
||||
var pos = new Vector3(-1.2287f * aspectRatio + 10.9f, -0.57f, 4.5f);
|
||||
Text.transform.position = pos;
|
||||
}
|
||||
|
||||
private static readonly ResolutionManager.ResolutionChangedHandler _resolutionChangedHandler = (Action<float, int, int, bool>) ((aspectRatio, _, _, _) =>
|
||||
{
|
||||
SetMainMenuPositionFromAspect(aspectRatio);
|
||||
});
|
||||
|
||||
internal static void Initialize()
|
||||
{
|
||||
SceneManager.add_sceneLoaded((Action<Scene, LoadSceneMode>) ((_, _) =>
|
||||
SceneManager.add_sceneLoaded((Action<Scene, LoadSceneMode>) ((scene, _) =>
|
||||
{
|
||||
var original = UnityEngine.Object.FindObjectOfType<VersionShower>();
|
||||
if (!original)
|
||||
return;
|
||||
|
||||
var gameObject = new GameObject("ReactorVersion " + Guid.NewGuid());
|
||||
gameObject.transform.parent = original.transform.parent;
|
||||
|
||||
var aspectPosition = gameObject.AddComponent<AspectPosition>();
|
||||
|
||||
aspectPosition.Alignment = AspectPosition.EdgeAlignments.LeftTop;
|
||||
|
||||
var originalAspectPosition = original.GetComponent<AspectPosition>();
|
||||
var originalPosition = originalAspectPosition.DistanceFromEdge;
|
||||
originalPosition.y = 0.15f;
|
||||
originalAspectPosition.DistanceFromEdge = originalPosition;
|
||||
originalAspectPosition.AdjustPosition();
|
||||
var originalText = original.GetComponentInChildren<TextMeshPro>();
|
||||
|
||||
var position = originalPosition;
|
||||
position.x += 10.075f - 0.1f;
|
||||
position.y += 2.75f - 0.15f;
|
||||
position.z -= 1;
|
||||
aspectPosition.DistanceFromEdge = position;
|
||||
|
||||
aspectPosition.AdjustPosition();
|
||||
var gameObject = new GameObject("ReactorVersion");
|
||||
|
||||
Text = gameObject.AddComponent<TextMeshPro>();
|
||||
Text.font = originalText.font;
|
||||
Text.fontMaterial = originalText.fontMaterial;
|
||||
Text.UpdateFontAsset();
|
||||
Text.overflowMode = TextOverflowModes.Overflow;
|
||||
Text.fontSize = 2;
|
||||
Text.outlineWidth = 0.1f;
|
||||
Text.enableWordWrapping = false;
|
||||
Text.alignment = TextAlignmentOptions.TopLeft;
|
||||
|
||||
if (scene.name == "MainMenu")
|
||||
{
|
||||
ResolutionManager.add_ResolutionChanged(_resolutionChangedHandler);
|
||||
SetMainMenuPositionFromAspect(Screen.width / (float) Screen.height);
|
||||
}
|
||||
else
|
||||
{
|
||||
ResolutionManager.remove_ResolutionChanged(_resolutionChangedHandler);
|
||||
var aspectPosition = gameObject.AddComponent<AspectPosition>();
|
||||
var distanceFromEdge = new Vector3(10.13f, 2.55f, -1);
|
||||
if (originalAspectPosition.Alignment == AspectPosition.EdgeAlignments.LeftTop)
|
||||
{
|
||||
distanceFromEdge.y += 0.2f;
|
||||
}
|
||||
else if (AccountManager.Instance.isActiveAndEnabled)
|
||||
{
|
||||
distanceFromEdge.x += 0.2f;
|
||||
distanceFromEdge.y += 0.575f;
|
||||
}
|
||||
|
||||
aspectPosition.Alignment = AspectPosition.EdgeAlignments.LeftTop;
|
||||
aspectPosition.DistanceFromEdge = distanceFromEdge;
|
||||
aspectPosition.AdjustPosition();
|
||||
}
|
||||
|
||||
UpdateText();
|
||||
}));
|
||||
}
|
||||
|
||||
private static string ToStringWithoutBuild(Version version)
|
||||
{
|
||||
return $"{version.Major}.{version.Minor}.{version.Patch}{(version.PreRelease == null ? string.Empty : $"-{version.PreRelease}")}";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates <see cref="Text"/> with reactor version and fires <see cref="TextUpdated"/>.
|
||||
/// </summary>
|
||||
public static void UpdateText()
|
||||
{
|
||||
if (Text == null) return;
|
||||
Text.text = "Reactor " + ReactorPlugin.Version;
|
||||
Text.text += "\nBepInEx " + ToStringWithoutBuild(Paths.BepInExVersion);
|
||||
Text.text = "Reactor " + Version.Parse(ReactorPlugin.Version).WithoutBuild();
|
||||
Text.text += "\nBepInEx " + Paths.BepInExVersion.WithoutBuild();
|
||||
Text.text += "\nMods: " + IL2CPPChainloader.Instance.Plugins.Count;
|
||||
|
||||
var creditsText = ReactorCredits.GetText(ReactorCredits.Location.MainMenu);
|
||||
if (creditsText != null)
|
||||
{
|
||||
Text.text += "\n" + creditsText;
|
||||
}
|
||||
|
||||
TextUpdated?.Invoke(Text);
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(FreeWeekendShower), nameof(FreeWeekendShower.Start))]
|
||||
private static class FreeWeekendShowerPatch
|
||||
{
|
||||
public static bool Prefix(FreeWeekendShower __instance)
|
||||
{
|
||||
__instance.Output.Destroy();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,15 +6,9 @@
|
||||
|
||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||
|
||||
<!-- SourceLink -->
|
||||
<EmbedUntrackedSources>true</EmbedUntrackedSources>
|
||||
<IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion>
|
||||
<ContinuousIntegrationBuild Condition="'$(GITHUB_ACTIONS)' == 'true'">true</ContinuousIntegrationBuild>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1" PrivateAssets="All" />
|
||||
<Compile Include="..\Reactor.Networking.Shared\**\*.cs" LinkBase="Networking" Visible="false" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
using BepInEx.Configuration;
|
||||
|
||||
namespace Reactor;
|
||||
|
||||
internal static class ReactorConfig
|
||||
{
|
||||
public const string FeaturesSection = "Features";
|
||||
public const string MessagesSection = "Messages";
|
||||
|
||||
public static ConfigEntry<bool> ForceDisableServerAuthority { get; private set; } = null!;
|
||||
|
||||
public static ConfigEntry<string> HandshakePopupMessage { get; private set; } = null!;
|
||||
public static ConfigEntry<string> MakePublicDisallowedPopupMessage { get; private set; } = null!;
|
||||
|
||||
public static void Bind(ConfigFile config)
|
||||
{
|
||||
ForceDisableServerAuthority = config.Bind(FeaturesSection, nameof(ForceDisableServerAuthority), false, "Enables the DisableServerAuthority flag even when no mods declare it");
|
||||
|
||||
HandshakePopupMessage = config.Bind(MessagesSection, nameof(HandshakePopupMessage), string.Empty);
|
||||
MakePublicDisallowedPopupMessage = config.Bind(MessagesSection, nameof(MakePublicDisallowedPopupMessage), string.Empty);
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,6 @@
|
||||
global using static Reactor.Utilities.Logger<Reactor.ReactorPlugin>;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using BepInEx;
|
||||
using BepInEx.Configuration;
|
||||
using BepInEx.Unity.IL2CPP;
|
||||
using HarmonyLib;
|
||||
using Il2CppInterop.Runtime.Attributes;
|
||||
@@ -37,13 +35,13 @@ public partial class ReactorPlugin : BasePlugin
|
||||
/// </summary>
|
||||
public CustomRpcManager CustomRpcManager { get; } = new();
|
||||
|
||||
internal ConfigEntry<bool>? AllowVanillaServers { get; private set; }
|
||||
|
||||
internal RegionInfoWatcher RegionInfoWatcher { get; } = new();
|
||||
|
||||
/// <inheritdoc />
|
||||
public ReactorPlugin()
|
||||
{
|
||||
Log.LogMessage($"Among Us {Application.version} {Constants.GetCurrentPlatformName()}");
|
||||
|
||||
PluginSingleton<ReactorPlugin>.Instance = this;
|
||||
PluginSingleton<BasePlugin>.Initialize();
|
||||
|
||||
@@ -60,7 +58,7 @@ public partial class ReactorPlugin : BasePlugin
|
||||
/// <inheritdoc />
|
||||
public override void Load()
|
||||
{
|
||||
AllowVanillaServers = Config.Bind("Features", "Allow vanilla servers", false, "Whether reactor should ignore servers not responding to modded handshake. This config is ignored if any plugin uses custom rpcs!");
|
||||
ReactorConfig.Bind(Config);
|
||||
|
||||
Harmony.PatchAll();
|
||||
|
||||
@@ -91,7 +89,7 @@ public partial class ReactorPlugin : BasePlugin
|
||||
}
|
||||
|
||||
[RegisterInIl2Cpp]
|
||||
private class ReactorComponent : MonoBehaviour
|
||||
private sealed class ReactorComponent : MonoBehaviour
|
||||
{
|
||||
[HideFromIl2Cpp]
|
||||
public ReactorPlugin? Plugin { get; internal set; }
|
||||
@@ -109,7 +107,7 @@ public partial class ReactorPlugin : BasePlugin
|
||||
foreach (var pluginInfo in IL2CPPChainloader.Instance.Plugins.Values)
|
||||
{
|
||||
var config = ((BasePlugin) pluginInfo.Instance).Config;
|
||||
if (!config.Any())
|
||||
if (config.Count == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -3,8 +3,8 @@ using System.Diagnostics.CodeAnalysis;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Runtime.InteropServices;
|
||||
using Il2CppInterop.Runtime.InteropTypes.Arrays;
|
||||
using MonoMod.Utils;
|
||||
using Reactor.Utilities.Extensions;
|
||||
using UnityEngine;
|
||||
|
||||
@@ -23,38 +23,48 @@ public static class AssetBundleManager
|
||||
/// <summary>
|
||||
/// Gets the target name of the current system.
|
||||
/// </summary>
|
||||
public static string TargetName { get; }
|
||||
[Obsolete("Use AssetBundleManager#GetTargetName instead")]
|
||||
public static string TargetName { get; } = GetTargetName(true);
|
||||
|
||||
static AssetBundleManager()
|
||||
/// <summary>
|
||||
/// Gets the target name of the current system.
|
||||
/// </summary>
|
||||
/// <param name="includeArchitecture">A value indicating whether to include the process architecture.</param>
|
||||
/// <returns>Target name of the current system.</returns>
|
||||
public static string GetTargetName(bool includeArchitecture)
|
||||
{
|
||||
if (PlatformHelper.Is(Platform.Android))
|
||||
string operatingSystem;
|
||||
|
||||
if (OperatingSystem.IsWindows())
|
||||
{
|
||||
TargetName = "android";
|
||||
operatingSystem = "win";
|
||||
}
|
||||
else if (OperatingSystem.IsLinux())
|
||||
{
|
||||
operatingSystem = "linux";
|
||||
}
|
||||
else if (OperatingSystem.IsAndroid())
|
||||
{
|
||||
operatingSystem = "android";
|
||||
}
|
||||
else
|
||||
{
|
||||
if (PlatformHelper.Is(Platform.Windows))
|
||||
{
|
||||
TargetName = "win";
|
||||
}
|
||||
else if (PlatformHelper.Is(Platform.Linux))
|
||||
{
|
||||
TargetName = "linux";
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new PlatformNotSupportedException();
|
||||
}
|
||||
|
||||
if (PlatformHelper.Is(Platform.ARM))
|
||||
{
|
||||
TargetName += Environment.Is64BitProcess ? "-arm64" : "-arm";
|
||||
}
|
||||
else
|
||||
{
|
||||
TargetName += Environment.Is64BitProcess ? "-x64" : "-x86";
|
||||
}
|
||||
throw new PlatformNotSupportedException();
|
||||
}
|
||||
|
||||
if (!includeArchitecture)
|
||||
{
|
||||
return operatingSystem;
|
||||
}
|
||||
|
||||
return $"{operatingSystem}-{RuntimeInformation.ProcessArchitecture switch
|
||||
{
|
||||
Architecture.X86 => "x86",
|
||||
Architecture.X64 => "x64",
|
||||
Architecture.Arm => "arm",
|
||||
Architecture.Arm64 => "arm64",
|
||||
_ => throw new PlatformNotSupportedException(),
|
||||
}}";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -62,7 +72,16 @@ public static class AssetBundleManager
|
||||
/// </summary>
|
||||
/// <param name="assetBundleName">The name of the asset bundle.</param>
|
||||
/// <returns>File name of the asset bundle.</returns>
|
||||
public static string GetFileName(string assetBundleName) => $"{assetBundleName}-{TargetName}{BundleExtension}";
|
||||
[Obsolete("Use the overload with includeArchitecture instead")]
|
||||
public static string GetFileName(string assetBundleName) => GetFileName(assetBundleName, true);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the file name for an asset bundle named <paramref name="assetBundleName"/>.
|
||||
/// </summary>
|
||||
/// <param name="assetBundleName">The name of the asset bundle.</param>
|
||||
/// <param name="includeArchitecture">A value indicating whether to include the process architecture.</param>
|
||||
/// <returns>File name of the asset bundle.</returns>
|
||||
public static string GetFileName(string assetBundleName, bool includeArchitecture) => $"{assetBundleName}-{GetTargetName(includeArchitecture)}{BundleExtension}";
|
||||
|
||||
private static bool TryFindFile(Assembly assembly, string fileName, [NotNullWhen(true)] out string? path)
|
||||
{
|
||||
@@ -72,6 +91,7 @@ public static class AssetBundleManager
|
||||
var filePath = Path.Combine(pluginDirectoryPath, fileName);
|
||||
if (File.Exists(filePath))
|
||||
{
|
||||
Debug($"Loading an asset bundle from {filePath}");
|
||||
path = filePath;
|
||||
return true;
|
||||
}
|
||||
@@ -86,6 +106,8 @@ public static class AssetBundleManager
|
||||
var resourceName = assembly.GetManifestResourceNames().SingleOrDefault(n => n.EndsWith(fileName, StringComparison.Ordinal));
|
||||
if (resourceName != null)
|
||||
{
|
||||
Debug($"Loading an asset bundle from {resourceName}");
|
||||
|
||||
using var stream = assembly.GetManifestResourceStream(resourceName) ?? throw new InvalidOperationException("Resource stream was null");
|
||||
|
||||
var length = (int) stream.Length;
|
||||
@@ -119,8 +141,13 @@ public static class AssetBundleManager
|
||||
/// <exception cref="AssetBundleNotFoundException">Couldn't find an assetbundle named <paramref name="name"/>.</exception>
|
||||
public static AssetBundle Load(Assembly assembly, string name)
|
||||
{
|
||||
var fileName = GetFileName(name);
|
||||
return TryLoad(assembly, GetFileName(name, includeArchitecture: true))
|
||||
?? TryLoad(assembly, GetFileName(name, includeArchitecture: false))
|
||||
?? throw new AssetBundleNotFoundException(name);
|
||||
}
|
||||
|
||||
private static AssetBundle? TryLoad(Assembly assembly, string fileName)
|
||||
{
|
||||
if (TryFindFile(assembly, fileName, out var filePath))
|
||||
{
|
||||
return AssetBundle.LoadFromFile(filePath);
|
||||
@@ -131,7 +158,7 @@ public static class AssetBundleManager
|
||||
return AssetBundle.LoadFromMemory(data);
|
||||
}
|
||||
|
||||
throw new AssetBundleNotFoundException(name);
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -154,8 +181,13 @@ public static class AssetBundleManager
|
||||
/// <exception cref="AssetBundleNotFoundException">Couldn't find an assetbundle named <paramref name="name"/>.</exception>
|
||||
public static AssetBundleCreateRequest LoadAsync(Assembly assembly, string name)
|
||||
{
|
||||
var fileName = GetFileName(name);
|
||||
return TryLoadAsync(assembly, GetFileName(name, includeArchitecture: true))
|
||||
?? TryLoadAsync(assembly, GetFileName(name, includeArchitecture: false))
|
||||
?? throw new AssetBundleNotFoundException(name);
|
||||
}
|
||||
|
||||
private static AssetBundleCreateRequest? TryLoadAsync(Assembly assembly, string fileName)
|
||||
{
|
||||
if (TryFindFile(assembly, fileName, out var filePath))
|
||||
{
|
||||
return AssetBundle.LoadFromFileAsync(filePath);
|
||||
@@ -166,7 +198,7 @@ public static class AssetBundleManager
|
||||
return AssetBundle.LoadFromMemoryAsync(data);
|
||||
}
|
||||
|
||||
throw new AssetBundleNotFoundException(name);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace Reactor.Utilities;
|
||||
public static class Coroutines
|
||||
{
|
||||
[RegisterInIl2Cpp]
|
||||
internal class Component : MonoBehaviour
|
||||
internal sealed class Component : MonoBehaviour
|
||||
{
|
||||
internal static Component? Instance { get; set; }
|
||||
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
namespace Reactor.Utilities.Extensions;
|
||||
|
||||
/// <summary>
|
||||
/// Provides extension methods for TestMeshPro's Rich Text.
|
||||
/// </summary>
|
||||
internal static class RichTextExtensions
|
||||
{
|
||||
private static string Wrap(this string text, string tag)
|
||||
{
|
||||
return $"<{tag}>{text}</{tag}>";
|
||||
}
|
||||
|
||||
private static string Wrap(this string text, string tag, string value)
|
||||
{
|
||||
return $"<{tag}={value}>{text}</{tag}>";
|
||||
}
|
||||
|
||||
public static string Align(this string text, string value)
|
||||
{
|
||||
return text.Wrap("align", value);
|
||||
}
|
||||
|
||||
public static string Color(this string text, string value)
|
||||
{
|
||||
return text.Wrap("color", value);
|
||||
}
|
||||
|
||||
public static string Size(this string text, string value)
|
||||
{
|
||||
return text.Wrap("size", value);
|
||||
}
|
||||
|
||||
public static string EscapeRichText(this string text)
|
||||
{
|
||||
return text
|
||||
.Replace("<noparse>", string.Empty)
|
||||
.Replace("</noparse>", string.Empty)
|
||||
.Wrap("noparse");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
using SemanticVersioning;
|
||||
|
||||
namespace Reactor.Utilities.Extensions;
|
||||
|
||||
/// <summary>
|
||||
/// Provides extension methods for <see cref="SemanticVersioning.Version"/>.
|
||||
/// </summary>
|
||||
public static class VersionExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the provided <paramref name="version"/> without the build string (everything after the + symbol like the commit hash is stripped).
|
||||
/// </summary>
|
||||
/// <param name="version">The <see cref="SemanticVersioning.Version"/>.</param>
|
||||
/// <returns>The <paramref name="version"/> without build.</returns>
|
||||
public static Version WithoutBuild(this Version version)
|
||||
{
|
||||
return new Version(version.Major, version.Minor, version.Patch, version.PreRelease);
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,7 @@ namespace Reactor.Utilities.ImGui;
|
||||
/// </summary>
|
||||
public class Window
|
||||
{
|
||||
private static int _lastWindowId;
|
||||
private static int _lastWindowId = 2135184938;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the next window id.
|
||||
@@ -75,7 +75,8 @@ public class Window
|
||||
Rect = Rect.ResetSize();
|
||||
}
|
||||
|
||||
Rect = GUILayout.Window(Id, Rect, Func, Title);
|
||||
GUI.skin.label.wordWrap = false;
|
||||
Rect = GUILayout.Window(Id, Rect, Func, Title, GUILayout.MinWidth(GUI.skin.label.CalcSize(new GUIContent(Title)).x * 2));
|
||||
|
||||
if ((Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1)) && Rect.Contains(new Vector2(Input.mousePosition.x, Screen.height - Input.mousePosition.y)))
|
||||
{
|
||||
|
||||
@@ -0,0 +1,123 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using BepInEx.Unity.IL2CPP;
|
||||
using Reactor.Patches;
|
||||
using Reactor.Utilities.Extensions;
|
||||
|
||||
namespace Reactor.Utilities;
|
||||
|
||||
/// <summary>
|
||||
/// Provides a way for mods to show their version information in-game.
|
||||
/// </summary>
|
||||
public static class ReactorCredits
|
||||
{
|
||||
private readonly struct ModIdentifier(string name, string version, Func<Location, bool>? shouldShow, bool isPreRelease)
|
||||
{
|
||||
private const string NormalColor = "#fff";
|
||||
private const string PreReleaseColor = "#f00";
|
||||
|
||||
public string Name => name;
|
||||
|
||||
public string Text { get; } = $"{name} {version}".EscapeRichText().Color(isPreRelease ? PreReleaseColor : NormalColor);
|
||||
|
||||
public bool ShouldShow(Location location)
|
||||
{
|
||||
return shouldShow == AlwaysShow || shouldShow(location);
|
||||
}
|
||||
}
|
||||
|
||||
private static readonly List<ModIdentifier> _modIdentifiers = [];
|
||||
|
||||
/// <summary>
|
||||
/// Represents the location of where the credit is shown.
|
||||
/// </summary>
|
||||
public enum Location
|
||||
{
|
||||
/// <summary>
|
||||
/// In the main menu under Reactor/BepInEx versions.
|
||||
/// </summary>
|
||||
MainMenu,
|
||||
|
||||
/// <summary>
|
||||
/// During game under the ping tracker.
|
||||
/// </summary>
|
||||
PingTracker,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A special value indicating a mod should always show.
|
||||
/// </summary>
|
||||
public const Func<Location, bool>? AlwaysShow = null;
|
||||
|
||||
/// <summary>
|
||||
/// Registers a mod with the <see cref="ReactorCredits"/>, adding it to the list of mods that will be displayed.
|
||||
/// </summary>
|
||||
/// <param name="name">The user-friendly name of the mod. Can contain spaces or special characters.</param>
|
||||
/// <param name="version">The version of the mod.</param>
|
||||
/// <param name="isPreRelease">If this version is a development or beta version. If true, it will display the mod in red.</param>
|
||||
/// <param name="shouldShow">
|
||||
/// This function will be called every frame to determine if the mod should be displayed or not.
|
||||
/// This function should return false if your mod is currently disabled or has no effect on gameplay at the time.
|
||||
/// If you want the mod to be displayed at all times, you can set this parameter to <see cref="ReactorCredits.AlwaysShow"/>.
|
||||
/// </param>
|
||||
public static void Register(string name, string version, bool isPreRelease, Func<Location, bool>? shouldShow)
|
||||
{
|
||||
const int MaxLength = 60;
|
||||
|
||||
if (name.Length + version.Length > MaxLength)
|
||||
{
|
||||
Error($"Not registering mod \"{name}\" with version \"{version}\" in {nameof(ReactorCredits)} because the combined length of the mod name and version is greater than {MaxLength} characters.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (_modIdentifiers.Any(m => m.Name == name))
|
||||
{
|
||||
Error($"Mod \"{name}\" is already registered in {nameof(ReactorCredits)}.");
|
||||
return;
|
||||
}
|
||||
|
||||
_modIdentifiers.Add(new ModIdentifier(name, version, shouldShow, isPreRelease));
|
||||
|
||||
_modIdentifiers.Sort((a, b) => string.Compare(a.Name, b.Name, StringComparison.Ordinal));
|
||||
|
||||
if (!isPreRelease)
|
||||
{
|
||||
Info($"Mod \"{name}\" registered in {nameof(ReactorCredits)} with version {version}.");
|
||||
}
|
||||
else
|
||||
{
|
||||
Warning($"Mod \"{name}\" registered in {nameof(ReactorCredits)} with DEVELOPMENT/BETA version {version}.");
|
||||
}
|
||||
|
||||
ReactorVersionShower.UpdateText();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Registers a mod with the <see cref="ReactorCredits"/>, adding it to the list of mods that will be displayed.
|
||||
/// </summary>
|
||||
/// <typeparam name="T">The BepInEx plugin type to get the name and version from.</typeparam>
|
||||
/// <param name="shouldShow"><inheritdoc cref="Register(string,string,bool,System.Func{Location,bool})" path="/param[@name='shouldShow']"/></param>
|
||||
public static void Register<T>(Func<Location, bool>? shouldShow) where T : BasePlugin
|
||||
{
|
||||
var pluginInfo = IL2CPPChainloader.Instance.Plugins.Values.SingleOrDefault(p => p.TypeName == typeof(T).FullName)
|
||||
?? throw new ArgumentException("Couldn't find the metadata for the provided plugin type", nameof(T));
|
||||
|
||||
var metadata = pluginInfo.Metadata;
|
||||
|
||||
Register(metadata.Name, metadata.Version.WithoutBuild().Clean(), metadata.Version.IsPreRelease, shouldShow);
|
||||
}
|
||||
|
||||
internal static string? GetText(Location location)
|
||||
{
|
||||
var modTexts = _modIdentifiers.Where(m => m.ShouldShow(location)).Select(m => m.Text).ToArray();
|
||||
if (modTexts.Length == 0) return null;
|
||||
|
||||
return location switch
|
||||
{
|
||||
Location.MainMenu => string.Join('\n', modTexts),
|
||||
Location.PingTracker => ("<space=3em>" + string.Join(", ", modTexts)).Size("50%").Align("center"),
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(location), location, null),
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,7 @@ using Object = UnityEngine.Object;
|
||||
|
||||
namespace Reactor.Utilities;
|
||||
|
||||
internal class RegionInfoWatcher : IDisposable
|
||||
internal sealed class RegionInfoWatcher : IDisposable
|
||||
{
|
||||
private FileSystemWatcher Watcher { get; }
|
||||
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
using Il2CppInterop.Runtime.Attributes;
|
||||
using Reactor.Utilities.Attributes;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Reactor.Utilities.UI;
|
||||
|
||||
/// <summary>
|
||||
/// Wrapper over <see cref="GenericPopup"/> that adds hyperlink and controller support.
|
||||
/// </summary>
|
||||
[RegisterInIl2Cpp]
|
||||
internal sealed class ReactorPopup : MonoBehaviour
|
||||
{
|
||||
private readonly Il2CppSystem.Collections.Generic.List<SelectableHyperLink> _selectableHyperLinks = new();
|
||||
|
||||
public GenericPopup Popup { get; private set; } = null!;
|
||||
public TextMeshPro TextArea { get; private set; } = null!;
|
||||
public PassiveButton BackButton { get; private set; } = null!;
|
||||
public SpriteRenderer Background { get; private set; } = null!;
|
||||
|
||||
[HideFromIl2Cpp]
|
||||
public void Show(string text)
|
||||
{
|
||||
Popup.Show(text);
|
||||
|
||||
ControllerManager.Instance.OpenOverlayMenu(name, BackButton);
|
||||
|
||||
SelectableHyperLinkHelper.AddSelectableUiForHyperlinks(_selectableHyperLinks, name);
|
||||
TextArea.text = SelectableHyperLinkHelper.DecomposeAnnouncementText(TextArea, _selectableHyperLinks, name, TextArea.text);
|
||||
SelectableHyperLinkHelper.UpdateHyperlinkPositions(TextArea, _selectableHyperLinks, name);
|
||||
|
||||
ControllerManager.Instance.AddSelectableUiElement(BackButton, true);
|
||||
}
|
||||
|
||||
public void OnDisable()
|
||||
{
|
||||
ControllerManager.Instance.CloseOverlayMenu(name);
|
||||
}
|
||||
|
||||
[HideFromIl2Cpp]
|
||||
public static ReactorPopup Create(string name)
|
||||
{
|
||||
var genericPopup = Instantiate(DiscordManager.Instance.discordPopup, Camera.main!.transform);
|
||||
var gameObject = genericPopup.gameObject;
|
||||
var reactorPopup = gameObject.AddComponent<ReactorPopup>();
|
||||
|
||||
reactorPopup.Popup = genericPopup;
|
||||
reactorPopup.TextArea = genericPopup.TextAreaTMP;
|
||||
reactorPopup.BackButton = gameObject.transform.Find("ExitGame").GetComponent<PassiveButton>();
|
||||
reactorPopup.Background = gameObject.transform.Find("Background").GetComponent<SpriteRenderer>();
|
||||
|
||||
gameObject.name = name;
|
||||
genericPopup.destroyOnClose = true;
|
||||
reactorPopup.TextArea.fontSizeMin = 2;
|
||||
|
||||
return reactorPopup;
|
||||
}
|
||||
}
|
||||
+119
-103
@@ -4,9 +4,9 @@
|
||||
"net6.0": {
|
||||
"AmongUs.GameLibs.Steam": {
|
||||
"type": "Direct",
|
||||
"requested": "[2022.12.8, )",
|
||||
"resolved": "2022.12.8",
|
||||
"contentHash": "IJsIi89xUYRvA54YtNVEJjf25hhF3LWzkNBslKCNDUpL1aQ/PhNyO4j18pO71DCgW/qr1P1j8+CwByuBLsInNA=="
|
||||
"requested": "[2025.3.25, )",
|
||||
"resolved": "2025.3.25",
|
||||
"contentHash": "2QxQXgZDcQOdAIDXrNLrQ7veEzD6EBzuaRjzSbHptWUPUsuVc3I5Ur3xMkPPwmSGsDHjLuAGE84yRjV6oJxGxw=="
|
||||
},
|
||||
"BepInEx.AutoPlugin": {
|
||||
"type": "Direct",
|
||||
@@ -22,68 +22,105 @@
|
||||
},
|
||||
"BepInEx.Unity.IL2CPP": {
|
||||
"type": "Direct",
|
||||
"requested": "[6.0.0-be.663, )",
|
||||
"resolved": "6.0.0-be.663",
|
||||
"contentHash": "J+mZ4svyTt4ZYbUoPwpVtF5QCGfzC42VuYJ7z1K6Qt8YlBEZx3rnmUmaEnoJIqN5wN7BSnQgzEmrRfdbrgtTnA==",
|
||||
"requested": "[6.0.0-be.733, )",
|
||||
"resolved": "6.0.0-be.733",
|
||||
"contentHash": "lnoGaPHjIdGfEiKtf89knaTdLXe4IUqVLdoYqW8NYhhNqgxa3oNwScjTmuYQpa4Leew3937+slq2WIjvX/DUwQ==",
|
||||
"dependencies": {
|
||||
"BepInEx.Core": "6.0.0-be.663",
|
||||
"BepInEx.Unity.Common": "6.0.0-be.663",
|
||||
"HarmonyX": "2.10.1",
|
||||
"Iced": "1.17.0",
|
||||
"Il2CppInterop.Generator": "1.4.0",
|
||||
"Il2CppInterop.HarmonySupport": "1.4.0",
|
||||
"Il2CppInterop.Runtime": "1.4.0",
|
||||
"MonoMod.RuntimeDetour": "22.5.1.1",
|
||||
"Samboy063.Cpp2IL.Core": "2022.0.7.2"
|
||||
}
|
||||
},
|
||||
"Microsoft.SourceLink.GitHub": {
|
||||
"type": "Direct",
|
||||
"requested": "[1.1.1, )",
|
||||
"resolved": "1.1.1",
|
||||
"contentHash": "IaJGnOv/M7UQjRJks7B6p7pbPnOwisYGOIzqCz5ilGFTApZ3ktOR+6zJ12ZRPInulBmdAf1SrGdDG2MU8g6XTw==",
|
||||
"dependencies": {
|
||||
"Microsoft.Build.Tasks.Git": "1.1.1",
|
||||
"Microsoft.SourceLink.Common": "1.1.1"
|
||||
"BepInEx.Core": "6.0.0-be.733",
|
||||
"BepInEx.Unity.Common": "6.0.0-be.733",
|
||||
"HarmonyX": "2.10.2",
|
||||
"Iced": "1.21.0",
|
||||
"Il2CppInterop.Generator": "1.4.6-ci.426",
|
||||
"Il2CppInterop.HarmonySupport": "1.4.6-ci.426",
|
||||
"Il2CppInterop.Runtime": "1.4.6-ci.426",
|
||||
"MonoMod.RuntimeDetour": "22.7.31.1",
|
||||
"Samboy063.Cpp2IL.Core": "2022.1.0-pre-release.18"
|
||||
}
|
||||
},
|
||||
"StyleCop.Analyzers": {
|
||||
"type": "Direct",
|
||||
"requested": "[1.2.0-beta.435, )",
|
||||
"resolved": "1.2.0-beta.435",
|
||||
"contentHash": "TADk7vdGXtfTnYCV7GyleaaRTQjfoSfZXprQrVMm7cSJtJbFc1QIbWPyLvrgrfGdfHbGmUPvaN4ODKNxg2jgPQ==",
|
||||
"requested": "[1.2.0-beta.556, )",
|
||||
"resolved": "1.2.0-beta.556",
|
||||
"contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==",
|
||||
"dependencies": {
|
||||
"StyleCop.Analyzers.Unstable": "1.2.0.435"
|
||||
"StyleCop.Analyzers.Unstable": "1.2.0.556"
|
||||
}
|
||||
},
|
||||
"AssetRipper.VersionUtilities": {
|
||||
"AsmResolver": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.2.1",
|
||||
"contentHash": "knQ/W1YwTZS2AbdaZh+nhyyBEZQPQDcahhSOnh88i+cdg4/FEoFJiCwaavgFvCMNuUeHTbcZc4qttF8WQ8xLIA=="
|
||||
"resolved": "6.0.0-beta.1",
|
||||
"contentHash": "M5btCR/rmrx32jZsoN6CLQ/VQk8lN8hvPb6lgojua7pjNoo7StAl92koMC8qz4vzZyH2CNqxLSDoswRvyyK/vA=="
|
||||
},
|
||||
"AsmResolver.DotNet": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0-beta.1",
|
||||
"contentHash": "PTq8nNQvhgTxF1iARCknffCsu7Iq9B0kN7TVC8iMaU7uEYog3xvVqH/0+TreY8GW74/+MqhZt/yEFsvS4oAduQ==",
|
||||
"dependencies": {
|
||||
"AsmResolver.PE": "6.0.0-beta.1"
|
||||
}
|
||||
},
|
||||
"AsmResolver.PE": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0-beta.1",
|
||||
"contentHash": "KadLvx/zzFCJyF+E4jG6jPE1d0iJquzL6+hm8GBivBAs6nwHC8s6g4c857QwQCzXMWza6Vz5Q+3hFiNuOfKaWQ==",
|
||||
"dependencies": {
|
||||
"AsmResolver.PE.File": "6.0.0-beta.1"
|
||||
}
|
||||
},
|
||||
"AsmResolver.PE.File": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0-beta.1",
|
||||
"contentHash": "+lusB9UMHevI5aQsu73NQ1ctPMLFvyHAsEf8vjaJ/py+kX1DkU0JkbERtBRmaf58/hBZ7cyrE7gFnjoo7Bbg7A==",
|
||||
"dependencies": {
|
||||
"AsmResolver": "6.0.0-beta.1"
|
||||
}
|
||||
},
|
||||
"AssetRipper.CIL": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.1.0",
|
||||
"contentHash": "nSz1cBjgVeKv+esfDtyQGC1mY9b4C4NFStytdoa9DMozDC8uth6930kAsuWZEivj9GqWSqENnaQUGnl23WpmnQ==",
|
||||
"dependencies": {
|
||||
"AsmResolver.DotNet": "6.0.0-beta.1"
|
||||
}
|
||||
},
|
||||
"AssetRipper.Gee.External.Capstone": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.3.2",
|
||||
"contentHash": "wOr5PQPL/2ZfD7+ebt6cpRbUhSzSY5nlHGHjjzuQRiU5zkQlqQNwWDLX0M3smrm5IkaDvONkmDjFMKTlZJmyuQ=="
|
||||
},
|
||||
"AssetRipper.Primitives": {
|
||||
"type": "Transitive",
|
||||
"resolved": "3.1.3",
|
||||
"contentHash": "djZbN/+EXmI+Oia9Pm0LyjZVCPLf60TPSL5rGb7mBEYM5F4CN3nPFXvl2yA5LanPZoHS1Yq7PghGUmkP7Pv9RQ=="
|
||||
},
|
||||
"BepInEx.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0-be.663",
|
||||
"contentHash": "yTlqwieyV3FCzSo4tfiIlS7pTqVtEZwrwHnograkWO4loECeYpShcpoCoxnhQ0vkWsnWGThMK7NodHhjZ+jQDA==",
|
||||
"resolved": "6.0.0-be.733",
|
||||
"contentHash": "uRzpyUdU3L8Y4ZW+ZnF73orq0E40MjGK6XcPzm24CrrWB5bUshwdrtFQfrwZB6jcZVNVV6PXE92hScEI+Jaoqw==",
|
||||
"dependencies": {
|
||||
"HarmonyX": "2.10.1",
|
||||
"MonoMod.Utils": "22.5.1.1",
|
||||
"HarmonyX": "2.10.2",
|
||||
"MonoMod.Utils": "22.7.31.1",
|
||||
"SemanticVersioning": "2.0.2"
|
||||
}
|
||||
},
|
||||
"BepInEx.Unity.Common": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0-be.663",
|
||||
"contentHash": "kxv0yXJQ7YPzUQzlwkpVzmTkdd87kVcQhMjkrwqpowJ0Yx5vEwPUrRyG/pwMH5/cK+2WHCn/2akGWrW0C4vUAQ==",
|
||||
"resolved": "6.0.0-be.733",
|
||||
"contentHash": "KfdiHVSOPnIbDEF7zLPTSXDjKqIEq7SgffqFFKIxOBkCws7LdtSRQsamUcxdD0H8yopcgdlqobIp6t8e4M/k9Q==",
|
||||
"dependencies": {
|
||||
"AssetRipper.VersionUtilities": "1.2.1",
|
||||
"MonoMod.Utils": "22.5.1.1"
|
||||
"AssetRipper.Primitives": "3.1.3",
|
||||
"MonoMod.Utils": "22.7.31.1"
|
||||
}
|
||||
},
|
||||
"Disarm": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.1.0-master.34",
|
||||
"contentHash": "sxzTci5eSdl+sFoaGsMZIp7X/eB5ZzplM3CppvD1CWoiZ8rSa43XGLC19G5e8n6mjutNBfN9yL+RER5PCspHFg=="
|
||||
},
|
||||
"HarmonyX": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.10.1",
|
||||
"contentHash": "9LodMC9Y0u1TW96eKJoWrFJFpmzbgojEO38/Q+e7c1mFPhmHt8xcR8qhI06iF1rf0Dnsk+hqENFVSgbtwl/bEw==",
|
||||
"resolved": "2.10.2",
|
||||
"contentHash": "/5WwkxXX8mPsRuigQt957rJGx1f0dDQxk+bvk4yYITKFjXas9Em+O71zEP8X0ym8OFQQ2XH/2SxS4NC7vEC+Xg==",
|
||||
"dependencies": {
|
||||
"MonoMod.RuntimeDetour": "22.3.23.4",
|
||||
"System.Reflection.Emit": "4.7.0"
|
||||
@@ -91,13 +128,13 @@
|
||||
},
|
||||
"Iced": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.17.0",
|
||||
"contentHash": "8x+HCVTl/HHTGpscH3vMBhV8sknN/muZFw9s3TsI8SA6+c43cOTCi2+jE4KsU8pNLbJ++iF2ZFcpcXHXtDglnw=="
|
||||
"resolved": "1.21.0",
|
||||
"contentHash": "dv5+81Q1TBQvVMSOOOmRcjJmvWcX3BZPZsIq31+RLc5cNft0IHAyNlkdb7ZarOWG913PyBoFDsDXoCIlKmLclg=="
|
||||
},
|
||||
"Il2CppInterop.Common": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.4.0",
|
||||
"contentHash": "xl60qoa1nImG6qgOQcjSDW46nLQHoRvSWE7QTDQz7XeMsGwOxAbgDtOvJ4gOvoLijTU79gFZYe8H1CM7TcTQ5g==",
|
||||
"resolved": "1.4.6-ci.426",
|
||||
"contentHash": "pI0kU0qqJKMP6z9eFz4+WJtGIwklfPxW2yWEY9vKnrN9bbYMusK3v5uFWV8al7S/HPSATV5jNWH1hyTvP7kglA==",
|
||||
"dependencies": {
|
||||
"Iced": "1.17.0",
|
||||
"Microsoft.Extensions.Logging.Abstractions": "6.0.1",
|
||||
@@ -106,46 +143,31 @@
|
||||
},
|
||||
"Il2CppInterop.Generator": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.4.0",
|
||||
"contentHash": "Q4QqkwQroDwwqB17/DRF6hbHQRIuyLksgxVUEDvXZ3T+ogkrZB9h0Ev36alN0f6e7fcZPRkMrpXOAYwZzPiZag==",
|
||||
"resolved": "1.4.6-ci.426",
|
||||
"contentHash": "kecdx/vbNl0RtfzfYW592jU8PMyq1JbzpvoJSvqwO+tV6icp9SljXy6yG8bT/wt0gaPj9mFUNDTe2Wu6M6XGZQ==",
|
||||
"dependencies": {
|
||||
"Il2CppInterop.Common": "1.4.0",
|
||||
"Il2CppInterop.Common": "1.4.6-ci.426",
|
||||
"Mono.Cecil": "0.11.3"
|
||||
}
|
||||
},
|
||||
"Il2CppInterop.HarmonySupport": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.4.0",
|
||||
"contentHash": "Uz4w5PbQ3kLXqUrsQxR35f7xMpfnxLiXthVtNaT3fvHXC8B7arjuBZXeCbcozr6dXFJBDa5W0EElBmH0fWoASg==",
|
||||
"resolved": "1.4.6-ci.426",
|
||||
"contentHash": "rd2T5o6SybIc12hmX3HktTF5n27hFb0w4mNSExq7h1YsmrNlt7x+Ac1MBnnB0JwPLIg7w8LjnKjoIX6Gf626ng==",
|
||||
"dependencies": {
|
||||
"HarmonyX": "2.10.0",
|
||||
"Il2CppInterop.Runtime": "1.4.0"
|
||||
"Il2CppInterop.Runtime": "1.4.6-ci.426"
|
||||
}
|
||||
},
|
||||
"Il2CppInterop.Runtime": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.4.0",
|
||||
"contentHash": "ScgsFlbJ3gj5f69As/GT8pSO2WlS7cOeS/n3h4gBqJ01Eq/Lm+s3FBrGpEiuIWALOgmtQYimhjWVpxRt7LYtGw==",
|
||||
"resolved": "1.4.6-ci.426",
|
||||
"contentHash": "0O0oI7gOqJixrsjvh1firhuGYK3Yr0uDLp6Q+t5CfcTMmeEX8Plk3pqAP9ZYyilBvh7uW0gv4Golqz08L1GXug==",
|
||||
"dependencies": {
|
||||
"Iced": "1.17.0",
|
||||
"Il2CppInterop.Common": "1.4.0"
|
||||
"Il2CppInterop.Common": "1.4.6-ci.426"
|
||||
}
|
||||
},
|
||||
"IndexRange": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.0.0",
|
||||
"contentHash": "6TgS1JLSUkpmPLfXBPaAgB39ZUix8E4soXWk2XSDcscVe84i1JKzIAtA7jHbRHSkOOrcr6YA0MpLCeq98y9mYQ=="
|
||||
},
|
||||
"js6pak.Gee.External.Capstone": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.1.0",
|
||||
"contentHash": "YYpq7NM50bSSVUDjXyV/eiITk6syXqItPjKBOb3jEWS6RFsk0DNhpWMPW6b3hKDmArARuWDU6S2pVu1IeVrvIA=="
|
||||
},
|
||||
"Microsoft.Build.Tasks.Git": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.1.1",
|
||||
"contentHash": "AT3HlgTjsqHnWpBHSNeR0KxbLZD7bztlZVj7I8vgeYG9SYqbeFGh0TM/KVtC6fg53nrWHl3VfZFvb5BiQFcY6Q=="
|
||||
},
|
||||
"Microsoft.Extensions.Logging.Abstractions": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.1",
|
||||
@@ -161,11 +183,6 @@
|
||||
"resolved": "1.1.0",
|
||||
"contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg=="
|
||||
},
|
||||
"Microsoft.SourceLink.Common": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.1.1",
|
||||
"contentHash": "WMcGpWKrmJmzrNeuaEb23bEMnbtR/vLmvZtkAP5qWu7vQsY59GqfRJd65sFpBszbd2k/bQ8cs8eWawQKAabkVg=="
|
||||
},
|
||||
"Mono.Cecil": {
|
||||
"type": "Transitive",
|
||||
"resolved": "0.11.4",
|
||||
@@ -173,11 +190,11 @@
|
||||
},
|
||||
"MonoMod.RuntimeDetour": {
|
||||
"type": "Transitive",
|
||||
"resolved": "22.5.1.1",
|
||||
"contentHash": "WG5zLRuAr8KJEnIkKTuIG1OJCrGIT3pjvnAD43E0FDchHf3Dp985MF/8tmIQvAzCZV87JNs6QKeGGqmwDmpXpw==",
|
||||
"resolved": "22.7.31.1",
|
||||
"contentHash": "nxVJTvQbWAujaogt5XX3eAy7d22t66Z88aWg9sirPLO9rR/6yNCHAyZpgxXrOsIobZVW0IEZPqNMOBhgke25/w==",
|
||||
"dependencies": {
|
||||
"Mono.Cecil": "0.11.4",
|
||||
"MonoMod.Utils": "22.5.1.1",
|
||||
"MonoMod.Utils": "22.7.31.1",
|
||||
"System.Collections.NonGeneric": "4.3.0",
|
||||
"System.ComponentModel.TypeConverter": "4.3.0",
|
||||
"System.IO.FileSystem.Primitives": "4.3.0",
|
||||
@@ -188,8 +205,8 @@
|
||||
},
|
||||
"MonoMod.Utils": {
|
||||
"type": "Transitive",
|
||||
"resolved": "22.5.1.1",
|
||||
"contentHash": "vBObO1atXxhi2C4AuC53y87Bqeogi9xIrD1Ym3YWr5uxc8Nrm8SrsFeD1i3x04R999+XQ3FdeHrbXScyWYEHqQ==",
|
||||
"resolved": "22.7.31.1",
|
||||
"contentHash": "nI0E1oadXS1iMbfwfCzYF08C1jRQR9cnnHv66a4BSPd4sGu2p6g4BmctCWsdAB6oGKkSJUhcfHfxcfTsDyB94Q==",
|
||||
"dependencies": {
|
||||
"Mono.Cecil": "0.11.4",
|
||||
"System.Collections.NonGeneric": "4.3.0",
|
||||
@@ -300,42 +317,46 @@
|
||||
},
|
||||
"Samboy063.Cpp2IL.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.0.7.2",
|
||||
"contentHash": "e17CAhKSxdAp7vFcYEVxjSc7t7rcvVGBipGhgE9tAjRXY85wZXLlHEVO0AEvMRkLmf9U+if4wK/nZEC1AX6VqQ==",
|
||||
"resolved": "2022.1.0-pre-release.18",
|
||||
"contentHash": "eX9d1IK05jWaEaeuMAE0L5WYHT7thtxz+aWLL/CAaCzZ0TzRPD+WFTjJ0KQO0YWBVO300CX3GwmPmf7TNO+wUg==",
|
||||
"dependencies": {
|
||||
"HarmonyX": "2.5.5",
|
||||
"Iced": "1.11.1",
|
||||
"IndexRange": "1.0.0",
|
||||
"Mono.Cecil": "0.11.4",
|
||||
"Samboy063.LibCpp2IL": "2022.0.7.2",
|
||||
"System.Runtime.InteropServices": "4.3.0",
|
||||
"System.ValueTuple": "4.5.0",
|
||||
"js6pak.Gee.External.Capstone": "2.1.0"
|
||||
"AsmResolver.DotNet": "6.0.0-beta.1",
|
||||
"AssetRipper.CIL": "1.1.0",
|
||||
"AssetRipper.Gee.External.Capstone": "2.3.2",
|
||||
"Disarm": "2022.1.0-master.34",
|
||||
"Iced": "1.21.0",
|
||||
"Samboy063.LibCpp2IL": "2022.1.0-pre-release.18",
|
||||
"StableNameDotNet": "0.1.0-pre-release.15"
|
||||
}
|
||||
},
|
||||
"Samboy063.LibCpp2IL": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.0.7.2",
|
||||
"contentHash": "DpVeU0dQkUJCpbw0f1xKOG8vimdK2oYhrVABC7HDE3/ikGjhnMZd3i5b1joKDHZ+AiL90TWOaEXPcy24rCZ0dA==",
|
||||
"resolved": "2022.1.0-pre-release.18",
|
||||
"contentHash": "9zJdTAeErpwJpYDHYwwI0MAC1OyBEfC1ce7dpAOYRUUYCfeaKVWxnSCcyaoY6HDzIoxPkhbfllbwOe49ZmUYuQ==",
|
||||
"dependencies": {
|
||||
"IndexRange": "1.0.0",
|
||||
"Samboy063.WasmDisassembler": "2022.0.2"
|
||||
"AssetRipper.Primitives": "3.1.2",
|
||||
"Samboy063.WasmDisassembler": "2022.1.0-pre-release.15"
|
||||
}
|
||||
},
|
||||
"Samboy063.WasmDisassembler": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.0.2",
|
||||
"contentHash": "2uu+xBb7M3HKfBx9tAY6jiDieAf0hRnQjSmGX+7IdE6i24dYsx6TYgtrLvRx5lOuF2M8DijZ5H8yQ1pcuCs2SA=="
|
||||
"resolved": "2022.1.0-pre-release.15",
|
||||
"contentHash": "e6qw81SHS+fS7iZ3qfqZBavVarYbkPElNgDCANF6dNFTYq5+hc80am+4FqQDl+ZVNS47bZDZobxIzHhmriCXGg=="
|
||||
},
|
||||
"SemanticVersioning": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.0.2",
|
||||
"contentHash": "4EQgYdNZ92SyaO7YFk6olVnebF5V+jrHyMUjvPq89tLeMo8NSfgDF+6Zwq/lgh9j/0yfQp9Lkm0ZA0rUATCZFA=="
|
||||
},
|
||||
"StableNameDotNet": {
|
||||
"type": "Transitive",
|
||||
"resolved": "0.1.0-pre-release.15",
|
||||
"contentHash": "aIkEOo8V76vE+9CppHpTFLGXalBw6TAl4/tb6vadmS+gHJMshTVehzQv9cJXy4xZDdANV1uGMRaUFZERcDA2xQ=="
|
||||
},
|
||||
"StyleCop.Analyzers.Unstable": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.2.0.435",
|
||||
"contentHash": "ouwPWZxbOV3SmCZxIRqHvljkSzkCyi1tDoMzQtDb/bRP8ctASV/iRJr+A2Gdj0QLaLmWnqTWDrH82/iP+X80Lg=="
|
||||
"resolved": "1.2.0.556",
|
||||
"contentHash": "zvn9Mqs/ox/83cpYPignI8hJEM2A93s2HkHs8HYMOAQW0PkampyoErAiIyKxgTLqbbad29HX/shv/6LGSjPJNQ=="
|
||||
},
|
||||
"System.Collections": {
|
||||
"type": "Transitive",
|
||||
@@ -878,11 +899,6 @@
|
||||
"Microsoft.NETCore.Targets": "1.1.0",
|
||||
"System.Runtime": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.ValueTuple": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.5.0",
|
||||
"contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ=="
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"sdk": {
|
||||
"version": "8.0.0",
|
||||
"rollForward": "latestFeature"
|
||||
}
|
||||
}
|
||||
@@ -3,5 +3,6 @@
|
||||
<configuration>
|
||||
<packageSources>
|
||||
<add key="BepInEx" value="https://nuget.bepinex.dev/v3/index.json" />
|
||||
<add key="Samboy" value="https://nuget.samboy.dev/v3/index.json" />
|
||||
</packageSources>
|
||||
</configuration>
|
||||
Reference in new issue
Block a user