From bb69bbddfdf63ee2876e8874fef5d268fcff4d0e Mon Sep 17 00:00:00 2001 From: Daemon Date: Sun, 14 Mar 2021 12:27:47 +0000 Subject: [PATCH 1/5] Revert "Modified mod to remove Reactor as a dependency" --- INSTALLATION.md | 21 ++++++++++++-- README.md | 12 ++++++-- Unify/Patches/Regions.cs | 30 ++++++++------------ Unify/Unify.cs | 6 +++- Unify/Unify.csproj | 57 ++++++++++++++++---------------------- build/Unify-2021.3.5s.dll | Bin 6656 -> 6656 bytes 6 files changed, 67 insertions(+), 59 deletions(-) diff --git a/INSTALLATION.md b/INSTALLATION.md index 384ace7..982a285 100644 --- a/INSTALLATION.md +++ b/INSTALLATION.md @@ -3,6 +3,7 @@ # Table of Contents - [Locating the Among Us game files directory](#locating-the-among-us-game-files-directory) - [Installing BepInEx](#installing-bepinex) +- [Installing Reactor](#installing-reactor) ## Locating the Among Us game files directory @@ -34,9 +35,9 @@ library then selecting `Manage > Browse local files`. └── winhttp.dll ``` -3. Launch the game so that BepInEx can generate the necessary files - (this may take a while), then close the game after. The Among Us game - files should now look something like this: +3. Launch the game so that BepInEx can generate the necessary files, + then close the game after. The Among Us game files should now look + something like this: ``` . @@ -60,3 +61,17 @@ library then selecting `Manage > Browse local files`. ├── UnityPlayer.dll └── winhttp.dll ``` + +## Installing Reactor + +1. Go to the + [Reactor CI](https://github.com/NuclearPowered/Reactor/actions) + page. +2. Click on the top workflow run. +3. Download the `Reactor.dll` artifact. +4. Move the `Reactor.dll` file to the + `(Among Us game files)/BepInEx/plugins` folder. +5. Launch the game. The top left of the game menu should look + something like this: + +![Mod text](images/ModText.jpg) \ No newline at end of file diff --git a/README.md b/README.md index 6bfd912..0838c9b 100644 --- a/README.md +++ b/README.md @@ -22,11 +22,17 @@ The following regions have been added: > **⚠ WARNING** > -> This mod only has compiled releases for the steam release of the game. +> This mod is only compatible with the steam release of the game. -> This mod requires you to have BepInEx installed. You can install BepInEx by following [this guide](INSTALLATION.md). +> This mod requires you to have BepInEx and Reactor installed. You can install BepInEx and Reactor by following [this guide](INSTALLATION.md) or by following the steps on the +> following two pages: https://docs.reactor.gg/docs/basic/install_bepinex and https://docs.reactor.gg/docs/basic/install_reactor. -1. Ensure that BepInEx is installed (more information above). +> If you are still using 2020.12.9s and Reactor fails to load, try using the Reactor version located +> here: https://github.com/NuclearPowered/Reactor/actions/runs/593649307. + +> If you are using 2021.3.5s and Reactor fails to load, ensure you have the latest version of Reactor installed. + +1. Ensure that BepInEx and Reactor are installed (more information above). 2. Download the latest mod on the [releases](https://github.com/DaemonBeast/Unify/releases) page. 3. Move the mod to the `(Among Us game files)/BepInEx/plugins` folder. 4. Launch the game. diff --git a/Unify/Patches/Regions.cs b/Unify/Patches/Regions.cs index 49af462..d34e04f 100644 --- a/Unify/Patches/Regions.cs +++ b/Unify/Patches/Regions.cs @@ -1,7 +1,5 @@ using System.Collections.Generic; using BepInEx.Configuration; -using HarmonyLib; -using UnityEngine; using Array = System.Array; using String = System.String; @@ -9,15 +7,23 @@ namespace Unify.Patches { public static class RegionsPatch { - private static readonly IRegionInfo[] NewRegions = new IRegionInfo[] + private static IRegionInfo[] _newRegions = new IRegionInfo[] { new DnsRegionInfo("192.241.154.115", "skeld.net", StringNames.NoTranslation, "192.241.154.115") .Duplicate(), new DnsRegionInfo("localhost", "localhost", StringNames.NoTranslation, "127.0.0.1") .Duplicate() }; - private static readonly IRegionInfo[] CustomRegions = MergeRegions(NewRegions, LoadCustomUserRegions()); - private static readonly IRegionInfo[] PatchedRegions = MergeRegions(ServerManager.DefaultRegions, CustomRegions); + private static IRegionInfo[] _customRegions = MergeRegions(_newRegions, LoadCustomUserRegions()); + + public static void Patch() + { + IRegionInfo[] patchedRegions = MergeRegions(ServerManager.DefaultRegions, _customRegions); + + ServerManager.DefaultRegions = patchedRegions; + ServerManager.Instance.AvailableRegions = patchedRegions; + ServerManager.Instance.SaveServers(); + } private static IRegionInfo[] MergeRegions(IRegionInfo[] oldRegions, IRegionInfo[] newRegions) { @@ -50,19 +56,5 @@ namespace Unify.Patches return customRegions.ToArray(); } - - [HarmonyPatch(typeof(ServerManager), nameof(ServerManager.Awake))] - public static class AddRegionsPatch - { - public static void Prefix(ServerManager __instance) - { - ServerManager.DefaultRegions = PatchedRegions; - - // ServerManager.AvailableRegions - __instance.JIJNOHCGPHM = PatchedRegions; - - __instance.SaveServers(); - } - } } } \ No newline at end of file diff --git a/Unify/Unify.cs b/Unify/Unify.cs index 8d2325b..ab05b09 100644 --- a/Unify/Unify.cs +++ b/Unify/Unify.cs @@ -3,17 +3,19 @@ using BepInEx; using BepInEx.Configuration; using BepInEx.IL2CPP; using HarmonyLib; +using Reactor; using Unify.Patches; namespace Unify { [BepInPlugin(Id, Name, Version)] [BepInProcess("Among Us.exe")] + [BepInDependency(ReactorPlugin.Id)] public class UnifyPlugin : BasePlugin { public const string Id = "daemon.unify.reactor"; private const string Name = "Unify"; - private const string Version = "2.0.2"; + private const string Version = "2.0.1"; public static readonly ConfigFile ConfigFile = new ConfigFile(Path.Combine(Paths.ConfigPath, $"{UnifyPlugin.Id}.cfg"), true); @@ -22,6 +24,8 @@ namespace Unify public override void Load() { + RegionsPatch.Patch(); + Harmony.PatchAll(); } } diff --git a/Unify/Unify.csproj b/Unify/Unify.csproj index 281e31b..2b16178 100644 --- a/Unify/Unify.csproj +++ b/Unify/Unify.csproj @@ -1,45 +1,36 @@ netstandard2.1 - 2.0.2 - 2021.3.5s + 2.0.1 + NuclearPowered/Mappings:0.2.0 - Region mod + Region mod for Reactor Daemon - - - $(AssemblyName)-$(GameVersion) + + + 2021.3.5s + $(DefineConstants);STEAM - + + + 2021.11.17i + $(DefineConstants);ITCH + + - - ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\core\0Harmony.dll - - - ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Assembly-CSharp.dll - - - ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\core\BepInEx.Core.dll - - - ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\core\BepInEx.IL2CPP.dll - - - ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Il2Cppmscorlib.dll - - - ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\core\UnhollowerBaseLib.dll - - - ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unity-libs\UnityEngine.dll - - - ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.CoreModule.dll - + - - + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + \ No newline at end of file diff --git a/build/Unify-2021.3.5s.dll b/build/Unify-2021.3.5s.dll index a76515a2334158984ac2feafb571c486351f9072..f9e2d5052bb98b54444bb5c7b72cf20dc78cb322 100644 GIT binary patch delta 2575 zcmZuze{2-T75-*+Z|`o;UVJ}oW1H^bf)5)GpCLhrl9(TIa3WfRV*(Ns4*PIj8=rG$ zDKaR&ONF996@;}BX(W^;@JD{AN*W=NMs=hRwN0Wzo2qKkN~NU=Q5u0LO%)Z2TKAh- z6Z%KTx8J_^y*F>(yqO(Ob#-<1iKjaM-1W}0m~WRM(-F}L#7I~^=}?91%Ro0~ezL`x zT?u?kQQiC*GwFEEKA?vB3p6x)X}R3nCE7&7dxF^Qy&@iIyg`d(7hPgR|^R5 z@3A#rpA1!cG64=MGlE!@fZhIWS)wvgHmE#KqbW0{;>VSzUFx7M!z}Ika*$Z1&1?ta zof7Lf3cE%#5gIbg%$}x;sk|-Q%5Ype<0x1_@b&&;-5sJBrPR(q0kq8rlE+7k<0Ctt zW+-7xi)w~7vW=7yY01P@AivK`dWwja6W*U>qm^QpOw#+eTwL)*dX}DJ?xi0R5=G|O zQ5!DSlg=~{R&@AENK@`r&fX`=jml*qA#Pexv)Du_Sidt8Y`Xv8+}xa1Y$l;n2x31| zP_02Hyd+h6QH|Gso~Q$A{cgO|OX^F%QyvO@htDbfk3*G}Gp7|~SV&73vZ_kz<;=E9 zA4}gl4b1Y*wMA?HWNBo4xU5o`4HG!W)`5P^+5oGJ)&~Z9H}idg`ZHYW){SGuJ1MJ` zf28GfI2@wGzr-q}ex|x(DIb;s92Ck#KfOBSypPRfg~Mt;WmEpZb?Lty%*n&BkrwSn z3^&YE+}eF&*07N@-!?5=mXFeE8*iI7PLi>4k=TX+XJg@2^QKH;h{L3CoVXA<93u*1 z3S4$9QhbFkO(7Kr!#io6^R1quoehLWjGh{j+kGK2?pQ;uYgD z{895K#mnq9EW2s_LMV)C`E@N{(D+TwR47-}jCU(wX6mmFDdUnE(DDexKnfJEpa-nds5y!o(%>dH)7`qU~wD}ov6|v7%@tzD_GY>G%PObd{zrr4B-}P+` zrwpZiucFnNhSNrs>I+&si4UdH{_5MX)Ep23&1taBV59l2Fz}(T>3*Cxy_;BeiHezq z3f+iLrNUFjD8iaqhL7X~7a=DmndT|u5Y`eaN3lUW^%CF52zHuZ@JM>Ylp;Y)iV=*O zY0->?=n_X!z#1~g%sqGxH_Z(~;e+Dq?7IhV;fy&gqPT%0VmY3d&x^Mp#2N7ctuGUM z#2fVdEzS{tZqAB7s1YmTFS_&R#4p7y;wU@mtTje8Hfl_3T&6Ln(Sga$1DaA3w)^!JQLXJ z)MuyKTJOlCznd^__N13;)kg2bg!W@sgHS;2AYU z?^xHSiHQxRQhsVBL-ie&^o~+s3xw$Y=7#}K(4^H)r<$0v_HqLYPzP2 zSgq*_;jn;C0Mc=sfGdR~sS7hhtK}Mktk)cE6*;dvny6UHA-b$yz!@ISmJ0d7$zmy+ zpBVAi$h2Bwxj;}5xtPh=S`o`x$=G_nA`mTcQtNqQkWv;>N{EAoFn9V_{u@N>9xfDF zrl;B75ch0sYbCZdWFtT+#9t@^$&vhDG8jn4wlQib85-{i&)rGCDb3Uu!e*uh4umk`A delta 2775 zcmZuze{56N75?sf&(F?F;>6Ff6Mpsum&Sy|bsT=K%4ibClCe;S5DFc%b&>}dj2-My z8X;msVH%^fgjcm?VxV^G25MC_MWRfa)a{>2sBCMQy1}HWLrjxst1(SfqEof(yUzjk z$8LPTd%kndJ@?*of8>>xl$MColE* zU!(2`$sPxi>SSZE>RF(Q{L-Vq2B%SJaW;!4@lWRBNehxgsX(3Q(pwb9eu6U7A zCS=(BR*vPZ-}K^q#)-~ydesH`jJQV)Z<<5@=v+eU;)R;VTAed|KggRUZj3e|AxhAr z%#L32O4=v~VqT32m%0WY4b4BAkWDlq?GF=_2Rye>^4udtr$cKh#<}Lm1aO*d6(d9j z#`5Xx_JW+&xe5YP8yOtHIfG|`H1h4i-qma`kzZj3BVC!?5Vme$R#ec2e~Wf7 z|LhLV0}KyN%B@Tl(+{w9Zfc>Tv`IfM&uyg)+)&D`&aJ(y>KJx$ow%sh;1;{;7#GJB z9p6zpX#GS;yyN0Y7caQj=30j+8}O=EH3M&JS2aJrRz_f88cnKRM7y}Gn)q5f!l3VK zUn*gw+yQP<*724iF^CiF&?Y;eUPzx~^fB=(f3@B8j*{X$@q%Ra!nj4WW6Z4IZ2T#>*5 zmrgdERX5W0beSQcJw^7>4C~Xj2^EJM!BX~AQMo{}SMg^pLz~>dCazY&D@1`ioc1YI zAVAbHi)dgGv6h*XxRO|`MW;)8UF>&pvx_Mg)5H+=xbjh=j_bs^n8Y=1%%rOycl9@L zS&85lYD5zbQqzj_&^#+$?Ba_h`~Cu#w4Jnmgi+Mtpz^~aRX6Z5ggB+XLR=)y&~*ww zA>Po=<6{hK7cdteXurY3#6ME=oOYAA4*wvY<<9$gz!l-=7A+=LVVSVF&x@59DzQ(* zczR02IXFv<;2d!=J|(u}b5V@pG2A8ThL0WAB19a3Mf@JI8^eebcVVOQ0-uZ>${TLz zcAg1^DFzR2UPwu$=VAO3zk^nCZ=<}CGv#O8o3eLV@fALC1>U(O6y(*GWv+YY22o?UvSBOx#27t{AGbyKHVCKL`QF7j? z7*U^jChdd_OWiO&I@NBR6!o1WBkS$$>0GvuOpOiiKu;>aJC_}Iu2e>h)QB`RMKN)tdE3PuU#xj=>($RbHr_f1%@V?=S`Z!zfqZv`@KEsa=L>l~A#9 z{0}AIaYfW0f+ncvLvi9Dwd@9poCHD?x(!*=*@eR3McD5tC zHwvnUgDyLi8o&osw6giZiS-d8h9cIWK;#xE~~=G>)3inZWF#G_N06 zJuq=>+N6aG9) From fbc17511721dadb20018668995f7b9b30d32f9db Mon Sep 17 00:00:00 2001 From: Daemon Date: Thu, 18 Mar 2021 09:29:37 +0000 Subject: [PATCH 2/5] Removed outdated notice --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index 0838c9b..4cfc7d2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,3 @@ -> The 2021.3.5s release of this mod requires you to compile an in-development version of Impostor -> [here](https://github.com/Impostor/Impostor/tree/2021.3.5) if you want to host a local server. - # Unify An Among Us mod to add extra regions to the regions menu. From 26142c72d4da11038081e40c57de17a65c9e4a0c Mon Sep 17 00:00:00 2001 From: Daemon Date: Tue, 30 Mar 2021 21:15:08 +0100 Subject: [PATCH 3/5] Added direct connect in regions menu --- Unify/Patches/Regions.cs | 89 +++++++++++++++++++++++++++++++++++++- Unify/Unify.cs | 44 ++++++++++++++++++- build/Unify-2021.3.5s.dll | Bin 7680 -> 10752 bytes 3 files changed, 130 insertions(+), 3 deletions(-) diff --git a/Unify/Patches/Regions.cs b/Unify/Patches/Regions.cs index 1dd98a8..c7c0ee9 100644 --- a/Unify/Patches/Regions.cs +++ b/Unify/Patches/Regions.cs @@ -1,10 +1,13 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using BepInEx.Configuration; using HarmonyLib; using Hazel.Udp; using Reactor; -using Array = System.Array; +using UnityEngine; +using UnityEngine.UI; +using Object = UnityEngine.Object; using String = System.String; namespace Unify.Patches @@ -12,6 +15,7 @@ namespace Unify.Patches public static class RegionsPatch { private static IRegionInfo[] _oldRegions = ServerManager.DefaultRegions; + private static IRegionInfo[] _newRegions = new IRegionInfo[] { new DnsRegionInfo("192.241.154.115", "skeld.net", StringNames.NoTranslation, "192.241.154.115") @@ -24,10 +28,15 @@ namespace Unify.Patches public static List ModRegions = new List(); + public static IRegionInfo DirectRegion; + + private static TextBox directConnect; + public static void Patch() { IRegionInfo[] customRegions = UnifyPlugin.MergeRegions(_newRegions, ModRegions.ToArray()); customRegions = UnifyPlugin.MergeRegions(customRegions, LoadCustomUserRegions()); + if (DirectRegion != null) customRegions = customRegions.AddToArray(DirectRegion); IRegionInfo[] patchedRegions = UnifyPlugin.MergeRegions(_oldRegions, customRegions); ServerManager.DefaultRegions = patchedRegions; @@ -57,6 +66,82 @@ namespace Unify.Patches return customRegions.ToArray(); } + + private static void UpdateRegion() + { + RegionMenu regionMenu = GameObject.Find("RegionMenu").GetComponent(); + + IRegionInfo newRegion = UnifyPlugin.SetDirectRegion(directConnect.text); + + regionMenu.ChooseOption(newRegion); + regionMenu.Close(); + } + + [HarmonyPatch(typeof(NameTextBehaviour), nameof(NameTextBehaviour.Start))] + public static class DirectConnectButtonPatch + { + public static void Postfix() + { + if (directConnect) return; + + JoinGameButton joinGameButton = DestroyableSingleton.Instance; + RegionMenu regionMenu = DestroyableSingleton.Instance; + + directConnect = Object.Instantiate(joinGameButton.GameIdText, regionMenu.transform); + directConnect.gameObject.SetActive(false); + directConnect.SetText(""); + directConnect.IpMode = true; + directConnect.characterLimit = 15; + directConnect.ClearOnFocus = false; + + directConnect.OnEnter = new Button.ButtonClickedEvent(); + directConnect.OnEnter.AddListener((Action) UpdateRegion); + + float offset = (float) 0.5 * ServerManager.DefaultRegions.Length; + directConnect.transform.localPosition = new Vector3(0, 2 - offset, -100); + } + } + + [HarmonyPatch(typeof(JoinGameButton), nameof(JoinGameButton.OnClick))] + public static class DirectConnectEnterButtonPatch + { + public static bool Prefix(JoinGameButton __instance) + { + GameObject regionMenuGameObject = GameObject.Find("RegionMenu"); + if (!regionMenuGameObject) return true; + + UpdateRegion(); + + return false; + } + } + + [HarmonyPatch(typeof(RegionMenu), nameof(RegionMenu.Open))] + public static class ShowDirectConnectPatch + { + public static void Postfix() + { + directConnect.gameObject.SetActive(true); + } + } + + [HarmonyPatch(typeof(RegionMenu), nameof(RegionMenu.Close))] + public static class HideDirectConnectPatch + { + public static void Postfix() + { + directConnect.gameObject.SetActive(false); + } + } + + [HarmonyPatch(typeof(ServerManager), nameof(ServerManager.SaveServers))] + public static class HideDirectConnectOnSelectPatch + { + public static void Postfix() + { + directConnect.gameObject.SetActive(false); + } + } } [HarmonyPatch(typeof(UdpConnection), nameof(UdpConnection.HandleSend))] diff --git a/Unify/Unify.cs b/Unify/Unify.cs index 7968ec0..9352f49 100644 --- a/Unify/Unify.cs +++ b/Unify/Unify.cs @@ -1,8 +1,11 @@ using System; using System.IO; +using System.Linq; +using System.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using BepInEx.IL2CPP; +using BepInEx.Logging; using HarmonyLib; using Reactor; using Unify.Patches; @@ -45,13 +48,52 @@ namespace Unify return patchedRegions; } - public static void AddRegion(string name, string ip) + public static IRegionInfo AddRegion(string name, string ip) { + if (Uri.CheckHostName(ip) != UriHostNameType.IPv4) return ServerManager.Instance.CurrentRegion; + + IRegionInfo existingRegion = + ServerManager.DefaultRegions.ToArray().FirstOrDefault(region => region.PingServer == ip); + if (existingRegion != null) return existingRegion; + IRegionInfo newRegion = new DnsRegionInfo(ip, name, StringNames.NoTranslation, ip) .Cast(); RegionsPatch.ModRegions.Add(newRegion); RegionsPatch.Patch(); + + return newRegion; + } + + public static IRegionInfo SetDirectRegion(string ip) + { + if (Uri.CheckHostName(ip) != UriHostNameType.IPv4) return ServerManager.Instance.CurrentRegion; + + IRegionInfo newRegion = new DnsRegionInfo(ip, ip, StringNames.NoTranslation, ip) + .Cast(); + + RegionsPatch.DirectRegion = newRegion; + RegionsPatch.Patch(); + + return newRegion; + } + + public static void SetRegionIp(string ip) + { + IRegionInfo existingRegion = + ServerManager.DefaultRegions.ToArray().FirstOrDefault(region => region.PingServer == ip); + if (existingRegion != null) return; + + RegionMenu regionMenu = DestroyableSingleton.Instance; + IRegionInfo newRegion = AddRegion(ip, ip); + + // ChatLanguageButton lastRegionButton = regionMenu.ButtonPool.activeChildren[^1].Cast(); + + // regionMenu.ChooseOption(ServerManager.DefaultRegions[^1]); + // regionMenu.ButtonPool.activeChildren[^1].Cast().Button.ReceiveClickDown(); + // lastRegionButton.gameObject.SetActive(true); + // lastRegionButton.Button.OnClick.Invoke(); + regionMenu.ChooseOption(newRegion); } } } \ No newline at end of file diff --git a/build/Unify-2021.3.5s.dll b/build/Unify-2021.3.5s.dll index 6fe6567741dd663edcf8047caec0d859ec6e8c46..24f825017a1ba6450c789225c8697ed1605c07eb 100644 GIT binary patch literal 10752 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 delta 2965 zcmZuz32ao?6+QQFGaloQXUvQjY%*iB3^rKC7z%LMt{ao%S+Cj;Z6y!mQRzWWI#lwoj z;s)a7go2)`nAB61l=>#)XGzB8XOODVmXdw$L{UX!$m2Wyy!#c&Mvp@X{ zTGGEFOiQu04O2+`zq~7o_raIElA;uS1mZIY^BW3^Uz>E53x=DeF0-6q*3y+`_+sDm zyL)fkxZ&uDtE_!^f=Q|tzeBl=5^`$#l}EW;GAok)P{q#^w12JMbbo4AdAdkQP*5P$ zP`Z^+k= zf-*Z+t`7A z?xj-N>h9gx-o|&1dd~D*e|eT=!M|l8A|oIfJaTHe!KA?rspSQHGeeY3=!!S_a9e9x z@f8QSXsSLSg!j!8^z)=Fv?8c?&hs4qLEf{f(8~Z0#2GWIkUc=93YDBdE#8#V?6@D7 zIBbzUZaaA0%)`YJoU>efVV<)B=)pqELE0QM1NhJ!w*xp&W&l2C++K%S^yA`RqWB#| z2bb(Ivlbh0no(ZTv0_Yaww7n3H>-2`CX~A^)3t)*R-GI#wPZbnC-M5Hx$06aihkx#?Lj*BC0B7A5q9a>aP^0 zRqohY9+Fag*DSWT!Ve#mc0g;ztj*VRA9FD_}zztJqBJlW!n~BH6(k ztj*pnLA*eWV7;A^^-&e?uz$AG%Q%~|TKzTthAygmv~~?71pPH0oD3tZbvT02}Z zY<2M(8rNFB;tlI6wFgyAaSSh;N*mT%9zFJ_VxxyU9GGNY)7mlo-B!%zI(3b4;8m@v zI;`Rf8hDW?cuti3xD|s6T8R;}3k%Tf?AJJirL;eXcKq3XiMRhhah9B6YXn7_zZtKX zqv*sbxyU*UTW@0;R?B7V#WwjXs?lct15akz0mnJ8=XXG;Y?|sWGW>uf_u!hctRS z+^Xy{dEID4tGq${s*Dpm2wh|A@ZsH-?M|_&tibL>8E1t%D zqQ_ac;skG!L!8xG;|gzu9;}cCX*AL}j&I4Z7+fmwg#U+&C0TBjpW$76g2VE>{6(&d zl~b#zD3h(6SJkZ+!5rO9Gn=}oRC{G&Na0#3*v{!gb35;Z?lKrx4bU43sL>pgM@M*S z3+*XA_;%Zc3GWuKjmdUe3%BzMW3__`S^&S%QVD*{jd)q^>^P7aNc1*7km%l%*f~HNee`uFceN!l zJJZR2ZD}t!Xz%Mzp{*}-Q}eDz8oll1*S!9U%EhZw>E6x(tb1rT9U;}fy}h@8PjY8+ z0Ii*w0jx~)xA(2ukM-$9capDEW>yuZlra^My@~n`IY8BuDo#h)r)6KK3L(+oPK{TRQ1#*v6Nv3Tz3XS2h6}d;;Mwi<%MG~bucQwzJ-Vk{AeLCLn^rp zRurMI8HHO?Duxjbv~u From c7af5d5c9cf7e5e3ce7e04a0ccc99d8e7b899416 Mon Sep 17 00:00:00 2001 From: Daemon Date: Tue, 30 Mar 2021 21:36:41 +0100 Subject: [PATCH 4/5] Removed attempt to set input placeholder text --- Unify/Patches/Regions.cs | 13 ++++++++++--- build/Unify-2021.3.5s.dll | Bin 10752 -> 10752 bytes 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Unify/Patches/Regions.cs b/Unify/Patches/Regions.cs index c7c0ee9..94ae7f4 100644 --- a/Unify/Patches/Regions.cs +++ b/Unify/Patches/Regions.cs @@ -89,7 +89,6 @@ namespace Unify.Patches directConnect = Object.Instantiate(joinGameButton.GameIdText, regionMenu.transform); directConnect.gameObject.SetActive(false); - directConnect.SetText(""); directConnect.IpMode = true; directConnect.characterLimit = 15; directConnect.ClearOnFocus = false; @@ -101,7 +100,7 @@ namespace Unify.Patches directConnect.transform.localPosition = new Vector3(0, 2 - offset, -100); } } - + [HarmonyPatch(typeof(JoinGameButton), nameof(JoinGameButton.OnClick))] public static class DirectConnectEnterButtonPatch { @@ -163,4 +162,12 @@ namespace Unify.Patches PluginSingleton.Instance.ModdedHandshake.Value = true; } } -} \ No newline at end of file +} + +/* + +Change GUID +Change fields to properties +Change layout of region menu + +*/ \ No newline at end of file diff --git a/build/Unify-2021.3.5s.dll b/build/Unify-2021.3.5s.dll index 24f825017a1ba6450c789225c8697ed1605c07eb..cebebfe2b2f4c59a666ec7be353a1ec5fa395026 100644 GIT binary patch delta 2255 zcmaKte{fXQ7018lzPPT43 z2E{?$jinF?w%NW8)5wg9MMp+N?AlhQMPVv4#vfzpOb3CE6>CIFnKo_gwCO~9?hENm z|LM)_=bfMLoO9oMH>r+P$IyW1)S&;j>HS4?EPdpT>`je83wUh;8jW;mURDaoVtsWZ zP~?<~1n;ajwS z6=M!hvC{UHObaJmL(RK^bAW(m86D zuXu!G${qtg=j(Qx<@Ubb`?h^2p?B%dTwp)3E!vJx^MD+-l{H5rTn6K;?{vOqRm|je zz`FvT7+eE<6GWYeRhw*)oXjg1ebOW^a>O+mK&Krhh2x^gEJT;$(NJwirNT0)`E3!E zg@|)jAzonbJUoK{$4l{)Qn(!rEWZOC)5G3EtT%PclS0S*n7xJgQa@PiFzuwR5SEkN z*d9!%Yz)c?<;Bl&jmxxpqSA|`v~4f^mS&x8+X=+@cG-AW==cw4f=h0+bg>Xm6~JH3 zFx9wi)m(4=EpEk&Ms-b=AYyfjdAN()E#a(Akt{?T_gI4GSYeaw6ooj&mP%|;pWv4` z%AG1$D$2=*DzQrNrlolnogx4!^*;6Regu#dT0UYFnF{}Q`I)fI%V^+s75v6hkHRO0 zkK65WxnFYuDqW@7<%r7(;o}B?^BN%cF9*Z2$tm{ErxvH#+n(QI_QS{1cBby2JhY}( z3(ZmIRc~?aUX{lMHT~FaUM4?2Wd<;0{+aov9B0dB>z}kPr0>7SYIDBw&Wav1_j9FZ zUE2XXFLTJioKhWe0Kby?Bys0;ZI`O$L0@*YJq6>c8z$a%wRC|nyU9eYe)YjVCq82q zjXQ%g<|kh?9}zYN%CskqS7bNYI5nlYSvES#weJ85Z0(Eiv7j}-{X@e>_jOJCym;{c zXaoPv(~)mXM<(4wy`A6V=OHl4Bt(Rk_wshr|L`NJEmM4pN}-1gVwLPhE$+5=y6i_i zmWxAt&i#Upp%w4R4D${1b#$T1K8+hV>mtiT)+IcQChL z6y(q)JhLuy2qkhk9l>p4B|oQewT2eBktZ-pZFCcYo_pvl+k5D|n{|nKl*X9v5|O^c ze2l7dG=k0cMJnP}l<-qHX=jNBJYdZhtvG8|i6EyeW?5R@+>lNi!7Ba+{P;d?6sz4b zBREVCiF$HqFY_60-KHIqJeLbGEz*WgaiR%Jv2F1as_WahfkY zCG$ghp1FiBxxC_X%;mpal5ih~OTQR*?#eD+`7Lo=)?l+Z!MtDmfte7WGk1yEss`T` zRm?%LjOmCD=0VZL{E67gd`WC|PGna!)ro535}(8O;*Y2k!-he1V$vvMZtyfQU-xWg zu9c@myI3T9`K&CaNoo|2ix-99_YvrH%6vCclhf|2rwQjtU&YLbKFVS6CrJF!Ppy5< zh_8YgoH5^W+UHc~w0hEfMrC&Ay)QPFi63Om6D* zl=X}e;-fcYP*zr!w)j);n<2p=zssyG`Kh2Q&SdEMIr?AT^xDKH&p_j}20X3hP`WfA bh8i<}D&0+)?D7di9AB96hyOz9h30<%**mzq delta 2096 zcmaKte{9s{9mn6F&-b3^`@L(uUR${K+ERLLr9Y^pC0JIAE3ROz5~P+EI$5-GLl(r_ zC`JgTcesQ}gz5PtL^M(H$0AdSdIaGQOq;o69W07}3`&XdFw8JWRudK&8)l#9+jiOh z*|+KIK0lxD`+1&wo=dMyuYK{kz=dlQZ)NsXP&jjVUHE7xunzJ(3M_Xr@#6e6kT3qr zlBh6oZZd;ZM{~?>O2wumW}o}ypP}&n?ZDL-KxV9ZX?6{7cS;}k3xIkL2-PnVq(eZU z)Lc;AW`&Mu6t@I$-VEydw|ooye49mbsnm^xrLH9TgIRNaL9%_;jwbJ#HHSOIN-mpq zlXr_X=X+fM=;0rVT`w9#$>oA-k<#hwNZw=Sxz+kdHq&KRx*P6VX)8tI!aJz3J}SD%356u?IOFMoQ&$2*;3<*YpN@R0zW==Y?>?wag3VykV@8;len@ zw*GU<$t$}&`?4D{XcTANdTRD%HP1-@Or(UcMCVi`TD$>XfS-umO6eNlR2l9Sjg{Cd zP9@f;0dB-8;xe&bo5!2n00lwF~%vJz3G*xH93$JO|!&%f}L z{suK7RHM*Y8qm1tI3jeb&wV}{Ef=8McgB6*WJkmR6BZ!E6{AfyuV1*428Dm84T$3@dQ>Fr(#10@#1{8kD#R&a6i>TX zg;{k?BKLbYXib%U?;fwwwC0ufKkM!j1#kGV130K6I7W;!S^zymvw?%wAup!$(ciWLiUMqT1e<&Ywwb6 zp#R~Q%0{O78O32I8AF>&pcQSw9X@xX9UXi~uCPz&2zoK9vch-V;~0Vy9K#&xniTtK zFNd8-P3mjdi;uipsK6r>qFTT0AnNo&ib-jk%-O!?5Q9mZO}-Vm?blc+8EdC8!C6=&-~WsE>qK_=GTlG2xf$ zjIfO+eCB*!_W7O9fA}Q!*V|_p0Xbh`c<2=7!yE~RIv?QQs%G?YR`@Va2siRY;TDeR zW(@P~!d<*r_)A_be4ZZ`8r~#)l{cB|;kvFGu5)t8!)D0cz{YW?hOav{!nJ`e;m3iE z!WC+iySPbhle=;r-J<3EEWgVv-#(z(3>7S*a+4`&r<^%eP&YR&zW{(E2ae>3Pd_8Z zjnq+#SrqA@5wj)ItM|)I1!PAfMJoH%+&3w^zhoX~PsBczFVyM8^M5_JW9)%9k4;FcX G7WdylO`voD From 5f0decd34f4d944b6a7455a68b83e993334a046f Mon Sep 17 00:00:00 2001 From: Daemon Date: Fri, 2 Apr 2021 12:54:15 +0100 Subject: [PATCH 5/5] Updated code to work with 2021.3.31.3s Modified way regions menu is displayed Changed GUID and added code to automatically transfer old config --- README.md | 13 +- Unify/Patches/Regions.cs | 78 +++++++----- Unify/Unify.cs | 67 +++++------ Unify/Unify.csproj | 245 +++++++++++++++++++++++++++++++++----- build/Unify-2021.3.5s.dll | Bin 10752 -> 11264 bytes 5 files changed, 305 insertions(+), 98 deletions(-) diff --git a/README.md b/README.md index a8a49c0..7ea13cf 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,15 @@ -# Unify +> **⚠ WARNING** +> +> Impostor currently doesn't support the 2021.3.31.3s release of the +> game, so custom servers will give an outdated error when you try to +> connect. The 3.0.0-pre.1 release of Unify doesn't use Reactor, since +> Reactor is currently outdated and Unify will not actually work until +> Impostor has been updated to support the 2021.3.31.3s release of the +> game. A new stable version of Unify will be released once Reactor is +> up-to-date, but it should be functional with or without Reactor once +> Impostor is up-to-date. + +# Unify An Among Us mod to add extra regions to the regions menu. diff --git a/Unify/Patches/Regions.cs b/Unify/Patches/Regions.cs index 94ae7f4..dec7375 100644 --- a/Unify/Patches/Regions.cs +++ b/Unify/Patches/Regions.cs @@ -1,10 +1,7 @@ using System; using System.Collections.Generic; -using System.Linq; using BepInEx.Configuration; using HarmonyLib; -using Hazel.Udp; -using Reactor; using UnityEngine; using UnityEngine.UI; using Object = UnityEngine.Object; @@ -18,11 +15,11 @@ namespace Unify.Patches private static IRegionInfo[] _newRegions = new IRegionInfo[] { - new DnsRegionInfo("192.241.154.115", "skeld.net", StringNames.NoTranslation, "192.241.154.115") + new DnsRegionInfo("192.241.154.115", "skeld.net", StringNames.NoTranslation, "192.241.154.115", 22023) .Cast(), - new DnsRegionInfo("localhost", "localhost", StringNames.NoTranslation, "127.0.0.1") + new DnsRegionInfo("localhost", "localhost", StringNames.NoTranslation, "127.0.0.1", 22023) .Cast(), - new DnsRegionInfo("152.228.160.91", "matux.fr", StringNames.NoTranslation, "152.228.160.91") + new DnsRegionInfo("152.228.160.91", "matux.fr", StringNames.NoTranslation, "152.228.160.91", 22023) .Cast() }; @@ -34,14 +31,16 @@ namespace Unify.Patches public static void Patch() { + ServerManager serverManager = DestroyableSingleton.CMJOLNCMAPD; + IRegionInfo[] customRegions = UnifyPlugin.MergeRegions(_newRegions, ModRegions.ToArray()); customRegions = UnifyPlugin.MergeRegions(customRegions, LoadCustomUserRegions()); if (DirectRegion != null) customRegions = customRegions.AddToArray(DirectRegion); IRegionInfo[] patchedRegions = UnifyPlugin.MergeRegions(_oldRegions, customRegions); ServerManager.DefaultRegions = patchedRegions; - ServerManager.Instance.AvailableRegions = patchedRegions; - ServerManager.Instance.SaveServers(); + serverManager.GDOLGIJJLBL = patchedRegions; + serverManager.SaveServers(); } private static IRegionInfo[] LoadCustomUserRegions() @@ -58,7 +57,7 @@ namespace Unify.Patches if (String.IsNullOrWhiteSpace(regionIp.Value)) continue; IRegionInfo regionInfo = new DnsRegionInfo( - regionIp.Value, regionName.Value, StringNames.NoTranslation, regionIp.Value) + regionIp.Value, regionName.Value, StringNames.NoTranslation, regionIp.Value, 22023) .Cast(); customRegions.Add(regionInfo); @@ -70,22 +69,26 @@ namespace Unify.Patches private static void UpdateRegion() { RegionMenu regionMenu = GameObject.Find("RegionMenu").GetComponent(); - - IRegionInfo newRegion = UnifyPlugin.SetDirectRegion(directConnect.text); - + + bool success = UnifyPlugin.SetDirectRegion(directConnect.text, out IRegionInfo newRegion); + + if (!success) + { + directConnect.StartCoroutine(HLPCBNMDEHF.FIJHCJMBGFP(directConnect.transform, 0.75f, 0.25f)); + return; + } + regionMenu.ChooseOption(newRegion); regionMenu.Close(); } - [HarmonyPatch(typeof(NameTextBehaviour), nameof(NameTextBehaviour.Start))] + [HarmonyPatch(typeof(RegionMenu), nameof(RegionMenu.Open))] public static class DirectConnectButtonPatch { public static void Postfix() { - if (directConnect) return; - - JoinGameButton joinGameButton = DestroyableSingleton.Instance; - RegionMenu regionMenu = DestroyableSingleton.Instance; + JoinGameButton joinGameButton = DestroyableSingleton.CMJOLNCMAPD; + RegionMenu regionMenu = DestroyableSingleton.CMJOLNCMAPD; directConnect = Object.Instantiate(joinGameButton.GameIdText, regionMenu.transform); directConnect.gameObject.SetActive(false); @@ -96,8 +99,27 @@ namespace Unify.Patches directConnect.OnEnter = new Button.ButtonClickedEvent(); directConnect.OnEnter.AddListener((Action) UpdateRegion); - float offset = (float) 0.5 * ServerManager.DefaultRegions.Length; - directConnect.transform.localPosition = new Vector3(0, 2 - offset, -100); + int offset = ((ServerManager.DefaultRegions.Length + 1) / 2) + 1; + directConnect.transform.localPosition = new Vector3(0, 2f - (offset / 2f), -100f); + } + } + + [HarmonyPatch(typeof(RegionMenu), nameof(RegionMenu.Open))] + public static class RegionMenuLayoutPatch + { + public static void Postfix(RegionMenu __instance) + { + directConnect.gameObject.SetActive(true); + + var regionButtons = __instance.ButtonPool.activeChildren.ToArray(); + int half = regionButtons.Length / 2; + + for (int x = 0; x < regionButtons.Length; x++) + { + ServerListButton regionButton = regionButtons[x].Cast(); + + regionButton.transform.localPosition = new Vector3(1.25f * ((x < half)? -1: 1), 2f - 0.5f * (x - ((x < half)? 0 : half)), 0f); + } } } @@ -115,15 +137,6 @@ namespace Unify.Patches } } - [HarmonyPatch(typeof(RegionMenu), nameof(RegionMenu.Open))] - public static class ShowDirectConnectPatch - { - public static void Postfix() - { - directConnect.gameObject.SetActive(true); - } - } - [HarmonyPatch(typeof(RegionMenu), nameof(RegionMenu.Close))] public static class HideDirectConnectPatch { @@ -133,7 +146,7 @@ namespace Unify.Patches } } - [HarmonyPatch(typeof(ServerManager), nameof(ServerManager.SaveServers))] + [HarmonyPatch(typeof(RegionMenu), nameof(RegionMenu.ChooseOption))] public static class HideDirectConnectOnSelectPatch { public static void Postfix() @@ -143,7 +156,7 @@ namespace Unify.Patches } } - [HarmonyPatch(typeof(UdpConnection), nameof(UdpConnection.HandleSend))] + /*[HarmonyPatch(typeof(UdpConnection), nameof(UdpConnection.HandleSend))] public static class DisableModdedHandshakePatch { [HarmonyBefore(new string[] { "gg.reactor.api" })] @@ -161,13 +174,12 @@ namespace Unify.Patches PluginSingleton.Instance.ModdedHandshake.Value = true; } - } + }*/ } /* -Change GUID Change fields to properties -Change layout of region menu +Change how custom region is detected */ \ No newline at end of file diff --git a/Unify/Unify.cs b/Unify/Unify.cs index 9352f49..48b8352 100644 --- a/Unify/Unify.cs +++ b/Unify/Unify.cs @@ -5,40 +5,48 @@ using System.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using BepInEx.IL2CPP; -using BepInEx.Logging; using HarmonyLib; -using Reactor; using Unify.Patches; namespace Unify { [BepInPlugin(Id, Name, Version)] [BepInProcess("Among Us.exe")] - [BepInDependency(ReactorPlugin.Id)] - [ReactorPluginSide(PluginSide.ClientOnly)] public class UnifyPlugin : BasePlugin { - public const string Id = "daemon.unify.reactor"; + public const string Id = "daemon.unify"; private const string Name = "Unify"; - private const string Version = "2.1.0"; - - public static readonly ConfigFile ConfigFile = - new ConfigFile(Path.Combine(Paths.ConfigPath, $"{UnifyPlugin.Id}.cfg"), true); + private const string Version = "3.0.0-pre.1"; - public static readonly bool HandshakeDisabled = !PluginSingleton.Instance.ModdedHandshake.Value; + public static ConfigFile ConfigFile; + + // public static readonly bool HandshakeDisabled = !PluginSingleton.Instance.ModdedHandshake.Value; - public static readonly string[] NormalHandshake = - new string[] {"North America", "Europe", "Asia", "skeld.net"}; + /*public static readonly string[] NormalHandshake = + new string[] {"North America", "Europe", "Asia", "skeld.net"};*/ public Harmony Harmony { get; } = new Harmony(Id); public override void Load() { + // ===== For compatibility reasons ===== + string oldConfigPath = Path.Combine(Paths.ConfigPath, "daemon.unify.reactor.cfg"); + string newConfigPath = Path.Combine(Paths.ConfigPath, $"{UnifyPlugin.Id}.cfg"); + bool oldConfigExists = File.Exists(oldConfigPath); + if (oldConfigExists) + { + File.Copy(oldConfigPath, newConfigPath, true); + File.Delete(oldConfigPath); + } + + ConfigFile = new ConfigFile(Path.Combine(Paths.ConfigPath, $"{UnifyPlugin.Id}.cfg"), true); + // ===================================== + RegionsPatch.Patch(); Harmony.PatchAll(); } - + public static IRegionInfo[] MergeRegions(IRegionInfo[] oldRegions, IRegionInfo[] newRegions) { IRegionInfo[] patchedRegions = new IRegionInfo[oldRegions.Length + newRegions.Length]; @@ -50,13 +58,14 @@ namespace Unify public static IRegionInfo AddRegion(string name, string ip) { - if (Uri.CheckHostName(ip) != UriHostNameType.IPv4) return ServerManager.Instance.CurrentRegion; + if (Uri.CheckHostName(ip) != UriHostNameType.IPv4) + return DestroyableSingleton.CMJOLNCMAPD.KIDDJMGEOKK; IRegionInfo existingRegion = ServerManager.DefaultRegions.ToArray().FirstOrDefault(region => region.PingServer == ip); if (existingRegion != null) return existingRegion; - IRegionInfo newRegion = new DnsRegionInfo(ip, name, StringNames.NoTranslation, ip) + IRegionInfo newRegion = new DnsRegionInfo(ip, name, StringNames.NoTranslation, ip, 22023) .Cast(); RegionsPatch.ModRegions.Add(newRegion); @@ -65,35 +74,19 @@ namespace Unify return newRegion; } - public static IRegionInfo SetDirectRegion(string ip) + public static bool SetDirectRegion(string ip, out IRegionInfo newRegion) { - if (Uri.CheckHostName(ip) != UriHostNameType.IPv4) return ServerManager.Instance.CurrentRegion; + newRegion = null; - IRegionInfo newRegion = new DnsRegionInfo(ip, ip, StringNames.NoTranslation, ip) + if (!Regex.IsMatch(ip, @"^(\d{1,3}\.){3}\d{1,3}$")) return false; + + newRegion = new DnsRegionInfo(ip, ip, StringNames.NoTranslation, ip, 22023) .Cast(); RegionsPatch.DirectRegion = newRegion; RegionsPatch.Patch(); - return newRegion; - } - - public static void SetRegionIp(string ip) - { - IRegionInfo existingRegion = - ServerManager.DefaultRegions.ToArray().FirstOrDefault(region => region.PingServer == ip); - if (existingRegion != null) return; - - RegionMenu regionMenu = DestroyableSingleton.Instance; - IRegionInfo newRegion = AddRegion(ip, ip); - - // ChatLanguageButton lastRegionButton = regionMenu.ButtonPool.activeChildren[^1].Cast(); - - // regionMenu.ChooseOption(ServerManager.DefaultRegions[^1]); - // regionMenu.ButtonPool.activeChildren[^1].Cast().Button.ReceiveClickDown(); - // lastRegionButton.gameObject.SetActive(true); - // lastRegionButton.Button.OnClick.Invoke(); - regionMenu.ChooseOption(newRegion); + return true; } } } \ No newline at end of file diff --git a/Unify/Unify.csproj b/Unify/Unify.csproj index d23bd93..9df40c2 100644 --- a/Unify/Unify.csproj +++ b/Unify/Unify.csproj @@ -1,36 +1,227 @@ netstandard2.1 - 2.1.0 - NuclearPowered/Mappings:0.2.0 + 3.0.0-pre.1 - Region mod for Reactor + Region mod Daemon - - - 2021.3.5s - $(DefineConstants);STEAM - - - - 2021.11.17i - $(DefineConstants);ITCH - - - + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\core\0Harmony.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Apple.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\AppleCore.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\AppleMacos.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Assembly-CSharp.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Assembly-CSharp-firstpass.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\core\BepInEx.Core.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\core\BepInEx.IL2CPP.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\FacebookStore.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Hazel.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Il2CppMono.Security.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Il2Cppmscorlib.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Il2CppSystem.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Il2CppSystem.Configuration.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Il2CppSystem.Core.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Il2CppSystem.Data.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Il2CppSystem.Net.Http.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Il2CppSystem.Numerics.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Il2CppSystem.Runtime.Serialization.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Il2CppSystem.Xml.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Il2CppSystem.Xml.Linq.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Newtonsoft.Json.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Purchasing.Common.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\QRCoder.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Rewired_Core.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Rewired_Windows.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Security.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Stores.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\core\UnhollowerBaseLib.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Unity.Addressables.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Unity.Analytics.DataPrivacy.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Unity.ResourceManager.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\Unity.TextMeshPro.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.AIModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.AndroidJNIModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.AnimationModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.AssetBundleModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.AudioModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.CoreModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.DirectorModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.GridModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.ImageConversionModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.IMGUIModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.InputLegacyModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.InputModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.JSONSerializeModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.ParticleSystemModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.Physics2DModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.PhysicsModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.Purchasing.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.ScreenCaptureModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.SharedInternalsModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.SpriteMaskModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.SpriteShapeModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.SubsystemsModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.TerrainModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.TextCoreModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.TextRenderingModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.TilemapModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.UI.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.UIElementsNativeModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.UIModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.UnityAnalyticsModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.UnityWebRequestAssetBundleModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.UnityWebRequestModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.UnityWebRequestWWWModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.VFXModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.VideoModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.VRModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\UnityEngine.XRModule.dll + + + ..\..\..\Program Files\SteamLibrary\steamapps\common\Among Us\BepInEx\unhollowed\winrt.dll + - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - \ No newline at end of file diff --git a/build/Unify-2021.3.5s.dll b/build/Unify-2021.3.5s.dll index cebebfe2b2f4c59a666ec7be353a1ec5fa395026..269738bf97b525b3606beb24c090a1d47e7761dc 100644 GIT binary patch delta 3614 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