Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6eb0bf19c3 | ||
|
|
f63569d2e0 | ||
|
|
c84d36a3f6 | ||
|
|
89146cea4f | ||
|
|
8553a2aa83 | ||
|
|
30027d89ea | ||
|
|
375a4170e7 | ||
|
|
4deb5f88b9 | ||
|
|
2407a99569 | ||
|
|
eded2830cc | ||
|
|
9ef4bd5dc6 | ||
|
|
678730ed0f | ||
|
|
da20e0990e | ||
|
|
9246458919 | ||
|
|
fa4cc03e33 | ||
|
|
67c89f99ed | ||
|
|
7155b45bef | ||
|
|
6079ea8fd4 | ||
|
|
0c8156aaf6 | ||
|
|
f2da251ae5 | ||
|
|
128c4f436e | ||
|
|
8d67b08481 | ||
|
|
615f6b20e1 | ||
|
|
da217c1627 | ||
|
|
2d148db013 | ||
|
|
ed05e563f0 | ||
|
|
81eea3eee2 | ||
|
|
b7971d36a8 | ||
|
|
5cc08363c7 | ||
|
|
6be7629187 | ||
|
|
04a32b486d | ||
|
|
510711c184 | ||
|
|
879c4181cc | ||
|
|
af27afed80 | ||
|
|
d2bc7cce04 | ||
|
|
d01ea478f4 | ||
|
|
f56aa32927 | ||
|
|
256f7617ad | ||
|
|
55c77a7651 | ||
|
|
f4631805f6 | ||
|
|
b751800b29 | ||
|
|
ffd58ddcd8 | ||
|
|
7fae71bdf2 | ||
|
|
5004ac8d5b | ||
|
|
c2047b033e |
No files matched your search
@@ -3,7 +3,7 @@
|
||||
"isRoot": true,
|
||||
"tools": {
|
||||
"cake.tool": {
|
||||
"version": "1.1.0",
|
||||
"version": "2.2.0",
|
||||
"commands": [
|
||||
"dotnet-cake"
|
||||
]
|
||||
|
||||
@@ -149,6 +149,16 @@ dotnet_diagnostic.IDE0043.severity = warning
|
||||
# IDE0044: Make field readonly
|
||||
dotnet_diagnostic.IDE0044.severity = warning
|
||||
|
||||
dotnet_diagnostic.CA1000.severity = none
|
||||
dotnet_diagnostic.CA1016.severity = none
|
||||
dotnet_diagnostic.CA1711.severity = none
|
||||
dotnet_diagnostic.CA1716.severity = none
|
||||
dotnet_diagnostic.CA1720.severity = none
|
||||
|
||||
[Reactor.Benchmarks/*.cs]
|
||||
dotnet_diagnostic.CA1707.severity = none
|
||||
dotnet_diagnostic.CA1822.severity = none
|
||||
|
||||
# CSharp code style settings:
|
||||
[*.cs]
|
||||
# Newline settings
|
||||
|
||||
@@ -7,7 +7,7 @@ jobs:
|
||||
runs-on: ubuntu-20.04
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: true
|
||||
|
||||
@@ -21,7 +21,7 @@ jobs:
|
||||
${{ runner.os }}-nuget-
|
||||
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v1
|
||||
uses: actions/setup-dotnet@v2
|
||||
with:
|
||||
dotnet-version: 6.x
|
||||
|
||||
@@ -30,23 +30,33 @@ jobs:
|
||||
with:
|
||||
verbosity: Diagnostic
|
||||
|
||||
- uses: actions/upload-artifact@v2
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: Reactor.dll
|
||||
path: Reactor/bin/Release/netstandard2.1/Reactor.dll
|
||||
path: Reactor/bin/Release/net6.0/Reactor.dll
|
||||
|
||||
- uses: actions/upload-artifact@v2
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: Reactor.nupkg
|
||||
path: Reactor/bin/Release/Reactor.*.nupkg
|
||||
|
||||
- uses: actions/upload-artifact@v2
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: Reactor.Networking.Shared.nupkg
|
||||
path: Reactor.Networking.Shared/bin/Release/*.nupkg
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: Reactor.Debugger.dll
|
||||
path: Reactor.Debugger/bin/Release/netstandard2.1/Reactor.Debugger.dll
|
||||
path: Reactor.Debugger/bin/Release/net6.0/Reactor.Debugger.dll
|
||||
|
||||
- uses: softprops/action-gh-release@v1
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
if: github.ref_type == 'tag'
|
||||
with:
|
||||
draft: true
|
||||
files: Reactor/bin/Release/netstandard2.1/Reactor.dll
|
||||
files: Reactor/bin/Release/net6.0/Reactor.dll
|
||||
|
||||
- name: Push nightly NuGet package
|
||||
if: github.repository == 'NuclearPowered/Reactor' && github.ref == 'refs/heads/master'
|
||||
run: |
|
||||
dotnet nuget push {Reactor/bin/Release/Reactor.*.nupkg,Reactor.Networking.Shared/bin/Release/*.nupkg} --source https://nuget.reactor.gg/v3/index.json --api-key ${{ secrets.REACTOR_NUGET_KEY }}
|
||||
@@ -0,0 +1,44 @@
|
||||
name: Unity
|
||||
|
||||
on:
|
||||
push:
|
||||
paths: [ "Reactor.Assets/**", "Reactor/Assets/*.bundle", ".github/workflows/unity.yml" ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
~/Unity/Hub/Editor
|
||||
~/.config/unityhub
|
||||
key: unity-2020.3.22f1
|
||||
|
||||
- name: Setup Unity
|
||||
uses: js6pak/setup-unity@master
|
||||
with:
|
||||
project-path: ./Reactor.Assets
|
||||
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 }}
|
||||
|
||||
- name: Build
|
||||
working-directory: ./Reactor.Assets
|
||||
run: bash ./build.sh
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: bundles
|
||||
path: ./Reactor/Assets/*.bundle
|
||||
|
||||
- name: Verify
|
||||
run: if [[ $(git status --porcelain) ]]; then git status; git diff; exit 1; fi
|
||||
@@ -6,3 +6,4 @@ riderModule.iml
|
||||
.idea
|
||||
/tools
|
||||
.vscode
|
||||
*.DotSettings.user
|
||||
@@ -1,16 +1,10 @@
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<GamePlatform Condition="'$(GamePlatform)' == ''">Steam</GamePlatform>
|
||||
<GameVersion Condition="'$(GamePlatform)' == 'Steam'">2022.8.23</GameVersion>
|
||||
<GameVersion Condition="'$(GamePlatform)' == 'Itch'">2022.8.23</GameVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="BepInEx.IL2CPP" Version="6.0.0-be.570" />
|
||||
<PackageReference Include="AmongUs.GameLibs.$(GamePlatform)" Version="$(GameVersion)" PrivateAssets="all" />
|
||||
<PackageReference Include="BepInEx.Unity.IL2CPP" Version="6.0.0-be.670" Private="false" ExcludeAssets="runtime;native" />
|
||||
<PackageReference Include="AmongUs.GameLibs.Steam" Version="2023.7.11" PrivateAssets="all" />
|
||||
|
||||
<PackageReference Include="BepInEx.AutoPlugin" Version="1.0.1" PrivateAssets="all" />
|
||||
<PackageReference Include="BepInEx.IL2CPP.MSBuild" Version="1.1.1" 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" />
|
||||
</ItemGroup>
|
||||
|
||||
<Target Name="Copy" AfterTargets="Build" Condition="'$(AmongUs)' != ''">
|
||||
|
||||
@@ -1,5 +1,39 @@
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<DebugType>embedded</DebugType>
|
||||
<Nullable>enable</Nullable>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
|
||||
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
|
||||
|
||||
<VersionPrefix>2.2.0</VersionPrefix>
|
||||
<VersionSuffix>dev</VersionSuffix>
|
||||
|
||||
<Authors>NuclearPowered</Authors>
|
||||
<PackageIcon>icon.png</PackageIcon>
|
||||
<RepositoryType>git</RepositoryType>
|
||||
<RepositoryUrl>https://github.com/NuclearPowered/Reactor</RepositoryUrl>
|
||||
<PackageLicenseExpression>LGPL-3.0-or-later</PackageLicenseExpression>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
|
||||
<ItemGroup>
|
||||
<None Include="$(MSBuildThisFileDirectory)\assets\icon.png" Pack="true" PackagePath="" Visible="false" />
|
||||
</ItemGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<EnableNETAnalyzers>true</EnableNETAnalyzers>
|
||||
<AnalysisLevel>latest</AnalysisLevel>
|
||||
<AnalysisMode>recommended</AnalysisMode>
|
||||
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="StyleCop.Analyzers" Version="1.2.0-beta.435" PrivateAssets="all" />
|
||||
<AdditionalFiles Include="$(MSBuildThisFileDirectory)\stylecop.json" Link="stylecop.json" Visible="false" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup>
|
||||
<CodeAnalysisRuleSet>$(MSBuildThisFileDirectory)\stylecop.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,9 @@
|
||||
*
|
||||
!.gitignore
|
||||
!Assets/
|
||||
!Assets/**
|
||||
!Packages/
|
||||
!Packages/**
|
||||
!ProjectSettings/
|
||||
!ProjectSettings/ProjectVersion.txt
|
||||
!build.sh
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ae7df23e94a4b0c83a418e20686437d1
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5425e70810911f650b05cf41f536c339
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,116 @@
|
||||
// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)
|
||||
|
||||
Shader "UI/Default"
|
||||
{
|
||||
Properties
|
||||
{
|
||||
[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
|
||||
_Color ("Tint", Color) = (1,1,1,1)
|
||||
|
||||
_StencilComp ("Stencil Comparison", Float) = 8
|
||||
_Stencil ("Stencil ID", Float) = 0
|
||||
_StencilOp ("Stencil Operation", Float) = 0
|
||||
_StencilWriteMask ("Stencil Write Mask", Float) = 255
|
||||
_StencilReadMask ("Stencil Read Mask", Float) = 255
|
||||
|
||||
_ColorMask ("Color Mask", Float) = 15
|
||||
|
||||
[Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0
|
||||
}
|
||||
|
||||
SubShader
|
||||
{
|
||||
Tags
|
||||
{
|
||||
"Queue"="Transparent"
|
||||
"IgnoreProjector"="True"
|
||||
"RenderType"="Transparent"
|
||||
"PreviewType"="Plane"
|
||||
"CanUseSpriteAtlas"="True"
|
||||
}
|
||||
|
||||
Stencil
|
||||
{
|
||||
Ref [_Stencil]
|
||||
Comp [_StencilComp]
|
||||
Pass [_StencilOp]
|
||||
ReadMask [_StencilReadMask]
|
||||
WriteMask [_StencilWriteMask]
|
||||
}
|
||||
|
||||
Cull Off
|
||||
Lighting Off
|
||||
ZWrite Off
|
||||
ZTest [unity_GUIZTestMode]
|
||||
Blend SrcAlpha OneMinusSrcAlpha
|
||||
ColorMask [_ColorMask]
|
||||
|
||||
Pass
|
||||
{
|
||||
Name "Default"
|
||||
CGPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#pragma target 2.0
|
||||
|
||||
#include "UnityCG.cginc"
|
||||
#include "UnityUI.cginc"
|
||||
|
||||
#pragma multi_compile_local _ UNITY_UI_CLIP_RECT
|
||||
#pragma multi_compile_local _ UNITY_UI_ALPHACLIP
|
||||
|
||||
struct appdata_t
|
||||
{
|
||||
float4 vertex : POSITION;
|
||||
float4 color : COLOR;
|
||||
float2 texcoord : TEXCOORD0;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
|
||||
struct v2f
|
||||
{
|
||||
float4 vertex : SV_POSITION;
|
||||
fixed4 color : COLOR;
|
||||
float2 texcoord : TEXCOORD0;
|
||||
float4 worldPosition : TEXCOORD1;
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
|
||||
sampler2D _MainTex;
|
||||
fixed4 _Color;
|
||||
fixed4 _TextureSampleAdd;
|
||||
float4 _ClipRect;
|
||||
float4 _MainTex_ST;
|
||||
|
||||
v2f vert(appdata_t v)
|
||||
{
|
||||
v2f OUT;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
|
||||
OUT.worldPosition = v.vertex;
|
||||
OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);
|
||||
|
||||
OUT.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
|
||||
|
||||
OUT.color = v.color * _Color;
|
||||
return OUT;
|
||||
}
|
||||
|
||||
fixed4 frag(v2f IN) : SV_Target
|
||||
{
|
||||
half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;
|
||||
|
||||
#ifdef UNITY_UI_CLIP_RECT
|
||||
color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
|
||||
#endif
|
||||
|
||||
#ifdef UNITY_UI_ALPHACLIP
|
||||
clip (color.a - 0.001);
|
||||
#endif
|
||||
|
||||
return color;
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ba8fc08df3e3f060089297eca021e4d4
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures: []
|
||||
nonModifiableTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e90cbb1a99b248a86995ee7f3c98c535
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 68078bcc7def68b6088cdcf1eb1b4e9b
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 682 B |
@@ -0,0 +1,120 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 65b1cd3c5eee8851e847e241c19b9255
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 11
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 1
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 0
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 200
|
||||
spriteBorder: {x: 10, y: 10, z: 10, w: 10}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 100
|
||||
crunchedCompression: 1
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 100
|
||||
crunchedCompression: 1
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 100
|
||||
crunchedCompression: 1
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: 5e97eb03825dee720800000000000000
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 636 B |
@@ -0,0 +1,120 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d08be60d3e2df0be09c5425e53870ba2
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 11
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 1
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 100
|
||||
crunchedCompression: 1
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 100
|
||||
crunchedCompression: 1
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 100
|
||||
crunchedCompression: 1
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: 5e97eb03825dee720800000000000000
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 347 B |
@@ -0,0 +1,120 @@
|
||||
fileFormatVersion: 2
|
||||
guid: eb30bbf806046ba1abf51bdd925e9647
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 11
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 1
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 100
|
||||
crunchedCompression: 1
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 100
|
||||
crunchedCompression: 1
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 100
|
||||
crunchedCompression: 1
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: 5e97eb03825dee720800000000000000
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 825 B |
@@ -0,0 +1,120 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a9d090601d3e0379b8075998ffd68c0a
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 11
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 1
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 0
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 200
|
||||
spriteBorder: {x: 10, y: 10, z: 10, w: 10}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 100
|
||||
crunchedCompression: 1
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 100
|
||||
crunchedCompression: 1
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 100
|
||||
crunchedCompression: 1
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: 5e97eb03825dee720800000000000000
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
@@ -0,0 +1,120 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bc8ea6103cf8330a999ba68b1990c144
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 11
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 1
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 100
|
||||
crunchedCompression: 1
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 100
|
||||
crunchedCompression: 1
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 100
|
||||
crunchedCompression: 1
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: 5e97eb03825dee720800000000000000
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 270 B |
@@ -0,0 +1,120 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 510b2bfc58b13bddd82690444d29a7f1
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 11
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 1
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 0
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 200
|
||||
spriteBorder: {x: 10, y: 10, z: 10, w: 10}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 100
|
||||
crunchedCompression: 1
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 100
|
||||
crunchedCompression: 1
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 100
|
||||
crunchedCompression: 1
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: 5e97eb03825dee720800000000000000
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 740 B |
@@ -0,0 +1,120 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 63bb215422fe83002acfe2f01232904c
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 11
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 1
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 0
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 200
|
||||
spriteBorder: {x: 10, y: 10, z: 10, w: 10}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 100
|
||||
crunchedCompression: 1
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 100
|
||||
crunchedCompression: 1
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 100
|
||||
crunchedCompression: 1
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: 5e97eb03825dee720800000000000000
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,102 @@
|
||||
#if UNITY_EDITOR
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using UnityEditor;
|
||||
using Debug = UnityEngine.Debug;
|
||||
|
||||
internal static class Build
|
||||
{
|
||||
public static BuildTarget[] Targets { get; } =
|
||||
{
|
||||
BuildTarget.StandaloneWindows,
|
||||
BuildTarget.Android,
|
||||
};
|
||||
|
||||
public static Compression Compression => Compression.LZMA;
|
||||
|
||||
public static string OutputPath { get; } = Path.Combine("..", "Reactor", "Assets");
|
||||
|
||||
public static string AssetBundlesPath { get; } = Path.Combine("Assets", "AssetBundles");
|
||||
public static string TempPath { get; } = Path.Combine("Temp", "AssetBundles");
|
||||
|
||||
[MenuItem("File/Build Asset Bundles")]
|
||||
public static void BuildAssetBundles()
|
||||
{
|
||||
Directory.CreateDirectory(TempPath);
|
||||
|
||||
var ignoredExtensions = new[] { ".meta", ".manifest", ".dll", ".cs", ".exe", ".tps" };
|
||||
|
||||
var builds = Directory.GetDirectories(AssetBundlesPath)
|
||||
.Select(directoryPath => new AssetBundleBuild
|
||||
{
|
||||
assetBundleName = Path.GetFileName(directoryPath),
|
||||
assetNames = Directory.GetFiles(directoryPath, "*", SearchOption.AllDirectories).Where(p => !ignoredExtensions.Contains(Path.GetExtension(p))).ToArray(),
|
||||
})
|
||||
.ToArray();
|
||||
|
||||
Debug.Log($"Building {builds.Length} asset bundle(s) ({string.Join(", ", builds.Select(b => b.assetBundleName))})");
|
||||
|
||||
var options = BuildAssetBundleOptions.StrictMode;
|
||||
|
||||
switch (Compression)
|
||||
{
|
||||
case Compression.None:
|
||||
options |= BuildAssetBundleOptions.UncompressedAssetBundle;
|
||||
break;
|
||||
|
||||
case Compression.LZ4:
|
||||
options |= BuildAssetBundleOptions.ChunkBasedCompression;
|
||||
break;
|
||||
}
|
||||
|
||||
foreach (var target in Targets)
|
||||
{
|
||||
var tempPath = Path.Combine(TempPath, target.ToString());
|
||||
Directory.CreateDirectory(tempPath);
|
||||
|
||||
var stopwatch = Stopwatch.StartNew();
|
||||
var manifest = BuildPipeline.BuildAssetBundles(tempPath, builds, options, target);
|
||||
Debug.Log($"Built asset bundle(s) for {target} in {stopwatch.Elapsed}");
|
||||
|
||||
foreach (var assetBundleName in manifest.GetAllAssetBundles())
|
||||
{
|
||||
var destinationPath = Path.Combine(OutputPath, $"{assetBundleName}-{GetTargetName(target)}.bundle");
|
||||
File.Delete(destinationPath);
|
||||
File.Copy(Path.Combine(tempPath, assetBundleName), destinationPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetTargetName(BuildTarget target)
|
||||
{
|
||||
return target switch
|
||||
{
|
||||
BuildTarget.StandaloneWindows => "win-x86",
|
||||
BuildTarget.StandaloneWindows64 => "win-x64",
|
||||
BuildTarget.Android => "android",
|
||||
BuildTarget.StandaloneLinux64 => "linux-x64",
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(target), target, null),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
internal enum Compression
|
||||
{
|
||||
/// <summary>
|
||||
/// Worst size, best load speed
|
||||
/// </summary>
|
||||
None,
|
||||
|
||||
/// <summary>
|
||||
/// Best size, worst load speed
|
||||
/// </summary>
|
||||
LZMA,
|
||||
|
||||
/// <summary>
|
||||
/// Okay size, okay load speed
|
||||
/// </summary>
|
||||
LZ4,
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d785823c2752b6812b292c93aa323bfa
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"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.vscode": "1.2.5",
|
||||
"com.unity.toolchain.linux-x86_64": "2.0.2",
|
||||
"com.unity.modules.ai": "1.0.0",
|
||||
"com.unity.modules.androidjni": "1.0.0",
|
||||
"com.unity.modules.animation": "1.0.0",
|
||||
"com.unity.modules.assetbundle": "1.0.0",
|
||||
"com.unity.modules.audio": "1.0.0",
|
||||
"com.unity.modules.cloth": "1.0.0",
|
||||
"com.unity.modules.director": "1.0.0",
|
||||
"com.unity.modules.imageconversion": "1.0.0",
|
||||
"com.unity.modules.imgui": "1.0.0",
|
||||
"com.unity.modules.jsonserialize": "1.0.0",
|
||||
"com.unity.modules.particlesystem": "1.0.0",
|
||||
"com.unity.modules.physics": "1.0.0",
|
||||
"com.unity.modules.physics2d": "1.0.0",
|
||||
"com.unity.modules.screencapture": "1.0.0",
|
||||
"com.unity.modules.terrain": "1.0.0",
|
||||
"com.unity.modules.terrainphysics": "1.0.0",
|
||||
"com.unity.modules.tilemap": "1.0.0",
|
||||
"com.unity.modules.ui": "1.0.0",
|
||||
"com.unity.modules.uielements": "1.0.0",
|
||||
"com.unity.modules.umbra": "1.0.0",
|
||||
"com.unity.modules.unityanalytics": "1.0.0",
|
||||
"com.unity.modules.unitywebrequest": "1.0.0",
|
||||
"com.unity.modules.unitywebrequestassetbundle": "1.0.0",
|
||||
"com.unity.modules.unitywebrequestaudio": "1.0.0",
|
||||
"com.unity.modules.unitywebrequesttexture": "1.0.0",
|
||||
"com.unity.modules.unitywebrequestwww": "1.0.0",
|
||||
"com.unity.modules.vehicles": "1.0.0",
|
||||
"com.unity.modules.video": "1.0.0",
|
||||
"com.unity.modules.vr": "1.0.0",
|
||||
"com.unity.modules.wind": "1.0.0",
|
||||
"com.unity.modules.xr": "1.0.0"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,333 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"com.unity.2d.sprite": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.ext.nunit": {
|
||||
"version": "1.0.6",
|
||||
"depth": 2,
|
||||
"source": "registry",
|
||||
"dependencies": {},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.ide.rider": {
|
||||
"version": "2.0.7",
|
||||
"depth": 0,
|
||||
"source": "registry",
|
||||
"dependencies": {
|
||||
"com.unity.test-framework": "1.1.1"
|
||||
},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.ide.visualstudio": {
|
||||
"version": "2.0.16",
|
||||
"depth": 0,
|
||||
"source": "registry",
|
||||
"dependencies": {
|
||||
"com.unity.test-framework": "1.1.9"
|
||||
},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.ide.vscode": {
|
||||
"version": "1.2.5",
|
||||
"depth": 0,
|
||||
"source": "registry",
|
||||
"dependencies": {},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.sysroot": {
|
||||
"version": "2.0.3",
|
||||
"depth": 1,
|
||||
"source": "registry",
|
||||
"dependencies": {},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.sysroot.linux-x86_64": {
|
||||
"version": "2.0.2",
|
||||
"depth": 1,
|
||||
"source": "registry",
|
||||
"dependencies": {
|
||||
"com.unity.sysroot": "2.0.3"
|
||||
},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.test-framework": {
|
||||
"version": "1.1.29",
|
||||
"depth": 1,
|
||||
"source": "registry",
|
||||
"dependencies": {
|
||||
"com.unity.ext.nunit": "1.0.6",
|
||||
"com.unity.modules.imgui": "1.0.0",
|
||||
"com.unity.modules.jsonserialize": "1.0.0"
|
||||
},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.toolchain.linux-x86_64": {
|
||||
"version": "2.0.2",
|
||||
"depth": 0,
|
||||
"source": "registry",
|
||||
"dependencies": {
|
||||
"com.unity.sysroot": "2.0.3",
|
||||
"com.unity.sysroot.linux-x86_64": "2.0.2"
|
||||
},
|
||||
"url": "https://packages.unity.com"
|
||||
},
|
||||
"com.unity.modules.ai": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.androidjni": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.animation": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.assetbundle": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.audio": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.cloth": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.physics": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.director": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.audio": "1.0.0",
|
||||
"com.unity.modules.animation": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.imageconversion": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.imgui": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.jsonserialize": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.particlesystem": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.physics": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.physics2d": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.screencapture": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.imageconversion": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.subsystems": {
|
||||
"version": "1.0.0",
|
||||
"depth": 1,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.jsonserialize": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.terrain": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.terrainphysics": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.physics": "1.0.0",
|
||||
"com.unity.modules.terrain": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.tilemap": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.physics2d": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.ui": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.uielements": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.ui": "1.0.0",
|
||||
"com.unity.modules.imgui": "1.0.0",
|
||||
"com.unity.modules.jsonserialize": "1.0.0",
|
||||
"com.unity.modules.uielementsnative": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.uielementsnative": {
|
||||
"version": "1.0.0",
|
||||
"depth": 1,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.ui": "1.0.0",
|
||||
"com.unity.modules.imgui": "1.0.0",
|
||||
"com.unity.modules.jsonserialize": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.umbra": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.unityanalytics": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.unitywebrequest": "1.0.0",
|
||||
"com.unity.modules.jsonserialize": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.unitywebrequest": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.unitywebrequestassetbundle": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.assetbundle": "1.0.0",
|
||||
"com.unity.modules.unitywebrequest": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.unitywebrequestaudio": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.unitywebrequest": "1.0.0",
|
||||
"com.unity.modules.audio": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.unitywebrequesttexture": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.unitywebrequest": "1.0.0",
|
||||
"com.unity.modules.imageconversion": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.unitywebrequestwww": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.unitywebrequest": "1.0.0",
|
||||
"com.unity.modules.unitywebrequestassetbundle": "1.0.0",
|
||||
"com.unity.modules.unitywebrequestaudio": "1.0.0",
|
||||
"com.unity.modules.audio": "1.0.0",
|
||||
"com.unity.modules.assetbundle": "1.0.0",
|
||||
"com.unity.modules.imageconversion": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.vehicles": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.physics": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.video": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.audio": "1.0.0",
|
||||
"com.unity.modules.ui": "1.0.0",
|
||||
"com.unity.modules.unitywebrequest": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.vr": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.jsonserialize": "1.0.0",
|
||||
"com.unity.modules.physics": "1.0.0",
|
||||
"com.unity.modules.xr": "1.0.0"
|
||||
}
|
||||
},
|
||||
"com.unity.modules.wind": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {}
|
||||
},
|
||||
"com.unity.modules.xr": {
|
||||
"version": "1.0.0",
|
||||
"depth": 0,
|
||||
"source": "builtin",
|
||||
"dependencies": {
|
||||
"com.unity.modules.physics": "1.0.0",
|
||||
"com.unity.modules.jsonserialize": "1.0.0",
|
||||
"com.unity.modules.subsystems": "1.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
m_EditorVersion: 2020.3.22f1
|
||||
m_EditorVersionWithRevision: 2020.3.22f1 (e1a7f79fd887)
|
||||
@@ -0,0 +1,25 @@
|
||||
#!/bin/bash
|
||||
|
||||
UNITY_VERSION=2020.3.22f1
|
||||
|
||||
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)
|
||||
UNITY_PATH="$UNITYHUB_INSTALL_PATH/$UNITY_VERSION/Editor/Unity"
|
||||
|
||||
if [[ ! -f $UNITY_PATH ]]; then
|
||||
echo "Unity $UNITY_VERSION is not installed"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "UNITY_PATH is not set"
|
||||
exit 1
|
||||
fi
|
||||
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
|
||||
@@ -0,0 +1,97 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using BenchmarkDotNet.Attributes;
|
||||
using BenchmarkDotNet.Configs;
|
||||
using BenchmarkDotNet.Jobs;
|
||||
using BepInEx;
|
||||
using Il2CppInterop.Runtime.InteropTypes.Arrays;
|
||||
using Reactor.Utilities;
|
||||
using Reactor.Utilities.Extensions;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Reactor.Benchmarks;
|
||||
|
||||
[MemoryDiagnoser]
|
||||
[StopOnFirstError, Config(typeof(Config))]
|
||||
public class AssetBundleBenchmarks
|
||||
{
|
||||
private sealed class Config : ManualConfig
|
||||
{
|
||||
public Config()
|
||||
{
|
||||
AddJob(Job.ShortRun.WithLaunchCount(1).WithWarmupCount(1).WithIterationCount(10).WithToolchain(SingleThreadedInProcessEmitToolchain.Instance));
|
||||
}
|
||||
}
|
||||
|
||||
[ParamsSource(nameof(ValuesForAssetBundleName))]
|
||||
public string AssetBundleFileName { get; set; } = null!;
|
||||
|
||||
public static IEnumerable<string> ValuesForAssetBundleName()
|
||||
{
|
||||
yield return $"default-{AssetBundleManager.TargetName}{AssetBundleManager.BundleExtension}";
|
||||
// yield return "submerged";
|
||||
}
|
||||
|
||||
[IterationSetup]
|
||||
public void IterationSetup()
|
||||
{
|
||||
AssetBundle.UnloadAllAssetBundles(true);
|
||||
}
|
||||
|
||||
private AssetBundle LoadAll(AssetBundle assetBundle)
|
||||
{
|
||||
if (assetBundle == null) throw new ArgumentNullException(nameof(assetBundle));
|
||||
|
||||
assetBundle.LoadAllAssets();
|
||||
return assetBundle;
|
||||
}
|
||||
|
||||
private Stream GetResourceStream()
|
||||
{
|
||||
return typeof(ReactorPlugin).Assembly.GetManifestResourceStream("Reactor.Assets." + AssetBundleFileName)!;
|
||||
}
|
||||
|
||||
[Benchmark]
|
||||
public AssetBundle LoadFromStream()
|
||||
{
|
||||
using var stream = GetResourceStream();
|
||||
return LoadAll(AssetBundle.LoadFromStream(stream.AsIl2Cpp()));
|
||||
}
|
||||
|
||||
[Benchmark]
|
||||
public AssetBundle LoadFromMemory_ReadFully()
|
||||
{
|
||||
using var stream = GetResourceStream();
|
||||
return LoadAll(AssetBundle.LoadFromMemory(stream.ReadFully()));
|
||||
}
|
||||
|
||||
[Benchmark]
|
||||
public unsafe AssetBundle LoadFromMemory_ReadFullyFastCopy()
|
||||
{
|
||||
using var stream = GetResourceStream();
|
||||
var array = stream.ReadFully();
|
||||
var il2CppArray = new Il2CppStructArray<byte>(array.Length);
|
||||
fixed (byte* arrayPtr = array) { Buffer.MemoryCopy(arrayPtr, IntPtr.Add(il2CppArray.Pointer, 4 * IntPtr.Size).ToPointer(), il2CppArray.Length, array.Length); }
|
||||
|
||||
return LoadAll(AssetBundle.LoadFromMemory(il2CppArray));
|
||||
}
|
||||
|
||||
[Benchmark]
|
||||
public AssetBundle LoadFromMemory_Span()
|
||||
{
|
||||
using var stream = GetResourceStream();
|
||||
var length = (int) stream.Length;
|
||||
|
||||
var array = new Il2CppStructArray<byte>(length);
|
||||
if (stream.Read(array.ToSpan()) < length) throw new IOException("Failed to read in full");
|
||||
|
||||
return LoadAll(AssetBundle.LoadFromMemory(array));
|
||||
}
|
||||
|
||||
[Benchmark]
|
||||
public AssetBundle LoadFromFile()
|
||||
{
|
||||
return LoadAll(AssetBundle.LoadFromFile(Path.Combine(Paths.PluginPath, AssetBundleFileName)));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
using System.Diagnostics;
|
||||
using BenchmarkDotNet.Running;
|
||||
using BepInEx;
|
||||
using BepInEx.Unity.IL2CPP;
|
||||
|
||||
namespace Reactor.Benchmarks;
|
||||
|
||||
[BepInAutoPlugin("gg.reactor.benchmarks")]
|
||||
[BepInProcess("Among Us.exe")]
|
||||
[BepInDependency(ReactorPlugin.Id)]
|
||||
public partial class BenchmarksPlugin : BasePlugin
|
||||
{
|
||||
public override void Load()
|
||||
{
|
||||
try
|
||||
{
|
||||
BenchmarkRunner.Run<AssetBundleBenchmarks>();
|
||||
}
|
||||
finally
|
||||
{
|
||||
Process.GetCurrentProcess().Kill();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<Version>0.1.0</Version>
|
||||
<Authors>NuclearPowered</Authors>
|
||||
<EnableDynamicLoading>true</EnableDynamicLoading>
|
||||
<SatelliteResourceLanguages>en-US</SatelliteResourceLanguages>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Reactor\Reactor.csproj" Private="false" />
|
||||
<PackageReference Include="BenchmarkDotNet" Version="0.13.2" />
|
||||
</ItemGroup>
|
||||
|
||||
<Import Project="../AmongUs.props" />
|
||||
</Project>
|
||||
@@ -0,0 +1,54 @@
|
||||
#pragma warning disable SA1611, SA1615
|
||||
|
||||
using BenchmarkDotNet.Engines;
|
||||
using BenchmarkDotNet.Loggers;
|
||||
using BenchmarkDotNet.Toolchains;
|
||||
using BenchmarkDotNet.Toolchains.InProcess;
|
||||
using BenchmarkDotNet.Toolchains.InProcess.Emit;
|
||||
using BenchmarkDotNet.Toolchains.InProcess.Emit.Implementation;
|
||||
using BenchmarkDotNet.Toolchains.Parameters;
|
||||
using BenchmarkDotNet.Toolchains.Results;
|
||||
using HarmonyLib;
|
||||
|
||||
namespace Reactor.Benchmarks;
|
||||
|
||||
public class SingleThreadedInProcessEmitToolchain : Toolchain
|
||||
{
|
||||
public static readonly IToolchain Instance = new SingleThreadedInProcessEmitToolchain(true);
|
||||
|
||||
public SingleThreadedInProcessEmitToolchain(bool logOutput)
|
||||
: base(nameof(SingleThreadedInProcessEmitToolchain), new InProcessEmitGenerator(), new InProcessEmitBuilder(), new SingleThreadedInProcessEmitExecutor(logOutput))
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
public class SingleThreadedInProcessEmitExecutor : IExecutor
|
||||
{
|
||||
/// <summary>Initializes a new instance of the <see cref="SingleThreadedInProcessEmitExecutor" /> class.</summary>
|
||||
/// <param name="logOutput"><c>true</c> if the output should be logged.</param>
|
||||
public SingleThreadedInProcessEmitExecutor(bool logOutput)
|
||||
{
|
||||
LogOutput = logOutput;
|
||||
}
|
||||
|
||||
/// <summary>Gets a value indicating whether the output should be logged.</summary>
|
||||
/// <value><c>true</c> if the output should be logged; otherwise, <c>false</c>.</value>
|
||||
public bool LogOutput { get; }
|
||||
|
||||
/// <summary>Executes the specified benchmark.</summary>
|
||||
public ExecuteResult Execute(ExecuteParameters executeParameters)
|
||||
{
|
||||
var hostLogger = LogOutput ? executeParameters.Logger : NullLogger.Instance;
|
||||
var host = new InProcessHost(executeParameters.BenchmarkCase, hostLogger, executeParameters.Diagnoser);
|
||||
|
||||
var exitCode = ExecuteCore(host, executeParameters);
|
||||
return ((ExecuteResult) AccessTools.Method(typeof(ExecuteResult), "FromRunResults").Invoke(null, new object[] { host.RunResults, exitCode })!)!;
|
||||
}
|
||||
|
||||
private int ExecuteCore(IHost host, ExecuteParameters parameters)
|
||||
{
|
||||
var generatedAssembly = ((InProcessEmitArtifactsPath) parameters.BuildResult.ArtifactsPaths).GeneratedAssembly;
|
||||
|
||||
return RunnableProgram.Run(parameters.BenchmarkId, generatedAssembly, parameters.BenchmarkCase, host);
|
||||
}
|
||||
}
|
||||
@@ -1,118 +1,126 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using AmongUs.Data;
|
||||
using AmongUs.GameOptions;
|
||||
using BepInEx;
|
||||
using BepInEx.IL2CPP;
|
||||
using BepInEx.Unity.IL2CPP;
|
||||
using HarmonyLib;
|
||||
using Il2CppInterop.Runtime.Attributes;
|
||||
using Il2CppInterop.Runtime.InteropTypes.Arrays;
|
||||
using InnerNet;
|
||||
using Reactor.Extensions;
|
||||
using UnhollowerBaseLib;
|
||||
using UnhollowerBaseLib.Attributes;
|
||||
using Reactor.Utilities.Attributes;
|
||||
using Reactor.Utilities.ImGui;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Reactor.Debugger
|
||||
namespace Reactor.Debugger;
|
||||
|
||||
[BepInAutoPlugin("gg.reactor.debugger")]
|
||||
[BepInProcess("Among Us.exe")]
|
||||
[BepInDependency(ReactorPlugin.Id)]
|
||||
public partial class DebuggerPlugin : BasePlugin
|
||||
{
|
||||
[BepInAutoPlugin("gg.reactor.debugger")]
|
||||
[BepInProcess("Among Us.exe")]
|
||||
[BepInDependency(ReactorPlugin.Id)]
|
||||
[ReactorPluginSide(PluginSide.ClientOnly)]
|
||||
public partial class DebuggerPlugin : BasePlugin
|
||||
public Harmony Harmony { get; } = new(Id);
|
||||
public DebuggerComponent Component { get; private set; } = null!;
|
||||
|
||||
public override void Load()
|
||||
{
|
||||
public Harmony Harmony { get; } = new Harmony(Id);
|
||||
public DebuggerComponent Component { get; private set; }
|
||||
Component = this.AddComponent<DebuggerComponent>();
|
||||
|
||||
public override void Load()
|
||||
var maxImpostors = (Il2CppStructArray<int>) Enumerable.Repeat((int) byte.MaxValue, byte.MaxValue).ToArray();
|
||||
GameOptionsData.MaxImpostors = GameOptionsData.RecommendedImpostors = maxImpostors;
|
||||
NormalGameOptionsV07.MaxImpostors = NormalGameOptionsV07.RecommendedImpostors = maxImpostors;
|
||||
HideNSeekGameOptionsV07.MaxImpostors = maxImpostors;
|
||||
|
||||
var minPlayers = (Il2CppStructArray<int>) Enumerable.Repeat(1, byte.MaxValue).ToArray();
|
||||
GameOptionsData.MinPlayers = minPlayers;
|
||||
NormalGameOptionsV07.MinPlayers = minPlayers;
|
||||
HideNSeekGameOptionsV07.MinPlayers = minPlayers;
|
||||
|
||||
Harmony.PatchAll();
|
||||
}
|
||||
|
||||
[RegisterInIl2Cpp]
|
||||
public class DebuggerComponent : MonoBehaviour
|
||||
{
|
||||
[HideFromIl2Cpp]
|
||||
public bool DisableGameEnd { get; set; }
|
||||
|
||||
[HideFromIl2Cpp]
|
||||
public DragWindow TestWindow { get; }
|
||||
|
||||
public DebuggerComponent(IntPtr ptr) : base(ptr)
|
||||
{
|
||||
Component = this.AddComponent<DebuggerComponent>();
|
||||
TestWindow = new DragWindow(new Rect(20, 20, 0, 0), "Debugger", () =>
|
||||
{
|
||||
GUILayout.Label("Name: " + DataManager.Player.Customization.Name);
|
||||
DisableGameEnd = GUILayout.Toggle(DisableGameEnd, "Disable game end");
|
||||
|
||||
GameOptionsData.MaxImpostors = GameOptionsData.RecommendedImpostors = Enumerable.Repeat((int) byte.MaxValue, byte.MaxValue).ToArray();
|
||||
GameOptionsData.MinPlayers = Enumerable.Repeat(1, 4).ToArray();
|
||||
if (ShipStatus.Instance && AmongUsClient.Instance.AmHost)
|
||||
{
|
||||
if (GUILayout.Button("Force game end"))
|
||||
{
|
||||
ShipStatus.Instance.enabled = false;
|
||||
GameManager.Instance.RpcEndGame(GameOverReason.ImpostorDisconnect, false);
|
||||
}
|
||||
|
||||
Harmony.PatchAll();
|
||||
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,
|
||||
};
|
||||
}
|
||||
|
||||
[RegisterInIl2Cpp]
|
||||
public class DebuggerComponent : MonoBehaviour
|
||||
private void Update()
|
||||
{
|
||||
[HideFromIl2Cpp]
|
||||
public bool DisableGameEnd { get; set; }
|
||||
|
||||
[HideFromIl2Cpp]
|
||||
public DragWindow TestWindow { get; }
|
||||
|
||||
public DebuggerComponent(IntPtr ptr) : base(ptr)
|
||||
if (Input.GetKeyDown(KeyCode.F1))
|
||||
{
|
||||
TestWindow = new DragWindow(new Rect(20, 20, 0, 0), "Debugger", () =>
|
||||
{
|
||||
GUILayout.Label("Name: " + SaveManager.PlayerName);
|
||||
DisableGameEnd = GUILayout.Toggle(DisableGameEnd, "Disable game end");
|
||||
|
||||
if (ShipStatus.Instance && AmongUsClient.Instance.AmHost)
|
||||
{
|
||||
if (GUILayout.Button("Force game end"))
|
||||
{
|
||||
ShipStatus.Instance.enabled = false;
|
||||
ShipStatus.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
|
||||
};
|
||||
TestWindow.Enabled = !TestWindow.Enabled;
|
||||
}
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
if (Input.GetKeyDown(KeyCode.F1))
|
||||
{
|
||||
TestWindow.Enabled = !TestWindow.Enabled;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnGUI()
|
||||
{
|
||||
TestWindow.OnGUI();
|
||||
}
|
||||
private void OnGUI()
|
||||
{
|
||||
TestWindow.OnGUI();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,70 +1,76 @@
|
||||
using System.Linq;
|
||||
using AmongUs.GameOptions;
|
||||
using HarmonyLib;
|
||||
using UnhollowerBaseLib;
|
||||
using Il2CppInterop.Runtime.InteropTypes.Arrays;
|
||||
using Reactor.Utilities;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Reactor.Debugger
|
||||
namespace Reactor.Debugger;
|
||||
|
||||
internal static class Patches
|
||||
{
|
||||
internal static class Patches
|
||||
[HarmonyPatch(typeof(GameStartManager), nameof(GameStartManager.Update))]
|
||||
public static class UpdatePatch
|
||||
{
|
||||
[HarmonyPatch(typeof(GameStartManager), nameof(GameStartManager.Update))]
|
||||
public static class UpdatePatch
|
||||
public static void Prefix(GameStartManager __instance)
|
||||
{
|
||||
public static void Prefix(GameStartManager __instance)
|
||||
{
|
||||
__instance.MinPlayers = 1;
|
||||
}
|
||||
__instance.MinPlayers = 1;
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(GameStartManager), nameof(GameStartManager.Update))]
|
||||
public static class CountdownPatch
|
||||
[HarmonyPatch(typeof(GameStartManager), nameof(GameStartManager.Update))]
|
||||
public static class CountdownPatch
|
||||
{
|
||||
public static void Prefix(GameStartManager __instance)
|
||||
{
|
||||
public static void Prefix(GameStartManager __instance)
|
||||
{
|
||||
__instance.countDownTimer = 0;
|
||||
}
|
||||
__instance.countDownTimer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(StatsManager), nameof(StatsManager.AmBanned), MethodType.Getter)]
|
||||
public static class AmBannedPatch
|
||||
[HarmonyPatch(typeof(StatsManager), nameof(StatsManager.AmBanned), MethodType.Getter)]
|
||||
public static class AmBannedPatch
|
||||
{
|
||||
public static void Postfix(out bool __result)
|
||||
{
|
||||
public static void Postfix(out bool __result)
|
||||
{
|
||||
__result = false;
|
||||
}
|
||||
__result = false;
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(ShipStatus), nameof(ShipStatus.CheckEndCriteria))]
|
||||
[HarmonyPriority(Priority.First)]
|
||||
public static class CheckEndCriteriaPatch
|
||||
[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()
|
||||
{
|
||||
public static bool Prefix()
|
||||
{
|
||||
return !PluginSingleton<DebuggerPlugin>.Instance.Component.DisableGameEnd;
|
||||
}
|
||||
return !PluginSingleton<DebuggerPlugin>.Instance.Component.DisableGameEnd;
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(GameSettingMenu), nameof(GameSettingMenu.Start))]
|
||||
public static class GameSettingMenuPatch
|
||||
[HarmonyPatch(typeof(GameSettingMenu), nameof(GameSettingMenu.Start))]
|
||||
public static class GameSettingMenuPatch
|
||||
{
|
||||
public static void Prefix(GameSettingMenu __instance)
|
||||
{
|
||||
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);
|
||||
}
|
||||
// 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
|
||||
[HarmonyPatch(typeof(GameOptionsMenu), nameof(GameOptionsMenu.Start))]
|
||||
[HarmonyPriority(Priority.First)]
|
||||
public static class GameOptionsMenuPatch
|
||||
{
|
||||
public static void Postfix(GameOptionsMenu __instance)
|
||||
{
|
||||
public static void Postfix(GameOptionsMenu __instance)
|
||||
{
|
||||
__instance.Children
|
||||
.Single(o => o.Title == StringNames.GameNumImpostors)
|
||||
.Cast<NumberOption>()
|
||||
.ValidRange = new FloatRange(0, byte.MaxValue);
|
||||
}
|
||||
if (GameOptionsManager.Instance.CurrentGameOptions.GameMode != GameModes.Normal) return;
|
||||
|
||||
__instance.Children
|
||||
.Single(o => o.Title == StringNames.GameNumImpostors)
|
||||
.Cast<NumberOption>()
|
||||
.ValidRange = new FloatRange(0, byte.MaxValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,15 +1,12 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netstandard2.1</TargetFramework>
|
||||
<LangVersion>latest</LangVersion>
|
||||
|
||||
<Version>0.1.0</Version>
|
||||
<Description>Debugging mod for Reactor</Description>
|
||||
<Authors>NuclearPowered</Authors>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Reactor\Reactor.csproj" />
|
||||
<ProjectReference Include="..\Reactor\Reactor.csproj" Private="false" />
|
||||
</ItemGroup>
|
||||
|
||||
<Import Project="../AmongUs.props" />
|
||||
|
||||
@@ -1,65 +1,114 @@
|
||||
{
|
||||
"version": 1,
|
||||
"dependencies": {
|
||||
".NETStandard,Version=v2.1": {
|
||||
"net6.0": {
|
||||
"AmongUs.GameLibs.Steam": {
|
||||
"type": "Direct",
|
||||
"requested": "[2022.8.23, )",
|
||||
"resolved": "2022.8.23",
|
||||
"contentHash": "baY5JO6dbdOAZ0VTtGX0xre6/BlDdreJDAH8boCKZt3JTAcn+eeH+l8mUZRC9eCJOODUik2C0TTAt5AqBmYtZg=="
|
||||
"requested": "[2023.7.11, )",
|
||||
"resolved": "2023.7.11",
|
||||
"contentHash": "e5zbU+4AYnp1zAQDizO5GRIh1kemkgCa8rFVAcr9bxeupkBu5dwwdHxArWv/pUybIJTZfOPjkOnicZ2qKWLX7g=="
|
||||
},
|
||||
"BepInEx.AutoPlugin": {
|
||||
"type": "Direct",
|
||||
"requested": "[1.0.1, )",
|
||||
"resolved": "1.0.1",
|
||||
"contentHash": "G4YpTHG9rtkDJof+ld7Er4E+sCOlgsjG4bJ1itx1ub7dgff6qqHLy9ksX1ehgO0AdBOPVyVl/GKJg9o7iNl8HA=="
|
||||
},
|
||||
"BepInEx.IL2CPP": {
|
||||
"type": "Direct",
|
||||
"requested": "[6.0.0-be.570, )",
|
||||
"resolved": "6.0.0-be.570",
|
||||
"contentHash": "JGkWFFGZTWQ+YlFQ17izlwfGNUyo/zfFGNYPX6XAeTkfM5RwXiPYNMNO6eWoxbKwaYlAylQq2YCRkkCnAr9nwQ==",
|
||||
"dependencies": {
|
||||
"BepInEx.Core": "6.0.0-be.570",
|
||||
"BepInEx.Il2Cpp.TlsAdapter": "1.0.1",
|
||||
"HarmonyX": "2.10.0",
|
||||
"Iced": "1.17.0",
|
||||
"Il2CppAssemblyUnhollower.BaseLib": "0.4.33.3",
|
||||
"Il2CppAssemblyUnhollower.BaseLib.Legacy": "0.4.33.3",
|
||||
"Il2CppAssemblyUnhollower.Lib": "0.4.33.3",
|
||||
"Il2CppDumper": "6.6.4",
|
||||
"MonoMod.RuntimeDetour": "22.5.1.1",
|
||||
"Samboy063.Cpp2IL.Core": "2022.0.5"
|
||||
}
|
||||
"requested": "[1.1.0, )",
|
||||
"resolved": "1.1.0",
|
||||
"contentHash": "/7Nmc1EA9lYlGBiyz6qPAaHvlcJHEjFZ1RFpGX+8EBj3GrgoX5kbpnZusuSHoOlLx0l+CnzKuQNE54B8UaGPyw=="
|
||||
},
|
||||
"BepInEx.IL2CPP.MSBuild": {
|
||||
"type": "Direct",
|
||||
"requested": "[1.1.1, )",
|
||||
"resolved": "1.1.1",
|
||||
"contentHash": "uUSo4TuamyEIVg+ICNeJMSSW/arKWHGpfBFINc4fdF5kppfHFrsDURKzNPmDvxivtLsiuGthck9J/5uPXgIcTg=="
|
||||
"requested": "[2.0.1, )",
|
||||
"resolved": "2.0.1",
|
||||
"contentHash": "hUZjCV0t8dkw/Z/zq4Zl405QP7frBk/LVfMdUmUz+7XOhGd7lYPKrR48A5vbGl2QeHudMxlkXzAr9WM3Duq2SQ=="
|
||||
},
|
||||
"BepInEx.Unity.IL2CPP": {
|
||||
"type": "Direct",
|
||||
"requested": "[6.0.0-be.670, )",
|
||||
"resolved": "6.0.0-be.670",
|
||||
"contentHash": "dhzCrem44oFxhOICCJ9eoSUbaKSsGGyBUfUQW9WFljCwIK8o4Cx5BiuXAkYoRjr2DhpzLpPDyPZDRImUqH0bwA==",
|
||||
"dependencies": {
|
||||
"BepInEx.Core": "6.0.0-be.670",
|
||||
"BepInEx.Unity.Common": "6.0.0-be.670",
|
||||
"HarmonyX": "2.10.1",
|
||||
"Iced": "1.18.0",
|
||||
"Il2CppInterop.Generator": "1.4.6-ci.354",
|
||||
"Il2CppInterop.HarmonySupport": "1.4.6-ci.354",
|
||||
"Il2CppInterop.Runtime": "1.4.6-ci.354",
|
||||
"MonoMod.RuntimeDetour": "22.5.1.1",
|
||||
"Samboy063.Cpp2IL.Core": "2022.1.0-development.866"
|
||||
}
|
||||
},
|
||||
"StyleCop.Analyzers": {
|
||||
"type": "Direct",
|
||||
"requested": "[1.2.0-beta.435, )",
|
||||
"resolved": "1.2.0-beta.435",
|
||||
"contentHash": "TADk7vdGXtfTnYCV7GyleaaRTQjfoSfZXprQrVMm7cSJtJbFc1QIbWPyLvrgrfGdfHbGmUPvaN4ODKNxg2jgPQ==",
|
||||
"dependencies": {
|
||||
"StyleCop.Analyzers.Unstable": "1.2.0.435"
|
||||
}
|
||||
},
|
||||
"AsmResolver": {
|
||||
"type": "Transitive",
|
||||
"resolved": "5.1.0",
|
||||
"contentHash": "7PjujQzgQ3wjzqZYT4CY8SV6zx7FY6swIwj3Yk4QLolLqo9sBPb7FLF3W30QFvCsCkNfiVWXlSbeZKs4xGgQOQ=="
|
||||
},
|
||||
"AsmResolver.DotNet": {
|
||||
"type": "Transitive",
|
||||
"resolved": "5.1.0",
|
||||
"contentHash": "oKrBU94OaSrbbTwydvpLRFalYxozrNXGkl13nIkm823ZFQtPNYOiOMJb5DQLvkCJlWyis7q865tg803T5zg9IA==",
|
||||
"dependencies": {
|
||||
"AsmResolver.PE": "5.1.0",
|
||||
"System.Text.Json": "6.0.7"
|
||||
}
|
||||
},
|
||||
"AsmResolver.PE": {
|
||||
"type": "Transitive",
|
||||
"resolved": "5.1.0",
|
||||
"contentHash": "XD3iAgLSInJIODKUUlpHWXf8MR9H1SFMb1lsmabb4GxxxnDQRPjMxjglv2NOCjQQuNB2Oh0bvjHE7ewf82UqyQ==",
|
||||
"dependencies": {
|
||||
"AsmResolver.PE.File": "5.1.0"
|
||||
}
|
||||
},
|
||||
"AsmResolver.PE.File": {
|
||||
"type": "Transitive",
|
||||
"resolved": "5.1.0",
|
||||
"contentHash": "YituBYe0Fh471sXQMfu+f4tWKX/JZvRwrX6g/SVsr4XkUIUzYi/aGT3/QvjHoYx19fE1KYOB6zBKqPkkOK7HPw==",
|
||||
"dependencies": {
|
||||
"AsmResolver": "5.1.0"
|
||||
}
|
||||
},
|
||||
"AssetRipper.VersionUtilities": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.3.1",
|
||||
"contentHash": "/1D18NOpqm7rS7+qVUbAReVMNWwgDuYpsnf0RkX1Aah/I0a0irqldoFJ+Kku7YdbSm0zqD+Z6iYUGKoP3GwTNQ=="
|
||||
},
|
||||
"BepInEx.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0-be.570",
|
||||
"contentHash": "kygIunLrK1HMGcRo2E/7e4ZEAA0xewuB/j5mPoMi7Xk58GUi43XnclBJHif9x05a55s0kFkfKOrpwIRmjd0cDw==",
|
||||
"resolved": "6.0.0-be.670",
|
||||
"contentHash": "7CbbMNZfb+1VHjFKh/ErFBOOEYrVCIkng/B3/HPcbNioySC7qdT1ztfYqs6YjQia4krEic+LV3ew86B/hTg+hw==",
|
||||
"dependencies": {
|
||||
"HarmonyX": "2.10.0",
|
||||
"MonoMod.Utils": "22.3.23.4",
|
||||
"HarmonyX": "2.10.1",
|
||||
"MonoMod.Utils": "22.5.1.1",
|
||||
"SemanticVersioning": "2.0.2"
|
||||
}
|
||||
},
|
||||
"BepInEx.Il2Cpp.TlsAdapter": {
|
||||
"BepInEx.Unity.Common": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.0.1",
|
||||
"contentHash": "kTfX6312X0Fvwks+t7Ul3YO2jMSbqNS2Jx/85Cgl6lbAjEJnKzsmx7Krmd66dbnx0eY/QMjaV2r6LyWmQARtdA==",
|
||||
"resolved": "6.0.0-be.670",
|
||||
"contentHash": "FSzWILgwepZ7CpA34ew1WyO75lNjxkfX86uwo2172lbhmLkgoAdQbNun8dxKJCDlIevmTDga76yr/WPrTXELvA==",
|
||||
"dependencies": {
|
||||
"HarmonyX": "2.3.1"
|
||||
"AssetRipper.VersionUtilities": "1.2.1",
|
||||
"MonoMod.Utils": "22.5.1.1"
|
||||
}
|
||||
},
|
||||
"Disarm": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.1.0-master.26",
|
||||
"contentHash": "YnZEbRGr0nG+N3G8WbRQ4Lkg8dTD3oso9iJlCVBmyhEyhLyqs+drBs1kWQbQqFPnb9mi/RJ++R9bPb+L3HF03Q=="
|
||||
},
|
||||
"HarmonyX": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.10.0",
|
||||
"contentHash": "4ayiy/dlCiW86K2N7Jvbf+VpI5wvP7dncv/6oRmfwRi32UCmCRzCGzsxdMfzJZkp6/26oBW+DrD8vi4UejzVAg==",
|
||||
"resolved": "2.10.1",
|
||||
"contentHash": "9LodMC9Y0u1TW96eKJoWrFJFpmzbgojEO38/Q+e7c1mFPhmHt8xcR8qhI06iF1rf0Dnsk+hqENFVSgbtwl/bEw==",
|
||||
"dependencies": {
|
||||
"MonoMod.RuntimeDetour": "22.3.23.4",
|
||||
"System.Reflection.Emit": "4.7.0"
|
||||
@@ -67,57 +116,60 @@
|
||||
},
|
||||
"Iced": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.17.0",
|
||||
"contentHash": "8x+HCVTl/HHTGpscH3vMBhV8sknN/muZFw9s3TsI8SA6+c43cOTCi2+jE4KsU8pNLbJ++iF2ZFcpcXHXtDglnw=="
|
||||
"resolved": "1.18.0",
|
||||
"contentHash": "G60lZOvbvqttA+SBSv/yY6/wUboXKJlkffhSNR9iOrx0M5gpcK1TRr6xrFR+qAhqIAhvrsPF1jkn9fYb4lEufQ=="
|
||||
},
|
||||
"Il2CppAssemblyUnhollower.BaseLib": {
|
||||
"Il2CppInterop.Common": {
|
||||
"type": "Transitive",
|
||||
"resolved": "0.4.33.3",
|
||||
"contentHash": "CH91M6Asz4iwennTa8cLg5wqROJY1JvnsfRetyOvs0cy8o/YAikvm8uuNgZv6UiTO/qoyy/QrBE1qSZDvs8bLw==",
|
||||
"resolved": "1.4.6-ci.354",
|
||||
"contentHash": "aCP3kr39YQw5GVqE9Q8c5y7f9CEKdFxpUhIqYgQBtrEz5Z/KCbHhjuOf/lSuFrjl6Vub/BKk6k+UbMRdoSvC1w==",
|
||||
"dependencies": {
|
||||
"Iced": "1.15.0"
|
||||
"Iced": "1.17.0",
|
||||
"Microsoft.Extensions.Logging.Abstractions": "6.0.1",
|
||||
"System.Net.Http": "4.3.4"
|
||||
}
|
||||
},
|
||||
"Il2CppAssemblyUnhollower.BaseLib.Legacy": {
|
||||
"Il2CppInterop.Generator": {
|
||||
"type": "Transitive",
|
||||
"resolved": "0.4.33.3",
|
||||
"contentHash": "6yIJg8lkayBDevPwcdcV3LWTdHt8VAZVY0wQwuXH4POOo0Kzc6Cshy9kLCxH3AC6EQg0G/v+Albs6RZgwszXMQ==",
|
||||
"resolved": "1.4.6-ci.354",
|
||||
"contentHash": "y30sxc9mMv0bUzCPDr73xiI6fiu7ksmnEm6XULTGU/5JEGv2aw++/71bLOEYCscNbZTa2JT4yYrLCXCj3GSekg==",
|
||||
"dependencies": {
|
||||
"Il2CppAssemblyUnhollower.BaseLib": "0.4.33.3"
|
||||
}
|
||||
},
|
||||
"Il2CppAssemblyUnhollower.Lib": {
|
||||
"type": "Transitive",
|
||||
"resolved": "0.4.33.3",
|
||||
"contentHash": "tdu4OnMxodkWwoImNDaycaLY1L3qJOazb5UaLAt1ncRpWyu6xvKuKe5NM6OcBXONpkYsJQeQZjD6syeFl5MCQA==",
|
||||
"dependencies": {
|
||||
"Il2CppAssemblyUnhollower.BaseLib": "0.4.33.3",
|
||||
"Il2CppAssemblyUnhollower.BaseLib.Legacy": "0.4.33.3",
|
||||
"Il2CppInterop.Common": "1.4.6-ci.354",
|
||||
"Mono.Cecil": "0.11.3"
|
||||
}
|
||||
},
|
||||
"Il2CppDumper": {
|
||||
"Il2CppInterop.HarmonySupport": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.6.4",
|
||||
"contentHash": "aqjmlyigdZ5FS9ElMNlaCExlgSmAiho4BeIcVwkmzHGnomBzopjOCxqIX9vc/575TQ87TKoaGW2KP+3b5xI15A==",
|
||||
"resolved": "1.4.6-ci.354",
|
||||
"contentHash": "mQV5A+B/qtI6kSXEGx/UswiqjFKw13/yyviawnStfRKbLMW+XFsdMgGSkOVZd/TiDtF9ZG4Xt7DbkbFu26WjyA==",
|
||||
"dependencies": {
|
||||
"Mono.Cecil": "0.11.3"
|
||||
"HarmonyX": "2.10.0",
|
||||
"Il2CppInterop.Runtime": "1.4.6-ci.354"
|
||||
}
|
||||
},
|
||||
"IndexRange": {
|
||||
"Il2CppInterop.Runtime": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.0.0",
|
||||
"contentHash": "6TgS1JLSUkpmPLfXBPaAgB39ZUix8E4soXWk2XSDcscVe84i1JKzIAtA7jHbRHSkOOrcr6YA0MpLCeq98y9mYQ=="
|
||||
"resolved": "1.4.6-ci.354",
|
||||
"contentHash": "Xe5md9z+KIthdEcjfUjmoOhvM3gTI3SPyocqvuzEHoov5jQ/HhIPv5hUZzTSm+2nzn3XplENNE8vlBPvQ1o6OA==",
|
||||
"dependencies": {
|
||||
"Iced": "1.17.0",
|
||||
"Il2CppInterop.Common": "1.4.6-ci.354"
|
||||
}
|
||||
},
|
||||
"js6pak.Gee.External.Capstone": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.1.0",
|
||||
"contentHash": "YYpq7NM50bSSVUDjXyV/eiITk6syXqItPjKBOb3jEWS6RFsk0DNhpWMPW6b3hKDmArARuWDU6S2pVu1IeVrvIA=="
|
||||
},
|
||||
"Microsoft.Extensions.Logging.Abstractions": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.1",
|
||||
"contentHash": "dzB2Cgg+JmrouhjkcQGzSFjjvpwlq353i8oBQO2GWNjCXSzhbtBRUf28HSauWe7eib3wYOdb3tItdjRwAdwCSg=="
|
||||
},
|
||||
"Microsoft.NETCore.Platforms": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.1.0",
|
||||
"contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A=="
|
||||
"resolved": "1.1.1",
|
||||
"contentHash": "TMBuzAHpTenGbGgk0SMTwyEkyijY/Eae4ZGsFNYJvAr/LDn1ku3Etp3FPxChmDp5HHF3kzJuoaa08N0xjqAJfQ=="
|
||||
},
|
||||
"Microsoft.NETCore.Targets": {
|
||||
"type": "Transitive",
|
||||
@@ -158,40 +210,146 @@
|
||||
"System.Reflection.TypeExtensions": "4.7.0"
|
||||
}
|
||||
},
|
||||
"runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.2",
|
||||
"contentHash": "7VSGO0URRKoMEAq0Sc9cRz8mb6zbyx/BZDEWhgPdzzpmFhkam3fJ1DAGWFXBI4nGlma+uPKpfuMQP5LXRnOH5g=="
|
||||
},
|
||||
"runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.2",
|
||||
"contentHash": "0oAaTAm6e2oVH+/Zttt0cuhGaePQYKII1dY8iaqP7CvOpVKgLybKRFvQjXR2LtxXOXTVPNv14j0ot8uV+HrUmw=="
|
||||
},
|
||||
"runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.2",
|
||||
"contentHash": "G24ibsCNi5Kbz0oXWynBoRgtGvsw5ZSVEWjv13/KiCAM8C6wz9zzcCniMeQFIkJ2tasjo2kXlvlBZhplL51kGg=="
|
||||
},
|
||||
"runtime.native.System": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0",
|
||||
"Microsoft.NETCore.Targets": "1.1.0"
|
||||
}
|
||||
},
|
||||
"runtime.native.System.Net.Http": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0",
|
||||
"Microsoft.NETCore.Targets": "1.1.0"
|
||||
}
|
||||
},
|
||||
"runtime.native.System.Security.Cryptography.Apple": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==",
|
||||
"dependencies": {
|
||||
"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0"
|
||||
}
|
||||
},
|
||||
"runtime.native.System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.2",
|
||||
"contentHash": "QR1OwtwehHxSeQvZKXe+iSd+d3XZNkEcuWMFYa2i0aG1l+lR739HPicKMlTbJst3spmeekDVBUS7SeS26s4U/g==",
|
||||
"dependencies": {
|
||||
"runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2",
|
||||
"runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2",
|
||||
"runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2",
|
||||
"runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2",
|
||||
"runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2",
|
||||
"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2",
|
||||
"runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2",
|
||||
"runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2",
|
||||
"runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2",
|
||||
"runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2"
|
||||
}
|
||||
},
|
||||
"runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.2",
|
||||
"contentHash": "I+GNKGg2xCHueRd1m9PzeEW7WLbNNLznmTuEi8/vZX71HudUbx1UTwlGkiwMri7JLl8hGaIAWnA/GONhu+LOyQ=="
|
||||
},
|
||||
"runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.2",
|
||||
"contentHash": "1Z3TAq1ytS1IBRtPXJvEUZdVsfWfeNEhBkbiOCGEl9wwAfsjP2lz3ZFDx5tq8p60/EqbS0HItG5piHuB71RjoA=="
|
||||
},
|
||||
"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ=="
|
||||
},
|
||||
"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.2",
|
||||
"contentHash": "6mU/cVmmHtQiDXhnzUImxIcDL48GbTk+TsptXyJA+MIOG9LRjPoAQC/qBFB7X+UNyK86bmvGwC8t+M66wsYC8w=="
|
||||
},
|
||||
"runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.2",
|
||||
"contentHash": "vjwG0GGcTW/PPg6KVud8F9GLWYuAV1rrw1BKAqY0oh4jcUqg15oYF1+qkGR2x2ZHM4DQnWKQ7cJgYbfncz/lYg=="
|
||||
},
|
||||
"runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.2",
|
||||
"contentHash": "7KMFpTkHC/zoExs+PwP8jDCWcrK9H6L7soowT80CUx3e+nxP/AFnq0AQAW5W76z2WYbLAYCRyPfwYFG6zkvQRw=="
|
||||
},
|
||||
"runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.2",
|
||||
"contentHash": "xrlmRCnKZJLHxyyLIqkZjNXqgxnKdZxfItrPkjI+6pkRo5lHX8YvSZlWrSI5AVwLMi4HbNWP7064hcAWeZKp5w=="
|
||||
},
|
||||
"runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.2",
|
||||
"contentHash": "leXiwfiIkW7Gmn7cgnNcdtNAU70SjmKW3jxGj1iKHOvdn0zRWsgv/l2OJUO5zdGdiv2VRFnAsxxhDgMzofPdWg=="
|
||||
},
|
||||
"Samboy063.Cpp2IL.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.0.5",
|
||||
"contentHash": "5JipfyEmJWePqLLnvwzxWx9dQXxNfgN0wcZ4IcmuabWKVvk4gA5Rux4vgDh9NrWf8q9LzkizWHkrnMaG1niF7g==",
|
||||
"resolved": "2022.1.0-development.866",
|
||||
"contentHash": "QPMuix/3jRngWBdNSLhAbm9BHYf95Ln1Ph1eCK/cDZdVibxFDFP3a6Yczyx1p7GbN7bRQwrhs2skPJSS/z3m2w==",
|
||||
"dependencies": {
|
||||
"HarmonyX": "2.5.5",
|
||||
"Iced": "1.11.1",
|
||||
"IndexRange": "1.0.0",
|
||||
"Mono.Cecil": "0.11.4",
|
||||
"Samboy063.LibCpp2IL": "2022.0.5",
|
||||
"System.Runtime.InteropServices": "4.3.0",
|
||||
"System.ValueTuple": "4.5.0",
|
||||
"AsmResolver.DotNet": "5.1.0",
|
||||
"Disarm": "2022.1.0-master.26",
|
||||
"Iced": "1.18.0",
|
||||
"Samboy063.LibCpp2IL": "2022.1.0-development.866",
|
||||
"StableNameDotNet": "0.1.0-development.866",
|
||||
"js6pak.Gee.External.Capstone": "2.1.0"
|
||||
}
|
||||
},
|
||||
"Samboy063.LibCpp2IL": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.0.5",
|
||||
"contentHash": "eH+/FBclsKDxboa9N/tFoiM8kwvietVX0FtXYxvcexSp/geYCyTt2XUGOQjinqd3Yqg/QxmpIqBO7qy4MQHrhw==",
|
||||
"resolved": "2022.1.0-development.866",
|
||||
"contentHash": "EcJSWTfQko8SQozozoUT+aQJVWC8wj8C0YUiPBF4rNRId19yTKp2IXcXnI747v+8/aal222QR6WHfoBK2WlVLg==",
|
||||
"dependencies": {
|
||||
"IndexRange": "1.0.0",
|
||||
"Samboy063.WasmDisassembler": "2022.0.2"
|
||||
"AssetRipper.VersionUtilities": "1.3.1",
|
||||
"Samboy063.WasmDisassembler": "2022.1.0-development.866"
|
||||
}
|
||||
},
|
||||
"Samboy063.WasmDisassembler": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.0.2",
|
||||
"contentHash": "2uu+xBb7M3HKfBx9tAY6jiDieAf0hRnQjSmGX+7IdE6i24dYsx6TYgtrLvRx5lOuF2M8DijZ5H8yQ1pcuCs2SA=="
|
||||
"resolved": "2022.1.0-development.866",
|
||||
"contentHash": "2QK8F3eISkLcoW/Nt7wtxyQh31EXAqEMBVXXjEnuxyvXpBXxOIGpjmE3pWhGwxQwDCbe4zBsLF1zUiqq3/pXRA=="
|
||||
},
|
||||
"SemanticVersioning": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.0.2",
|
||||
"contentHash": "4EQgYdNZ92SyaO7YFk6olVnebF5V+jrHyMUjvPq89tLeMo8NSfgDF+6Zwq/lgh9j/0yfQp9Lkm0ZA0rUATCZFA=="
|
||||
},
|
||||
"StableNameDotNet": {
|
||||
"type": "Transitive",
|
||||
"resolved": "0.1.0-development.866",
|
||||
"contentHash": "DJb8x4dV3ucDgM12sU28HxCdeqY/JudJbeJG6mgXWDJzpFZw2Jd7JF1pKFRNLzh/0gpo8bCGLQS9gOWZmBjdtg=="
|
||||
},
|
||||
"StyleCop.Analyzers.Unstable": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.2.0.435",
|
||||
"contentHash": "ouwPWZxbOV3SmCZxIRqHvljkSzkCyi1tDoMzQtDb/bRP8ctASV/iRJr+A2Gdj0QLaLmWnqTWDrH82/iP+X80Lg=="
|
||||
},
|
||||
"System.Collections": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
@@ -202,6 +360,23 @@
|
||||
"System.Runtime": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Collections.Concurrent": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==",
|
||||
"dependencies": {
|
||||
"System.Collections": "4.3.0",
|
||||
"System.Diagnostics.Debug": "4.3.0",
|
||||
"System.Diagnostics.Tracing": "4.3.0",
|
||||
"System.Globalization": "4.3.0",
|
||||
"System.Reflection": "4.3.0",
|
||||
"System.Resources.ResourceManager": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Runtime.Extensions": "4.3.0",
|
||||
"System.Threading": "4.3.0",
|
||||
"System.Threading.Tasks": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Collections.NonGeneric": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
@@ -279,6 +454,28 @@
|
||||
"System.Runtime": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Diagnostics.DiagnosticSource": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==",
|
||||
"dependencies": {
|
||||
"System.Collections": "4.3.0",
|
||||
"System.Diagnostics.Tracing": "4.3.0",
|
||||
"System.Reflection": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Threading": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Diagnostics.Tracing": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0",
|
||||
"Microsoft.NETCore.Targets": "1.1.0",
|
||||
"System.Runtime": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Globalization": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
@@ -289,6 +486,17 @@
|
||||
"System.Runtime": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Globalization.Calendars": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0",
|
||||
"Microsoft.NETCore.Targets": "1.1.0",
|
||||
"System.Globalization": "4.3.0",
|
||||
"System.Runtime": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Globalization.Extensions": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
@@ -314,6 +522,21 @@
|
||||
"System.Threading.Tasks": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.IO.FileSystem": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0",
|
||||
"Microsoft.NETCore.Targets": "1.1.0",
|
||||
"System.IO": "4.3.0",
|
||||
"System.IO.FileSystem.Primitives": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Runtime.Handles": "4.3.0",
|
||||
"System.Text.Encoding": "4.3.0",
|
||||
"System.Threading.Tasks": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.IO.FileSystem.Primitives": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
@@ -334,6 +557,50 @@
|
||||
"System.Runtime.Extensions": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Net.Http": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.4",
|
||||
"contentHash": "aOa2d51SEbmM+H+Csw7yJOuNZoHkrP2XnAurye5HWYgGVVU54YZDvsLUYRv6h18X3sPnjNCANmN7ZhIPiqMcjA==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.1",
|
||||
"System.Collections": "4.3.0",
|
||||
"System.Diagnostics.Debug": "4.3.0",
|
||||
"System.Diagnostics.DiagnosticSource": "4.3.0",
|
||||
"System.Diagnostics.Tracing": "4.3.0",
|
||||
"System.Globalization": "4.3.0",
|
||||
"System.Globalization.Extensions": "4.3.0",
|
||||
"System.IO": "4.3.0",
|
||||
"System.IO.FileSystem": "4.3.0",
|
||||
"System.Net.Primitives": "4.3.0",
|
||||
"System.Resources.ResourceManager": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Runtime.Extensions": "4.3.0",
|
||||
"System.Runtime.Handles": "4.3.0",
|
||||
"System.Runtime.InteropServices": "4.3.0",
|
||||
"System.Security.Cryptography.Algorithms": "4.3.0",
|
||||
"System.Security.Cryptography.Encoding": "4.3.0",
|
||||
"System.Security.Cryptography.OpenSsl": "4.3.0",
|
||||
"System.Security.Cryptography.Primitives": "4.3.0",
|
||||
"System.Security.Cryptography.X509Certificates": "4.3.0",
|
||||
"System.Text.Encoding": "4.3.0",
|
||||
"System.Threading": "4.3.0",
|
||||
"System.Threading.Tasks": "4.3.0",
|
||||
"runtime.native.System": "4.3.0",
|
||||
"runtime.native.System.Net.Http": "4.3.0",
|
||||
"runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2"
|
||||
}
|
||||
},
|
||||
"System.Net.Primitives": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0",
|
||||
"Microsoft.NETCore.Targets": "1.1.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Runtime.Handles": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Reflection": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
@@ -408,6 +675,11 @@
|
||||
"Microsoft.NETCore.Targets": "1.1.0"
|
||||
}
|
||||
},
|
||||
"System.Runtime.CompilerServices.Unsafe": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0",
|
||||
"contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg=="
|
||||
},
|
||||
"System.Runtime.Extensions": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
@@ -441,6 +713,161 @@
|
||||
"System.Runtime.Handles": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Runtime.Numerics": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==",
|
||||
"dependencies": {
|
||||
"System.Globalization": "4.3.0",
|
||||
"System.Resources.ResourceManager": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Runtime.Extensions": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Security.Cryptography.Algorithms": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0",
|
||||
"System.Collections": "4.3.0",
|
||||
"System.IO": "4.3.0",
|
||||
"System.Resources.ResourceManager": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Runtime.Extensions": "4.3.0",
|
||||
"System.Runtime.Handles": "4.3.0",
|
||||
"System.Runtime.InteropServices": "4.3.0",
|
||||
"System.Runtime.Numerics": "4.3.0",
|
||||
"System.Security.Cryptography.Encoding": "4.3.0",
|
||||
"System.Security.Cryptography.Primitives": "4.3.0",
|
||||
"System.Text.Encoding": "4.3.0",
|
||||
"runtime.native.System.Security.Cryptography.Apple": "4.3.0",
|
||||
"runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Security.Cryptography.Cng": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0",
|
||||
"System.IO": "4.3.0",
|
||||
"System.Resources.ResourceManager": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Runtime.Extensions": "4.3.0",
|
||||
"System.Runtime.Handles": "4.3.0",
|
||||
"System.Runtime.InteropServices": "4.3.0",
|
||||
"System.Security.Cryptography.Algorithms": "4.3.0",
|
||||
"System.Security.Cryptography.Encoding": "4.3.0",
|
||||
"System.Security.Cryptography.Primitives": "4.3.0",
|
||||
"System.Text.Encoding": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Security.Cryptography.Csp": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0",
|
||||
"System.IO": "4.3.0",
|
||||
"System.Reflection": "4.3.0",
|
||||
"System.Resources.ResourceManager": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Runtime.Extensions": "4.3.0",
|
||||
"System.Runtime.Handles": "4.3.0",
|
||||
"System.Runtime.InteropServices": "4.3.0",
|
||||
"System.Security.Cryptography.Algorithms": "4.3.0",
|
||||
"System.Security.Cryptography.Encoding": "4.3.0",
|
||||
"System.Security.Cryptography.Primitives": "4.3.0",
|
||||
"System.Text.Encoding": "4.3.0",
|
||||
"System.Threading": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Security.Cryptography.Encoding": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0",
|
||||
"System.Collections": "4.3.0",
|
||||
"System.Collections.Concurrent": "4.3.0",
|
||||
"System.Linq": "4.3.0",
|
||||
"System.Resources.ResourceManager": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Runtime.Extensions": "4.3.0",
|
||||
"System.Runtime.Handles": "4.3.0",
|
||||
"System.Runtime.InteropServices": "4.3.0",
|
||||
"System.Security.Cryptography.Primitives": "4.3.0",
|
||||
"System.Text.Encoding": "4.3.0",
|
||||
"runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==",
|
||||
"dependencies": {
|
||||
"System.Collections": "4.3.0",
|
||||
"System.IO": "4.3.0",
|
||||
"System.Resources.ResourceManager": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Runtime.Extensions": "4.3.0",
|
||||
"System.Runtime.Handles": "4.3.0",
|
||||
"System.Runtime.InteropServices": "4.3.0",
|
||||
"System.Runtime.Numerics": "4.3.0",
|
||||
"System.Security.Cryptography.Algorithms": "4.3.0",
|
||||
"System.Security.Cryptography.Encoding": "4.3.0",
|
||||
"System.Security.Cryptography.Primitives": "4.3.0",
|
||||
"System.Text.Encoding": "4.3.0",
|
||||
"runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Security.Cryptography.Primitives": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==",
|
||||
"dependencies": {
|
||||
"System.Diagnostics.Debug": "4.3.0",
|
||||
"System.Globalization": "4.3.0",
|
||||
"System.IO": "4.3.0",
|
||||
"System.Resources.ResourceManager": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Threading": "4.3.0",
|
||||
"System.Threading.Tasks": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Security.Cryptography.X509Certificates": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0",
|
||||
"System.Collections": "4.3.0",
|
||||
"System.Diagnostics.Debug": "4.3.0",
|
||||
"System.Globalization": "4.3.0",
|
||||
"System.Globalization.Calendars": "4.3.0",
|
||||
"System.IO": "4.3.0",
|
||||
"System.IO.FileSystem": "4.3.0",
|
||||
"System.IO.FileSystem.Primitives": "4.3.0",
|
||||
"System.Resources.ResourceManager": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Runtime.Extensions": "4.3.0",
|
||||
"System.Runtime.Handles": "4.3.0",
|
||||
"System.Runtime.InteropServices": "4.3.0",
|
||||
"System.Runtime.Numerics": "4.3.0",
|
||||
"System.Security.Cryptography.Algorithms": "4.3.0",
|
||||
"System.Security.Cryptography.Cng": "4.3.0",
|
||||
"System.Security.Cryptography.Csp": "4.3.0",
|
||||
"System.Security.Cryptography.Encoding": "4.3.0",
|
||||
"System.Security.Cryptography.OpenSsl": "4.3.0",
|
||||
"System.Security.Cryptography.Primitives": "4.3.0",
|
||||
"System.Text.Encoding": "4.3.0",
|
||||
"System.Threading": "4.3.0",
|
||||
"runtime.native.System": "4.3.0",
|
||||
"runtime.native.System.Net.Http": "4.3.0",
|
||||
"runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Text.Encoding": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
@@ -451,6 +878,23 @@
|
||||
"System.Runtime": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Text.Encodings.Web": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0",
|
||||
"contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==",
|
||||
"dependencies": {
|
||||
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
|
||||
}
|
||||
},
|
||||
"System.Text.Json": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.7",
|
||||
"contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==",
|
||||
"dependencies": {
|
||||
"System.Runtime.CompilerServices.Unsafe": "6.0.0",
|
||||
"System.Text.Encodings.Web": "6.0.0"
|
||||
}
|
||||
},
|
||||
"System.Threading": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
@@ -470,15 +914,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.IL2CPP": "6.0.0-be.570"
|
||||
"BepInEx.Unity.IL2CPP": "[6.0.0-be.670, )"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
namespace Reactor.Example
|
||||
namespace Reactor.Example;
|
||||
|
||||
public enum CustomRpcCalls : uint
|
||||
{
|
||||
public enum CustomRpcCalls : uint
|
||||
{
|
||||
Example,
|
||||
MethodRpcExample
|
||||
}
|
||||
Example,
|
||||
MethodRpcExample,
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
using Reactor.Localization;
|
||||
|
||||
namespace Reactor.Example;
|
||||
|
||||
public class ExampleLocalizationProvider : LocalizationProvider
|
||||
{
|
||||
public override bool TryGetText(StringNames stringName, out string? result)
|
||||
{
|
||||
if (stringName == (StringNames) 1337)
|
||||
{
|
||||
switch (CurrentLanguage)
|
||||
{
|
||||
case SupportedLangs.English:
|
||||
result = "Cringe English";
|
||||
return true;
|
||||
|
||||
default:
|
||||
result = "Based " + CurrentLanguage;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
result = null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -1,59 +1,100 @@
|
||||
using System;
|
||||
using System;
|
||||
using BepInEx;
|
||||
using BepInEx.IL2CPP;
|
||||
using Reactor.Extensions;
|
||||
using BepInEx.Unity.IL2CPP;
|
||||
using Il2CppInterop.Runtime.Attributes;
|
||||
using Reactor.Localization;
|
||||
using Reactor.Localization.Utilities;
|
||||
using Reactor.Networking;
|
||||
using Reactor.Networking.MethodRpc;
|
||||
using UnhollowerBaseLib.Attributes;
|
||||
using Reactor.Networking.Attributes;
|
||||
using Reactor.Networking.Rpc;
|
||||
using Reactor.Utilities;
|
||||
using Reactor.Utilities.Attributes;
|
||||
using Reactor.Utilities.ImGui;
|
||||
using UnityEngine;
|
||||
using Random = UnityEngine.Random;
|
||||
|
||||
namespace Reactor.Example
|
||||
namespace Reactor.Example;
|
||||
|
||||
[BepInAutoPlugin("gg.reactor.Example")]
|
||||
[BepInProcess("Among Us.exe")]
|
||||
[BepInDependency(ReactorPlugin.Id)]
|
||||
[ReactorModFlags(ModFlags.RequireOnAllClients)]
|
||||
public partial class ExamplePlugin : BasePlugin
|
||||
{
|
||||
[BepInAutoPlugin("gg.reactor.Example")]
|
||||
[BepInProcess("Among Us.exe")]
|
||||
[BepInDependency(ReactorPlugin.Id)]
|
||||
public partial class ExamplePlugin : BasePlugin
|
||||
private static StringNames _helloStringName;
|
||||
|
||||
public override void Load()
|
||||
{
|
||||
public override void Load()
|
||||
{
|
||||
this.AddComponent<ExampleComponent>();
|
||||
}
|
||||
this.AddComponent<ExampleComponent>();
|
||||
|
||||
[RegisterInIl2Cpp]
|
||||
public class ExampleComponent : MonoBehaviour
|
||||
{
|
||||
public ExampleComponent(IntPtr ptr) : base(ptr)
|
||||
{
|
||||
}
|
||||
_helloStringName = CustomStringName.CreateAndRegister("Hello!");
|
||||
LocalizationManager.Register(new ExampleLocalizationProvider());
|
||||
}
|
||||
|
||||
private void Update()
|
||||
[RegisterInIl2Cpp]
|
||||
public class ExampleComponent : MonoBehaviour
|
||||
{
|
||||
[HideFromIl2Cpp]
|
||||
public DragWindow TestWindow { get; }
|
||||
|
||||
public ExampleComponent(IntPtr ptr) : base(ptr)
|
||||
{
|
||||
TestWindow = new DragWindow(new Rect(60, 20, 0, 0), "Example", () =>
|
||||
{
|
||||
if (GUILayout.Button("Log CustomStringName"))
|
||||
{
|
||||
Logger<ExamplePlugin>.Info(TranslationController.Instance.GetString(_helloStringName));
|
||||
}
|
||||
|
||||
if (GUILayout.Button("Log localized string"))
|
||||
{
|
||||
Logger<ExamplePlugin>.Info(TranslationController.Instance.GetString((StringNames) 1337));
|
||||
}
|
||||
|
||||
if (AmongUsClient.Instance && PlayerControl.LocalPlayer)
|
||||
{
|
||||
if (Input.GetKeyDown(KeyCode.F3))
|
||||
if (GUILayout.Button("Send ExampleRpc"))
|
||||
{
|
||||
var name = PlayerControl.LocalPlayer.Data.PlayerName;
|
||||
Rpc<ExampleRpc>.Instance.Send(new ExampleRpc.Data($"Send: from {name}"));
|
||||
var playerName = PlayerControl.LocalPlayer.Data.PlayerName;
|
||||
Rpc<ExampleRpc>.Instance.Send(new ExampleRpc.Data($"Send: from {playerName}"), ackCallback: () =>
|
||||
{
|
||||
Logger<ExamplePlugin>.Info("Got an acknowledgement for example rpc");
|
||||
});
|
||||
|
||||
if (!AmongUsClient.Instance.AmHost)
|
||||
{
|
||||
Rpc<ExampleRpc>.Instance.SendTo(AmongUsClient.Instance.HostId, new ExampleRpc.Data($"SendTo: from {name} to host"));
|
||||
Rpc<ExampleRpc>.Instance.SendTo(AmongUsClient.Instance.HostId, new ExampleRpc.Data($"SendTo: from {playerName} to host"));
|
||||
}
|
||||
}
|
||||
|
||||
if (Input.GetKeyDown(KeyCode.F4))
|
||||
if (GUILayout.Button("Send MethodExampleRpc"))
|
||||
{
|
||||
RpcSay(PlayerControl.LocalPlayer, "Hello from method rpc", Random.value, PlayerControl.LocalPlayer);
|
||||
}
|
||||
}
|
||||
})
|
||||
{
|
||||
Enabled = false,
|
||||
};
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
if (Input.GetKeyDown(KeyCode.F2))
|
||||
{
|
||||
TestWindow.Enabled = !TestWindow.Enabled;
|
||||
}
|
||||
}
|
||||
|
||||
[MethodRpc((uint) CustomRpcCalls.MethodRpcExample)]
|
||||
public static void RpcSay(PlayerControl player, string text, float number, PlayerControl testPlayer)
|
||||
private void OnGUI()
|
||||
{
|
||||
Logger<ExamplePlugin>.Info($"{player.Data.PlayerName} text: {text} number: {number} testPlayer: {testPlayer.NetId}");
|
||||
TestWindow.OnGUI();
|
||||
}
|
||||
}
|
||||
|
||||
[MethodRpc((uint) CustomRpcCalls.MethodRpcExample)]
|
||||
public static void RpcSay(PlayerControl player, string text, float number, PlayerControl testPlayer)
|
||||
{
|
||||
Logger<ExamplePlugin>.Info($"{player.Data.PlayerName} text: {text} number: {number} testPlayer: {testPlayer.NetId}");
|
||||
}
|
||||
}
|
||||
@@ -1,40 +1,32 @@
|
||||
using Hazel;
|
||||
using Reactor.Networking;
|
||||
using Reactor.Networking.Attributes;
|
||||
using Reactor.Networking.Rpc;
|
||||
|
||||
namespace Reactor.Example
|
||||
namespace Reactor.Example;
|
||||
|
||||
[RegisterCustomRpc((uint) CustomRpcCalls.Example)]
|
||||
public class ExampleRpc : PlayerCustomRpc<ExamplePlugin, ExampleRpc.Data>
|
||||
{
|
||||
[RegisterCustomRpc((uint) CustomRpcCalls.Example)]
|
||||
public class ExampleRpc : PlayerCustomRpc<ExamplePlugin, ExampleRpc.Data>
|
||||
public ExampleRpc(ExamplePlugin plugin, uint id) : base(plugin, id)
|
||||
{
|
||||
public ExampleRpc(ExamplePlugin plugin, uint id) : base(plugin, id)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
public readonly struct Data
|
||||
{
|
||||
public readonly string Message;
|
||||
public readonly record struct Data(string Message);
|
||||
|
||||
public Data(string message)
|
||||
{
|
||||
Message = message;
|
||||
}
|
||||
}
|
||||
public override RpcLocalHandling LocalHandling => RpcLocalHandling.None;
|
||||
|
||||
public override RpcLocalHandling LocalHandling => RpcLocalHandling.None;
|
||||
public override void Write(MessageWriter writer, Data data)
|
||||
{
|
||||
writer.Write(data.Message);
|
||||
}
|
||||
|
||||
public override void Write(MessageWriter writer, Data data)
|
||||
{
|
||||
writer.Write(data.Message);
|
||||
}
|
||||
public override Data Read(MessageReader reader)
|
||||
{
|
||||
return new Data(reader.ReadString());
|
||||
}
|
||||
|
||||
public override Data Read(MessageReader reader)
|
||||
{
|
||||
return new Data(reader.ReadString());
|
||||
}
|
||||
|
||||
public override void Handle(PlayerControl innerNetObject, Data data)
|
||||
{
|
||||
Plugin.Log.LogWarning($"Handle: {innerNetObject.Data.PlayerName} sent \"{data.Message}\"");
|
||||
}
|
||||
public override void Handle(PlayerControl innerNetObject, Data data)
|
||||
{
|
||||
Plugin.Log.LogWarning($"Handle: {innerNetObject.Data.PlayerName} sent \"{data.Message}\"");
|
||||
}
|
||||
}
|
||||
@@ -1,16 +1,12 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netstandard2.1</TargetFramework>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<DebugType>embedded</DebugType>
|
||||
|
||||
<Version>0.1.0</Version>
|
||||
<Description>Example mod using Reactor</Description>
|
||||
<Authors>NuclearPowered</Authors>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Reactor\Reactor.csproj" />
|
||||
<ProjectReference Include="..\Reactor\Reactor.csproj" Private="false" />
|
||||
</ItemGroup>
|
||||
|
||||
<Import Project="../AmongUs.props" />
|
||||
|
||||
@@ -1,65 +1,114 @@
|
||||
{
|
||||
"version": 1,
|
||||
"dependencies": {
|
||||
".NETStandard,Version=v2.1": {
|
||||
"net6.0": {
|
||||
"AmongUs.GameLibs.Steam": {
|
||||
"type": "Direct",
|
||||
"requested": "[2022.8.23, )",
|
||||
"resolved": "2022.8.23",
|
||||
"contentHash": "baY5JO6dbdOAZ0VTtGX0xre6/BlDdreJDAH8boCKZt3JTAcn+eeH+l8mUZRC9eCJOODUik2C0TTAt5AqBmYtZg=="
|
||||
"requested": "[2023.7.11, )",
|
||||
"resolved": "2023.7.11",
|
||||
"contentHash": "e5zbU+4AYnp1zAQDizO5GRIh1kemkgCa8rFVAcr9bxeupkBu5dwwdHxArWv/pUybIJTZfOPjkOnicZ2qKWLX7g=="
|
||||
},
|
||||
"BepInEx.AutoPlugin": {
|
||||
"type": "Direct",
|
||||
"requested": "[1.0.1, )",
|
||||
"resolved": "1.0.1",
|
||||
"contentHash": "G4YpTHG9rtkDJof+ld7Er4E+sCOlgsjG4bJ1itx1ub7dgff6qqHLy9ksX1ehgO0AdBOPVyVl/GKJg9o7iNl8HA=="
|
||||
},
|
||||
"BepInEx.IL2CPP": {
|
||||
"type": "Direct",
|
||||
"requested": "[6.0.0-be.570, )",
|
||||
"resolved": "6.0.0-be.570",
|
||||
"contentHash": "JGkWFFGZTWQ+YlFQ17izlwfGNUyo/zfFGNYPX6XAeTkfM5RwXiPYNMNO6eWoxbKwaYlAylQq2YCRkkCnAr9nwQ==",
|
||||
"dependencies": {
|
||||
"BepInEx.Core": "6.0.0-be.570",
|
||||
"BepInEx.Il2Cpp.TlsAdapter": "1.0.1",
|
||||
"HarmonyX": "2.10.0",
|
||||
"Iced": "1.17.0",
|
||||
"Il2CppAssemblyUnhollower.BaseLib": "0.4.33.3",
|
||||
"Il2CppAssemblyUnhollower.BaseLib.Legacy": "0.4.33.3",
|
||||
"Il2CppAssemblyUnhollower.Lib": "0.4.33.3",
|
||||
"Il2CppDumper": "6.6.4",
|
||||
"MonoMod.RuntimeDetour": "22.5.1.1",
|
||||
"Samboy063.Cpp2IL.Core": "2022.0.5"
|
||||
}
|
||||
"requested": "[1.1.0, )",
|
||||
"resolved": "1.1.0",
|
||||
"contentHash": "/7Nmc1EA9lYlGBiyz6qPAaHvlcJHEjFZ1RFpGX+8EBj3GrgoX5kbpnZusuSHoOlLx0l+CnzKuQNE54B8UaGPyw=="
|
||||
},
|
||||
"BepInEx.IL2CPP.MSBuild": {
|
||||
"type": "Direct",
|
||||
"requested": "[1.1.1, )",
|
||||
"resolved": "1.1.1",
|
||||
"contentHash": "uUSo4TuamyEIVg+ICNeJMSSW/arKWHGpfBFINc4fdF5kppfHFrsDURKzNPmDvxivtLsiuGthck9J/5uPXgIcTg=="
|
||||
"requested": "[2.0.1, )",
|
||||
"resolved": "2.0.1",
|
||||
"contentHash": "hUZjCV0t8dkw/Z/zq4Zl405QP7frBk/LVfMdUmUz+7XOhGd7lYPKrR48A5vbGl2QeHudMxlkXzAr9WM3Duq2SQ=="
|
||||
},
|
||||
"BepInEx.Unity.IL2CPP": {
|
||||
"type": "Direct",
|
||||
"requested": "[6.0.0-be.670, )",
|
||||
"resolved": "6.0.0-be.670",
|
||||
"contentHash": "dhzCrem44oFxhOICCJ9eoSUbaKSsGGyBUfUQW9WFljCwIK8o4Cx5BiuXAkYoRjr2DhpzLpPDyPZDRImUqH0bwA==",
|
||||
"dependencies": {
|
||||
"BepInEx.Core": "6.0.0-be.670",
|
||||
"BepInEx.Unity.Common": "6.0.0-be.670",
|
||||
"HarmonyX": "2.10.1",
|
||||
"Iced": "1.18.0",
|
||||
"Il2CppInterop.Generator": "1.4.6-ci.354",
|
||||
"Il2CppInterop.HarmonySupport": "1.4.6-ci.354",
|
||||
"Il2CppInterop.Runtime": "1.4.6-ci.354",
|
||||
"MonoMod.RuntimeDetour": "22.5.1.1",
|
||||
"Samboy063.Cpp2IL.Core": "2022.1.0-development.866"
|
||||
}
|
||||
},
|
||||
"StyleCop.Analyzers": {
|
||||
"type": "Direct",
|
||||
"requested": "[1.2.0-beta.435, )",
|
||||
"resolved": "1.2.0-beta.435",
|
||||
"contentHash": "TADk7vdGXtfTnYCV7GyleaaRTQjfoSfZXprQrVMm7cSJtJbFc1QIbWPyLvrgrfGdfHbGmUPvaN4ODKNxg2jgPQ==",
|
||||
"dependencies": {
|
||||
"StyleCop.Analyzers.Unstable": "1.2.0.435"
|
||||
}
|
||||
},
|
||||
"AsmResolver": {
|
||||
"type": "Transitive",
|
||||
"resolved": "5.1.0",
|
||||
"contentHash": "7PjujQzgQ3wjzqZYT4CY8SV6zx7FY6swIwj3Yk4QLolLqo9sBPb7FLF3W30QFvCsCkNfiVWXlSbeZKs4xGgQOQ=="
|
||||
},
|
||||
"AsmResolver.DotNet": {
|
||||
"type": "Transitive",
|
||||
"resolved": "5.1.0",
|
||||
"contentHash": "oKrBU94OaSrbbTwydvpLRFalYxozrNXGkl13nIkm823ZFQtPNYOiOMJb5DQLvkCJlWyis7q865tg803T5zg9IA==",
|
||||
"dependencies": {
|
||||
"AsmResolver.PE": "5.1.0",
|
||||
"System.Text.Json": "6.0.7"
|
||||
}
|
||||
},
|
||||
"AsmResolver.PE": {
|
||||
"type": "Transitive",
|
||||
"resolved": "5.1.0",
|
||||
"contentHash": "XD3iAgLSInJIODKUUlpHWXf8MR9H1SFMb1lsmabb4GxxxnDQRPjMxjglv2NOCjQQuNB2Oh0bvjHE7ewf82UqyQ==",
|
||||
"dependencies": {
|
||||
"AsmResolver.PE.File": "5.1.0"
|
||||
}
|
||||
},
|
||||
"AsmResolver.PE.File": {
|
||||
"type": "Transitive",
|
||||
"resolved": "5.1.0",
|
||||
"contentHash": "YituBYe0Fh471sXQMfu+f4tWKX/JZvRwrX6g/SVsr4XkUIUzYi/aGT3/QvjHoYx19fE1KYOB6zBKqPkkOK7HPw==",
|
||||
"dependencies": {
|
||||
"AsmResolver": "5.1.0"
|
||||
}
|
||||
},
|
||||
"AssetRipper.VersionUtilities": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.3.1",
|
||||
"contentHash": "/1D18NOpqm7rS7+qVUbAReVMNWwgDuYpsnf0RkX1Aah/I0a0irqldoFJ+Kku7YdbSm0zqD+Z6iYUGKoP3GwTNQ=="
|
||||
},
|
||||
"BepInEx.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0-be.570",
|
||||
"contentHash": "kygIunLrK1HMGcRo2E/7e4ZEAA0xewuB/j5mPoMi7Xk58GUi43XnclBJHif9x05a55s0kFkfKOrpwIRmjd0cDw==",
|
||||
"resolved": "6.0.0-be.670",
|
||||
"contentHash": "7CbbMNZfb+1VHjFKh/ErFBOOEYrVCIkng/B3/HPcbNioySC7qdT1ztfYqs6YjQia4krEic+LV3ew86B/hTg+hw==",
|
||||
"dependencies": {
|
||||
"HarmonyX": "2.10.0",
|
||||
"MonoMod.Utils": "22.3.23.4",
|
||||
"HarmonyX": "2.10.1",
|
||||
"MonoMod.Utils": "22.5.1.1",
|
||||
"SemanticVersioning": "2.0.2"
|
||||
}
|
||||
},
|
||||
"BepInEx.Il2Cpp.TlsAdapter": {
|
||||
"BepInEx.Unity.Common": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.0.1",
|
||||
"contentHash": "kTfX6312X0Fvwks+t7Ul3YO2jMSbqNS2Jx/85Cgl6lbAjEJnKzsmx7Krmd66dbnx0eY/QMjaV2r6LyWmQARtdA==",
|
||||
"resolved": "6.0.0-be.670",
|
||||
"contentHash": "FSzWILgwepZ7CpA34ew1WyO75lNjxkfX86uwo2172lbhmLkgoAdQbNun8dxKJCDlIevmTDga76yr/WPrTXELvA==",
|
||||
"dependencies": {
|
||||
"HarmonyX": "2.3.1"
|
||||
"AssetRipper.VersionUtilities": "1.2.1",
|
||||
"MonoMod.Utils": "22.5.1.1"
|
||||
}
|
||||
},
|
||||
"Disarm": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.1.0-master.26",
|
||||
"contentHash": "YnZEbRGr0nG+N3G8WbRQ4Lkg8dTD3oso9iJlCVBmyhEyhLyqs+drBs1kWQbQqFPnb9mi/RJ++R9bPb+L3HF03Q=="
|
||||
},
|
||||
"HarmonyX": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.10.0",
|
||||
"contentHash": "4ayiy/dlCiW86K2N7Jvbf+VpI5wvP7dncv/6oRmfwRi32UCmCRzCGzsxdMfzJZkp6/26oBW+DrD8vi4UejzVAg==",
|
||||
"resolved": "2.10.1",
|
||||
"contentHash": "9LodMC9Y0u1TW96eKJoWrFJFpmzbgojEO38/Q+e7c1mFPhmHt8xcR8qhI06iF1rf0Dnsk+hqENFVSgbtwl/bEw==",
|
||||
"dependencies": {
|
||||
"MonoMod.RuntimeDetour": "22.3.23.4",
|
||||
"System.Reflection.Emit": "4.7.0"
|
||||
@@ -67,57 +116,60 @@
|
||||
},
|
||||
"Iced": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.17.0",
|
||||
"contentHash": "8x+HCVTl/HHTGpscH3vMBhV8sknN/muZFw9s3TsI8SA6+c43cOTCi2+jE4KsU8pNLbJ++iF2ZFcpcXHXtDglnw=="
|
||||
"resolved": "1.18.0",
|
||||
"contentHash": "G60lZOvbvqttA+SBSv/yY6/wUboXKJlkffhSNR9iOrx0M5gpcK1TRr6xrFR+qAhqIAhvrsPF1jkn9fYb4lEufQ=="
|
||||
},
|
||||
"Il2CppAssemblyUnhollower.BaseLib": {
|
||||
"Il2CppInterop.Common": {
|
||||
"type": "Transitive",
|
||||
"resolved": "0.4.33.3",
|
||||
"contentHash": "CH91M6Asz4iwennTa8cLg5wqROJY1JvnsfRetyOvs0cy8o/YAikvm8uuNgZv6UiTO/qoyy/QrBE1qSZDvs8bLw==",
|
||||
"resolved": "1.4.6-ci.354",
|
||||
"contentHash": "aCP3kr39YQw5GVqE9Q8c5y7f9CEKdFxpUhIqYgQBtrEz5Z/KCbHhjuOf/lSuFrjl6Vub/BKk6k+UbMRdoSvC1w==",
|
||||
"dependencies": {
|
||||
"Iced": "1.15.0"
|
||||
"Iced": "1.17.0",
|
||||
"Microsoft.Extensions.Logging.Abstractions": "6.0.1",
|
||||
"System.Net.Http": "4.3.4"
|
||||
}
|
||||
},
|
||||
"Il2CppAssemblyUnhollower.BaseLib.Legacy": {
|
||||
"Il2CppInterop.Generator": {
|
||||
"type": "Transitive",
|
||||
"resolved": "0.4.33.3",
|
||||
"contentHash": "6yIJg8lkayBDevPwcdcV3LWTdHt8VAZVY0wQwuXH4POOo0Kzc6Cshy9kLCxH3AC6EQg0G/v+Albs6RZgwszXMQ==",
|
||||
"resolved": "1.4.6-ci.354",
|
||||
"contentHash": "y30sxc9mMv0bUzCPDr73xiI6fiu7ksmnEm6XULTGU/5JEGv2aw++/71bLOEYCscNbZTa2JT4yYrLCXCj3GSekg==",
|
||||
"dependencies": {
|
||||
"Il2CppAssemblyUnhollower.BaseLib": "0.4.33.3"
|
||||
}
|
||||
},
|
||||
"Il2CppAssemblyUnhollower.Lib": {
|
||||
"type": "Transitive",
|
||||
"resolved": "0.4.33.3",
|
||||
"contentHash": "tdu4OnMxodkWwoImNDaycaLY1L3qJOazb5UaLAt1ncRpWyu6xvKuKe5NM6OcBXONpkYsJQeQZjD6syeFl5MCQA==",
|
||||
"dependencies": {
|
||||
"Il2CppAssemblyUnhollower.BaseLib": "0.4.33.3",
|
||||
"Il2CppAssemblyUnhollower.BaseLib.Legacy": "0.4.33.3",
|
||||
"Il2CppInterop.Common": "1.4.6-ci.354",
|
||||
"Mono.Cecil": "0.11.3"
|
||||
}
|
||||
},
|
||||
"Il2CppDumper": {
|
||||
"Il2CppInterop.HarmonySupport": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.6.4",
|
||||
"contentHash": "aqjmlyigdZ5FS9ElMNlaCExlgSmAiho4BeIcVwkmzHGnomBzopjOCxqIX9vc/575TQ87TKoaGW2KP+3b5xI15A==",
|
||||
"resolved": "1.4.6-ci.354",
|
||||
"contentHash": "mQV5A+B/qtI6kSXEGx/UswiqjFKw13/yyviawnStfRKbLMW+XFsdMgGSkOVZd/TiDtF9ZG4Xt7DbkbFu26WjyA==",
|
||||
"dependencies": {
|
||||
"Mono.Cecil": "0.11.3"
|
||||
"HarmonyX": "2.10.0",
|
||||
"Il2CppInterop.Runtime": "1.4.6-ci.354"
|
||||
}
|
||||
},
|
||||
"IndexRange": {
|
||||
"Il2CppInterop.Runtime": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.0.0",
|
||||
"contentHash": "6TgS1JLSUkpmPLfXBPaAgB39ZUix8E4soXWk2XSDcscVe84i1JKzIAtA7jHbRHSkOOrcr6YA0MpLCeq98y9mYQ=="
|
||||
"resolved": "1.4.6-ci.354",
|
||||
"contentHash": "Xe5md9z+KIthdEcjfUjmoOhvM3gTI3SPyocqvuzEHoov5jQ/HhIPv5hUZzTSm+2nzn3XplENNE8vlBPvQ1o6OA==",
|
||||
"dependencies": {
|
||||
"Iced": "1.17.0",
|
||||
"Il2CppInterop.Common": "1.4.6-ci.354"
|
||||
}
|
||||
},
|
||||
"js6pak.Gee.External.Capstone": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.1.0",
|
||||
"contentHash": "YYpq7NM50bSSVUDjXyV/eiITk6syXqItPjKBOb3jEWS6RFsk0DNhpWMPW6b3hKDmArARuWDU6S2pVu1IeVrvIA=="
|
||||
},
|
||||
"Microsoft.Extensions.Logging.Abstractions": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.1",
|
||||
"contentHash": "dzB2Cgg+JmrouhjkcQGzSFjjvpwlq353i8oBQO2GWNjCXSzhbtBRUf28HSauWe7eib3wYOdb3tItdjRwAdwCSg=="
|
||||
},
|
||||
"Microsoft.NETCore.Platforms": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.1.0",
|
||||
"contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A=="
|
||||
"resolved": "1.1.1",
|
||||
"contentHash": "TMBuzAHpTenGbGgk0SMTwyEkyijY/Eae4ZGsFNYJvAr/LDn1ku3Etp3FPxChmDp5HHF3kzJuoaa08N0xjqAJfQ=="
|
||||
},
|
||||
"Microsoft.NETCore.Targets": {
|
||||
"type": "Transitive",
|
||||
@@ -158,40 +210,146 @@
|
||||
"System.Reflection.TypeExtensions": "4.7.0"
|
||||
}
|
||||
},
|
||||
"runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.2",
|
||||
"contentHash": "7VSGO0URRKoMEAq0Sc9cRz8mb6zbyx/BZDEWhgPdzzpmFhkam3fJ1DAGWFXBI4nGlma+uPKpfuMQP5LXRnOH5g=="
|
||||
},
|
||||
"runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.2",
|
||||
"contentHash": "0oAaTAm6e2oVH+/Zttt0cuhGaePQYKII1dY8iaqP7CvOpVKgLybKRFvQjXR2LtxXOXTVPNv14j0ot8uV+HrUmw=="
|
||||
},
|
||||
"runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.2",
|
||||
"contentHash": "G24ibsCNi5Kbz0oXWynBoRgtGvsw5ZSVEWjv13/KiCAM8C6wz9zzcCniMeQFIkJ2tasjo2kXlvlBZhplL51kGg=="
|
||||
},
|
||||
"runtime.native.System": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0",
|
||||
"Microsoft.NETCore.Targets": "1.1.0"
|
||||
}
|
||||
},
|
||||
"runtime.native.System.Net.Http": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0",
|
||||
"Microsoft.NETCore.Targets": "1.1.0"
|
||||
}
|
||||
},
|
||||
"runtime.native.System.Security.Cryptography.Apple": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==",
|
||||
"dependencies": {
|
||||
"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0"
|
||||
}
|
||||
},
|
||||
"runtime.native.System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.2",
|
||||
"contentHash": "QR1OwtwehHxSeQvZKXe+iSd+d3XZNkEcuWMFYa2i0aG1l+lR739HPicKMlTbJst3spmeekDVBUS7SeS26s4U/g==",
|
||||
"dependencies": {
|
||||
"runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2",
|
||||
"runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2",
|
||||
"runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2",
|
||||
"runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2",
|
||||
"runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2",
|
||||
"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2",
|
||||
"runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2",
|
||||
"runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2",
|
||||
"runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2",
|
||||
"runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2"
|
||||
}
|
||||
},
|
||||
"runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.2",
|
||||
"contentHash": "I+GNKGg2xCHueRd1m9PzeEW7WLbNNLznmTuEi8/vZX71HudUbx1UTwlGkiwMri7JLl8hGaIAWnA/GONhu+LOyQ=="
|
||||
},
|
||||
"runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.2",
|
||||
"contentHash": "1Z3TAq1ytS1IBRtPXJvEUZdVsfWfeNEhBkbiOCGEl9wwAfsjP2lz3ZFDx5tq8p60/EqbS0HItG5piHuB71RjoA=="
|
||||
},
|
||||
"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ=="
|
||||
},
|
||||
"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.2",
|
||||
"contentHash": "6mU/cVmmHtQiDXhnzUImxIcDL48GbTk+TsptXyJA+MIOG9LRjPoAQC/qBFB7X+UNyK86bmvGwC8t+M66wsYC8w=="
|
||||
},
|
||||
"runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.2",
|
||||
"contentHash": "vjwG0GGcTW/PPg6KVud8F9GLWYuAV1rrw1BKAqY0oh4jcUqg15oYF1+qkGR2x2ZHM4DQnWKQ7cJgYbfncz/lYg=="
|
||||
},
|
||||
"runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.2",
|
||||
"contentHash": "7KMFpTkHC/zoExs+PwP8jDCWcrK9H6L7soowT80CUx3e+nxP/AFnq0AQAW5W76z2WYbLAYCRyPfwYFG6zkvQRw=="
|
||||
},
|
||||
"runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.2",
|
||||
"contentHash": "xrlmRCnKZJLHxyyLIqkZjNXqgxnKdZxfItrPkjI+6pkRo5lHX8YvSZlWrSI5AVwLMi4HbNWP7064hcAWeZKp5w=="
|
||||
},
|
||||
"runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.2",
|
||||
"contentHash": "leXiwfiIkW7Gmn7cgnNcdtNAU70SjmKW3jxGj1iKHOvdn0zRWsgv/l2OJUO5zdGdiv2VRFnAsxxhDgMzofPdWg=="
|
||||
},
|
||||
"Samboy063.Cpp2IL.Core": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.0.5",
|
||||
"contentHash": "5JipfyEmJWePqLLnvwzxWx9dQXxNfgN0wcZ4IcmuabWKVvk4gA5Rux4vgDh9NrWf8q9LzkizWHkrnMaG1niF7g==",
|
||||
"resolved": "2022.1.0-development.866",
|
||||
"contentHash": "QPMuix/3jRngWBdNSLhAbm9BHYf95Ln1Ph1eCK/cDZdVibxFDFP3a6Yczyx1p7GbN7bRQwrhs2skPJSS/z3m2w==",
|
||||
"dependencies": {
|
||||
"HarmonyX": "2.5.5",
|
||||
"Iced": "1.11.1",
|
||||
"IndexRange": "1.0.0",
|
||||
"Mono.Cecil": "0.11.4",
|
||||
"Samboy063.LibCpp2IL": "2022.0.5",
|
||||
"System.Runtime.InteropServices": "4.3.0",
|
||||
"System.ValueTuple": "4.5.0",
|
||||
"AsmResolver.DotNet": "5.1.0",
|
||||
"Disarm": "2022.1.0-master.26",
|
||||
"Iced": "1.18.0",
|
||||
"Samboy063.LibCpp2IL": "2022.1.0-development.866",
|
||||
"StableNameDotNet": "0.1.0-development.866",
|
||||
"js6pak.Gee.External.Capstone": "2.1.0"
|
||||
}
|
||||
},
|
||||
"Samboy063.LibCpp2IL": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.0.5",
|
||||
"contentHash": "eH+/FBclsKDxboa9N/tFoiM8kwvietVX0FtXYxvcexSp/geYCyTt2XUGOQjinqd3Yqg/QxmpIqBO7qy4MQHrhw==",
|
||||
"resolved": "2022.1.0-development.866",
|
||||
"contentHash": "EcJSWTfQko8SQozozoUT+aQJVWC8wj8C0YUiPBF4rNRId19yTKp2IXcXnI747v+8/aal222QR6WHfoBK2WlVLg==",
|
||||
"dependencies": {
|
||||
"IndexRange": "1.0.0",
|
||||
"Samboy063.WasmDisassembler": "2022.0.2"
|
||||
"AssetRipper.VersionUtilities": "1.3.1",
|
||||
"Samboy063.WasmDisassembler": "2022.1.0-development.866"
|
||||
}
|
||||
},
|
||||
"Samboy063.WasmDisassembler": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2022.0.2",
|
||||
"contentHash": "2uu+xBb7M3HKfBx9tAY6jiDieAf0hRnQjSmGX+7IdE6i24dYsx6TYgtrLvRx5lOuF2M8DijZ5H8yQ1pcuCs2SA=="
|
||||
"resolved": "2022.1.0-development.866",
|
||||
"contentHash": "2QK8F3eISkLcoW/Nt7wtxyQh31EXAqEMBVXXjEnuxyvXpBXxOIGpjmE3pWhGwxQwDCbe4zBsLF1zUiqq3/pXRA=="
|
||||
},
|
||||
"SemanticVersioning": {
|
||||
"type": "Transitive",
|
||||
"resolved": "2.0.2",
|
||||
"contentHash": "4EQgYdNZ92SyaO7YFk6olVnebF5V+jrHyMUjvPq89tLeMo8NSfgDF+6Zwq/lgh9j/0yfQp9Lkm0ZA0rUATCZFA=="
|
||||
},
|
||||
"StableNameDotNet": {
|
||||
"type": "Transitive",
|
||||
"resolved": "0.1.0-development.866",
|
||||
"contentHash": "DJb8x4dV3ucDgM12sU28HxCdeqY/JudJbeJG6mgXWDJzpFZw2Jd7JF1pKFRNLzh/0gpo8bCGLQS9gOWZmBjdtg=="
|
||||
},
|
||||
"StyleCop.Analyzers.Unstable": {
|
||||
"type": "Transitive",
|
||||
"resolved": "1.2.0.435",
|
||||
"contentHash": "ouwPWZxbOV3SmCZxIRqHvljkSzkCyi1tDoMzQtDb/bRP8ctASV/iRJr+A2Gdj0QLaLmWnqTWDrH82/iP+X80Lg=="
|
||||
},
|
||||
"System.Collections": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
@@ -202,6 +360,23 @@
|
||||
"System.Runtime": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Collections.Concurrent": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==",
|
||||
"dependencies": {
|
||||
"System.Collections": "4.3.0",
|
||||
"System.Diagnostics.Debug": "4.3.0",
|
||||
"System.Diagnostics.Tracing": "4.3.0",
|
||||
"System.Globalization": "4.3.0",
|
||||
"System.Reflection": "4.3.0",
|
||||
"System.Resources.ResourceManager": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Runtime.Extensions": "4.3.0",
|
||||
"System.Threading": "4.3.0",
|
||||
"System.Threading.Tasks": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Collections.NonGeneric": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
@@ -279,6 +454,28 @@
|
||||
"System.Runtime": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Diagnostics.DiagnosticSource": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==",
|
||||
"dependencies": {
|
||||
"System.Collections": "4.3.0",
|
||||
"System.Diagnostics.Tracing": "4.3.0",
|
||||
"System.Reflection": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Threading": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Diagnostics.Tracing": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0",
|
||||
"Microsoft.NETCore.Targets": "1.1.0",
|
||||
"System.Runtime": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Globalization": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
@@ -289,6 +486,17 @@
|
||||
"System.Runtime": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Globalization.Calendars": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0",
|
||||
"Microsoft.NETCore.Targets": "1.1.0",
|
||||
"System.Globalization": "4.3.0",
|
||||
"System.Runtime": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Globalization.Extensions": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
@@ -314,6 +522,21 @@
|
||||
"System.Threading.Tasks": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.IO.FileSystem": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0",
|
||||
"Microsoft.NETCore.Targets": "1.1.0",
|
||||
"System.IO": "4.3.0",
|
||||
"System.IO.FileSystem.Primitives": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Runtime.Handles": "4.3.0",
|
||||
"System.Text.Encoding": "4.3.0",
|
||||
"System.Threading.Tasks": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.IO.FileSystem.Primitives": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
@@ -334,6 +557,50 @@
|
||||
"System.Runtime.Extensions": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Net.Http": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.4",
|
||||
"contentHash": "aOa2d51SEbmM+H+Csw7yJOuNZoHkrP2XnAurye5HWYgGVVU54YZDvsLUYRv6h18X3sPnjNCANmN7ZhIPiqMcjA==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.1",
|
||||
"System.Collections": "4.3.0",
|
||||
"System.Diagnostics.Debug": "4.3.0",
|
||||
"System.Diagnostics.DiagnosticSource": "4.3.0",
|
||||
"System.Diagnostics.Tracing": "4.3.0",
|
||||
"System.Globalization": "4.3.0",
|
||||
"System.Globalization.Extensions": "4.3.0",
|
||||
"System.IO": "4.3.0",
|
||||
"System.IO.FileSystem": "4.3.0",
|
||||
"System.Net.Primitives": "4.3.0",
|
||||
"System.Resources.ResourceManager": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Runtime.Extensions": "4.3.0",
|
||||
"System.Runtime.Handles": "4.3.0",
|
||||
"System.Runtime.InteropServices": "4.3.0",
|
||||
"System.Security.Cryptography.Algorithms": "4.3.0",
|
||||
"System.Security.Cryptography.Encoding": "4.3.0",
|
||||
"System.Security.Cryptography.OpenSsl": "4.3.0",
|
||||
"System.Security.Cryptography.Primitives": "4.3.0",
|
||||
"System.Security.Cryptography.X509Certificates": "4.3.0",
|
||||
"System.Text.Encoding": "4.3.0",
|
||||
"System.Threading": "4.3.0",
|
||||
"System.Threading.Tasks": "4.3.0",
|
||||
"runtime.native.System": "4.3.0",
|
||||
"runtime.native.System.Net.Http": "4.3.0",
|
||||
"runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2"
|
||||
}
|
||||
},
|
||||
"System.Net.Primitives": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0",
|
||||
"Microsoft.NETCore.Targets": "1.1.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Runtime.Handles": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Reflection": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
@@ -408,6 +675,11 @@
|
||||
"Microsoft.NETCore.Targets": "1.1.0"
|
||||
}
|
||||
},
|
||||
"System.Runtime.CompilerServices.Unsafe": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0",
|
||||
"contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg=="
|
||||
},
|
||||
"System.Runtime.Extensions": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
@@ -441,6 +713,161 @@
|
||||
"System.Runtime.Handles": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Runtime.Numerics": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==",
|
||||
"dependencies": {
|
||||
"System.Globalization": "4.3.0",
|
||||
"System.Resources.ResourceManager": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Runtime.Extensions": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Security.Cryptography.Algorithms": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0",
|
||||
"System.Collections": "4.3.0",
|
||||
"System.IO": "4.3.0",
|
||||
"System.Resources.ResourceManager": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Runtime.Extensions": "4.3.0",
|
||||
"System.Runtime.Handles": "4.3.0",
|
||||
"System.Runtime.InteropServices": "4.3.0",
|
||||
"System.Runtime.Numerics": "4.3.0",
|
||||
"System.Security.Cryptography.Encoding": "4.3.0",
|
||||
"System.Security.Cryptography.Primitives": "4.3.0",
|
||||
"System.Text.Encoding": "4.3.0",
|
||||
"runtime.native.System.Security.Cryptography.Apple": "4.3.0",
|
||||
"runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Security.Cryptography.Cng": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0",
|
||||
"System.IO": "4.3.0",
|
||||
"System.Resources.ResourceManager": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Runtime.Extensions": "4.3.0",
|
||||
"System.Runtime.Handles": "4.3.0",
|
||||
"System.Runtime.InteropServices": "4.3.0",
|
||||
"System.Security.Cryptography.Algorithms": "4.3.0",
|
||||
"System.Security.Cryptography.Encoding": "4.3.0",
|
||||
"System.Security.Cryptography.Primitives": "4.3.0",
|
||||
"System.Text.Encoding": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Security.Cryptography.Csp": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0",
|
||||
"System.IO": "4.3.0",
|
||||
"System.Reflection": "4.3.0",
|
||||
"System.Resources.ResourceManager": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Runtime.Extensions": "4.3.0",
|
||||
"System.Runtime.Handles": "4.3.0",
|
||||
"System.Runtime.InteropServices": "4.3.0",
|
||||
"System.Security.Cryptography.Algorithms": "4.3.0",
|
||||
"System.Security.Cryptography.Encoding": "4.3.0",
|
||||
"System.Security.Cryptography.Primitives": "4.3.0",
|
||||
"System.Text.Encoding": "4.3.0",
|
||||
"System.Threading": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Security.Cryptography.Encoding": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0",
|
||||
"System.Collections": "4.3.0",
|
||||
"System.Collections.Concurrent": "4.3.0",
|
||||
"System.Linq": "4.3.0",
|
||||
"System.Resources.ResourceManager": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Runtime.Extensions": "4.3.0",
|
||||
"System.Runtime.Handles": "4.3.0",
|
||||
"System.Runtime.InteropServices": "4.3.0",
|
||||
"System.Security.Cryptography.Primitives": "4.3.0",
|
||||
"System.Text.Encoding": "4.3.0",
|
||||
"runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Security.Cryptography.OpenSsl": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==",
|
||||
"dependencies": {
|
||||
"System.Collections": "4.3.0",
|
||||
"System.IO": "4.3.0",
|
||||
"System.Resources.ResourceManager": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Runtime.Extensions": "4.3.0",
|
||||
"System.Runtime.Handles": "4.3.0",
|
||||
"System.Runtime.InteropServices": "4.3.0",
|
||||
"System.Runtime.Numerics": "4.3.0",
|
||||
"System.Security.Cryptography.Algorithms": "4.3.0",
|
||||
"System.Security.Cryptography.Encoding": "4.3.0",
|
||||
"System.Security.Cryptography.Primitives": "4.3.0",
|
||||
"System.Text.Encoding": "4.3.0",
|
||||
"runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Security.Cryptography.Primitives": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==",
|
||||
"dependencies": {
|
||||
"System.Diagnostics.Debug": "4.3.0",
|
||||
"System.Globalization": "4.3.0",
|
||||
"System.IO": "4.3.0",
|
||||
"System.Resources.ResourceManager": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Threading": "4.3.0",
|
||||
"System.Threading.Tasks": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Security.Cryptography.X509Certificates": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
"contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==",
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "1.1.0",
|
||||
"System.Collections": "4.3.0",
|
||||
"System.Diagnostics.Debug": "4.3.0",
|
||||
"System.Globalization": "4.3.0",
|
||||
"System.Globalization.Calendars": "4.3.0",
|
||||
"System.IO": "4.3.0",
|
||||
"System.IO.FileSystem": "4.3.0",
|
||||
"System.IO.FileSystem.Primitives": "4.3.0",
|
||||
"System.Resources.ResourceManager": "4.3.0",
|
||||
"System.Runtime": "4.3.0",
|
||||
"System.Runtime.Extensions": "4.3.0",
|
||||
"System.Runtime.Handles": "4.3.0",
|
||||
"System.Runtime.InteropServices": "4.3.0",
|
||||
"System.Runtime.Numerics": "4.3.0",
|
||||
"System.Security.Cryptography.Algorithms": "4.3.0",
|
||||
"System.Security.Cryptography.Cng": "4.3.0",
|
||||
"System.Security.Cryptography.Csp": "4.3.0",
|
||||
"System.Security.Cryptography.Encoding": "4.3.0",
|
||||
"System.Security.Cryptography.OpenSsl": "4.3.0",
|
||||
"System.Security.Cryptography.Primitives": "4.3.0",
|
||||
"System.Text.Encoding": "4.3.0",
|
||||
"System.Threading": "4.3.0",
|
||||
"runtime.native.System": "4.3.0",
|
||||
"runtime.native.System.Net.Http": "4.3.0",
|
||||
"runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Text.Encoding": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
@@ -451,6 +878,23 @@
|
||||
"System.Runtime": "4.3.0"
|
||||
}
|
||||
},
|
||||
"System.Text.Encodings.Web": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.0",
|
||||
"contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==",
|
||||
"dependencies": {
|
||||
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
|
||||
}
|
||||
},
|
||||
"System.Text.Json": {
|
||||
"type": "Transitive",
|
||||
"resolved": "6.0.7",
|
||||
"contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==",
|
||||
"dependencies": {
|
||||
"System.Runtime.CompilerServices.Unsafe": "6.0.0",
|
||||
"System.Text.Encodings.Web": "6.0.0"
|
||||
}
|
||||
},
|
||||
"System.Threading": {
|
||||
"type": "Transitive",
|
||||
"resolved": "4.3.0",
|
||||
@@ -470,15 +914,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.IL2CPP": "6.0.0-be.570"
|
||||
"BepInEx.Unity.IL2CPP": "[6.0.0-be.670, )"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,122 @@
|
||||
#nullable enable
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Reactor.Networking;
|
||||
|
||||
/// <summary>
|
||||
/// Represents a Reactor.Protocol mod.
|
||||
/// </summary>
|
||||
public readonly struct Mod : IEquatable<Mod>
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="Mod"/> struct.
|
||||
/// </summary>
|
||||
/// <param name="id">The id of the mod.</param>
|
||||
/// <param name="version">The version of the mod.</param>
|
||||
/// <param name="flags">The flags of the mod.</param>
|
||||
/// <param name="name">The name of the mod.</param>
|
||||
public Mod(string id, string version, ModFlags flags, string? name = null)
|
||||
{
|
||||
Id = id;
|
||||
Version = version;
|
||||
Flags = flags;
|
||||
Name = name;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the id of the mod.
|
||||
/// </summary>
|
||||
public string Id { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the version of the mod.
|
||||
/// </summary>
|
||||
public string Version { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the flags of the mod.
|
||||
/// </summary>
|
||||
public ModFlags Flags { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the name of the mod.
|
||||
/// </summary>
|
||||
public string? Name { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether the mod is required on all clients.
|
||||
/// </summary>
|
||||
public bool IsRequiredOnAllClients => (Flags & ModFlags.RequireOnAllClients) != 0;
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool Equals(Mod other)
|
||||
{
|
||||
return Id == other.Id && Version == other.Version;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override bool Equals(object? obj)
|
||||
{
|
||||
return obj is Mod other && Equals(other);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public static bool operator ==(Mod left, Mod right)
|
||||
{
|
||||
return left.Equals(right);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public static bool operator !=(Mod left, Mod right)
|
||||
{
|
||||
return !(left == right);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return HashCode.Combine(Id, Version);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{Name ?? Id} ({Version})";
|
||||
}
|
||||
|
||||
internal static bool Validate(IReadOnlyCollection<Mod> clientMods, IReadOnlyCollection<Mod> hostMods, [NotNullWhen(false)] out string? reason)
|
||||
{
|
||||
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())
|
||||
{
|
||||
var message = new StringBuilder();
|
||||
|
||||
if (clientMissing.Any())
|
||||
{
|
||||
message.Append("You are missing: ");
|
||||
message.AppendJoin(", ", clientMissing.Select(x => x.ToString()));
|
||||
message.AppendLine();
|
||||
}
|
||||
|
||||
if (hostMissing.Any())
|
||||
{
|
||||
message.Append("Host is missing: ");
|
||||
message.AppendJoin(", ", hostMissing.Select(x => x.ToString()));
|
||||
message.AppendLine();
|
||||
}
|
||||
|
||||
reason = message.ToString();
|
||||
return false;
|
||||
}
|
||||
|
||||
reason = null;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
using System;
|
||||
|
||||
namespace Reactor.Networking;
|
||||
|
||||
/// <summary>
|
||||
/// Represents flags of the mod.
|
||||
/// </summary>
|
||||
[Flags]
|
||||
public enum ModFlags : ushort
|
||||
{
|
||||
/// <summary>
|
||||
/// No flags.
|
||||
/// </summary>
|
||||
None = 0,
|
||||
|
||||
/// <summary>
|
||||
/// Requires all clients in a lobby to have the mod.
|
||||
/// </summary>
|
||||
RequireOnAllClients = 1 << 0,
|
||||
|
||||
/// <summary>
|
||||
/// Requires the server to have a plugin that handles the mod.
|
||||
/// </summary>
|
||||
RequireOnServer = 1 << 1,
|
||||
|
||||
/// <summary>
|
||||
/// Requires the host of the lobby to have the mod.
|
||||
/// </summary>
|
||||
RequireOnHost = 1 << 2,
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
<Project>
|
||||
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<RootNamespace>Reactor.Networking</RootNamespace>
|
||||
|
||||
<Description>Shared sources for Reactor.Networking (Reactor and Reactor.Impostor)</Description>
|
||||
|
||||
<ContentTargetFolders>contentFiles</ContentTargetFolders>
|
||||
<IsPackable>true</IsPackable>
|
||||
<IncludeBuildOutput>false</IncludeBuildOutput>
|
||||
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
||||
<GenerateTargetFrameworkAttribute>false</GenerateTargetFrameworkAttribute>
|
||||
<NoBuild>true</NoBuild>
|
||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||
<SuppressDependenciesWhenPacking>true</SuppressDependenciesWhenPacking>
|
||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Update="@(Compile)">
|
||||
<Pack>true</Pack>
|
||||
<PackagePath>$(ContentTargetFolders)\cs\any\$(PackageId)\%(RecursiveDir)\</PackagePath>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Remove="@(PackageReference)" />
|
||||
</ItemGroup>
|
||||
|
||||
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
|
||||
|
||||
<Target Name="CopyFilesToOutputDirectory" />
|
||||
</Project>
|
||||
@@ -0,0 +1,12 @@
|
||||
namespace Reactor.Networking;
|
||||
|
||||
/// <summary>
|
||||
/// Represents a GameData flag for Reactor messages.
|
||||
/// </summary>
|
||||
public enum ReactorGameDataFlag : byte
|
||||
{
|
||||
/// <summary>
|
||||
/// KickWithReason GameData message.
|
||||
/// </summary>
|
||||
SetKickReason,
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
namespace Reactor.Networking;
|
||||
|
||||
/// <summary>
|
||||
/// Represents a message flag for Reactor messages.
|
||||
/// </summary>
|
||||
public enum ReactorMessageFlags : byte
|
||||
{
|
||||
/// <summary>
|
||||
/// Handshake message.
|
||||
/// </summary>
|
||||
Handshake,
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
namespace Reactor.Networking;
|
||||
|
||||
/// <summary>
|
||||
/// Version of the Reactor.Networking protocol format.
|
||||
/// </summary>
|
||||
public enum ReactorProtocolVersion : byte
|
||||
{
|
||||
/// <summary>
|
||||
/// First public Reactor Protocol version.
|
||||
/// </summary>
|
||||
V2 = 1,
|
||||
|
||||
/// <summary>
|
||||
/// Version introducing vanilla server support, syncer concept and registries.
|
||||
/// </summary>
|
||||
V3 = 2,
|
||||
|
||||
/// <summary>
|
||||
/// Latest version.
|
||||
/// </summary>
|
||||
Latest = V3,
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"version": 1,
|
||||
"dependencies": {
|
||||
"net6.0": {}
|
||||
}
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
#nullable enable
|
||||
|
||||
using System;
|
||||
|
||||
namespace Reactor.Networking
|
||||
{
|
||||
public class Mod
|
||||
{
|
||||
public Mod(uint netId, string id, string version, PluginSide side)
|
||||
{
|
||||
NetId = netId;
|
||||
Id = id;
|
||||
Version = version;
|
||||
Side = side;
|
||||
}
|
||||
|
||||
public uint NetId { get; }
|
||||
public string Id { get; }
|
||||
public string Version { get; }
|
||||
public PluginSide Side { get; }
|
||||
|
||||
protected bool Equals(Mod other)
|
||||
{
|
||||
return Id == other.Id && Version == other.Version;
|
||||
}
|
||||
|
||||
public override bool Equals(object? obj)
|
||||
{
|
||||
if (ReferenceEquals(null, obj)) return false;
|
||||
if (ReferenceEquals(this, obj)) return true;
|
||||
if (obj.GetType() != GetType()) return false;
|
||||
return Equals((Mod) obj);
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return HashCode.Combine(Id, Version);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
namespace Reactor.Networking
|
||||
{
|
||||
public enum ReactorMessageFlags : byte
|
||||
{
|
||||
Handshake,
|
||||
ModDeclaration,
|
||||
PluginDeclaration
|
||||
}
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
namespace Reactor.Networking
|
||||
{
|
||||
/// <summary>
|
||||
/// Version of the Reactor.Net protocol format.
|
||||
/// </summary>
|
||||
public enum ReactorProtocolVersion : byte
|
||||
{
|
||||
/// <summary>
|
||||
/// Initial version.
|
||||
/// </summary>
|
||||
Initial = 1,
|
||||
|
||||
/// <summary>
|
||||
/// Latest version.
|
||||
/// </summary>
|
||||
Latest = Initial,
|
||||
}
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
namespace Reactor
|
||||
{
|
||||
/// <summary>
|
||||
/// Plugin side used in modded handshake
|
||||
/// </summary>
|
||||
public enum PluginSide : byte
|
||||
{
|
||||
/// <summary>
|
||||
/// Required by both sides, reject connection if missing on the other side
|
||||
/// </summary>
|
||||
Both,
|
||||
|
||||
/// <summary>
|
||||
/// Required only by client
|
||||
/// </summary>
|
||||
ClientOnly
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
<Project>
|
||||
<ItemGroup>
|
||||
<Compile Include="$(MSBuildThisFileDirectory)**\*.cs" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -1,3 +0,0 @@
|
||||
<Project>
|
||||
<Import Project="Reactor.Shared.projitems" Label="Shared" />
|
||||
</Project>
|
||||
@@ -5,7 +5,18 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Reactor.Debugger", "Reactor
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Reactor.Example", "Reactor.Example\Reactor.Example.csproj", "{26A83466-26FE-4383-A35C-B8629902F909}"
|
||||
EndProject
|
||||
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Reactor.Shared", "Reactor.Shared\Reactor.Shared.shproj", "{8C1EEFE9-EF8A-47C4-810E-6D9BA1E7218B}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Reactor.Benchmarks", "Reactor.Benchmarks\Reactor.Benchmarks.csproj", "{99B87307-3AEB-4A6A-BF45-871768308FDD}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Files", "Solution Files", "{4BBF0A80-F6E6-4FDD-ADD0-8CB4F28F88A4}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
AmongUs.props = AmongUs.props
|
||||
Directory.Build.props = Directory.Build.props
|
||||
nuget.config = nuget.config
|
||||
stylecop.json = stylecop.json
|
||||
stylecop.ruleset = stylecop.ruleset
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Reactor.Networking.Shared", "Reactor.Networking.Shared\Reactor.Networking.Shared.csproj", "{1E68CA20-22EB-4E57-B525-81970BE6363D}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
@@ -25,6 +36,14 @@ Global
|
||||
{26A83466-26FE-4383-A35C-B8629902F909}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{26A83466-26FE-4383-A35C-B8629902F909}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{26A83466-26FE-4383-A35C-B8629902F909}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{99B87307-3AEB-4A6A-BF45-871768308FDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{99B87307-3AEB-4A6A-BF45-871768308FDD}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{99B87307-3AEB-4A6A-BF45-871768308FDD}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{99B87307-3AEB-4A6A-BF45-871768308FDD}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{1E68CA20-22EB-4E57-B525-81970BE6363D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{1E68CA20-22EB-4E57-B525-81970BE6363D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{1E68CA20-22EB-4E57-B525-81970BE6363D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{1E68CA20-22EB-4E57-B525-81970BE6363D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(NestedProjects) = preSolution
|
||||
EndGlobalSection
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection.Emit;
|
||||
using BepInEx.IL2CPP;
|
||||
using HarmonyLib;
|
||||
|
||||
namespace Reactor
|
||||
{
|
||||
public static class ChainloaderHooks
|
||||
{
|
||||
public delegate void PluginLoadHandler(BasePlugin plugin);
|
||||
|
||||
public static event PluginLoadHandler? PluginLoad;
|
||||
|
||||
internal static void OnPluginLoad(BasePlugin plugin)
|
||||
{
|
||||
PluginLoad?.Invoke(plugin);
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(IL2CPPChainloader), nameof(IL2CPPChainloader.LoadPlugin))]
|
||||
private static class LoadPluginPatch
|
||||
{
|
||||
public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
|
||||
{
|
||||
return new CodeMatcher(instructions)
|
||||
.MatchForward(false, new CodeMatch(OpCodes.Callvirt, AccessTools.Method(typeof(BasePlugin), nameof(BasePlugin.Load))))
|
||||
.Insert(
|
||||
new CodeInstruction(OpCodes.Dup),
|
||||
new CodeInstruction(OpCodes.Call, AccessTools.Method(typeof(ChainloaderHooks), nameof(OnPluginLoad)))
|
||||
)
|
||||
.InstructionEnumeration();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
// ReSharper disable CheckNamespace
|
||||
|
||||
namespace System.Runtime.CompilerServices;
|
||||
|
||||
/// <summary>
|
||||
/// This attribute is required by the compiler for the "unmanaged" generic type constraint.
|
||||
/// It should be generated automatically, but for whatever reason its not.
|
||||
/// </summary>
|
||||
[Obsolete("Do not use directly.", true)]
|
||||
[AttributeUsage(AttributeTargets.All)]
|
||||
internal sealed class IsUnmanagedAttribute : Attribute
|
||||
{
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Runtime.CompilerServices;
|
||||
using BepInEx.IL2CPP.Utils;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Reactor
|
||||
{
|
||||
public static class Coroutines
|
||||
{
|
||||
[RegisterInIl2Cpp]
|
||||
internal class Component : MonoBehaviour
|
||||
{
|
||||
internal static Component? Instance { get; set; }
|
||||
|
||||
public Component(IntPtr ptr) : base(ptr)
|
||||
{
|
||||
}
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
Instance = this;
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
Instance = null;
|
||||
}
|
||||
}
|
||||
|
||||
private static readonly ConditionalWeakTable<IEnumerator, Coroutine> _ourCoroutineStore = new();
|
||||
|
||||
[return: NotNullIfNotNull("routine")]
|
||||
public static IEnumerator? Start(IEnumerator? routine)
|
||||
{
|
||||
if (routine != null)
|
||||
{
|
||||
_ourCoroutineStore.AddOrUpdate(routine, Component.Instance!.StartCoroutine(routine));
|
||||
}
|
||||
|
||||
return routine;
|
||||
}
|
||||
|
||||
public static void Stop(IEnumerator? enumerator)
|
||||
{
|
||||
if (enumerator != null && _ourCoroutineStore.TryGetValue(enumerator, out var routine))
|
||||
{
|
||||
Component.Instance!.StopCoroutine(routine);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using HarmonyLib;
|
||||
using UnhollowerBaseLib;
|
||||
|
||||
namespace Reactor
|
||||
{
|
||||
public class CustomStringName
|
||||
{
|
||||
private static int _lastId = -1;
|
||||
|
||||
private static readonly List<CustomStringName> _list = new List<CustomStringName>();
|
||||
|
||||
public static IReadOnlyList<CustomStringName> List => _list.AsReadOnly();
|
||||
|
||||
public static CustomStringName Register(string value)
|
||||
{
|
||||
var customStringName = new CustomStringName(_lastId--, value);
|
||||
_list.Add(customStringName);
|
||||
|
||||
return customStringName;
|
||||
}
|
||||
|
||||
public int Id { get; }
|
||||
|
||||
public string Value { get; }
|
||||
|
||||
private CustomStringName(int id, string value)
|
||||
{
|
||||
Id = id;
|
||||
Value = value;
|
||||
}
|
||||
|
||||
public static implicit operator StringNames(CustomStringName name) => (StringNames) name.Id;
|
||||
public static explicit operator CustomStringName?(StringNames name) => List.SingleOrDefault(x => x.Id == (int) name);
|
||||
|
||||
[HarmonyPatch(typeof(TranslationController), nameof(TranslationController.GetString), typeof(StringNames), typeof(Il2CppReferenceArray<Il2CppSystem.Object>))]
|
||||
private static class GetStringPatch
|
||||
{
|
||||
public static bool Prefix(StringNames id, Il2CppReferenceArray<Il2CppSystem.Object> parts, ref string __result)
|
||||
{
|
||||
var customStringName = (CustomStringName?) id;
|
||||
|
||||
if (customStringName != null)
|
||||
{
|
||||
__result = string.Format(customStringName.Value, parts);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,123 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Threading.Tasks;
|
||||
using HarmonyLib;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Events;
|
||||
using UnityEngine.Networking;
|
||||
using UnityEngine.SceneManagement;
|
||||
using Il2CppType = UnhollowerRuntimeLib.Il2CppType;
|
||||
|
||||
namespace Reactor.Extensions
|
||||
{
|
||||
/// <summary>
|
||||
/// General utilities
|
||||
/// </summary>
|
||||
public static class Extensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Adds a delegate to get one notification when a scene has loaded.
|
||||
/// </summary>
|
||||
public static void once_sceneLoaded(Action<Scene, LoadSceneMode> value)
|
||||
{
|
||||
UnityAction<Scene, LoadSceneMode>? unityAction = null;
|
||||
|
||||
unityAction = (Action<Scene, LoadSceneMode>) ((scene, loadMode) =>
|
||||
{
|
||||
SceneManager.remove_sceneLoaded(unityAction);
|
||||
value.Invoke(scene, loadMode);
|
||||
});
|
||||
|
||||
SceneManager.add_sceneLoaded(unityAction);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns random <typeparamref name="T"/> from <paramref name="input"/>
|
||||
/// </summary>
|
||||
public static T? Random<T>(this IEnumerable<T> input)
|
||||
{
|
||||
var list = input as IList<T> ?? input.ToList();
|
||||
return list.Count == 0 ? default : list[UnityEngine.Random.Range(0, list.Count)];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the color as a hexadecimal string in the format "RRGGBBAA".
|
||||
/// </summary>
|
||||
/// <param name="color">The color to be converted.</param>
|
||||
/// <returns>Hexadecimal string representing the color.</returns>
|
||||
/// <remarks>https://docs.unity3d.com/ScriptReference/ColorUtility.ToHtmlStringRGBA.html</remarks>
|
||||
public static string ToHtmlStringRGBA(this Color32 color)
|
||||
{
|
||||
return $"{color.r:X2}{color.g:X2}{color.b:X2}{color.a:X2}";
|
||||
}
|
||||
|
||||
/// <inheritdoc cref="ToHtmlStringRGBA(UnityEngine.Color32)"/>
|
||||
public static string ToHtmlStringRGBA(this Color color)
|
||||
{
|
||||
return ((Color32) color).ToHtmlStringRGBA();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fully read <paramref name="input"/> stream, can be used as workaround for il2cpp streams.
|
||||
/// </summary>
|
||||
public static byte[] ReadFully(this Stream input)
|
||||
{
|
||||
using (var ms = new MemoryStream())
|
||||
{
|
||||
input.CopyTo(ms);
|
||||
return ms.ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sends <see cref="UnityWebRequest"/> and return task that finishes on <paramref name="request"/> completion.
|
||||
/// </summary>
|
||||
public static Task SendAsync(this UnityWebRequest request)
|
||||
{
|
||||
var task = new TaskCompletionSource<object?>();
|
||||
|
||||
request.Send().m_completeCallback = (Action<AsyncOperation>) (_ =>
|
||||
{
|
||||
task.SetResult(null);
|
||||
});
|
||||
|
||||
return task.Task;
|
||||
}
|
||||
|
||||
private static readonly int _outline = Shader.PropertyToID("_Outline");
|
||||
private static readonly int _outlineColor = Shader.PropertyToID("_OutlineColor");
|
||||
private static readonly int _addColor = Shader.PropertyToID("_AddColor");
|
||||
|
||||
/// <summary>
|
||||
/// Sets color outline for renderers using default Among Us shader
|
||||
/// </summary>
|
||||
public static void SetOutline(this Renderer renderer, Color? color)
|
||||
{
|
||||
renderer.material.SetFloat(_outline, color.HasValue ? 1 : 0);
|
||||
|
||||
if (color.HasValue)
|
||||
{
|
||||
renderer.material.SetColor(_outlineColor, color.Value);
|
||||
renderer.material.SetColor(_addColor, color.Value);
|
||||
}
|
||||
}
|
||||
|
||||
public static IEnumerable<MethodBase> GetMethods(this Type type, BindingFlags bindingAttr, Type returnType, params Type[] parameterTypes)
|
||||
{
|
||||
return type.GetMethods(bindingAttr).Where(x => x.ReturnType == returnType && x.GetParameters().Select(x => x.ParameterType).SequenceEqual(parameterTypes));
|
||||
}
|
||||
|
||||
public static IEnumerable<MethodBase> GetMethods(this Type type, Type returnType, params Type[] parameterTypes)
|
||||
{
|
||||
return type.GetMethods(AccessTools.all, returnType, parameterTypes);
|
||||
}
|
||||
|
||||
public static T? LoadAsset<T>(this AssetBundle assetBundle, string name) where T : UnityEngine.Object
|
||||
{
|
||||
return assetBundle.LoadAsset(name, Il2CppType.Of<T>())?.Cast<T>();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
using System;
|
||||
using Hazel;
|
||||
using Hazel.Udp;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Reactor.Extensions
|
||||
{
|
||||
public static class ExtraMessageExtensions
|
||||
{
|
||||
private const float MIN = -50f;
|
||||
private const float MAX = 50f;
|
||||
|
||||
private static float ReverseLerp(float t)
|
||||
{
|
||||
return Mathf.Clamp((t - MIN) / (MAX - MIN), 0f, 1f);
|
||||
}
|
||||
|
||||
public static void Write(this MessageWriter writer, Vector2 value)
|
||||
{
|
||||
var x = (ushort) (ReverseLerp(value.x) * ushort.MaxValue);
|
||||
var y = (ushort) (ReverseLerp(value.y) * ushort.MaxValue);
|
||||
|
||||
writer.Write(x);
|
||||
writer.Write(y);
|
||||
}
|
||||
|
||||
public static Vector2 ReadVector2(this MessageReader reader)
|
||||
{
|
||||
var x = reader.ReadUInt16() / (float) ushort.MaxValue;
|
||||
var y = reader.ReadUInt16() / (float) ushort.MaxValue;
|
||||
|
||||
return new Vector2(Mathf.Lerp(MIN, MAX, x), Mathf.Lerp(MIN, MAX, y));
|
||||
}
|
||||
|
||||
public static void Send(this UdpConnection connection, MessageWriter msg, Action ackCallback)
|
||||
{
|
||||
if (msg.SendOption != SendOption.Reliable)
|
||||
throw new InvalidOperationException("Message SendOption has to be Reliable.");
|
||||
|
||||
var buffer = new byte[msg.Length];
|
||||
Buffer.BlockCopy(msg.Buffer, 0, buffer, 0, msg.Length);
|
||||
|
||||
connection.ResetKeepAliveTimer();
|
||||
|
||||
connection.AttachReliableID(buffer, 1, ackCallback);
|
||||
connection.WriteBytesToConnection(buffer, buffer.Length);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,149 +0,0 @@
|
||||
using System;
|
||||
using UnhollowerBaseLib;
|
||||
using UnityEngine;
|
||||
using UnityEngine.EventSystems;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace Reactor.Extensions
|
||||
{
|
||||
/// <summary>
|
||||
/// GUI utilities
|
||||
/// </summary>
|
||||
public static class GUIExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Shortcut for empty texture
|
||||
/// </summary>
|
||||
public static Texture2D CreateEmptyTexture(int width = 0, int height = 0)
|
||||
{
|
||||
return new Texture2D(width, height, TextureFormat.RGBA32, Texture.GenerateAllMips, false, IntPtr.Zero);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Clamp Rect to screen size
|
||||
/// </summary>
|
||||
public static Rect ClampScreen(this Rect rect)
|
||||
{
|
||||
rect.x = Mathf.Clamp(rect.x, 0, Screen.width - rect.width);
|
||||
rect.y = Mathf.Clamp(rect.y, 0, Screen.height - rect.height);
|
||||
|
||||
return rect;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reset Rect size
|
||||
/// </summary>
|
||||
public static Rect ResetSize(this Rect rect)
|
||||
{
|
||||
rect.width = rect.height = 0;
|
||||
|
||||
return rect;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create <see cref="Sprite"/> from <paramref name="tex"/>
|
||||
/// </summary>
|
||||
public static Sprite CreateSprite(this Texture2D tex)
|
||||
{
|
||||
return Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f), 100f);
|
||||
}
|
||||
|
||||
public static DefaultControls.Resources StandardResources { get; internal set; } = null!;
|
||||
|
||||
public static GameObject CreateCanvas()
|
||||
{
|
||||
var gameObject = new GameObject("Canvas");
|
||||
var canvas = gameObject.AddComponent<Canvas>();
|
||||
canvas.renderMode = RenderMode.ScreenSpaceOverlay;
|
||||
|
||||
var canvasScaler = gameObject.AddComponent<CanvasScaler>();
|
||||
|
||||
canvasScaler.screenMatchMode = CanvasScaler.ScreenMatchMode.Expand;
|
||||
canvasScaler.referencePixelsPerUnit = 100f;
|
||||
|
||||
gameObject.AddComponent<GraphicRaycaster>();
|
||||
|
||||
return gameObject;
|
||||
}
|
||||
|
||||
public static GameObject CreateEventSystem()
|
||||
{
|
||||
var gameObject = new GameObject("EventSystem");
|
||||
gameObject.AddComponent<EventSystem>();
|
||||
gameObject.AddComponent<StandaloneInputModule>();
|
||||
gameObject.AddComponent<BaseInput>();
|
||||
|
||||
return gameObject;
|
||||
}
|
||||
|
||||
public static void SetSize(this RectTransform rectTransform, float width, float height)
|
||||
{
|
||||
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, width);
|
||||
rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, height);
|
||||
}
|
||||
}
|
||||
|
||||
public class Window
|
||||
{
|
||||
private static int _lastWindowId;
|
||||
|
||||
public static int NextWindowId()
|
||||
{
|
||||
return _lastWindowId++;
|
||||
}
|
||||
|
||||
public int Id { get; set; } = NextWindowId();
|
||||
|
||||
public bool Enabled { get; set; } = true;
|
||||
public Rect Rect { get; set; }
|
||||
public Action<int> Func { get; set; }
|
||||
public string Title { get; set; }
|
||||
|
||||
public Window(Rect rect, string title, Action<int> func)
|
||||
{
|
||||
Rect = rect;
|
||||
Title = title;
|
||||
Func = func;
|
||||
}
|
||||
|
||||
public Window(Rect rect, string title, Action func) : this(rect, title, id => func())
|
||||
{
|
||||
}
|
||||
|
||||
public void OnGUI()
|
||||
{
|
||||
if (Enabled)
|
||||
{
|
||||
if (Event.current.type == EventType.Layout)
|
||||
{
|
||||
Rect = Rect.ResetSize();
|
||||
}
|
||||
|
||||
Rect = GUILayout.Window(Id, Rect, Func, Title);
|
||||
|
||||
if ((Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1)) && Rect.Contains(new Vector2(Input.mousePosition.x, Screen.height - Input.mousePosition.y)))
|
||||
{
|
||||
Input.ResetInputAxes();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class DragWindow : Window
|
||||
{
|
||||
public DragWindow(Rect rect, string title, Action<int> func) : base(rect, title, func)
|
||||
{
|
||||
Func = id =>
|
||||
{
|
||||
func(id);
|
||||
|
||||
GUI.DragWindow(new Rect(0, 0, 10000, 20));
|
||||
Rect = Rect.ClampScreen();
|
||||
};
|
||||
}
|
||||
|
||||
public DragWindow(Rect rect, string title, Action func) : this(rect, title, id => func())
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Reactor.Extensions;
|
||||
|
||||
public static class RandomExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Returns random <typeparamref name="T"/> from <paramref name="input"/> using <paramref name="random"/>
|
||||
/// </summary>
|
||||
public static T? Random<T>(this IEnumerable<T> input, Random random)
|
||||
{
|
||||
var list = input as IList<T> ?? input.ToList();
|
||||
return list.Count == 0 ? default : list[random.Next(0, list.Count)];
|
||||
}
|
||||
|
||||
/// <summary>Returns a random double that is within a specified range.</summary>
|
||||
public static double NextDouble(this Random random, double minValue, double maxValue)
|
||||
{
|
||||
return random.NextDouble() * (maxValue - minValue) + minValue;
|
||||
}
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace Reactor.Extensions
|
||||
{
|
||||
public static class UnityObjectExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Stops <paramref name="obj"/> from being destroyed
|
||||
/// </summary>
|
||||
/// <param name="obj">Object to stop from being destroyed</param>
|
||||
/// <returns>Passed <paramref name="obj"/></returns>
|
||||
public static T DontDestroy<T>(this T obj) where T : Object
|
||||
{
|
||||
obj.hideFlags |= HideFlags.HideAndDontSave;
|
||||
|
||||
return obj.DontDestroyOnLoad();
|
||||
}
|
||||
|
||||
public static T DontUnload<T>(this T obj) where T : Object
|
||||
{
|
||||
obj.hideFlags |= HideFlags.DontUnloadUnusedAsset;
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
public static T DontDestroyOnLoad<T>(this T obj) where T : Object
|
||||
{
|
||||
Object.DontDestroyOnLoad(obj);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
public static void Destroy(this Object obj)
|
||||
{
|
||||
Object.Destroy(obj);
|
||||
}
|
||||
|
||||
public static void DestroyImmediate(this Object obj)
|
||||
{
|
||||
Object.DestroyImmediate(obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using Il2CppSystem.Runtime.CompilerServices;
|
||||
|
||||
namespace Reactor
|
||||
{
|
||||
public sealed class Il2CppEqualityComparer<T> : IEqualityComparer<T> where T : Il2CppSystem.Object
|
||||
{
|
||||
private static Il2CppEqualityComparer<T>? _instance;
|
||||
|
||||
public static Il2CppEqualityComparer<T> Instance
|
||||
{
|
||||
get
|
||||
{
|
||||
_instance ??= new Il2CppEqualityComparer<T>();
|
||||
return _instance;
|
||||
}
|
||||
}
|
||||
|
||||
private Il2CppEqualityComparer()
|
||||
{
|
||||
}
|
||||
|
||||
public int GetHashCode(T value)
|
||||
{
|
||||
return RuntimeHelpers.GetHashCode(value);
|
||||
}
|
||||
|
||||
public bool Equals(T? left, T? right)
|
||||
{
|
||||
if (left == null || right == null)
|
||||
{
|
||||
return left == null && right == null;
|
||||
}
|
||||
|
||||
return left.Equals(right);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
// https://stackoverflow.com/questions/64749385/predefined-type-system-runtime-compilerservices-isexternalinit-is-not-defined?noredirect=1&lq=1
|
||||
// IsExternalInit is not included with netstandard2.1 even tho it could
|
||||
|
||||
// ReSharper disable CheckNamespace
|
||||
|
||||
namespace System.Runtime.CompilerServices
|
||||
{
|
||||
public static class IsExternalInit
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
using System;
|
||||
using System.Globalization;
|
||||
|
||||
namespace Reactor.Localization.Extensions;
|
||||
|
||||
/// <summary>
|
||||
/// Provides extension methods for <see cref="SupportedLangs"/>.
|
||||
/// </summary>
|
||||
public static class SupportedLangsExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets a <see cref="CultureInfo"/> from the specified <paramref name="language"/>.
|
||||
/// </summary>
|
||||
/// <param name="language">The <see cref="SupportedLangs"/>.</param>
|
||||
/// <returns>a <see cref="CultureInfo"/>.</returns>
|
||||
public static CultureInfo ToCultureInfo(this SupportedLangs language)
|
||||
{
|
||||
return language switch
|
||||
{
|
||||
SupportedLangs.English => CultureInfo.GetCultureInfo("en"),
|
||||
SupportedLangs.Latam => CultureInfo.GetCultureInfo("es"),
|
||||
SupportedLangs.Brazilian => CultureInfo.GetCultureInfo("pt-BR"),
|
||||
SupportedLangs.Portuguese => CultureInfo.GetCultureInfo("pt"),
|
||||
SupportedLangs.Korean => CultureInfo.GetCultureInfo("ko"),
|
||||
SupportedLangs.Russian => CultureInfo.GetCultureInfo("ru"),
|
||||
SupportedLangs.Dutch => CultureInfo.GetCultureInfo("nl"),
|
||||
SupportedLangs.Filipino => CultureInfo.GetCultureInfo("fil"),
|
||||
SupportedLangs.French => CultureInfo.GetCultureInfo("fr"),
|
||||
SupportedLangs.German => CultureInfo.GetCultureInfo("de"),
|
||||
SupportedLangs.Italian => CultureInfo.GetCultureInfo("it"),
|
||||
SupportedLangs.Japanese => CultureInfo.GetCultureInfo("ja"),
|
||||
SupportedLangs.Spanish => CultureInfo.GetCultureInfo("es"),
|
||||
SupportedLangs.SChinese => CultureInfo.GetCultureInfo("zh-Hans"),
|
||||
SupportedLangs.TChinese => CultureInfo.GetCultureInfo("zh-Hant"),
|
||||
SupportedLangs.Irish => CultureInfo.GetCultureInfo("ga"),
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(language), language, null),
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
using System.Collections.Generic;
|
||||
using Il2CppInterop.Runtime.InteropTypes.Arrays;
|
||||
|
||||
namespace Reactor.Localization;
|
||||
|
||||
/// <summary>
|
||||
/// Handles custom <see cref="StringNames"/> localization.
|
||||
/// </summary>
|
||||
public static class LocalizationManager
|
||||
{
|
||||
private static readonly List<LocalizationProvider> _providers = new();
|
||||
|
||||
/// <summary>
|
||||
/// Gets registered <see cref="LocalizationProvider"/>s.
|
||||
/// </summary>
|
||||
public static IReadOnlyList<LocalizationProvider> Providers { get; } = _providers.AsReadOnly();
|
||||
|
||||
/// <summary>
|
||||
/// Registers a new <see cref="LocalizationProvider"/> to be used for obtaining translations.
|
||||
/// </summary>
|
||||
/// <param name="provider">A <see cref="LocalizationProvider"/> instance.</param>
|
||||
public static void Register(LocalizationProvider provider)
|
||||
{
|
||||
if (!_providers.Contains(provider))
|
||||
{
|
||||
_providers.Add(provider);
|
||||
|
||||
if (TranslationController.InstanceExists)
|
||||
{
|
||||
provider.SetLanguage(TranslationController.Instance.currentLanguage.languageID);
|
||||
}
|
||||
|
||||
_providers.Sort((a, b) => b.Priority - a.Priority);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Unregisters a <see cref="LocalizationProvider"/>.
|
||||
/// </summary>
|
||||
/// <param name="provider">The <see cref="LocalizationProvider"/> to unregister.</param>
|
||||
public static void Unregister(LocalizationProvider provider)
|
||||
{
|
||||
_providers.Remove(provider);
|
||||
}
|
||||
|
||||
internal static bool TryGetTextFormatted(StringNames stringName, Il2CppReferenceArray<Il2CppSystem.Object> parts, out string text)
|
||||
{
|
||||
foreach (var provider in _providers)
|
||||
{
|
||||
if (provider.TryGetTextFormatted(stringName, parts, out text!))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
text = string.Empty;
|
||||
return false;
|
||||
}
|
||||
|
||||
internal static bool TryGetText(StringNames stringName, out string text)
|
||||
{
|
||||
foreach (var provider in _providers)
|
||||
{
|
||||
if (provider.TryGetText(stringName, out text!))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
text = string.Empty;
|
||||
return false;
|
||||
}
|
||||
|
||||
internal static bool TryGetStringName(SystemTypes systemType, out StringNames stringName)
|
||||
{
|
||||
foreach (var provider in _providers)
|
||||
{
|
||||
if (provider.TryGetStringName(systemType, out var stringNameNullable))
|
||||
{
|
||||
stringName = stringNameNullable!.Value;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
stringName = default;
|
||||
return false;
|
||||
}
|
||||
|
||||
internal static bool TryGetStringName(TaskTypes taskTypes, out StringNames stringName)
|
||||
{
|
||||
foreach (var provider in _providers)
|
||||
{
|
||||
if (provider.TryGetStringName(taskTypes, out var stringNameNullable))
|
||||
{
|
||||
stringName = stringNameNullable!.Value;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
stringName = default;
|
||||
return false;
|
||||
}
|
||||
|
||||
internal static void OnLanguageChanged(SupportedLangs newLanguage)
|
||||
{
|
||||
foreach (var provider in _providers)
|
||||
{
|
||||
provider.SetLanguage(newLanguage);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
using Il2CppInterop.Runtime.InteropTypes.Arrays;
|
||||
using Reactor.Utilities;
|
||||
|
||||
namespace Reactor.Localization;
|
||||
|
||||
/// <summary>
|
||||
/// The required implementation of a localization provider class.
|
||||
/// </summary>
|
||||
public abstract class LocalizationProvider
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the current language Among Us is set to.
|
||||
/// <br/>
|
||||
/// If used from <see cref="OnLanguageChanged"/>, this property will return the old language, not the new one.
|
||||
/// </summary>
|
||||
public SupportedLangs? CurrentLanguage { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the priority of this <see cref="LocalizationProvider"/>.
|
||||
/// The higher the priority is, the earlier it will be invoked in relation to other providers.
|
||||
/// <br/>
|
||||
/// You can use the <see cref="ReactorPriority"/> class for this value if you want to make this easier.
|
||||
/// </summary>
|
||||
public virtual int Priority => 0;
|
||||
|
||||
/// <summary>
|
||||
/// Returns the localized text for the given <see cref="StringNames"/>.
|
||||
/// </summary>
|
||||
/// <param name="stringName">The <see cref="StringNames"/> to localize.</param>
|
||||
/// <param name="result">The <see cref="string"/> representation of the given <see cref="StringNames"/>.</param>
|
||||
/// <returns>Whether or not this <see cref="LocalizationProvider"/> can handle this <see cref="StringNames"/>.</returns>
|
||||
public virtual bool TryGetText(StringNames stringName, out string? result)
|
||||
{
|
||||
result = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the localized text for the given <see cref="StringNames"/>.
|
||||
/// </summary>
|
||||
/// <param name="stringName">The <see cref="StringNames"/> to localize.</param>
|
||||
/// <param name="parts">The arguments used for formatting.</param>
|
||||
/// <param name="result">The <see cref="string"/> representation of the given <see cref="StringNames"/>.</param>
|
||||
/// <returns>Whether or not this <see cref="LocalizationProvider"/> can handle this <see cref="StringNames"/>.</returns>
|
||||
public virtual bool TryGetTextFormatted(StringNames stringName, Il2CppReferenceArray<Il2CppSystem.Object> parts, out string? result)
|
||||
{
|
||||
if (!TryGetText(stringName, out result)) return false;
|
||||
|
||||
result = Il2CppSystem.String.Format(result, parts);
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the <see cref="StringNames"/> equivalent for the given <see cref="SystemTypes"/>.
|
||||
/// </summary>
|
||||
/// <param name="systemType">The <see cref="SystemTypes"/> value.</param>
|
||||
/// <param name="result">The <see cref="string"/> representation of the given <see cref="StringNames"/>.</param>
|
||||
/// <returns>Whether or not this <see cref="LocalizationProvider"/> can handle this <see cref="StringNames"/>.</returns>
|
||||
public virtual bool TryGetStringName(SystemTypes systemType, out StringNames? result)
|
||||
{
|
||||
result = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the <see cref="StringNames"/> equivalent for the given <see cref="TaskTypes"/>.
|
||||
/// </summary>
|
||||
/// <param name="taskType">The <see cref="TaskTypes"/> value.</param>
|
||||
/// <param name="result">The <see cref="string"/> representation of the given <see cref="StringNames"/>.</param>
|
||||
/// <returns>Whether or not this <see cref="LocalizationProvider"/> can handle this <see cref="StringNames"/>.</returns>
|
||||
public virtual bool TryGetStringName(TaskTypes taskType, out StringNames? result)
|
||||
{
|
||||
result = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This method is called when the Among Us language is changed by the user.
|
||||
/// </summary>
|
||||
/// <param name="newLanguage">The new language that Among Us has been set to.</param>
|
||||
public virtual void OnLanguageChanged(SupportedLangs newLanguage)
|
||||
{
|
||||
}
|
||||
|
||||
internal void SetLanguage(SupportedLangs newLanguage)
|
||||
{
|
||||
OnLanguageChanged(newLanguage);
|
||||
CurrentLanguage = newLanguage;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
using HarmonyLib;
|
||||
using Il2CppInterop.Runtime.InteropTypes.Arrays;
|
||||
|
||||
namespace Reactor.Localization.Patches;
|
||||
|
||||
[HarmonyPatch]
|
||||
internal static class GetStringPatch
|
||||
{
|
||||
[HarmonyPatch(typeof(TranslationController), nameof(TranslationController.GetString), typeof(StringNames), typeof(Il2CppReferenceArray<Il2CppSystem.Object>))]
|
||||
[HarmonyPatch(typeof(TranslationController), nameof(TranslationController.GetStringWithDefault), typeof(StringNames), typeof(string), typeof(Il2CppReferenceArray<Il2CppSystem.Object>))]
|
||||
[HarmonyPrefix]
|
||||
public static bool StringNamesPatch(StringNames id, Il2CppReferenceArray<Il2CppSystem.Object> parts, out string __result)
|
||||
{
|
||||
if (LocalizationManager.TryGetTextFormatted(id, parts, out __result))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(TranslationController), nameof(TranslationController.GetString), typeof(SystemTypes))]
|
||||
[HarmonyPrefix]
|
||||
public static bool SystemTypesStringPatch(TranslationController __instance, SystemTypes room, ref string __result)
|
||||
{
|
||||
if (LocalizationManager.TryGetStringName(room, out var stringName))
|
||||
{
|
||||
if (LocalizationManager.TryGetText(stringName, out var text))
|
||||
{
|
||||
__result = text;
|
||||
return false;
|
||||
}
|
||||
|
||||
__result = __instance.GetString(stringName);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(TranslationController), nameof(TranslationController.GetSystemName))]
|
||||
[HarmonyPrefix]
|
||||
public static bool SystemTypesStringNamesPatch(SystemTypes room, ref StringNames __result)
|
||||
{
|
||||
if (LocalizationManager.TryGetStringName(room, out var stringName))
|
||||
{
|
||||
__result = stringName;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(TranslationController), nameof(TranslationController.GetString), typeof(TaskTypes))]
|
||||
[HarmonyPrefix]
|
||||
public static bool TaskTypesStringPatch(TranslationController __instance, TaskTypes task, ref string __result)
|
||||
{
|
||||
if (LocalizationManager.TryGetStringName(task, out var stringName))
|
||||
{
|
||||
if (LocalizationManager.TryGetText(stringName, out var text))
|
||||
{
|
||||
__result = text;
|
||||
return false;
|
||||
}
|
||||
|
||||
__result = __instance.GetString(stringName);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(TranslationController), nameof(TranslationController.GetTaskName))]
|
||||
[HarmonyPrefix]
|
||||
public static bool TaskTypesStringNamesPatch(TaskTypes task, ref StringNames __result)
|
||||
{
|
||||
if (LocalizationManager.TryGetStringName(task, out var stringName))
|
||||
{
|
||||
__result = stringName;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
using HarmonyLib;
|
||||
|
||||
namespace Reactor.Localization.Patches;
|
||||
|
||||
[HarmonyPatch]
|
||||
internal static class LanguageChangedPatch
|
||||
{
|
||||
[HarmonyPatch(typeof(TranslationController), nameof(TranslationController.Initialize))]
|
||||
[HarmonyPostfix]
|
||||
public static void Initialize(TranslationController __instance)
|
||||
{
|
||||
if (TranslationController.Instance.GetInstanceID() == __instance.GetInstanceID())
|
||||
LocalizationManager.OnLanguageChanged(__instance.currentLanguage.languageID);
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(TranslationController), nameof(TranslationController.SetLanguage))]
|
||||
[HarmonyPostfix]
|
||||
public static void SetLanguage(TranslationController __instance)
|
||||
{
|
||||
LocalizationManager.OnLanguageChanged(__instance.currentLanguage.languageID);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
using System.Collections.Generic;
|
||||
using Reactor.Utilities;
|
||||
|
||||
namespace Reactor.Localization.Providers;
|
||||
|
||||
/// <summary>
|
||||
/// Utility for adding hard-coded localization.
|
||||
/// </summary>
|
||||
public sealed class HardCodedLocalizationProvider : LocalizationProvider
|
||||
{
|
||||
private static readonly Dictionary<StringNames, string> _strings = new();
|
||||
|
||||
/// <summary>
|
||||
/// Adds a custom, hard-coded translation for a <see cref="StringNames"/>.
|
||||
/// </summary>
|
||||
/// <param name="stringName">The <see cref="StringNames"/>.</param>
|
||||
/// <param name="value">The text.</param>
|
||||
public static void Register(StringNames stringName, string value)
|
||||
{
|
||||
if (_strings.ContainsKey(stringName))
|
||||
{
|
||||
Warning($"Registering StringName {stringName} that already exists");
|
||||
}
|
||||
|
||||
_strings[stringName] = value;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override int Priority => ReactorPriority.Low;
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override bool TryGetText(StringNames stringName, out string? result)
|
||||
{
|
||||
return _strings.TryGetValue(stringName, out result);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
using Reactor.Localization.Providers;
|
||||
|
||||
namespace Reactor.Localization.Utilities;
|
||||
|
||||
/// <summary>
|
||||
/// Provides a way to use custom static <see cref="StringNames"/>.
|
||||
/// </summary>
|
||||
public static class CustomStringName
|
||||
{
|
||||
private static int _lastId = int.MinValue + 1;
|
||||
|
||||
/// <summary>
|
||||
/// Creates an returns a unique <see cref="StringNames"/> value.
|
||||
/// </summary>
|
||||
/// <returns>A unique <see cref="StringNames"/>.</returns>
|
||||
public static StringNames Create()
|
||||
{
|
||||
var id = _lastId++;
|
||||
return (StringNames) id;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates, registeres and returns a unique <see cref="StringNames"/> value.
|
||||
/// </summary>
|
||||
/// <param name="text">The text.</param>
|
||||
/// <returns>A unique <see cref="StringNames"/>.</returns>
|
||||
public static StringNames CreateAndRegister(string text)
|
||||
{
|
||||
var stringName = Create();
|
||||
HardCodedLocalizationProvider.Register(stringName, text);
|
||||
return stringName;
|
||||
}
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
using BepInEx.IL2CPP;
|
||||
using BepInEx.Logging;
|
||||
|
||||
namespace Reactor
|
||||
{
|
||||
public static class Logger<T> where T : BasePlugin
|
||||
{
|
||||
public static ManualLogSource Instance => PluginSingleton<T>.Instance.Log;
|
||||
|
||||
/// <inheritdoc cref="ManualLogSource.LogFatal"/>
|
||||
public static void Fatal(object data) => Instance.LogFatal(data);
|
||||
|
||||
/// <inheritdoc cref="ManualLogSource.LogError"/>
|
||||
public static void Error(object data) => Instance.LogError(data);
|
||||
|
||||
/// <inheritdoc cref="ManualLogSource.LogWarning"/>
|
||||
public static void Warning(object data) => Instance.LogWarning(data);
|
||||
|
||||
/// <inheritdoc cref="ManualLogSource.LogMessage"/>
|
||||
public static void Message(object data) => Instance.LogMessage(data);
|
||||
|
||||
/// <inheritdoc cref="ManualLogSource.LogInfo"/>
|
||||
public static void Info(object data) => Instance.LogInfo(data);
|
||||
|
||||
/// <inheritdoc cref="ManualLogSource.LogDebug"/>
|
||||
public static void Debug(object data) => Instance.LogDebug(data);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using BepInEx.Unity.IL2CPP;
|
||||
using HarmonyLib;
|
||||
using Reactor.Networking.Serialization;
|
||||
|
||||
namespace Reactor.Networking.Attributes;
|
||||
|
||||
/// <summary>
|
||||
/// Automatically registers a <see cref="MessageConverter{T}"/>.
|
||||
/// </summary>
|
||||
[AttributeUsage(AttributeTargets.Class)]
|
||||
public sealed class MessageConverterAttribute : Attribute
|
||||
{
|
||||
private static readonly HashSet<Assembly> _registeredAssemblies = new();
|
||||
|
||||
/// <summary>
|
||||
/// Registers all <see cref="MessageConverter{T}"/>s annotated with <see cref="MessageConverterAttribute"/> in the specified <paramref name="assembly"/>.
|
||||
/// </summary>
|
||||
/// <remarks>This is called automatically on plugin assemblies so you probably don't need to call this.</remarks>
|
||||
/// <param name="assembly">The assembly to search.</param>
|
||||
public static void Register(Assembly assembly)
|
||||
{
|
||||
if (_registeredAssemblies.Contains(assembly)) return;
|
||||
_registeredAssemblies.Add(assembly);
|
||||
|
||||
foreach (var type in assembly.GetTypes())
|
||||
{
|
||||
var attribute = type.GetCustomAttribute<MessageConverterAttribute>();
|
||||
|
||||
if (attribute != null)
|
||||
{
|
||||
if (!type.IsSubclassOf(typeof(UnsafeMessageConverter)))
|
||||
{
|
||||
throw new InvalidOperationException($"Type {type.FullDescription()} has {nameof(MessageConverterAttribute)} but doesn't extend {nameof(UnsafeMessageConverter)}.");
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var messageConverter = (UnsafeMessageConverter) Activator.CreateInstance(type)!;
|
||||
MessageSerializer.Register(messageConverter);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Warning($"Failed to register {type.FullDescription()}: {e}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal static void Initialize()
|
||||
{
|
||||
IL2CPPChainloader.Instance.PluginLoad += (_, assembly, _) => Register(assembly);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using BepInEx.Unity.IL2CPP;
|
||||
using HarmonyLib;
|
||||
using Hazel;
|
||||
using Reactor.Networking.Rpc;
|
||||
using Reactor.Utilities;
|
||||
|
||||
namespace Reactor.Networking.Attributes;
|
||||
|
||||
/// <summary>
|
||||
/// Automatically registers a method rpc.
|
||||
/// </summary>
|
||||
[AttributeUsage(AttributeTargets.Method)]
|
||||
public sealed class MethodRpcAttribute : Attribute
|
||||
{
|
||||
private static readonly HashSet<Assembly> _registeredAssemblies = new();
|
||||
|
||||
/// <summary>
|
||||
/// Gets the id of the rpc.
|
||||
/// </summary>
|
||||
public uint Id { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the send option of the rpc.
|
||||
/// </summary>
|
||||
public SendOption SendOption { get; set; } = SendOption.Reliable;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the local handling of the rpc.
|
||||
/// </summary>
|
||||
public RpcLocalHandling LocalHandling { get; set; } = RpcLocalHandling.Before;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether the rpc should be sent immediately.
|
||||
/// </summary>
|
||||
public bool SendImmediately { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="MethodRpcAttribute"/> class.
|
||||
/// </summary>
|
||||
/// <param name="id">The id of the rpc.</param>
|
||||
public MethodRpcAttribute(uint id)
|
||||
{
|
||||
Id = id;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Registers all method rpc's annotated with <see cref="MethodRpcAttribute"/> in the specified <paramref name="assembly"/>.
|
||||
/// </summary>
|
||||
/// <remarks>This is called automatically on plugin assemblies so you probably don't need to call this.</remarks>
|
||||
/// <param name="assembly">The assembly to search.</param>
|
||||
/// <param name="plugin">The plugin to register the rpc to.</param>
|
||||
public static void Register(Assembly assembly, BasePlugin plugin)
|
||||
{
|
||||
if (_registeredAssemblies.Contains(assembly)) return;
|
||||
_registeredAssemblies.Add(assembly);
|
||||
|
||||
var methods = assembly.GetTypes()
|
||||
.SelectMany(t => t.GetMethods(BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public));
|
||||
|
||||
foreach (var method in methods)
|
||||
{
|
||||
var attribute = method.GetCustomAttribute<MethodRpcAttribute>();
|
||||
if (attribute == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var customRpc = new MethodRpc(plugin, method, attribute.Id, attribute.SendOption, attribute.LocalHandling, attribute.SendImmediately);
|
||||
PluginSingleton<ReactorPlugin>.Instance.CustomRpcManager.Register(customRpc);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Warning($"Failed to register {method.FullDescription()}: {e}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal static void Initialize()
|
||||
{
|
||||
IL2CPPChainloader.Instance.PluginLoad += (_, assembly, plugin) => Register(assembly, plugin);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
|
||||
namespace Reactor.Networking.Attributes;
|
||||
|
||||
/// <summary>
|
||||
/// Describes the <see cref="ModFlags"/> of the annotated plugin class.
|
||||
/// </summary>
|
||||
[AttributeUsage(AttributeTargets.Class)]
|
||||
public sealed class ReactorModFlagsAttribute : Attribute
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets flags of the mod.
|
||||
/// </summary>
|
||||
public ModFlags Flags { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="ReactorModFlagsAttribute"/> class.
|
||||
/// </summary>
|
||||
/// <param name="flags">Flags of the mod.</param>
|
||||
public ReactorModFlagsAttribute(ModFlags flags)
|
||||
{
|
||||
Flags = flags;
|
||||
}
|
||||
|
||||
internal static ModFlags GetModFlags(Type type)
|
||||
{
|
||||
var attribute = type.GetCustomAttribute<ReactorModFlagsAttribute>();
|
||||
if (attribute != null)
|
||||
{
|
||||
return attribute.Flags;
|
||||
}
|
||||
|
||||
var metadataAttribute = type.Assembly.GetCustomAttributes<AssemblyMetadataAttribute>().SingleOrDefault(x => x.Key == "Reactor.ModFlags");
|
||||
if (metadataAttribute is { Value: not null })
|
||||
{
|
||||
return Enum.Parse<ModFlags>(metadataAttribute.Value);
|
||||
}
|
||||
|
||||
return ModFlags.None;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using BepInEx.Unity.IL2CPP;
|
||||
using HarmonyLib;
|
||||
using Reactor.Networking.Rpc;
|
||||
using Reactor.Utilities;
|
||||
|
||||
namespace Reactor.Networking.Attributes;
|
||||
|
||||
/// <summary>
|
||||
/// Automatically registers a rpc.
|
||||
/// </summary>
|
||||
[AttributeUsage(AttributeTargets.Class)]
|
||||
public sealed class RegisterCustomRpcAttribute : Attribute
|
||||
{
|
||||
private static readonly HashSet<Assembly> _registeredAssemblies = new();
|
||||
|
||||
/// <summary>
|
||||
/// Gets the id of the rpc.
|
||||
/// </summary>
|
||||
public uint Id { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="RegisterCustomRpcAttribute"/> class.
|
||||
/// </summary>
|
||||
/// <param name="id">The id of the rpc.</param>
|
||||
public RegisterCustomRpcAttribute(uint id)
|
||||
{
|
||||
Id = id;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Registers all rpc's annotated with <see cref="RegisterCustomRpcAttribute"/> in the specified <paramref name="assembly"/>.
|
||||
/// </summary>
|
||||
/// <remarks>This is called automatically on plugin assemblies so you probably don't need to call this.</remarks>
|
||||
/// <param name="assembly">The assembly to search.</param>
|
||||
/// <param name="plugin">The plugin to register the rpc to.</param>
|
||||
public static void Register(Assembly assembly, BasePlugin plugin)
|
||||
{
|
||||
if (_registeredAssemblies.Contains(assembly)) return;
|
||||
_registeredAssemblies.Add(assembly);
|
||||
|
||||
foreach (var type in assembly.GetTypes())
|
||||
{
|
||||
var attribute = type.GetCustomAttribute<RegisterCustomRpcAttribute>();
|
||||
|
||||
if (attribute != null)
|
||||
{
|
||||
if (!type.IsSubclassOf(typeof(UnsafeCustomRpc)))
|
||||
{
|
||||
throw new InvalidOperationException($"Type {type.FullDescription()} has {nameof(RegisterCustomRpcAttribute)} but doesn't extend {nameof(UnsafeCustomRpc)}.");
|
||||
}
|
||||
|
||||
var customRpc = (UnsafeCustomRpc) Activator.CreateInstance(type, plugin, attribute.Id)!;
|
||||
PluginSingleton<ReactorPlugin>.Instance.CustomRpcManager.Register(customRpc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal static void Initialize()
|
||||
{
|
||||
IL2CPPChainloader.Instance.PluginLoad += (_, assembly, plugin) => Register(assembly, plugin);
|
||||
}
|
||||
}
|
||||
@@ -1,82 +0,0 @@
|
||||
using System;
|
||||
using BepInEx.IL2CPP;
|
||||
using Hazel;
|
||||
using InnerNet;
|
||||
|
||||
namespace Reactor.Networking
|
||||
{
|
||||
public abstract class CustomRpc<TPlugin, TInnerNetObject, TData> : UnsafeCustomRpc where TPlugin : BasePlugin where TInnerNetObject : InnerNetObject
|
||||
{
|
||||
protected CustomRpc(TPlugin plugin, uint id) : base(plugin, id)
|
||||
{
|
||||
}
|
||||
|
||||
public TPlugin Plugin => (TPlugin) UnsafePlugin;
|
||||
public override Type InnerNetObjectType => typeof(TInnerNetObject);
|
||||
|
||||
public abstract void Write(MessageWriter writer, TData? data);
|
||||
public abstract TData Read(MessageReader reader);
|
||||
public abstract void Handle(TInnerNetObject innerNetObject, TData? data);
|
||||
|
||||
public override void UnsafeWrite(MessageWriter writer, object? data)
|
||||
{
|
||||
Write(writer, (TData?) data);
|
||||
}
|
||||
|
||||
public override object? UnsafeRead(MessageReader reader)
|
||||
{
|
||||
return Read(reader);
|
||||
}
|
||||
|
||||
public override void UnsafeHandle(InnerNetObject innerNetObject, object? data)
|
||||
{
|
||||
Handle((TInnerNetObject) innerNetObject, (TData?) data);
|
||||
}
|
||||
|
||||
public void Send(InnerNetObject netObject, TData data, bool immediately = false)
|
||||
{
|
||||
UnsafeSend(netObject, data, immediately);
|
||||
}
|
||||
|
||||
public void SendTo(InnerNetObject netObject, int targetId, TData data)
|
||||
{
|
||||
UnsafeSend(netObject, data, true, targetId);
|
||||
}
|
||||
}
|
||||
|
||||
public abstract class CustomRpc<TPlugin, TInnerNetObject> : UnsafeCustomRpc where TPlugin : BasePlugin where TInnerNetObject : InnerNetObject
|
||||
{
|
||||
protected CustomRpc(TPlugin plugin, uint id) : base(plugin, id)
|
||||
{
|
||||
}
|
||||
|
||||
public TPlugin Plugin => (TPlugin) UnsafePlugin;
|
||||
public override Type InnerNetObjectType => typeof(TInnerNetObject);
|
||||
|
||||
public abstract void Handle(TInnerNetObject innerNetObject);
|
||||
|
||||
public override void UnsafeWrite(MessageWriter writer, object? data)
|
||||
{
|
||||
}
|
||||
|
||||
public override object? UnsafeRead(MessageReader reader)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public override void UnsafeHandle(InnerNetObject innerNetObject, object? data)
|
||||
{
|
||||
Handle((TInnerNetObject) innerNetObject);
|
||||
}
|
||||
|
||||
public void Send(InnerNetObject netObject, bool immediately = false)
|
||||
{
|
||||
UnsafeSend(netObject, immediately);
|
||||
}
|
||||
|
||||
public void SendTo(InnerNetObject netObject, int targetId)
|
||||
{
|
||||
UnsafeSend(netObject, null, true, targetId);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,118 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using HarmonyLib;
|
||||
using Hazel;
|
||||
using InnerNet;
|
||||
|
||||
namespace Reactor.Networking
|
||||
{
|
||||
public enum RpcLocalHandling
|
||||
{
|
||||
None,
|
||||
Before,
|
||||
After
|
||||
}
|
||||
|
||||
public class CustomRpcManager
|
||||
{
|
||||
public const byte CallId = byte.MaxValue;
|
||||
|
||||
private readonly List<UnsafeCustomRpc> _list = new List<UnsafeCustomRpc>();
|
||||
private readonly Dictionary<Type, List<UnsafeCustomRpc>> _map = new Dictionary<Type, List<UnsafeCustomRpc>>();
|
||||
|
||||
public IReadOnlyList<UnsafeCustomRpc> List => _list.AsReadOnly();
|
||||
|
||||
public ILookup<Type, UnsafeCustomRpc> Map =>
|
||||
_map.SelectMany(pair => pair.Value, (pair, value) => new { pair.Key, Value = value })
|
||||
.ToLookup(pair => pair.Key, pair => pair.Value);
|
||||
|
||||
public CustomRpcManager()
|
||||
{
|
||||
foreach (var type in HandleRpcPatch.InnerNetObjectTypes)
|
||||
{
|
||||
_map[type] = new List<UnsafeCustomRpc>();
|
||||
}
|
||||
}
|
||||
|
||||
public UnsafeCustomRpc Register(UnsafeCustomRpc customRpc)
|
||||
{
|
||||
if (_list.Any(x => x.UnsafePlugin == customRpc.UnsafePlugin && x.Id == customRpc.Id))
|
||||
{
|
||||
throw new ArgumentException("Rpc with that id was already registered");
|
||||
}
|
||||
|
||||
customRpc.Manager = this;
|
||||
_list.Add(customRpc);
|
||||
_map[customRpc.InnerNetObjectType].Add(customRpc);
|
||||
|
||||
if (customRpc.IsSingleton)
|
||||
{
|
||||
typeof(Rpc<>).MakeGenericType(customRpc.GetType()).GetProperty("Instance")!.SetValue(null, customRpc);
|
||||
}
|
||||
|
||||
return customRpc;
|
||||
}
|
||||
|
||||
[HarmonyPatch]
|
||||
private static class HandleRpcPatch
|
||||
{
|
||||
internal static List<Type> InnerNetObjectTypes { get; } = typeof(InnerNetObject).Assembly.GetTypes().Where(x => x.IsSubclassOf(typeof(InnerNetObject)) && x != typeof(LobbyBehaviour)).ToList();
|
||||
|
||||
public static IEnumerable<MethodBase> TargetMethods()
|
||||
{
|
||||
return InnerNetObjectTypes.Select(x => x.GetMethod(nameof(InnerNetObject.HandleRpc), AccessTools.all));
|
||||
}
|
||||
|
||||
public static bool Prefix(InnerNetObject __instance, [HarmonyArgument(0)] byte callId, [HarmonyArgument(1)] MessageReader reader)
|
||||
{
|
||||
if (callId == CallId)
|
||||
{
|
||||
var manager = PluginSingleton<ReactorPlugin>.Instance.CustomRpcManager;
|
||||
var customRpcs = manager.Map[__instance.GetType()];
|
||||
|
||||
var pluginNetId = reader.ReadPackedUInt32();
|
||||
var id = reader.ReadPackedUInt32();
|
||||
|
||||
var pluginId = ModList.GetByNetId(pluginNetId).Id;
|
||||
var customRpc = customRpcs.Single(x => x.PluginId == pluginId && x.Id == id);
|
||||
|
||||
customRpc.UnsafeHandle(__instance, customRpc.UnsafeRead(reader.ReadMessage()));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class Rpc<T> where T : UnsafeCustomRpc
|
||||
{
|
||||
private static T? _instance;
|
||||
|
||||
public static T Instance
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_instance == null)
|
||||
{
|
||||
throw new Exception($"{typeof(T).FullName} isn't registered");
|
||||
}
|
||||
|
||||
return _instance;
|
||||
}
|
||||
|
||||
internal set
|
||||
{
|
||||
if (_instance != null)
|
||||
{
|
||||
throw new Exception($"{typeof(T).FullName} is already registered");
|
||||
}
|
||||
|
||||
_instance = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
using Hazel;
|
||||
using InnerNet;
|
||||
|
||||
namespace Reactor.Networking.Extensions;
|
||||
|
||||
/// <summary>
|
||||
/// Provides extension methods for <see cref="InnerNetClient"/>.
|
||||
/// </summary>
|
||||
public static class ClientExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Kicks a client with id equal to <paramref name="targetClientId"/> with a <paramref name="reason"/>.
|
||||
/// </summary>
|
||||
/// <param name="innerNetClient">The <see cref="InnerNetClient"/> to send the message from.</param>
|
||||
/// <param name="targetClientId">The target client's id.</param>
|
||||
/// <param name="reason">The kick reason.</param>
|
||||
internal static void KickWithReason(this InnerNetClient innerNetClient, int targetClientId, string reason)
|
||||
{
|
||||
var writer = MessageWriter.Get(SendOption.Reliable);
|
||||
writer.StartMessage(Tags.GameDataTo);
|
||||
writer.Write(innerNetClient.GameId);
|
||||
writer.WritePacked(targetClientId);
|
||||
{
|
||||
writer.StartMessage(byte.MaxValue);
|
||||
writer.Write((byte) ReactorGameDataFlag.SetKickReason);
|
||||
writer.Write(reason);
|
||||
writer.EndMessage();
|
||||
}
|
||||
writer.EndMessage();
|
||||
innerNetClient.SendOrDisconnect(writer);
|
||||
writer.Recycle();
|
||||
|
||||
innerNetClient.KickPlayer(targetClientId, false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Disconnects a local <see cref="InnerNetClient"/> with a custom reason.
|
||||
/// </summary>
|
||||
/// <param name="innerNetClient">The <see cref="InnerNetClient"/> to disconnect.</param>
|
||||
/// <param name="reason">The custom reason to disconnect with.</param>
|
||||
public static void DisconnectWithReason(this InnerNetClient innerNetClient, string reason)
|
||||
{
|
||||
innerNetClient.LastCustomDisconnect = reason;
|
||||
innerNetClient.HandleDisconnect(innerNetClient.LastDisconnectReason = DisconnectReasons.Custom, reason);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
using System;
|
||||
using Hazel;
|
||||
using Hazel.Udp;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Reactor.Networking.Extensions;
|
||||
|
||||
/// <summary>
|
||||
/// Provides extension methods for <see cref="MessageWriter"/> and <see cref="MessageReader"/>.
|
||||
/// </summary>
|
||||
public static class ExtraMessageExtensions
|
||||
{
|
||||
private const float MIN = -50f;
|
||||
private const float MAX = 50f;
|
||||
|
||||
private static float ReverseLerp(float t)
|
||||
{
|
||||
return Mathf.Clamp((t - MIN) / (MAX - MIN), 0f, 1f);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a <see cref="Vector2"/> to the <paramref name="writer"/>.
|
||||
/// </summary>
|
||||
/// <param name="writer">The <see cref="MessageWriter"/> to write to.</param>
|
||||
/// <param name="value">The <see cref="Vector2"/> to write.</param>
|
||||
public static void Write(this MessageWriter writer, Vector2 value)
|
||||
{
|
||||
var x = (ushort) (ReverseLerp(value.x) * ushort.MaxValue);
|
||||
var y = (ushort) (ReverseLerp(value.y) * ushort.MaxValue);
|
||||
|
||||
writer.Write(x);
|
||||
writer.Write(y);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reads a <see cref="Vector2"/> from the <paramref name="reader"/>.
|
||||
/// </summary>
|
||||
/// <param name="reader">The <see cref="MessageReader"/> to read from.</param>
|
||||
/// <returns>A <see cref="Vector2"/> from the <paramref name="reader"/>.</returns>
|
||||
public static Vector2 ReadVector2(this MessageReader reader)
|
||||
{
|
||||
var x = reader.ReadUInt16() / (float) ushort.MaxValue;
|
||||
var y = reader.ReadUInt16() / (float) ushort.MaxValue;
|
||||
|
||||
return new Vector2(Mathf.Lerp(MIN, MAX, x), Mathf.Lerp(MIN, MAX, y));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sends a message on the <paramref name="connection"/> with an <paramref name="ackCallback"/>.
|
||||
/// </summary>
|
||||
/// <param name="connection">The connection to send the message on.</param>
|
||||
/// <param name="msg">The message to send.</param>
|
||||
/// <param name="ackCallback">The callback to invoke when this packet is acknowledged.</param>
|
||||
public static void Send(this UdpConnection connection, MessageWriter msg, Action ackCallback)
|
||||
{
|
||||
if (msg.SendOption != SendOption.Reliable)
|
||||
throw new InvalidOperationException("Message SendOption has to be Reliable.");
|
||||
|
||||
var buffer = new byte[msg.Length];
|
||||
Buffer.BlockCopy(msg.Buffer, 0, buffer, 0, msg.Length);
|
||||
|
||||
connection.ResetKeepAliveTimer();
|
||||
|
||||
connection.AttachReliableID(buffer, 1, ackCallback);
|
||||
connection.WriteBytesToConnection(buffer, buffer.Length);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
using System.Collections.Generic;
|
||||
using Hazel;
|
||||
|
||||
namespace Reactor.Networking.Messages;
|
||||
|
||||
internal static class ModdedHandshakeC2S
|
||||
{
|
||||
public static void Serialize(MessageWriter writer, IReadOnlyCollection<Mod> mods)
|
||||
{
|
||||
writer.WritePacked(mods.Count);
|
||||
foreach (var mod in mods)
|
||||
{
|
||||
writer.Write(mod.Id);
|
||||
writer.Write(mod.Version);
|
||||
writer.Write((ushort) mod.Flags);
|
||||
if (mod.IsRequiredOnAllClients) writer.Write(mod.Name);
|
||||
}
|
||||
}
|
||||
|
||||
public static void Deserialize(MessageReader reader, out Mod[] mods)
|
||||
{
|
||||
var modCount = reader.ReadPackedInt32();
|
||||
mods = new Mod[modCount];
|
||||
|
||||
for (var i = 0; i < modCount; i++)
|
||||
{
|
||||
var id = reader.ReadString();
|
||||
var version = reader.ReadString();
|
||||
var flags = (ModFlags) reader.ReadUInt16();
|
||||
var name = (flags & ModFlags.RequireOnAllClients) != 0 ? reader.ReadString() : null;
|
||||
|
||||
mods[i] = new Mod(id, version, flags, name);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
using Hazel;
|
||||
|
||||
namespace Reactor.Networking.Messages;
|
||||
|
||||
internal static class ModdedHandshakeS2C
|
||||
{
|
||||
public static void Serialize(MessageWriter writer, string serverName, string serverVersion, int pluginCount)
|
||||
{
|
||||
writer.Write(serverName);
|
||||
writer.Write(serverVersion);
|
||||
writer.WritePacked(pluginCount);
|
||||
}
|
||||
|
||||
public static void Deserialize(MessageReader reader, out string serverName, out string serverVersion, out int pluginCount)
|
||||
{
|
||||
serverName = reader.ReadString();
|
||||
serverVersion = reader.ReadString();
|
||||
pluginCount = reader.ReadPackedInt32();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
using Hazel;
|
||||
|
||||
namespace Reactor.Networking.Messages;
|
||||
|
||||
internal static class ReactorHeader
|
||||
{
|
||||
private const ulong MAGIC = 0x72656163746f72; // "reactor" in ascii, 7 bytes
|
||||
|
||||
public static int Size => sizeof(ulong);
|
||||
|
||||
public static void Read(MessageReader reader, out ulong magic, out byte version)
|
||||
{
|
||||
var value = reader.ReadUInt64();
|
||||
magic = value >> 8;
|
||||
version = (byte) (value & 0xFF);
|
||||
}
|
||||
|
||||
public static bool Read(MessageReader reader)
|
||||
{
|
||||
Read(reader, out var magic, out var version);
|
||||
return magic == MAGIC && version == (int) ReactorProtocolVersion.Latest;
|
||||
}
|
||||
|
||||
public static void Write(MessageWriter writer)
|
||||
{
|
||||
var version = (byte) ReactorProtocolVersion.Latest;
|
||||
var value = (MAGIC << 8) | version;
|
||||
writer.Write(value);
|
||||
}
|
||||
}
|
||||
@@ -1,213 +0,0 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Reflection.Emit;
|
||||
using System.Runtime.InteropServices;
|
||||
using BepInEx.IL2CPP;
|
||||
using HarmonyLib;
|
||||
using Hazel;
|
||||
using InnerNet;
|
||||
using MonoMod.RuntimeDetour;
|
||||
using MonoMod.Utils;
|
||||
using Reactor.Networking.Serialization;
|
||||
|
||||
namespace Reactor.Networking.MethodRpc
|
||||
{
|
||||
public class MethodRpc : UnsafeCustomRpc
|
||||
{
|
||||
public delegate object HandleDelegate(InnerNetObject innerNetObject, object[] args);
|
||||
|
||||
public MethodRpc(BasePlugin plugin, MethodInfo method, uint id, SendOption option, RpcLocalHandling localHandling, bool sendImmediately) : base(plugin, id)
|
||||
{
|
||||
Method = method;
|
||||
LocalHandling = localHandling;
|
||||
SendOption = option;
|
||||
SendImmediately = sendImmediately;
|
||||
|
||||
if (!method.IsStatic)
|
||||
{
|
||||
throw new NotImplementedException("Instance method rpc support is postponed until unhollower v0.5.0");
|
||||
}
|
||||
|
||||
var parameters = method.GetParameters();
|
||||
|
||||
if (method.IsStatic && parameters.Length == 0)
|
||||
{
|
||||
throw new ArgumentException("Static method rpc requires at least one argument", nameof(method));
|
||||
}
|
||||
|
||||
var innerNetObjectType = parameters.First().ParameterType;
|
||||
|
||||
if (!typeof(InnerNetObject).IsAssignableFrom(innerNetObjectType))
|
||||
{
|
||||
throw new ArgumentException("First argument of a static method rpc has to be an InnerNetObject", nameof(method));
|
||||
}
|
||||
|
||||
InnerNetObjectType = innerNetObjectType;
|
||||
|
||||
Handle = Hook(method, parameters);
|
||||
}
|
||||
|
||||
public MethodInfo Method { get; }
|
||||
public HandleDelegate Handle { get; }
|
||||
|
||||
protected internal override bool IsSingleton => false;
|
||||
|
||||
public override Type InnerNetObjectType { get; }
|
||||
public override RpcLocalHandling LocalHandling { get; }
|
||||
public override SendOption SendOption { get; }
|
||||
public bool SendImmediately { get; }
|
||||
|
||||
public override void UnsafeWrite(MessageWriter writer, object? data)
|
||||
{
|
||||
var args = (object[]) data!;
|
||||
MessageSerializer.Serialize(writer, args);
|
||||
}
|
||||
|
||||
public override object UnsafeRead(MessageReader reader)
|
||||
{
|
||||
var args = MessageSerializer.Deserialize(reader, this);
|
||||
return args;
|
||||
}
|
||||
|
||||
public override void UnsafeHandle(InnerNetObject innerNetObject, object? data)
|
||||
{
|
||||
var args = (object[]) data!;
|
||||
var result = Handle(innerNetObject, args);
|
||||
|
||||
if (result is IEnumerator enumerator)
|
||||
{
|
||||
Coroutines.Start(enumerator);
|
||||
}
|
||||
}
|
||||
|
||||
public void Send(InnerNetObject innerNetObject, object[] args)
|
||||
{
|
||||
UnsafeSend(innerNetObject, args, SendImmediately);
|
||||
}
|
||||
|
||||
private static readonly MethodInfo _sendMethod = AccessTools.Method(typeof(MethodRpc), nameof(Send));
|
||||
|
||||
/// <summary>
|
||||
/// Hooks the <paramref name="method"/> rpc with a dynamic method that sends it
|
||||
/// </summary>
|
||||
private HandleDelegate Hook(MethodInfo method, ParameterInfo[] parameters)
|
||||
{
|
||||
var detour = new Detour(method, GenerateSender());
|
||||
|
||||
// Used as target when hooking, sends the method rpc
|
||||
DynamicMethod GenerateSender()
|
||||
{
|
||||
var dynamicMethod = new DynamicMethod($"Sender<{method.GetID(simple: true)}>", method.ReturnType, parameters.Select(x => x.ParameterType).ToArray());
|
||||
|
||||
foreach (var parameter in parameters)
|
||||
{
|
||||
dynamicMethod.DefineParameter(parameter.Position, ParameterAttributes.None, parameter.Name);
|
||||
}
|
||||
|
||||
var il = dynamicMethod.GetILGenerator();
|
||||
|
||||
// :yeefuckinhaw:
|
||||
// Black magic from stackoverflow, they also said that you shouldn't do that ;)
|
||||
// Resort to Dictionary<MethodInfo, MethodRpc> if this turns out to be unreliable
|
||||
{
|
||||
var handle = GCHandle.Alloc(this);
|
||||
var ptr = GCHandle.ToIntPtr(handle);
|
||||
|
||||
if (IntPtr.Size == 4)
|
||||
{
|
||||
il.Emit(OpCodes.Ldc_I4, ptr.ToInt32());
|
||||
}
|
||||
else
|
||||
{
|
||||
il.Emit(OpCodes.Ldc_I8, ptr.ToInt64());
|
||||
}
|
||||
|
||||
il.Emit(OpCodes.Conv_I);
|
||||
|
||||
// TODO Figure out why this always throws NullReferenceException on mono
|
||||
// il.Emit(OpCodes.Ldobj, typeof(MethodRpc));
|
||||
|
||||
// Workaround for ^, speed seems to be the same
|
||||
il.Emit(OpCodes.Call, AccessTools.Method(typeof(GCHandle), nameof(GCHandle.FromIntPtr)));
|
||||
var temp = il.DeclareLocal(typeof(GCHandle));
|
||||
il.Emit(OpCodes.Stloc, temp);
|
||||
il.Emit(OpCodes.Ldloca, temp);
|
||||
il.Emit(OpCodes.Call, AccessTools.PropertyGetter(typeof(GCHandle), nameof(GCHandle.Target)));
|
||||
}
|
||||
|
||||
il.Emit(OpCodes.Ldarg_0);
|
||||
|
||||
il.Emit(OpCodes.Ldc_I4, parameters.Length - 1);
|
||||
il.Emit(OpCodes.Newarr, typeof(object));
|
||||
|
||||
for (var i = 1; i < parameters.Length; i++)
|
||||
{
|
||||
var parameter = parameters[i];
|
||||
|
||||
il.Emit(OpCodes.Dup);
|
||||
il.Emit(OpCodes.Ldc_I4, i - 1);
|
||||
il.Emit(OpCodes.Ldarg, i);
|
||||
|
||||
var parameterType = parameter.ParameterType;
|
||||
if (parameterType.IsValueType)
|
||||
{
|
||||
il.Emit(OpCodes.Box, parameterType);
|
||||
}
|
||||
|
||||
il.Emit(OpCodes.Stelem_Ref);
|
||||
}
|
||||
|
||||
il.Emit(OpCodes.Call, _sendMethod);
|
||||
|
||||
if (method.ReturnType != typeof(void))
|
||||
{
|
||||
il.Emit(OpCodes.Ldnull);
|
||||
}
|
||||
|
||||
il.Emit(OpCodes.Ret);
|
||||
|
||||
return dynamicMethod;
|
||||
}
|
||||
|
||||
// Proxy translating object array to trampoline method args, used by MethodRpc to invoke original handling
|
||||
HandleDelegate GenerateHandler(DynamicMethod trampoline)
|
||||
{
|
||||
var dynamicMethod = new DynamicMethod($"Handler<{method.GetID(simple: true)}>", typeof(object), new[] { typeof(InnerNetObject), typeof(object[]) });
|
||||
dynamicMethod.DefineParameter(0, ParameterAttributes.None, "innerNetObject");
|
||||
dynamicMethod.DefineParameter(1, ParameterAttributes.None, "args");
|
||||
|
||||
var il = dynamicMethod.GetILGenerator();
|
||||
|
||||
il.Emit(OpCodes.Ldarg_0);
|
||||
il.Emit(OpCodes.Castclass, InnerNetObjectType);
|
||||
|
||||
for (var i = 1; i < parameters.Length; i++)
|
||||
{
|
||||
var parameter = parameters[i];
|
||||
|
||||
il.Emit(OpCodes.Ldarg_1);
|
||||
il.Emit(OpCodes.Ldc_I4, i - 1);
|
||||
il.Emit(OpCodes.Ldelem_Ref);
|
||||
|
||||
var parameterType = parameter.ParameterType;
|
||||
il.Emit(parameterType.IsValueType ? OpCodes.Unbox_Any : OpCodes.Castclass, parameterType);
|
||||
}
|
||||
|
||||
il.Emit(OpCodes.Call, trampoline);
|
||||
|
||||
if (method.ReturnType == typeof(void))
|
||||
{
|
||||
il.Emit(OpCodes.Ldnull);
|
||||
}
|
||||
|
||||
il.Emit(OpCodes.Ret);
|
||||
|
||||
return dynamicMethod.CreateDelegate<HandleDelegate>();
|
||||
}
|
||||
|
||||
return GenerateHandler((DynamicMethod) detour.GenerateTrampoline());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using BepInEx.IL2CPP;
|
||||
using HarmonyLib;
|
||||
using Hazel;
|
||||
|
||||
namespace Reactor.Networking.MethodRpc
|
||||
{
|
||||
[AttributeUsage(AttributeTargets.Method)]
|
||||
public class MethodRpcAttribute : Attribute
|
||||
{
|
||||
public uint Id { get; }
|
||||
public SendOption Option { get; set; } = SendOption.Reliable;
|
||||
public RpcLocalHandling LocalHandling { get; set; } = RpcLocalHandling.Before;
|
||||
public bool SendImmediately { get; set; }
|
||||
|
||||
public MethodRpcAttribute(uint id)
|
||||
{
|
||||
Id = id;
|
||||
}
|
||||
|
||||
public static void Register(Assembly assembly, BasePlugin plugin)
|
||||
{
|
||||
var methods = assembly.GetTypes()
|
||||
.SelectMany(t => t.GetMethods(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public));
|
||||
|
||||
foreach (var method in methods)
|
||||
{
|
||||
var attribute = method.GetCustomAttribute<MethodRpcAttribute>();
|
||||
if (attribute == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var customRpc = new MethodRpc(plugin, method, attribute.Id, attribute.Option, attribute.LocalHandling, attribute.SendImmediately);
|
||||
PluginSingleton<ReactorPlugin>.Instance.CustomRpcManager.Register(customRpc);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Logger<ReactorPlugin>.Warning($"Failed to register {method.FullDescription()}: {e}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal static void Initialize()
|
||||
{
|
||||
ChainloaderHooks.PluginLoad += plugin => Register(plugin.GetType().Assembly, plugin);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
using Hazel;
|
||||
|
||||
namespace Reactor.Networking
|
||||
{
|
||||
public static class ModDeclaration
|
||||
{
|
||||
public static void Serialize(MessageWriter writer, Mod mod)
|
||||
{
|
||||
writer.StartMessage(byte.MaxValue);
|
||||
writer.Write((byte) ReactorMessageFlags.ModDeclaration);
|
||||
writer.WritePacked(mod.NetId);
|
||||
writer.Write(mod.Id);
|
||||
writer.Write(mod.Version);
|
||||
writer.Write((byte) mod.Side);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,42 +1,158 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using BepInEx.IL2CPP;
|
||||
using System.Text;
|
||||
using BepInEx;
|
||||
using BepInEx.Unity.IL2CPP;
|
||||
using Hazel;
|
||||
using Reactor.Networking.Attributes;
|
||||
using Reactor.Networking.Patches;
|
||||
|
||||
namespace Reactor.Networking
|
||||
namespace Reactor.Networking;
|
||||
|
||||
/// <summary>
|
||||
/// Represents currently loaded mods.
|
||||
/// </summary>
|
||||
public static class ModList
|
||||
{
|
||||
public static class ModList
|
||||
/// <summary>
|
||||
/// Gets current mods.
|
||||
/// </summary>
|
||||
public static IReadOnlyCollection<Mod> Current { get; private set; } = null!;
|
||||
|
||||
private static readonly Dictionary<string, Mod> _modById = new();
|
||||
private static readonly Dictionary<Type, Mod> _modByPluginType = new();
|
||||
|
||||
/// <summary>
|
||||
/// Gets a mod by it's id.
|
||||
/// </summary>
|
||||
/// <param name="id">The id of the mod.</param>
|
||||
/// <returns>The mod with the specified <paramref name="id"/>.</returns>
|
||||
public static Mod GetById(string id)
|
||||
{
|
||||
private static Dictionary<string, Mod>? _mapById;
|
||||
private static Dictionary<uint, Mod>? _mapByNetId;
|
||||
return _modById[id];
|
||||
}
|
||||
|
||||
public static ISet<Mod>? Current { get; private set; }
|
||||
internal static Mod GetByPluginType(Type pluginType)
|
||||
{
|
||||
return _modByPluginType[pluginType];
|
||||
}
|
||||
|
||||
public static Mod GetById(string id)
|
||||
internal static bool IsAnyModIsRequiredOnAllClients { get; private set; }
|
||||
|
||||
private static readonly Dictionary<uint, Mod> _modByNetId = new();
|
||||
private static readonly Dictionary<Mod, uint> _netIdByMod = new();
|
||||
|
||||
internal static Mod GetByNetId(uint netId)
|
||||
{
|
||||
return _modByNetId[netId];
|
||||
}
|
||||
|
||||
internal static uint GetNetId(this Mod mod)
|
||||
{
|
||||
if (!mod.IsRequiredOnAllClients) throw new ArgumentException("Cannot get a net id for a mod without RequireOnAllClients flag", nameof(mod));
|
||||
return _netIdByMod[mod];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reads a <see cref="Mod"/> reference from the <paramref name="reader"/>.
|
||||
/// </summary>
|
||||
/// <param name="reader">The <see cref="MessageReader"/> to read from.</param>
|
||||
/// <returns>A <see cref="Mod"/> from the <paramref name="reader"/>.</returns>
|
||||
/// <remarks>This will try to read by net id and fallback to a regular id otherwise.</remarks>
|
||||
public static Mod ReadMod(this MessageReader reader)
|
||||
{
|
||||
var netId = reader.ReadPackedUInt32();
|
||||
if (netId > 0)
|
||||
{
|
||||
return _mapById![id];
|
||||
return GetByNetId(netId);
|
||||
}
|
||||
|
||||
public static Mod GetByNetId(uint netId)
|
||||
var id = reader.ReadString();
|
||||
return GetById(id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a <see cref="Mod"/> reference to the <paramref name="writer"/>.
|
||||
/// </summary>
|
||||
/// <param name="writer">The <see cref="MessageWriter"/> to write to.</param>
|
||||
/// <param name="value">The <see cref="Mod"/> to write.</param>
|
||||
/// <remarks>This will write the net id if <see cref="Mod.IsRequiredOnAllClients"/> is true, regular id otherwise.</remarks>
|
||||
public static void Write(this MessageWriter writer, Mod value)
|
||||
{
|
||||
if (value.IsRequiredOnAllClients)
|
||||
{
|
||||
return _mapByNetId![netId];
|
||||
writer.WritePacked(value.GetNetId());
|
||||
}
|
||||
|
||||
internal static void Update()
|
||||
else
|
||||
{
|
||||
var i = (uint) 0;
|
||||
|
||||
Current = IL2CPPChainloader.Instance.Plugins.Values
|
||||
.OrderByDescending(x => x.Metadata.GUID == ReactorPlugin.Id)
|
||||
.Select(plugin => new Mod(
|
||||
i++,
|
||||
plugin.Metadata.GUID,
|
||||
plugin.Metadata.Version.Clean(),
|
||||
ReactorPluginSideAttribute.GetPluginSide(plugin.Instance.GetType())
|
||||
))
|
||||
.ToHashSet();
|
||||
|
||||
_mapById = Current.ToDictionary(mod => mod.Id, mod => mod);
|
||||
_mapByNetId = Current.ToDictionary(mod => mod.NetId, mod => mod);
|
||||
writer.WritePacked(0);
|
||||
writer.Write(value.Id);
|
||||
}
|
||||
}
|
||||
|
||||
private static void Refresh()
|
||||
{
|
||||
if (ReactorConnection.Instance != null) throw new InvalidOperationException("Can't refresh the mod list during a connection");
|
||||
|
||||
Current = IL2CPPChainloader.Instance.Plugins.Values
|
||||
.Select(pluginInfo => GetById(pluginInfo.Metadata.GUID))
|
||||
.OrderByDescending(x => x.Id == ReactorPlugin.Id)
|
||||
.ThenBy(x => x.Id, StringComparer.Ordinal)
|
||||
.ToHashSet();
|
||||
|
||||
_modByNetId.Clear();
|
||||
_netIdByMod.Clear();
|
||||
|
||||
uint netId = 1;
|
||||
foreach (var mod in Current)
|
||||
{
|
||||
if (!mod.IsRequiredOnAllClients) continue;
|
||||
|
||||
_modByNetId[netId] = mod;
|
||||
_netIdByMod[mod] = netId;
|
||||
netId++;
|
||||
}
|
||||
|
||||
IsAnyModIsRequiredOnAllClients = Current.Any(m => m.IsRequiredOnAllClients);
|
||||
|
||||
var debug = new StringBuilder("Mod list:");
|
||||
foreach (var mod in Current)
|
||||
{
|
||||
debug.AppendLine();
|
||||
debug.Append(CultureInfo.InvariantCulture, $" - {mod.Id} version: {mod.Version}, flags: {mod.Flags}");
|
||||
if (mod.IsRequiredOnAllClients) debug.Append(CultureInfo.InvariantCulture, $", netId: {mod.GetNetId()}");
|
||||
}
|
||||
|
||||
Debug(debug.ToString());
|
||||
}
|
||||
|
||||
private static void OnPluginLoad(PluginInfo pluginInfo, BasePlugin plugin)
|
||||
{
|
||||
var pluginType = plugin.GetType();
|
||||
|
||||
var mod = new Mod(
|
||||
pluginInfo.Metadata.GUID,
|
||||
pluginInfo.Metadata.Version.Clean(),
|
||||
ReactorModFlagsAttribute.GetModFlags(pluginType),
|
||||
pluginInfo.Metadata.Name
|
||||
);
|
||||
|
||||
_modById[mod.Id] = mod;
|
||||
_modByPluginType[pluginType] = mod;
|
||||
}
|
||||
|
||||
internal static void Initialize()
|
||||
{
|
||||
foreach (var existingPlugin in IL2CPPChainloader.Instance.Plugins.Values)
|
||||
{
|
||||
if (existingPlugin.Instance == null) continue;
|
||||
OnPluginLoad(existingPlugin, (BasePlugin) existingPlugin.Instance);
|
||||
}
|
||||
|
||||
IL2CPPChainloader.Instance.PluginLoad += (pluginInfo, _, plugin) => OnPluginLoad(pluginInfo, plugin);
|
||||
|
||||
IL2CPPChainloader.Instance.Finished += Refresh;
|
||||
}
|
||||
}
|
||||