From 256f7617ad2d49b5f9c53efaba264a6e00b8ef2b Mon Sep 17 00:00:00 2001 From: js6pak Date: Mon, 29 Aug 2022 02:44:29 +0200 Subject: [PATCH] Add Reactor.Assets to the repo --- .github/workflows/unity.yml | 44 + Directory.Build.props | 8 +- Reactor.Assets/.gitignore | 9 + Reactor.Assets/Assets/AssetBundles.meta | 8 + .../Assets/AssetBundles/default.meta | 8 + .../AssetBundles/default/UI-Default.shader | 116 ++ .../default/UI-Default.shader.meta | 9 + .../Assets/AssetBundles/default/UI.meta | 8 + .../Assets/AssetBundles/default/UI/Skin.meta | 8 + .../default/UI/Skin/Background.png | Bin 0 -> 682 bytes .../default/UI/Skin/Background.png.meta | 120 ++ .../default/UI/Skin/Checkmark.png | Bin 0 -> 636 bytes .../default/UI/Skin/Checkmark.png.meta | 120 ++ .../default/UI/Skin/DropdownArrow.png | Bin 0 -> 347 bytes .../default/UI/Skin/DropdownArrow.png.meta | 120 ++ .../default/UI/Skin/InputFieldBackground.png | Bin 0 -> 825 bytes .../UI/Skin/InputFieldBackground.png.meta | 120 ++ .../AssetBundles/default/UI/Skin/Knob.png | Bin 0 -> 1403 bytes .../default/UI/Skin/Knob.png.meta | 120 ++ .../AssetBundles/default/UI/Skin/UIMask.png | Bin 0 -> 270 bytes .../default/UI/Skin/UIMask.png.meta | 120 ++ .../AssetBundles/default/UI/Skin/UISprite.png | Bin 0 -> 740 bytes .../default/UI/Skin/UISprite.png.meta | 120 ++ Reactor.Assets/Assets/Build.cs | 102 ++ Reactor.Assets/Assets/Build.cs.meta | 11 + Reactor.Assets/Packages/manifest.json | 40 + Reactor.Assets/Packages/packages-lock.json | 333 +++++ .../ProjectSettings/ProjectVersion.txt | 2 + Reactor.Assets/build.sh | 25 + Reactor.Benchmarks/AssetBundleBenchmarks.cs | 96 ++ Reactor.Benchmarks/BenchmarksPlugin.cs | 24 + Reactor.Benchmarks/Reactor.Benchmarks.csproj | 13 + .../SingleThreadedInProcessEmitToolchain.cs | 52 + Reactor.Benchmarks/packages.lock.json | 1068 +++++++++++++++++ Reactor.Debugger/DebuggerPlugin.cs | 2 +- Reactor.Debugger/Reactor.Debugger.csproj | 3 - Reactor.Example/Reactor.Example.csproj | 4 - Reactor.sln | 6 + Reactor/AssetBundleManager.cs | 138 +++ Reactor/Assets/default-android.bundle | Bin 0 -> 13538 bytes Reactor/Assets/default-win-x86.bundle | Bin 0 -> 12857 bytes Reactor/Assets/default.bundle | Bin 10091 -> 0 bytes Reactor/Extensions/Extensions.cs | 6 + Reactor/IsExternalInit.cs | 10 - Reactor/Unstrip/DefaultBundle.cs | 3 +- Reactor/Unstrip/IsUnmanagedAttribute.cs | 7 + 46 files changed, 2982 insertions(+), 21 deletions(-) create mode 100644 .github/workflows/unity.yml create mode 100644 Reactor.Assets/.gitignore create mode 100644 Reactor.Assets/Assets/AssetBundles.meta create mode 100644 Reactor.Assets/Assets/AssetBundles/default.meta create mode 100644 Reactor.Assets/Assets/AssetBundles/default/UI-Default.shader create mode 100644 Reactor.Assets/Assets/AssetBundles/default/UI-Default.shader.meta create mode 100644 Reactor.Assets/Assets/AssetBundles/default/UI.meta create mode 100644 Reactor.Assets/Assets/AssetBundles/default/UI/Skin.meta create mode 100644 Reactor.Assets/Assets/AssetBundles/default/UI/Skin/Background.png create mode 100644 Reactor.Assets/Assets/AssetBundles/default/UI/Skin/Background.png.meta create mode 100644 Reactor.Assets/Assets/AssetBundles/default/UI/Skin/Checkmark.png create mode 100644 Reactor.Assets/Assets/AssetBundles/default/UI/Skin/Checkmark.png.meta create mode 100644 Reactor.Assets/Assets/AssetBundles/default/UI/Skin/DropdownArrow.png create mode 100644 Reactor.Assets/Assets/AssetBundles/default/UI/Skin/DropdownArrow.png.meta create mode 100644 Reactor.Assets/Assets/AssetBundles/default/UI/Skin/InputFieldBackground.png create mode 100644 Reactor.Assets/Assets/AssetBundles/default/UI/Skin/InputFieldBackground.png.meta create mode 100644 Reactor.Assets/Assets/AssetBundles/default/UI/Skin/Knob.png create mode 100644 Reactor.Assets/Assets/AssetBundles/default/UI/Skin/Knob.png.meta create mode 100644 Reactor.Assets/Assets/AssetBundles/default/UI/Skin/UIMask.png create mode 100644 Reactor.Assets/Assets/AssetBundles/default/UI/Skin/UIMask.png.meta create mode 100644 Reactor.Assets/Assets/AssetBundles/default/UI/Skin/UISprite.png create mode 100644 Reactor.Assets/Assets/AssetBundles/default/UI/Skin/UISprite.png.meta create mode 100644 Reactor.Assets/Assets/Build.cs create mode 100644 Reactor.Assets/Assets/Build.cs.meta create mode 100644 Reactor.Assets/Packages/manifest.json create mode 100644 Reactor.Assets/Packages/packages-lock.json create mode 100644 Reactor.Assets/ProjectSettings/ProjectVersion.txt create mode 100644 Reactor.Assets/build.sh create mode 100644 Reactor.Benchmarks/AssetBundleBenchmarks.cs create mode 100644 Reactor.Benchmarks/BenchmarksPlugin.cs create mode 100644 Reactor.Benchmarks/Reactor.Benchmarks.csproj create mode 100644 Reactor.Benchmarks/SingleThreadedInProcessEmitToolchain.cs create mode 100644 Reactor.Benchmarks/packages.lock.json create mode 100644 Reactor/AssetBundleManager.cs create mode 100644 Reactor/Assets/default-android.bundle create mode 100644 Reactor/Assets/default-win-x86.bundle delete mode 100644 Reactor/Assets/default.bundle delete mode 100644 Reactor/IsExternalInit.cs create mode 100644 Reactor/Unstrip/IsUnmanagedAttribute.cs diff --git a/.github/workflows/unity.yml b/.github/workflows/unity.yml new file mode 100644 index 0000000..eee051c --- /dev/null +++ b/.github/workflows/unity.yml @@ -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 diff --git a/Directory.Build.props b/Directory.Build.props index f520778..f4e7933 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,5 +1,11 @@ + net6.0 + latest + embedded + enable + true + true - \ No newline at end of file + diff --git a/Reactor.Assets/.gitignore b/Reactor.Assets/.gitignore new file mode 100644 index 0000000..cf247ae --- /dev/null +++ b/Reactor.Assets/.gitignore @@ -0,0 +1,9 @@ +* +!.gitignore +!Assets/ +!Assets/** +!Packages/ +!Packages/** +!ProjectSettings/ +!ProjectSettings/ProjectVersion.txt +!build.sh diff --git a/Reactor.Assets/Assets/AssetBundles.meta b/Reactor.Assets/Assets/AssetBundles.meta new file mode 100644 index 0000000..8f2743e --- /dev/null +++ b/Reactor.Assets/Assets/AssetBundles.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ae7df23e94a4b0c83a418e20686437d1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Reactor.Assets/Assets/AssetBundles/default.meta b/Reactor.Assets/Assets/AssetBundles/default.meta new file mode 100644 index 0000000..0da2411 --- /dev/null +++ b/Reactor.Assets/Assets/AssetBundles/default.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5425e70810911f650b05cf41f536c339 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Reactor.Assets/Assets/AssetBundles/default/UI-Default.shader b/Reactor.Assets/Assets/AssetBundles/default/UI-Default.shader new file mode 100644 index 0000000..4f49d32 --- /dev/null +++ b/Reactor.Assets/Assets/AssetBundles/default/UI-Default.shader @@ -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 + } + } +} diff --git a/Reactor.Assets/Assets/AssetBundles/default/UI-Default.shader.meta b/Reactor.Assets/Assets/AssetBundles/default/UI-Default.shader.meta new file mode 100644 index 0000000..4df8f9e --- /dev/null +++ b/Reactor.Assets/Assets/AssetBundles/default/UI-Default.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ba8fc08df3e3f060089297eca021e4d4 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Reactor.Assets/Assets/AssetBundles/default/UI.meta b/Reactor.Assets/Assets/AssetBundles/default/UI.meta new file mode 100644 index 0000000..e23d450 --- /dev/null +++ b/Reactor.Assets/Assets/AssetBundles/default/UI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e90cbb1a99b248a86995ee7f3c98c535 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Reactor.Assets/Assets/AssetBundles/default/UI/Skin.meta b/Reactor.Assets/Assets/AssetBundles/default/UI/Skin.meta new file mode 100644 index 0000000..89be650 --- /dev/null +++ b/Reactor.Assets/Assets/AssetBundles/default/UI/Skin.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 68078bcc7def68b6088cdcf1eb1b4e9b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Reactor.Assets/Assets/AssetBundles/default/UI/Skin/Background.png b/Reactor.Assets/Assets/AssetBundles/default/UI/Skin/Background.png new file mode 100644 index 0000000000000000000000000000000000000000..cf795927458b3817efb78142f134333b9b71c7cf GIT binary patch literal 682 zcmV;b0#*HqP)Doz!Zx zx?~8(!7PH=99&E^8a(ZL$9?kUsBNuYyWE4v`@VPYpYMHl{yrfb4g*gPhXa<&B}kG4 zi^W2FM0-IHc(dQGc^^>}K~+^P#&kM; zi3Gi2Z}Iu+)e~t}I%m`Av}Ci{*77*~>Gq&dsA=CX+X%%2~!0Le20jmRi2Oj2gf^p`O4$1CV7QTR+;c&?Grb#`=4NJfm zP;0l_OmCX(bUO5R+@N~{u}FA8=d*l1ud>UC85Pio3x$G;Na)K75wS{8UST1hOQn(- zxwV+(a+%~O{E=4-3QB}fs4|_uBWis$8jbe+e*eypF~Ramr2>scqc)q(vUp7+(ynWg z0fwmvl}o)|@3vmAzee<8Cm`u|yZ@>ybTMhQT9C`-?lI;&405Dp=As!dCP0u$r+sYG zA+FybN11X%d5QMtIPWu**W^2yOh~MV$Al}Tz95GaqjJ}K{x#fn>_3Y41Bfv9T)l3+ Q1poj507*qoM6N<$f}V!Z literal 0 HcmV?d00001 diff --git a/Reactor.Assets/Assets/AssetBundles/default/UI/Skin/Background.png.meta b/Reactor.Assets/Assets/AssetBundles/default/UI/Skin/Background.png.meta new file mode 100644 index 0000000..620cea2 --- /dev/null +++ b/Reactor.Assets/Assets/AssetBundles/default/UI/Skin/Background.png.meta @@ -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: diff --git a/Reactor.Assets/Assets/AssetBundles/default/UI/Skin/Checkmark.png b/Reactor.Assets/Assets/AssetBundles/default/UI/Skin/Checkmark.png new file mode 100644 index 0000000000000000000000000000000000000000..9c174dc947624e403de3f6f30dc656db9fa0dfbe GIT binary patch literal 636 zcmV-?0)zdDP)*H5!drJ}H*f zKN=Z;QOP$98U~{>5Y^wDLBn8F2B!Gev3@i~=UYzuq-2CuyoWClDl5Vr>%t~oBqiIn zZxnC~I&h>*lEEyPBXDH_>IGo;#eC`z3&4CnZ~b-U3S6(wfntr20BGCuye&*SB z%pG)#!nhBc4V=eUI+J007=RSNf$jt8IL;;(mPtts%pIU#)3J!s=S}e>`sCM_Zh%`- zl()@h^Hh;TPwi^88roSnx&S8&hn8B9S1`7PKGG0{K^gdmNu;uaXB}MvVgW}1;s8kd zj6q_2M=?CpLR>8_fP}}53zWJ~(l=@~HfwGGvS`v683r}vuvCUY7EKx>!=Q#7mg*Y| W(bSPc`1ef!0000I~l!01W~I&G0q1cwqzx7Z0B(Vwf!_r-JR`mXE?G2p!W@h zf}x;S0dIZW!BEhvfVV#GU?`{*cwtSyYUcXEa1xuRL;m|PubEz|AC_gQY0jJ;mUGiK zsfGN3!9`<3$a&ky<7Zo!1`WrDN~L5Sw*azM;1)<191pYtvPR%F zkZw30b_I}i0zZRn0>^`{0+7e literal 0 HcmV?d00001 diff --git a/Reactor.Assets/Assets/AssetBundles/default/UI/Skin/DropdownArrow.png.meta b/Reactor.Assets/Assets/AssetBundles/default/UI/Skin/DropdownArrow.png.meta new file mode 100644 index 0000000..7a21272 --- /dev/null +++ b/Reactor.Assets/Assets/AssetBundles/default/UI/Skin/DropdownArrow.png.meta @@ -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: diff --git a/Reactor.Assets/Assets/AssetBundles/default/UI/Skin/InputFieldBackground.png b/Reactor.Assets/Assets/AssetBundles/default/UI/Skin/InputFieldBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..90b9abb5b74ad4be121fe24131815be089af943d GIT binary patch literal 825 zcmV-91IGM`P)w*AqXu9qQ^u8y$I40qtV#;7Wc6}lUCCw?ZJh4J8yUAn{Q`!dGjnA8ylpyg@pwg z3bx6S2pNgapo&GzR2)9ECK!$CHiO(&r*oIsJzd%YgvV8`QevfJ&Ed_Mo0=blLjOE4Ie`YoRLw!gox zEiW$%Bapyt_}d6{IvqmjTdfvFqtQO!klXCE1jpLi+M2j_Jotil9^TyCq@|@LT3lQd z5n$FL3NjKPG_3#wn*aujwOA~6IHh@{RlNm~a5yZSBQ4VLb#{-P3Gks)U;z^wgAZ;I zJkV^);ktp-jNEab#w-HYDw%L!NPYAb1Ix)3b!TnGIQ9s00000NkvXXu0mjf Dqo#Q< literal 0 HcmV?d00001 diff --git a/Reactor.Assets/Assets/AssetBundles/default/UI/Skin/InputFieldBackground.png.meta b/Reactor.Assets/Assets/AssetBundles/default/UI/Skin/InputFieldBackground.png.meta new file mode 100644 index 0000000..9d56a9b --- /dev/null +++ b/Reactor.Assets/Assets/AssetBundles/default/UI/Skin/InputFieldBackground.png.meta @@ -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: diff --git a/Reactor.Assets/Assets/AssetBundles/default/UI/Skin/Knob.png b/Reactor.Assets/Assets/AssetBundles/default/UI/Skin/Knob.png new file mode 100644 index 0000000000000000000000000000000000000000..8c5b2cf757abdc91bb052ed6f0cacaa7f4414874 GIT binary patch literal 1403 zcmV->1%&#EP)^RSb{J5 z&?*?Zwz9Mk7L5iaD@qV81h3>x1+^ORu06jYla4Wou9{>IobSvxxAU8GneUrXG&eW1 zP_(|j&Z`Rx3)$-GDpM+z?CR=@*Fh#FC9$)!GhT;xg+dW%7iCCrLP7#NIXU5FOn|z} z%S%>VT+Ei2msv_m3WJ_dqzqO0A=RlL049URT8KX*))A}xk_2-TU-+ei> zTCMgw0BdMyxMj-F%~%k4e0I*Wzc}ky|}nw=jZ1FH@bjr)VL{4_m1 zowo-+A^}XL$!FTy+KgRYT}-8dA!)e;3fl|7pe#TDh#-`~Xp_MLB(^KeRZ~;Lj*pLv zX`5-J`d7nlc3I6KC(3b?z(AO^0)QGw{gj`X znJLO~lfXcj0x>9C@Ckms<4wRo7JMRb$XP7vJ}4_zf|WfyzAUT@q1ZfF2&Fn1BGw~&0 zAaHL43OPv-gR^sUbD}Ng61stb-0KbHVgPzEHZ~S>U_zl^_Y3h3DO(W1`P$)dIPG?v zv13cnIW;wf7`t|`r(=MU|JqCPC#)nEKdZt7&;^|odq0Zg5K@(slOy^GiCFyT@bFNN zQ&%jgudk0yPENieUDjZI>Y}2e;5xiNx7lnO`YxI~IyyqNKU$sDYGtI$PFHa^PIOSB zz~xUEN+r{~T3cH+?d|Phx;(6UU|@g^4GnoHyl~O;Z>ZT+1qB8Cq>s~n5TDS=?l(FP zetK|lP=uo);^Hv~F$cE}4-ebvBJ^|8yC0-GfJNays6^7MT3cItSzccLZDV62Gn>tk z`rg`xY(+xQ7vmL$7u*{0TpRA{LsoRPzrX+2_V)H$3gk~VHa0#^OG{%Rl1mPhxjikX1cPnvWz(3;GVgpq=au( zkf4>76~0YD;(pudbn-6*x%Ovjw!xjCaQD)@(f_#1{h-_*WgD&DMi$Md?E8YsI;sOh zD)ti zJGOlgw=(eSgX^(I+{!=?(J)LJ$PQ!&vIE(Hzv}>v;Hm={qh>|dM1&b`RuH%906^q) zfFp2r8Gx1?AUBwRI5;Vysn~%Sp^!AmIN-yI2j{1zll#7w0mn^S)f<>5rijzP3v^>6 UGbm~HZvX%Q07*qoM6N<$f)zz@vH$=8 literal 0 HcmV?d00001 diff --git a/Reactor.Assets/Assets/AssetBundles/default/UI/Skin/UIMask.png.meta b/Reactor.Assets/Assets/AssetBundles/default/UI/Skin/UIMask.png.meta new file mode 100644 index 0000000..bdf6bc0 --- /dev/null +++ b/Reactor.Assets/Assets/AssetBundles/default/UI/Skin/UIMask.png.meta @@ -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: diff --git a/Reactor.Assets/Assets/AssetBundles/default/UI/Skin/UISprite.png b/Reactor.Assets/Assets/AssetBundles/default/UI/Skin/UISprite.png new file mode 100644 index 0000000000000000000000000000000000000000..5f2ea2ff1b339e6f7863198930677ac0482dad8d GIT binary patch literal 740 zcmV|WreaiP{@aT34^fyID{Ko zkVNZu$z<}L-|q*n*9%m}Lk6|4)9FC7*@SF1J4N5O*v7271?mLO@C;l=qtQq_9tXGE zeMrn3ZTtN`6pKYDl}Z&%-~}2kn6c#XctEe$D}o2_A{L9qGnountyX4pXH8h4Pzc83 z@p-%5He)qE(jg}isKndx5X<(hUaw1(5S4JXS}B^n4a{&~O>HC5>2!*o&*u;b1Y~?e z9wEjL!Vw94D~VJpr39zI)GL<2z5&&C>_;#xgTVlJt|Uw{_J8 zy!Dze37cZzh%g`>cfmYxI-Sae!5$u4(`96{+32FX&#-lDg8Gb0hTA^wlx|v#vpeB@ z3yvFUPqb44rwW`ZaH_zm0(=D)%jI&<3-tD8(!3=yUvu{x^{PM#*Zm8Zj145}+1`!(kcmpJ0F%1rb>$s9X4*&gXJDO@b3> zKA$I*L#ozdR8X?p?F#oJ{)h6p+wDFbjYj9hmMs+1_LM*3Q#VWD@e-{$c$(x z>`QXFTzmi-sqzP;&ST{8&&+1Co`|Hw;oxodp7(k^s8*|xPN%1c`34 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 +{ + /// + /// Worst size, best load speed + /// + None, + + /// + /// Best size, worst load speed + /// + LZMA, + + /// + /// Okay size, okay load speed + /// + LZ4, +} +#endif diff --git a/Reactor.Assets/Assets/Build.cs.meta b/Reactor.Assets/Assets/Build.cs.meta new file mode 100644 index 0000000..31950c4 --- /dev/null +++ b/Reactor.Assets/Assets/Build.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d785823c2752b6812b292c93aa323bfa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Reactor.Assets/Packages/manifest.json b/Reactor.Assets/Packages/manifest.json new file mode 100644 index 0000000..e8635bd --- /dev/null +++ b/Reactor.Assets/Packages/manifest.json @@ -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" + } +} diff --git a/Reactor.Assets/Packages/packages-lock.json b/Reactor.Assets/Packages/packages-lock.json new file mode 100644 index 0000000..36e8baf --- /dev/null +++ b/Reactor.Assets/Packages/packages-lock.json @@ -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" + } + } + } +} diff --git a/Reactor.Assets/ProjectSettings/ProjectVersion.txt b/Reactor.Assets/ProjectSettings/ProjectVersion.txt new file mode 100644 index 0000000..2b4e8e5 --- /dev/null +++ b/Reactor.Assets/ProjectSettings/ProjectVersion.txt @@ -0,0 +1,2 @@ +m_EditorVersion: 2020.3.22f1 +m_EditorVersionWithRevision: 2020.3.22f1 (e1a7f79fd887) diff --git a/Reactor.Assets/build.sh b/Reactor.Assets/build.sh new file mode 100644 index 0000000..3c37354 --- /dev/null +++ b/Reactor.Assets/build.sh @@ -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 diff --git a/Reactor.Benchmarks/AssetBundleBenchmarks.cs b/Reactor.Benchmarks/AssetBundleBenchmarks.cs new file mode 100644 index 0000000..1c238dd --- /dev/null +++ b/Reactor.Benchmarks/AssetBundleBenchmarks.cs @@ -0,0 +1,96 @@ +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.Extensions; +using UnityEngine; + +namespace Reactor.Benchmarks; + +[MemoryDiagnoser] +[StopOnFirstError, Config(typeof(Config))] +public class AssetBundleBenchmarks +{ + private 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 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(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(length); + if (stream.Read(array.ToSpan()) < length) throw new Exception("Failed to read in full"); + + return LoadAll(AssetBundle.LoadFromMemory(array)); + } + + [Benchmark] + public AssetBundle LoadFromFile() + { + return LoadAll(AssetBundle.LoadFromFile(Path.Combine(Paths.PluginPath, AssetBundleFileName))); + } +} diff --git a/Reactor.Benchmarks/BenchmarksPlugin.cs b/Reactor.Benchmarks/BenchmarksPlugin.cs new file mode 100644 index 0000000..8641713 --- /dev/null +++ b/Reactor.Benchmarks/BenchmarksPlugin.cs @@ -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(); + } + finally + { + Process.GetCurrentProcess().Kill(); + } + } +} diff --git a/Reactor.Benchmarks/Reactor.Benchmarks.csproj b/Reactor.Benchmarks/Reactor.Benchmarks.csproj new file mode 100644 index 0000000..e0a1d72 --- /dev/null +++ b/Reactor.Benchmarks/Reactor.Benchmarks.csproj @@ -0,0 +1,13 @@ + + + 0.1.0 + NuclearPowered + + + + + + + + + diff --git a/Reactor.Benchmarks/SingleThreadedInProcessEmitToolchain.cs b/Reactor.Benchmarks/SingleThreadedInProcessEmitToolchain.cs new file mode 100644 index 0000000..2772892 --- /dev/null +++ b/Reactor.Benchmarks/SingleThreadedInProcessEmitToolchain.cs @@ -0,0 +1,52 @@ +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 +{ + /// Initializes a new instance of the class. + /// true if the output should be logged. + public SingleThreadedInProcessEmitExecutor(bool logOutput) + { + LogOutput = logOutput; + } + + /// Gets a value indicating whether the output should be logged. + /// true if the output should be logged; otherwise, false. + public bool LogOutput { get; } + + /// Executes the specified benchmark. + 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); + } +} diff --git a/Reactor.Benchmarks/packages.lock.json b/Reactor.Benchmarks/packages.lock.json new file mode 100644 index 0000000..86d3351 --- /dev/null +++ b/Reactor.Benchmarks/packages.lock.json @@ -0,0 +1,1068 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "AmongUs.GameLibs.Steam": { + "type": "Direct", + "requested": "[2022.8.23, )", + "resolved": "2022.8.23", + "contentHash": "baY5JO6dbdOAZ0VTtGX0xre6/BlDdreJDAH8boCKZt3JTAcn+eeH+l8mUZRC9eCJOODUik2C0TTAt5AqBmYtZg==" + }, + "BenchmarkDotNet": { + "type": "Direct", + "requested": "[0.13.2, )", + "resolved": "0.13.2", + "contentHash": "82IflYxY8qnQXEA3kXtqC9pntrkJYJZbQ9PV7hEV/XcfCtOdwLz84ilyO8tLRVbiliWttvmt/v44P+visN+fPQ==", + "dependencies": { + "BenchmarkDotNet.Annotations": "0.13.2", + "CommandLineParser": "2.4.3", + "Iced": "1.17.0", + "Microsoft.CodeAnalysis.CSharp": "3.0.0", + "Microsoft.Diagnostics.Runtime": "2.2.332302", + "Microsoft.Diagnostics.Tracing.TraceEvent": "3.0.2", + "Microsoft.DotNet.PlatformAbstractions": "3.1.6", + "Perfolizer": "0.2.1", + "System.Management": "6.0.0", + "System.Reflection.Emit": "4.7.0", + "System.Reflection.Emit.Lightweight": "4.7.0", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "BepInEx.AutoPlugin": { + "type": "Direct", + "requested": "[1.0.1, )", + "resolved": "1.0.1", + "contentHash": "G4YpTHG9rtkDJof+ld7Er4E+sCOlgsjG4bJ1itx1ub7dgff6qqHLy9ksX1ehgO0AdBOPVyVl/GKJg9o7iNl8HA==" + }, + "BepInEx.IL2CPP.MSBuild": { + "type": "Direct", + "requested": "[2.0.0, )", + "resolved": "2.0.0", + "contentHash": "Xy0XehKQK1cHZwyXBldQrVJv4e3snNOlzGjmQ6I1oovPusZNkjDX1eYriWT05CwKln3BaLA/mNcZ0QzkMLi7lw==" + }, + "BepInEx.Unity.IL2CPP": { + "type": "Direct", + "requested": "[6.0.0-be.652, )", + "resolved": "6.0.0-be.652", + "contentHash": "76ybuFLr9BDTOTfI+yOP3xOIA94NxhOejR8+517b2YnpXWJoUhLx5IHv5Bfezon/oafubEUBzrlLfzoAt+6iXA==", + "dependencies": { + "BepInEx.Core": "6.0.0-be.652", + "BepInEx.Unity.Common": "6.0.0-be.652", + "HarmonyX": "2.10.0", + "Iced": "1.17.0", + "Il2CppInterop.Generator": "1.1.1", + "Il2CppInterop.HarmonySupport": "1.1.1", + "Il2CppInterop.Runtime": "1.1.1", + "MonoMod.RuntimeDetour": "22.5.1.1", + "Samboy063.Cpp2IL.Core": "2022.0.5" + } + }, + "AssetRipper.VersionUtilities": { + "type": "Transitive", + "resolved": "1.2.1", + "contentHash": "knQ/W1YwTZS2AbdaZh+nhyyBEZQPQDcahhSOnh88i+cdg4/FEoFJiCwaavgFvCMNuUeHTbcZc4qttF8WQ8xLIA==" + }, + "BenchmarkDotNet.Annotations": { + "type": "Transitive", + "resolved": "0.13.2", + "contentHash": "+SGOYyXT6fiagbtrni38B8BqBgjruYKU3PfROI0lDIYo8jQ+APUmLKMEswK7zwR5fEOCrDmoAHSH6oykBkqPgA==" + }, + "BepInEx.Core": { + "type": "Transitive", + "resolved": "6.0.0-be.652", + "contentHash": "E2mQ1SbI7AHiUULZSCmgFQonUrNxSlGBinJiMD4tnVtExpig82sFJkaNsbeQOz0l46LymEJKJk9ir9rzHozQ9w==", + "dependencies": { + "HarmonyX": "2.10.0", + "MonoMod.Utils": "22.5.1.1", + "SemanticVersioning": "2.0.2" + } + }, + "BepInEx.Unity.Common": { + "type": "Transitive", + "resolved": "6.0.0-be.652", + "contentHash": "sxSYHRFKUtVts/bZKuapnB/rAHhOWz3rc2tu55mF1Ja9Wu9Fvrpd1bGablioX15EE1/GyfSLZwOeN8nYgXbZsQ==", + "dependencies": { + "AssetRipper.VersionUtilities": "1.2.1", + "MonoMod.Utils": "22.5.1.1" + } + }, + "CommandLineParser": { + "type": "Transitive", + "resolved": "2.4.3", + "contentHash": "U2FC9Y8NyIxxU6MpFFdWWu1xwiqz/61v/Doou7kmVjpeIEMLWyiNNkzNlSE84kyJ0O1LKApuEj5z48Ow0Hi4OQ==" + }, + "HarmonyX": { + "type": "Transitive", + "resolved": "2.10.0", + "contentHash": "4ayiy/dlCiW86K2N7Jvbf+VpI5wvP7dncv/6oRmfwRi32UCmCRzCGzsxdMfzJZkp6/26oBW+DrD8vi4UejzVAg==", + "dependencies": { + "MonoMod.RuntimeDetour": "22.3.23.4", + "System.Reflection.Emit": "4.7.0" + } + }, + "Iced": { + "type": "Transitive", + "resolved": "1.17.0", + "contentHash": "8x+HCVTl/HHTGpscH3vMBhV8sknN/muZFw9s3TsI8SA6+c43cOTCi2+jE4KsU8pNLbJ++iF2ZFcpcXHXtDglnw==" + }, + "Il2CppInterop.Common": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "eUXvZ2Ed/d1GqGHF9SQPzEz/HTihSfIC32EeUVXNJoGuj93n4xxCg3CbHhh9ZAqKRtG4WLCsIBa/7E/DgpuWqQ==", + "dependencies": { + "Iced": "1.17.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.1", + "System.Net.Http": "4.3.4" + } + }, + "Il2CppInterop.Generator": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "FaII+JqFKdcy6YRd7boa+IogcL+6FMCL1cqygFoW7v3WxnD3ZEbgJdqoobrI/5TXIBw+/WN0ngAZkR1GgJvN0g==", + "dependencies": { + "Il2CppInterop.Common": "1.1.1", + "Mono.Cecil": "0.11.3" + } + }, + "Il2CppInterop.HarmonySupport": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "b7BBIn2O/BY/ZU4WbWsbDae1+vrJMAydPVss58nUUpFmprPCM8DOs28mqOt5RILfZTw62ivIHP+PAzKmJnWQtA==", + "dependencies": { + "HarmonyX": "2.10.0", + "Il2CppInterop.Runtime": "1.1.1" + } + }, + "Il2CppInterop.Runtime": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "rMLHqJ6aiJ/dk91cCzbdg0aCBlCdSi7KGBEkJwWwF7GAnt35CJqoiTwr6orlg3qru1CBFbLpRXT8dqWrwvbowg==", + "dependencies": { + "Iced": "1.17.0", + "Il2CppInterop.Common": "1.1.1" + } + }, + "IndexRange": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "6TgS1JLSUkpmPLfXBPaAgB39ZUix8E4soXWk2XSDcscVe84i1JKzIAtA7jHbRHSkOOrcr6YA0MpLCeq98y9mYQ==" + }, + "js6pak.Gee.External.Capstone": { + "type": "Transitive", + "resolved": "2.1.0", + "contentHash": "YYpq7NM50bSSVUDjXyV/eiITk6syXqItPjKBOb3jEWS6RFsk0DNhpWMPW6b3hKDmArARuWDU6S2pVu1IeVrvIA==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "1Am6l4Vpn3/K32daEqZI+FFr96OlZkgwK2LcT3pZ2zWubR5zTPW3/FkO1Rat9kb7oQOa4rxgl9LJHc5tspCWfg==" + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Transitive", + "resolved": "2.6.2-beta2", + "contentHash": "rg5Ql73AmGCMG5Q40Kzbndq7C7S4XvsJA+2QXfZBCy2dRqD+a7BSbx/3942EoRUJ/8Wh9+kLg2G2qC46o3f1Aw==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "HEnLZ9Op5IoXeuokhfSLIXstXfEyPzXhQ/xsnvUmxzb+7YpwuLk57txArzGs/Wne5bWmU7Uey4Q1jUZ3++heqg==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "2.6.2-beta2", + "System.Collections.Immutable": "1.5.0", + "System.Memory": "4.5.1", + "System.Reflection.Metadata": "1.6.0", + "System.Runtime.CompilerServices.Unsafe": "4.5.0", + "System.Text.Encoding.CodePages": "4.5.0", + "System.Threading.Tasks.Extensions": "4.5.0" + } + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "hWFUxc0iUbVvIKWJODErOeOa5GiqZuEcetxaCfHqZ04zHy0ZCLx3v4/TdF/6Erx1mXPHfoT2Tiz5rZCQZ6OyxQ==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[3.0.0]" + } + }, + "Microsoft.Diagnostics.NETCore.Client": { + "type": "Transitive", + "resolved": "0.2.251802", + "contentHash": "bqnYl6AdSeboeN4v25hSukK6Odm6/54E3Y2B8rBvgqvAW0mF8fo7XNRVE2DMOG7Rk0fiuA079QIH28+V+W1Zdg==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.0", + "Microsoft.Extensions.Logging": "2.1.1" + } + }, + "Microsoft.Diagnostics.Runtime": { + "type": "Transitive", + "resolved": "2.2.332302", + "contentHash": "Hp84ivxSKIMTBzYSATxmUsm3YSXHWivcwiRRbsydGmqujMUK8BAueLN0ssAVEOkOBmh0vjUBhrq7YcroT7VCug==", + "dependencies": { + "Microsoft.Diagnostics.NETCore.Client": "0.2.251802", + "System.Collections.Immutable": "5.0.0", + "System.Runtime.CompilerServices.Unsafe": "5.0.0" + } + }, + "Microsoft.Diagnostics.Tracing.TraceEvent": { + "type": "Transitive", + "resolved": "3.0.2", + "contentHash": "Pr7t+Z/qBe6DxCow4BmYmDycHe2MrGESaflWXRcSUI4XNGyznx1ttS+9JNOxLuBZSoBSPTKw9Dyheo01Yi6anQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "4.5.3" + } + }, + "Microsoft.DotNet.PlatformAbstractions": { + "type": "Transitive", + "resolved": "3.1.6", + "contentHash": "jek4XYaQ/PGUwDKKhwR8K47Uh1189PFzMeLqO83mXrXQVIpARZCcfuDedH50YDTepBkfijCZN5U/vZi++erxtg==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "2.1.1", + "contentHash": "LjVKO6P2y52c5ZhTLX/w8zc5H4Y3J/LJsgqTBj49TtFq/hAtVNue/WA0F6/7GMY90xhD7K0MDZ4qpOeWXbLvzg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "2.1.1" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "2.1.1", + "contentHash": "VfuZJNa0WUshZ/+8BFZAhwFKiKuu/qOUCFntfdLpHj7vcRnsGHqd3G2Hse78DM+pgozczGM63lGPRLmy+uhUOA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "2.1.1" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "2.1.1", + "contentHash": "fcLCTS03poWE4v9tSNBr3pWn0QwGgAn1vzqHXlXgvqZeOc7LvQNzaWcKRQZTdEc3+YhQKwMsOtm3VKSA2aWQ8w==", + "dependencies": { + "Microsoft.Extensions.Configuration": "2.1.1" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "2.1.1", + "contentHash": "MgYpU5cwZohUMKKg3sbPhvGG+eAZ/59E9UwPwlrUkyXU+PGzqwZg9yyQNjhxuAWmoNoFReoemeCku50prYSGzA==" + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "2.1.1", + "contentHash": "hh+mkOAQDTp6XH80xJt3+wwYVzkbwYQl9XZRCz4Um0JjP/o7N9vHM3rZ6wwwtr+BBe/L6iBO2sz0px6OWBzqZQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Binder": "2.1.1", + "Microsoft.Extensions.DependencyInjection.Abstractions": "2.1.1", + "Microsoft.Extensions.Logging.Abstractions": "2.1.1", + "Microsoft.Extensions.Options": "2.1.1" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "dzB2Cgg+JmrouhjkcQGzSFjjvpwlq353i8oBQO2GWNjCXSzhbtBRUf28HSauWe7eib3wYOdb3tItdjRwAdwCSg==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "2.1.1", + "contentHash": "V7lXCU78lAbzaulCGFKojcCyG8RTJicEbiBkPJjFqiqXwndEBBIehdXRMWEVU3UtzQ1yDvphiWUL9th6/4gJ7w==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "2.1.1", + "Microsoft.Extensions.Primitives": "2.1.1" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "2.1.1", + "contentHash": "scJ1GZNIxMmjpENh0UZ8XCQ6vzr/LzeF9WvEA51Ix2OQGAs9WPgPu8ABVUdvpKPLuor/t05gm6menJK3PwqOXg==", + "dependencies": { + "System.Memory": "4.5.1", + "System.Runtime.CompilerServices.Unsafe": "4.5.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "2.0.0", + "contentHash": "VdLJOCXhZaEMY7Hm2GKiULmn7IEPFE4XC5LPSfBVCUIA8YLZVh846gtfBJalsPQF2PlzdD7ecX7DZEulJ402ZQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Mono.Cecil": { + "type": "Transitive", + "resolved": "0.11.4", + "contentHash": "IC1h5g0NeJGHIUgzM1P82ld57knhP0IcQfrYITDPXlNpMYGUrsG5TxuaWTjaeqDNQMBDNZkB8L0rBnwsY6JHuQ==" + }, + "MonoMod.RuntimeDetour": { + "type": "Transitive", + "resolved": "22.5.1.1", + "contentHash": "WG5zLRuAr8KJEnIkKTuIG1OJCrGIT3pjvnAD43E0FDchHf3Dp985MF/8tmIQvAzCZV87JNs6QKeGGqmwDmpXpw==", + "dependencies": { + "Mono.Cecil": "0.11.4", + "MonoMod.Utils": "22.5.1.1", + "System.Collections.NonGeneric": "4.3.0", + "System.ComponentModel.TypeConverter": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.7.0", + "System.Reflection.Emit.Lightweight": "4.7.0", + "System.Reflection.TypeExtensions": "4.7.0" + } + }, + "MonoMod.Utils": { + "type": "Transitive", + "resolved": "22.5.1.1", + "contentHash": "vBObO1atXxhi2C4AuC53y87Bqeogi9xIrD1Ym3YWr5uxc8Nrm8SrsFeD1i3x04R999+XQ3FdeHrbXScyWYEHqQ==", + "dependencies": { + "Mono.Cecil": "0.11.4", + "System.Collections.NonGeneric": "4.3.0", + "System.ComponentModel.TypeConverter": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.7.0", + "System.Reflection.Emit.Lightweight": "4.7.0", + "System.Reflection.TypeExtensions": "4.7.0" + } + }, + "Perfolizer": { + "type": "Transitive", + "resolved": "0.2.1", + "contentHash": "Dt4aCxCT8NPtWBKA8k+FsN/RezOQ2C6omNGm5o/qmYRiIwlQYF93UgFmeF1ezVNsztTnkg7P5P63AE+uNkLfrw==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "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==", + "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", + "js6pak.Gee.External.Capstone": "2.1.0" + } + }, + "Samboy063.LibCpp2IL": { + "type": "Transitive", + "resolved": "2022.0.5", + "contentHash": "eH+/FBclsKDxboa9N/tFoiM8kwvietVX0FtXYxvcexSp/geYCyTt2XUGOQjinqd3Yqg/QxmpIqBO7qy4MQHrhw==", + "dependencies": { + "IndexRange": "1.0.0", + "Samboy063.WasmDisassembler": "2022.0.2" + } + }, + "Samboy063.WasmDisassembler": { + "type": "Transitive", + "resolved": "2022.0.2", + "contentHash": "2uu+xBb7M3HKfBx9tAY6jiDieAf0hRnQjSmGX+7IdE6i24dYsx6TYgtrLvRx5lOuF2M8DijZ5H8yQ1pcuCs2SA==" + }, + "SemanticVersioning": { + "type": "Transitive", + "resolved": "2.0.2", + "contentHash": "4EQgYdNZ92SyaO7YFk6olVnebF5V+jrHyMUjvPq89tLeMo8NSfgDF+6Zwq/lgh9j/0yfQp9Lkm0ZA0rUATCZFA==" + }, + "System.CodeDom": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "CPc6tWO1LAer3IzfZufDBRL+UZQcj5uS207NHALQzP84Vp/z6wF0Aa0YZImOQY8iStY0A2zI/e3ihKNPfUm8XA==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "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.Immutable": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==" + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "prtjIEMhGUnQq6RnPEYLpFt8AtLbp9yq2zxOSrY7KJJZrw25Fi97IzBqY7iqssbM61Ek5b8f3MG/sG1N2sN5KA==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "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.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Epx8PoVZR0iuOnJJDzp7pWvdfMMOAvpUo95pC4ScH2mJuXkKA2Y4aR3cG9qt2klHgSons1WFh4kcGW7cSXvrxg==", + "dependencies": { + "System.Collections.NonGeneric": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "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.ComponentModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VyGn1jGRZVfxnh8EdvDCi71v3bMXrsu8aYJOwoV7SNDLVhiEqwP86pPMyRGsDsxhXAm2b3o9OIqeETfN5qfezw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "j8GUkCpM8V4d4vhLIIoBLGey2Z5bCkMVNjEZseyAlm4n5arcsJOeI3zkUP+zvZgzsbLTYh4lYeP/ZD/gdIAPrw==", + "dependencies": { + "System.ComponentModel": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "16pQ6P+EdhcXzPiEK4kbA953Fu0MNG2ovxTZU81/qsCd1zPRsKc3uif5NgvllCY598k6bI0KUyKW8fanlfaDQg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Collections.NonGeneric": "4.3.0", + "System.Collections.Specialized": "4.3.0", + "System.ComponentModel": "4.3.0", + "System.ComponentModel.Primitives": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "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.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "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", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "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", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "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", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Management": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "sHsESYMmPDhQuOC66h6AEOs/XowzKsbT9srMbX71TCXP58hkpn1BqBjdmKj1+DCA/WlBETX1K5WjQHwmV0Txrg==", + "dependencies": { + "System.CodeDom": "6.0.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.3", + "contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==" + }, + "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", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VR4kk8XLKebQ4MZuKuIni/7oh+QGFmZW3qORd1GvBq/8026OpW501SzT/oypwiQl4TvT8ErnReh/NzY9u+C6wQ==" + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "AucBYo3DSI0IDxdUjKksBcQJXPHyoPyrCXYURW1WDsLI4M65Ar/goSHjdnHOAY9MiYDNKqDlIgaYm+zL2hA1KA==" + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "a4OLB4IITxAXJeV74MDx49Oq2+PsF6Sml54XAFv+2RyWwtDBcabzoxiiJRhdhx+gaohLh4hEGCLQyBozXoQPqA==" + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "1.6.0", + "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "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", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "S0wEUiKcLvRlkFUXca8uio1UQ5bYQzYgOmOKtCqaBQC3GR9AJjh43otcM32IGsAyvadFTaAMw9Irm6dS4Evfng==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.0.0", + "System.Runtime.CompilerServices.Unsafe": "4.5.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" + }, + "System.ValueTuple": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==" + }, + "reactor": { + "type": "Project", + "dependencies": { + "BepInEx.Unity.IL2CPP": "[6.0.0-be.652, )" + } + } + } + } +} \ No newline at end of file diff --git a/Reactor.Debugger/DebuggerPlugin.cs b/Reactor.Debugger/DebuggerPlugin.cs index 16ac8cf..fc5526c 100644 --- a/Reactor.Debugger/DebuggerPlugin.cs +++ b/Reactor.Debugger/DebuggerPlugin.cs @@ -18,7 +18,7 @@ namespace Reactor.Debugger; public partial class DebuggerPlugin : BasePlugin { public Harmony Harmony { get; } = new(Id); - public DebuggerComponent Component { get; private set; } + public DebuggerComponent Component { get; private set; } = null!; public override void Load() { diff --git a/Reactor.Debugger/Reactor.Debugger.csproj b/Reactor.Debugger/Reactor.Debugger.csproj index 0e3ea4c..32bf6c1 100644 --- a/Reactor.Debugger/Reactor.Debugger.csproj +++ b/Reactor.Debugger/Reactor.Debugger.csproj @@ -1,8 +1,5 @@ - net6.0 - latest - 0.1.0 Debugging mod for Reactor NuclearPowered diff --git a/Reactor.Example/Reactor.Example.csproj b/Reactor.Example/Reactor.Example.csproj index 3dfa164..fa2af94 100644 --- a/Reactor.Example/Reactor.Example.csproj +++ b/Reactor.Example/Reactor.Example.csproj @@ -1,9 +1,5 @@ - net6.0 - latest - embedded - 0.1.0 Example mod using Reactor NuclearPowered diff --git a/Reactor.sln b/Reactor.sln index c9eb616..5733e5d 100644 --- a/Reactor.sln +++ b/Reactor.sln @@ -7,6 +7,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Reactor.Example", "Reactor. EndProject Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Reactor.Shared", "Reactor.Shared\Reactor.Shared.shproj", "{8C1EEFE9-EF8A-47C4-810E-6D9BA1E7218B}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Reactor.Benchmarks", "Reactor.Benchmarks\Reactor.Benchmarks.csproj", "{99B87307-3AEB-4A6A-BF45-871768308FDD}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -25,6 +27,10 @@ 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 EndGlobalSection GlobalSection(NestedProjects) = preSolution EndGlobalSection diff --git a/Reactor/AssetBundleManager.cs b/Reactor/AssetBundleManager.cs new file mode 100644 index 0000000..2c5823f --- /dev/null +++ b/Reactor/AssetBundleManager.cs @@ -0,0 +1,138 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using System.IO; +using System.Linq; +using System.Reflection; +using Il2CppInterop.Runtime.InteropTypes.Arrays; +using MonoMod.Utils; +using Reactor.Extensions; +using UnityEngine; + +namespace Reactor; + +public static class AssetBundleManager +{ + public const string BundleExtension = ".bundle"; + + public static string TargetName { get; } + + static AssetBundleManager() + { + if (PlatformHelper.Is(Platform.Android)) + { + TargetName = "android"; + } + else + { + if (PlatformHelper.Is(Platform.Windows)) + { + TargetName = "win"; + } + else if (PlatformHelper.Is(Platform.Linux)) + { + TargetName = "linux"; + } + else + { + throw new PlatformNotSupportedException(); + } + + if (PlatformHelper.Is(Platform.ARM)) + { + TargetName += Environment.Is64BitProcess ? "-arm64" : "-arm"; + } + else + { + TargetName += Environment.Is64BitProcess ? "-x64" : "-x86"; + } + } + } + + public static string GetFileName(string assetBundleName) => $"{assetBundleName}-{TargetName}{BundleExtension}"; + + private static bool TryFindFile(Assembly assembly, string fileName, [NotNullWhen(true)] out string? path) + { + var pluginDirectoryPath = Path.GetDirectoryName(assembly.Location); + if (pluginDirectoryPath != null) + { + var filePath = Path.Combine(pluginDirectoryPath, fileName); + if (File.Exists(filePath)) + { + path = filePath; + return true; + } + } + + path = null; + return false; + } + + private static bool TryLoadResource(Assembly assembly, string fileName, [NotNullWhen(true)] out Il2CppStructArray? data) + { + var resourceName = assembly.GetManifestResourceNames().SingleOrDefault(n => n.EndsWith(fileName)); + if (resourceName != null) + { + using var stream = assembly.GetManifestResourceStream(resourceName) ?? throw new NullReferenceException("Resource stream was null"); + + var length = (int) stream.Length; + data = new Il2CppStructArray(length); + if (stream.Read(data.ToSpan()) < length) throw new Exception("Failed to read in full"); + + return true; + } + + data = null; + return false; + } + + public static AssetBundle Load(string name) + { + return Load(Assembly.GetCallingAssembly(), name); + } + + public static AssetBundle Load(Assembly assembly, string name) + { + var fileName = GetFileName(name); + + if (TryFindFile(assembly, fileName, out var filePath)) + { + return AssetBundle.LoadFromFile(filePath); + } + + if (TryLoadResource(assembly, fileName, out var data)) + { + return AssetBundle.LoadFromMemory(data); + } + + throw new AssetBundleNotFoundException(name); + } + + public static AssetBundleCreateRequest LoadAsync(string name) + { + return LoadAsync(Assembly.GetCallingAssembly(), name); + } + + public static AssetBundleCreateRequest LoadAsync(Assembly assembly, string name) + { + var fileName = GetFileName(name); + + if (TryFindFile(assembly, fileName, out var filePath)) + { + return AssetBundle.LoadFromFileAsync(filePath); + } + + if (TryLoadResource(assembly, fileName, out var data)) + { + return AssetBundle.LoadFromMemoryAsync(data); + } + + throw new AssetBundleNotFoundException(name); + } +} + +public class AssetBundleNotFoundException : IOException +{ + internal AssetBundleNotFoundException(string name) : base("Couldn't find an assetbundle named " + name) + { + } +} diff --git a/Reactor/Assets/default-android.bundle b/Reactor/Assets/default-android.bundle new file mode 100644 index 0000000000000000000000000000000000000000..c81b505ef4be9c82b9e1d38a6f047cd908033afe GIT binary patch literal 13538 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 literal 0 HcmV?d00001 diff --git a/Reactor/Assets/default.bundle b/Reactor/Assets/default.bundle deleted file mode 100644 index ab3c5b5ce332d0128144a31fca76f41a388c1429..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10091 zcmV-xCzRM#ZfSIRMpFO)000IxE_g0@05UK!IW9CVF*If|000000000dYXATMSO5S3 znE(I)LmmJD0Qvv{00BT?001W806_o%00JBU_ZuCc00004LqS3GE)Wv>wpM zy0+YAq(H7t%2cGrz1kB)cqD1*D;KYQ)oj?#gTHnv0sy6017_R>0GNN5cV zQ9jyDNTqQA-RSU!P^mj(wv_Os6wPt`>$;kx3VHfJX2pntxFvur{|De*q*avr!q+vw zDLn%Y1mzpB01TxV%_u%ca zx$(S;yo<`q3{0Zhr)!vpxp}3-Y&xS_g7TGgRU02JMm1QO-IR?fZUn5-m??f(=jJHR zUvTQ`Ng6lwzYUHJ{ta_8g>3xKGN1r-%v;wt6paFP4)0|$ae@}Ir+TlX^+8cWRRex ziOeX;R@LRO1xKt#%h7=#0wtGlwpi2FGXVL?FV21nr#_gSkgE|zYPhLMNh@E!u$8%D zG&2ppF?{LXUjn#{CNF=gU$koI^K^)cTusNuiEtZC-A`d*zE0;uMy* zr#))-mI+O@r>a@Z@ikm)vTsLKCsyGX{tZZkKW(a4#9(g9|ko>Fj z1I(8&9)$9j{@)VL_k^6NKv%-bOVhOefs)2NRom2AW7hELKVr;f{S&dtTljK{Go~;x zr}Clxy@vme&=i0VYuiAF0k54~Ix$vW6=y*OrtTP|<_3nxeQAd-G**egW|@)p0>E;d z^IjD6kE2%OjzV(2Jk8oX4N7hvmY!SLVj0p*E>t-F(SReh%1|0EJ(Rm87H%5?Y+G<#%GOAc)#Kp}a^n z6tMd~s64<=@;F(`lv?3R1<3i8;!GKKOm8VkRI)z2CUcx7!*j~3ezEw;?ZVo9W|IFx#9l1dZRX}14_d{xYMs2ko&K5qIXzfq+yY+ z&&^pYG{fvg3~ps^Sh9$g?v2yEX@HfAL{F_cRTC1p=jyf7DV*P2Gm_CXfaqULLmG$} zWmX>P$l4XVE9W^9rMf+Lx1Xpfdf_d3D@{(fyIipz6iD?^T4Xl=UzH#Vf~!}u*z&2n z#$LmS-Y1=nRylHs*RKFkDLZKC4ezN(U?4`DQ&l`?QM0r+Pax_a@gU; zIUV|MI5a9B0q43=p~!*#A)S+lGQe+7F~jO@&bJ2(@5O#0_pU`A!xCl}I>O|b+{Ms3 z0<{Jm6|(uN@wq@5Tp$GGnI58*>ZH4@RmQ4}7kv<<+VNsAGuVY>2AD!$umqy!q7az=rO6sV(X!nV|R*V@U6!rO@wJ*Kq+u8<74L3hRoXO+gpbv;LKC#A<)|cROAt> zqGFhAF5H4(o)Lj4Xg{#%Z_*B5%Pn=}1G%QNRw4yxpD<+x&g5ct4Y}W#cDvvMS zN!sMQwrcpfn@@qfki2I1h#!6j5O;nek%(_j#l}4C77T+J3O2db_FMT)+M+hT@b?(V zu2|l|ljH~*9paR~B2|pTTa{vU?A^gL z8tcK?W+kD`Z0WE^mS_1;FY{ipy=!*30PsurYFufnpX__C*`!%ZdgxP`QiuuHgd#X? zA@`_~J=A$l%TR7T)hYEE5gZ?Zb-ji=(%5F;*A)$IIorq1LVz=a*Af%F55n&@v*80L ztN5UwBS5ci6KNsWz>%`NDyv!wW}_nZVJ3NDhH>m)RdpW*n%KEuoyo70_^ABoW1LEg zJDIBbv*{`I>|y#Gy??X6WO9T;f9a}noQJE_#bP%Z-{oJB?MFNS^dc{%0Q8>hLJjR5 z^4W1^QX?M(NA{SRNJcR6?(D@yV&9wF)xmO;pO2Ro1lUVjwzZ>5TZDC3=Ko%CJ|tyj z34p8+g#zGTVX7;EPa*xwO3!NNAQS2x*)TODFkBQ4Yahc)N~vrJPsD@?K>|Z0@lEFl zOXE|T2ak(*OQ3hl@zPqJ@D;h-nG=8=AE>f}K`{YldGu;-0A%9046jVs)l>>a^rFx3 zFI)%KdS$CRY#-zQl*79K+7?N|E=e1cRf z_s#D%h2GfhLuQPjS`J#x?fQVeO;%?`AiGGUK{%xetb@S6*?u0lF&4B23e(!8QTMy3Y=(|uij^LZ>BF6hwzTXr1uH&U_O|0 zRz`eqWQavbt}E{hfGvWC#!|}zOSYv*B2|!j8Gs{>TcK884?k-5XL4$oCvh17fqn(| z$;+LV;cd+C91WMt8AfP4TS@7Go-&MI(xXy@25UmLa1I9$!FIS1FI?=;=OTdb1?QE} znV~uN@l`UUf|zrw!y$Vy(2mXJnHj#e8}zK^^QDebS^y_IJ*`fwck>G#FMy2_Ot3+{ z*E<7qVr|ij$evEhbdg~#Sfd(tCH3BZPU6VULAb^GJ$Vc*KK3k!QP4gjqyh1K$# z0!k40c@-i=oJbLk`p|>G#C_O7QR!n`Ess!<94>@u^)pFXw;Gu}YW_1Qi1>Ey*&9v^ zW+mAt@?N<9AAFI5KIY9-TWVn=JV_IO&Mf(Xf;3a!r$tIMc)31F{m*=x2YvfMaU447 zK7R}x!%_ne9WoNaja5BAFV6Jgv;uMrEu!>qG}_U|><4-->95lHOR1;5Z6>{6=YGB% zQOfBk91f&0;E^7<$rya!sU9jiR0T>j%?ptUpo$uQH-(DU$iUO@bGru0gf%VvOHeKC0_@b&ejLq2F zdl8`>z@q&!nxY&)` zI&dK!d>+88d#A6!6MCbfUR9p*7$;(c@h&qi$xPsJZ=Z{uEa!bEp6Vcb~>xxd@&*ojI+d#*j~Wh=(9f>t6=uXUGGMWerxK2DWq>qObe$xO9CoUhPPpFtDlus#v6^3h{EbBuGoyS3 zgCWHKz_9V1MW#I7V>&VuSJomOwyWhdrs~p$ferye)cbpVH7u{ zkjK`zn=+a{uJ91iNF57G2S;iG9i507rVxPGXSV7FTi$caM?C0nk}`)b6?BGlZ^V)T z9cV^?8+Kd&y`~-TTx|q8ctTO{4K4#DkUgXQX93i?UXlNg5U9;+nj1wYAUTO_y{&ARnmm3e#Y-`;C6}67B ztWZ$sOs4cx8m6mc>{+#F2YYprXPcKV%j`*z?_KRy9T8A3yrWEc6)ipqq%C4LMh@t0ZMlaL0djiv^wl=Tv} zk>_g|}!e`55#9G$cVN0n!VrQQ@gLS!Zy99&l{ zKgUZOZk}(*fJ7M61th)(hbV--bqUQ6?~KMdy85Bpoo>6G&xVFW!-3(ebESO**IxFd zs6%pgKhhttN20`f;*?&Jfi4o}l&-qKXFi`)sV< z)%)74c?9(O!QW(NxOjAda8<~$?qdxKyt>E=i=D0!g29{0@Htc!np9(av+aCyT%u>! z3ClY>cp9{7SxPH+-(X`C16R+t7oF|3jkhnYFzgls%GDm`DAS}*BFom+TWMI(zBo7i ztZ6FqCtMu?7b-Jz)|V)UV1|E%M?u>e6Z{mft$xa_CuELi?pwM)&{F;9dquatR%`Q4 z9klzN0;+8;jw_Yxw05kGkm>|=LPVdmP(7;n6RlGx>02X&r{NdGgd>?LV+LP{ z%aA`^&J$RSP2DLr(7CKT#q9e)ULu9;3U)z2-nv>}h?jk)@U!Ct%1qWtqch$}T!q)y z?v!{qFnl0g4-q1|Mw<>^l_p5yG^{u*ye@xtn%!=1Psu*>Wp)B(VG{vRl>CJE=t|4k zPkq3*X(#U5^~;-Tj@$}86CW`O$r&I^x1tF=s=7C&f&)mKy54vo%cJ~yZb2J{Fc%)M zzI!(Yytyh3?ER+GHjng!)oFa9Oi>72gOtymf@GwG;=o>e6>I?wBqM9P-SiGSsOMAt zCmTCa801fKnGy8z3+#qG1U+}DJB2mYB!b};GP!$IaD4Pf;3by4K5GhxJkNsYU8&Ho z1?iPSkW<3&D(ngX=PpO-Tjyl23KPJ^b>Q3ga(hzs-SAX?W97AG8xi=U%C zeOzE4?;5;S-c1QU_vIy>TI=M3!AOu_&+@Km!iIxl81IT*;3^K^Pee=I09aV~ZttfL z+#k1-Aq-jZ96<*e!$|oeI_s7+HP1Uf(4uNH--p_T=eCK-<9RK+Iz6Le{z*B70{Y4q z5Fb;2|gMun(wO zFW9!NOar%h8T34`V+yOChNcsVi=fv7LCSZO{sm)KuK7{~ayG%U;IKjFs8spdc%L_M z7qW7{!uzW#UOYX-nOn;uwzxBv$N;?irTi=cfMFyTq1WC-Gh>1?V-mfwvkS@%Pu;G> z!l>19vv@BbawnSl1BW*+gMd?3PR!m{0YErZ3IR+mB`R^Rl9axlS{Re(G<&4Nb1hIz z1s=V6+m+rt_tVfF9T|D>-&JYR*OZoc7C$aEWaH8 zm1Fe-CYyx9Z(8_}li$V>2W?x!1QFV@C~JLuNp#n8ctJHSe&KKcieIyS`KORYVHmz-`R_Eg6+9=CQf_3I_MtMdaVy}{o zH!p8BCX#93P5wC*1|{MME|wX2d;TD`^0v?#W#-Jm@g=U$iX}GrCQB9+=5lAS<;pXgM!Zp60l%z zOj!ylsmME2A>5;-AcHIfR=da25dvrQX`zQOZwvy-{RCsV*lGYd=i!H91B;rnvUJtI zzyZWn@~)Tw=ONk&QSQ)VHkf-7@3$H*m&Q$Kj$K=U2u)WxhJ-_Y1Z2HV?*sV zfnyl{iS!ph*aF_d*ZTK2A*4C{$;Y!sA26E2ciT2SaEOKK5dz6nVJfpazYO=c64cQh zu#YcY6VJANU_Aq@MU!J-)tntejxOwN}ki3Q@FWBnYv-;;rJeGVjvREzUkId`?xRA^cQ;QtTAnY z7hSPUN&Wa?2-uJO;8e*9BTr$cIPiy{$i!W4N#AkJ246n0Z;DOe*0=+cQg(O~(ArE+ zOz207GR3`QU!T2|7q?W7Th-@aIRR&2!g-VEMZ>NuC=3Wmar@Vu!5Rlmox=?68h`o5BUZTrVh+494dW z>6XM&V!fa!)YU4uv^BQ9HXu2bAvC{)e&4FEd7$U;LB9#dYBL0S3 z=oG`}f08(6fWSXXve{d8jd$vxbXwEc)}3d%pZHjeoM4H|9d%o?1%mzN<;cY#D9wm( z4Ungf<_BEEjthhyS0!+WSoRx7yZ6_S^-O~UlAF^@KUCN9@BbKIQ?wKS*E$KNkWZf!GQNp8-@_ZXSX?e*^-Wx(;Z&b7kGp&IN(i{DYh}Az|q=m2Fu*#^30a? zHq6$ynEiD@d}{)+xPD2I3KvknD^tf*HZYPuL;D4_INxMLDPNOqFgI~IgX+A_=dOM> zQ8#IOOoO2Bpgg`j^{38lm5#CwMX^8dYfJSPc4BXn8y1a@8VM>ijdb(jXq0-WhRTd{ zS3_>)RA!w{aNTP)djDQ*?J#K#u8xhw-9WB+9eY-zw)-F2`1PtTIx}x36A1ovTU{fP zyBPapB(`|7lVpjd%rpg+%UVObf1s@Ob95RqQ!JCYW_S~4jod$V0|UDn4CSd`iFg)< zVN-+^LxOu8d!UGU(Jwg0BIq>}7gQ_ZdO~N2+*QkP%e3SuVJ^lao}llaxKp>GO_ZpP zY-s$!Nycap?7NQVsi@V78nE`MODmxzArBJvADH+L&-j>;%tAe0aqB5Orkb(O*5S{RP z20Pi6rp81lGpa*QNu#^bXm(&HcOUR4=dE;VZ$lu)pbVLbSd0DJ%`W+2^FGwvZm1#< z!ZNk@T!WZdj&o)x@_tTNNb3+Ha$^2YTjFGY%%Ruq^S z-TEIGqGHXF)&dxlMqSL$QOWsI+$rq!vF%ahfv_5;a%_?<$rW~S1C`~mh95dbM`rNq zKjfSbW@VXKrF_wSIH~;G@T~729s-EpWltpKlRwQ|Tsl1@zo}u$E(A>urJ7j)Q8oy- z6Gb#rF5s$bmTMEaXg@dre|H3d-M(+HuS=c{KW!wnSM8%OCZ52vWZ&a;Wg`qb-DzH~Z|O^a=8 zf3jytJ*j_YSkN!=JQr?`-1DQ#k{TS~)P?xI_7Fr8OKYwf$L{jXBn_0;Irs=++W32Z zJ`k`9u$Rg)k>v<$6=(#!_BCwz!iW7L#A3xG`hDQvCAEx>Yu!zh;Ong{Csi~r%JOyT za#_o5iQPruyg=3D|b@!j8TO2d->PX`@t;hZ}!pk>^d-*3$YMK)}#rhQ;heIs4rw%X4@efw<7$j0= zaJC((3Z6z(B~=ezg#Q!d5V-&Kt@Y=c}6J8+OY0yIF5V@-)Jd zKy%}uGj?PAH@44gW*)w+o41UV%5>vtvHX`#UQi?Rwfa%;b&7!l!Ul~Li=)MXdV@g z^KovQJ|%RrSiBO$Q#}Z#roJ_Q#$#mRUgZImW!?7cBBqJ#}$}dqzpMu=ZeiS%VjxM=nym>}hX``00 zUso4>&lBK&snFUw4W1*KRyLv5lO2D#q=ZE%q)~z2e`C*{Mse%4e&9%QgJ2u30GPys zjV_y4TgSJ!PG7&6*gN!MuZCB4koQWq}i+bnj*CcsaNKH9i^(9ZY5gtI){_i19I5CBQJkOr1 z`nHqgy(*0gPgzzUPfd&Ji=sX(?v7t2^8c5Kjhy98hKB0QDHf&dxxGuN$i)W04xEqH zR6{Fz?LJ1|fjoEOh-5nyZIm7i=6NbrDtuRjx4U}O1Qbn2cL~W;B>xjb{>HjYP%y=} ziEmqLEVtY3#(M+{tcMPz6~n77ZUb?|pM(+mY--c5BpEsq@_f`wxdmy#$uQ?8no#`$ zARXMvIVC_8gZ(eygjKm^Ce{jvrP5&NARAfG8(k^H#sC++%^-5MH6R=7yF&5E8#3i! zi|#5YNj%H=2Qm57r_z6#kh-$qH{V#Z+SGe<+0L6?nZO_2=x;>&=ato=V61*BLH6S9 z--C!N;V^kghoCjO{n;X^{~9L0M`GA!b*mEm8oYD;+>h&3h|Z1Zbuu>A82#0lyGoak zg3f!o3^LZV0am7h9#ie_d_s$sN^b1|Qk3mTLFeFLY2^2i&90+V{EHBmney@!p`>q!bVnT@C%DYR zvL)OMw~A`)uUzB|bHejcN_t$>YEo`cFPS|T4M?apZN|Lp0;skQFtb+_KJdg99BjEx zCD2;g)jH#1kcyyLFU13|(fe~$w*|Uzt;QAIe}BswJf)9C8!Z^rKT^*6ke6z_58G!O zGocd5I9=d)2TG9B+ZN?_aZ;*(0r#-{qT}j;8#WM)Z*O&q0A8BfNeW{4D7zT{?FJS{ zJzIx&kUG53N~TRf`Z*Ss?1$tl`UenNfzxx5wx$B@lfM(#Ot7Y(xn)`EI*>T|E4r24 z)7Dm;J5|$ zrCJcdyMn`~5Xr7Y&BO#)Lg?ljj(qQ7s6y~2lgf$h@i(0~+lnd-wPD(dZ-I~#Z;GeE zso<4iO3F5-_woJsf_x8GgZmOQfpkP*(uR(@&av5>Vw{CB^pjz$SwOkKfcXJh(5Am% zc9W2ll+X@B|2GO?CFxFL^(F&_(Pj2NvAQK(VKeS^3uQJZU`WgvXte#mX){AR^r+?g zaLGYSMLO0|^O#IV3g>4D8w+6WuuGJ*iKr7e54%z+G=3>2F8+4f!%!8oND}0cp(#=t*V8Tii4JMej$Zc2w$r! ze!>K>Lvnxh%BZL@BszT#9^2g0%HOy+gRDUgRy&$h`({FRFUyQ+_fIE;jRDX!0VRJ< z4dgR32$oD+ZEgnWH|tjDrvNXC z{gii~Js4B47=lAQ0vU3bW7mHc&jC7LuF$q%eM#jvb=qpK^6wqN)7}I_*}i+=EGwkd)4|1tW> z??^L<)lj3Sgm5r6=@YN2N2YB91Q*;71w%;5LMi|^B9EL$qxel<{uEu8diC=ufD%gD zr*y(%a_pB&-QuezU9@*N6pr~7AWUb)F2zht@YEl*lMC&_MDw&7;4SUUuE>qAi>}W8 zozP&y)wV@SlpkE?6dob$S$3Y$TlBi&c%I)Ge0Mtye$No_cp^kQNih{nYeX=ANS1l& zStZ=6GI2uek>`YQLA}rV)^9J%ysBV_&72L(3aA~>B5TYz^l+<*nM4uo2iI$qWTJMH NxEVLEjQ`T}y}Ey;O&|aO diff --git a/Reactor/Extensions/Extensions.cs b/Reactor/Extensions/Extensions.cs index 9f936e5..5cfa593 100644 --- a/Reactor/Extensions/Extensions.cs +++ b/Reactor/Extensions/Extensions.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Reflection; using System.Threading.Tasks; using HarmonyLib; +using Il2CppInterop.Runtime.InteropTypes.Arrays; using UnityEngine; using UnityEngine.Events; using UnityEngine.Networking; @@ -119,4 +120,9 @@ public static class Extensions { return assetBundle.LoadAsset(name, Il2CppType.Of())?.Cast(); } + + public static unsafe Span ToSpan(this Il2CppStructArray array) where T : unmanaged + { + return new Span(IntPtr.Add(array.Pointer, IntPtr.Size * 4).ToPointer(), array.Length); + } } diff --git a/Reactor/IsExternalInit.cs b/Reactor/IsExternalInit.cs deleted file mode 100644 index 80fb6dd..0000000 --- a/Reactor/IsExternalInit.cs +++ /dev/null @@ -1,10 +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 -{ -} diff --git a/Reactor/Unstrip/DefaultBundle.cs b/Reactor/Unstrip/DefaultBundle.cs index d2549a3..64573bc 100644 --- a/Reactor/Unstrip/DefaultBundle.cs +++ b/Reactor/Unstrip/DefaultBundle.cs @@ -8,8 +8,7 @@ internal static class DefaultBundle { public static void Load() { - using var stream = typeof(ReactorPlugin).Assembly.GetManifestResourceStream("Reactor.Assets.default.bundle")!; - var bundle = AssetBundle.LoadFromStream(stream.AsIl2Cpp()); + var bundle = AssetBundleManager.Load("default"); var backupShader = bundle.LoadAsset("UI-Default"); diff --git a/Reactor/Unstrip/IsUnmanagedAttribute.cs b/Reactor/Unstrip/IsUnmanagedAttribute.cs new file mode 100644 index 0000000..5ae4326 --- /dev/null +++ b/Reactor/Unstrip/IsUnmanagedAttribute.cs @@ -0,0 +1,7 @@ +// ReSharper disable CheckNamespace + +namespace System.Runtime.CompilerServices; + +public class IsUnmanagedAttribute : Attribute +{ +}