diff --git a/.gitignore b/.gitignore index 78853a3..a8eb5ee 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ Source_old/* GlobalGameManagersPatcher/bin/* GlobalGameManagersPatcher/obj/* Cpp2IlDump/*.exe + +Source_Melon/* diff --git a/LICENSE.md b/LICENSE.md index 603c01d..8b99af8 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 SuiMachine +Copyright (c) 2024 SuiMachine Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/LICENSE_BepInEx.txt b/LICENSE_BepInEx.txt new file mode 100644 index 0000000..bb491d7 --- /dev/null +++ b/LICENSE_BepInEx.txt @@ -0,0 +1,482 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + + NOTICE + +BepInEx - Unity +Copyright (C) 2020 BepInEx Team + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 +USA + + +Exemptions / alternate licenses are available for negotiation. diff --git a/README.md b/README.md index 5726152..85afe96 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Deadly Premonition 2 - Sui's hack -A hack/mod that utilizes ''MelonLoader'' and ''HarmonyX'' to make up for some of the ports shortcomings. +A hack/mod that utilizes ''BepInEx'' and ''HarmonyX'' to make up for some of the ports shortcomings. # List of features * Resolution override (the game should no longer start in 1920x1080 maximized window). @@ -31,42 +31,32 @@ A hack/mod that utilizes ''MelonLoader'' and ''HarmonyX'' to make up for some of * An option to add shadows to lights used byt the game. * Options to configure HBAO. * Option to modify planar reflections resolution. -* Rumble for controller when shooting -* Basic Keyboard and Mouse support* (see notes) +* Basic Keyboard and Mouse support* (see notes). # Experimental features * Hook for SteamInput to read Keyboard and mouse input instead. # Requirements -* Original copy of the game -* Melon Loader 0.6.x (versions above 0.6 might not be compatible) +* Original copy of the game. +* BepInEx (bundled in the release). # Installation (Windows) -* Download [MelonLoader](https://github.com/LavaGang/MelonLoader/releases) and install it (prefably using installer). -* Download the [Sui's Hack](https://github.com/SuiMachine/Deadly-Premonition-2---Sui-s-hack/releases) and extract it to game directory (do not change the file structure SuisHack.dll goes into "Mods", "Prompts" directory to a game's "StreamingAssets" folder etc.) +* Download the [Sui's Hack](https://github.com/SuiMachine/Deadly-Premonition-2---Sui-s-hack/releases) and extract it to game directory. * Launch the game. -* Press F11 to open configuration GUI or close the game and edit "MelonPreferences.cfg" inside the UserData folder. +* Press F11 to open configuration GUI or close the game and edit "SuisHack.cfg" inside the BepInEx/config folder. # Installation (SteamDeck) -These instructions are written with path assuming you install it on build in drive. They may need to be modified, if installing on SD card. * Switch to desktop mode. -* Download [MelonLoader](https://github.com/LavaGang/MelonLoader/releases). -* Launch the installer using Protontricks Launcher (if it is missing, install it using Discovery). -* When the screen of protontricks launcher pops up, selected Deadly Premonition 2. -* Select browse and navigate to: `/home/deck/` -* In text field type in `.local` and press enter (it's a hidden folder). -* Further navigate down to: `/home/deck/.local/share/Steam/common/Deadly Premonition 2` (or wherever the games install on SD cards) -* Select `DeadlyPremonition2.exe` and install it. -* Once it is installed download the [Sui's Hack](https://github.com/SuiMachine/Deadly-Premonition-2---Sui-s-hack/releases). -* Navigate to `/home/deck/.local/share/Steam/common/Deadly Premonition 2` (or wherever the games install on SD cards) -* Extract the files from the newly downloaded archive file to that folder. -* Finally right click on the game in Steam libary and choose `Properties`. -* Under launch options paste in the following `WINEDLLOVERRIDES="version.dll=n,b" %command%` -* Launch the game. If the MelonLoader appears you should be all set. - +* Download [Sui's Hack](https://github.com/SuiMachine/Deadly-Premonition-2---Sui-s-hack/releases) and extract it. +* Open Steam (in desktop mode) and find Deadly Premonition 2 on the list of games in your library. +* Right click on it and select `Properties`. +* Go to `Installed files` tab and select `Browse...` - this will open a new Dolphin file explorer window. +* Copy extracted files to that directory. +* Now return to Deadly Premonition 2's property window in Steam and go to `General` tab. +* Under launch options paste in the following `WINEDLLOVERRIDES="winhttp.dll=n,b" %command%` +* Launch the game. # Bugs -* Resolution is not applied to main window on startup, if focus is on console window. * Final boss doesn't seem to display controller prompts correctly. * Epilepsy warning! TAA causes issues with shader of phantoms in the otherworld, so if you are prone to suffering epileptic seizures - use SMAA instead. * Occasionally the protagonist may fall through the terrain when using interpolation. Sorry :( diff --git a/Release/.doorstop_version b/Release/.doorstop_version new file mode 100644 index 0000000..0c89fc9 --- /dev/null +++ b/Release/.doorstop_version @@ -0,0 +1 @@ +4.0.0 \ No newline at end of file diff --git a/Release/BepInEx/config/BepInEx.cfg b/Release/BepInEx/config/BepInEx.cfg new file mode 100644 index 0000000..f99dd6a --- /dev/null +++ b/Release/BepInEx/config/BepInEx.cfg @@ -0,0 +1,168 @@ +[Caching] + +## Enable/disable assembly metadata cache +## Enabling this will speed up discovery of plugins and patchers by caching the metadata of all types BepInEx discovers. +# Setting type: Boolean +# Default value: true +EnableAssemblyCache = true + +[Detours] + +## The native provider to use for managed detours +# Setting type: DetourProvider +# Default value: Default +# Acceptable values: Default, Dobby, Funchook +DetourProviderType = Default + +[Harmony.Logger] + +## Specifies which Harmony log channels to listen to. +## NOTE: IL channel dumps the whole patch methods, use only when needed! +# Setting type: LogChannel +# Default value: Warn, Error +# Acceptable values: None, Info, IL, Warn, Error, Debug, All +# Multiple values can be set at the same time by separating them with , (e.g. Debug, Warning) +LogChannels = Warn, Error + +[IL2CPP] + +## Whether to run Il2CppInterop automatically to generate Il2Cpp support assemblies when they are outdated. +## If disabled assemblies in `BepInEx/interop` won't be updated between game or BepInEx updates! +## +# Setting type: Boolean +# Default value: true +UpdateInteropAssemblies = true + +## URL to the ZIP of managed Unity base libraries. +## The base libraries are used by Il2CppInterop to generate interop assemblies. +## The URL can include {VERSION} template which will be replaced with the game's Unity engine version. +## +# Setting type: String +# Default value: https://unity.bepinex.dev/libraries/{VERSION}.zip +UnityBaseLibrariesSource = https://unity.bepinex.dev/libraries/{VERSION}.zip + +## The RegEx string to pass to Il2CppAssemblyUnhollower for renaming obfuscated names. +## All types and members matching this RegEx will get a name based on their signature, +## resulting in names that persist after game updates. +## +# Setting type: String +# Default value: +UnhollowerDeobfuscationRegex = + +## If enabled, Il2CppInterop will use xref to find dead methods and generate CallerCount attributes. +# Setting type: Boolean +# Default value: true +ScanMethodRefs = true + +## If enabled, BepInEx will save dummy assemblies generated by an Cpp2IL dumper into BepInEx/dummy. +# Setting type: Boolean +# Default value: false +DumpDummyAssemblies = false + +[Logging] + +## Enables showing unity log messages in the BepInEx logging system. +# Setting type: Boolean +# Default value: true +UnityLogListening = false + +[Logging.Console] + +## Enables showing a console for log output. +# Setting type: Boolean +# Default value: true +Enabled = false + +## If enabled, will prevent closing the console (either by deleting the close button or in other platform-specific way). +# Setting type: Boolean +# Default value: false +PreventClose = false + +## If true, console is set to the Shift-JIS encoding, otherwise UTF-8 encoding. +# Setting type: Boolean +# Default value: false +ShiftJisEncoding = false + +## Hints console manager on what handle to assign as StandardOut. Possible values: +## Auto - lets BepInEx decide how to redirect console output +## ConsoleOut - prefer redirecting to console output; if possible, closes original standard output +## StandardOut - prefer redirecting to standard output; if possible, closes console out +## +# Setting type: ConsoleOutRedirectType +# Default value: Auto +# Acceptable values: Auto, ConsoleOut, StandardOut +StandardOutType = Auto + +## Which log levels to show in the console output. +# Setting type: LogLevel +# Default value: Fatal, Error, Warning, Message, Info +# Acceptable values: None, Fatal, Error, Warning, Message, Info, Debug, All +# Multiple values can be set at the same time by separating them with , (e.g. Debug, Warning) +LogLevels = Fatal, Error, Warning, Message, Info + +[Logging.Disk] + +## Appends to the log file instead of overwriting, on game startup. +# Setting type: Boolean +# Default value: false +AppendLog = false + +## Enables writing log messages to disk. +# Setting type: Boolean +# Default value: true +Enabled = true + +## Only displays the specified log levels in the disk log output. +# Setting type: LogLevel +# Default value: Fatal, Error, Warning, Message, Info +# Acceptable values: None, Fatal, Error, Warning, Message, Info, Debug, All +# Multiple values can be set at the same time by separating them with , (e.g. Debug, Warning) +LogLevels = Fatal, Error, Warning, Message, Info + +## If true, instantly writes any received log entries to disk. +## This incurs a major performance hit if a lot of log messages are being written, however it is really useful for debugging crashes. +## +# Setting type: Boolean +# Default value: false +InstantFlushing = false + +## The maximum amount of concurrent log files that will be written to disk. +## As one log file is used per open game instance, you may find it necessary to increase this limit when debugging multiple instances at the same time. +## +# Setting type: Int32 +# Default value: 5 +ConcurrentFileLimit = 5 + +## Include unity log messages in log file output. +# Setting type: Boolean +# Default value: false +WriteUnityLog = false + +[Preloader] + +## Specifies which MonoMod backend to use for Harmony patches. Auto uses the best available backend. +## This setting should only be used for development purposes (e.g. debugging in dnSpy). Other code might override this setting. +# Setting type: MonoModBackend +# Default value: auto +# Acceptable values: auto, dynamicmethod, methodbuilder, cecil +HarmonyBackend = auto + +## If enabled, BepInEx will save patched assemblies into BepInEx/DumpedAssemblies. +## This can be used by developers to inspect and debug preloader patchers. +# Setting type: Boolean +# Default value: false +DumpAssemblies = false + +## If enabled, BepInEx will load patched assemblies from BepInEx/DumpedAssemblies instead of memory. +## This can be used to be able to load patched assemblies into debuggers like dnSpy. +## If set to true, will override DumpAssemblies. +# Setting type: Boolean +# Default value: false +LoadDumpedAssemblies = false + +## If enabled, BepInEx will call Debugger.Break() once before loading patched assemblies. +## This can be used with debuggers like dnSpy to install breakpoints into patched assemblies before they are loaded. +# Setting type: Boolean +# Default value: false +BreakBeforeLoadAssemblies = false + diff --git a/Release/BepInEx/core/0Harmony.dll b/Release/BepInEx/core/0Harmony.dll new file mode 100644 index 0000000..836b949 Binary files /dev/null and b/Release/BepInEx/core/0Harmony.dll differ diff --git a/Release/BepInEx/core/AsmResolver.DotNet.dll b/Release/BepInEx/core/AsmResolver.DotNet.dll new file mode 100644 index 0000000..11eeb39 Binary files /dev/null and b/Release/BepInEx/core/AsmResolver.DotNet.dll differ diff --git a/Release/BepInEx/core/AsmResolver.PE.File.dll b/Release/BepInEx/core/AsmResolver.PE.File.dll new file mode 100644 index 0000000..6c78d6d Binary files /dev/null and b/Release/BepInEx/core/AsmResolver.PE.File.dll differ diff --git a/Release/BepInEx/core/AsmResolver.PE.dll b/Release/BepInEx/core/AsmResolver.PE.dll new file mode 100644 index 0000000..f0e74a9 Binary files /dev/null and b/Release/BepInEx/core/AsmResolver.PE.dll differ diff --git a/Release/BepInEx/core/AsmResolver.dll b/Release/BepInEx/core/AsmResolver.dll new file mode 100644 index 0000000..af7a30c Binary files /dev/null and b/Release/BepInEx/core/AsmResolver.dll differ diff --git a/Release/BepInEx/core/AssetRipper.VersionUtilities.dll b/Release/BepInEx/core/AssetRipper.VersionUtilities.dll new file mode 100644 index 0000000..eab7dba Binary files /dev/null and b/Release/BepInEx/core/AssetRipper.VersionUtilities.dll differ diff --git a/Release/BepInEx/core/BepInEx.Core.dll b/Release/BepInEx/core/BepInEx.Core.dll new file mode 100644 index 0000000..9797f27 Binary files /dev/null and b/Release/BepInEx/core/BepInEx.Core.dll differ diff --git a/Release/BepInEx/core/BepInEx.Core.xml b/Release/BepInEx/core/BepInEx.Core.xml new file mode 100644 index 0000000..2c6f6ec --- /dev/null +++ b/Release/BepInEx/core/BepInEx.Core.xml @@ -0,0 +1,1734 @@ + + + + BepInEx.Core + + + + + Analyzes the given type definition and attempts to convert it to a valid + + Type definition to analyze. + The filepath of the assembly, to keep as metadata. + If the type represent a valid plugin, returns a instance. Otherwise, return null. + + + + List of all instances loaded via the chainloader. + + + + + Collection of error chainloader messages that occured during plugin loading. + Contains information about what certain plugins were not loaded. + + + + + Occurs after a plugin is loaded. + + + + + Occurs after all plugins are loaded. + + + + + Discovers all plugins in the plugin directory without loading them. + + + This is useful for discovering BepInEx plugin metadata. + + Path from which to search the plugins. + Cache name to use. If null, results are not cached. + List of discovered plugins and their metadata. + + + + Discovers plugins to load. + + List of plugins to be loaded. + + + + Preprocess the plugins and modify the load order. + + Some plugins may be skipped if they cannot be loaded (wrong metadata, etc). + Plugins to process. + List of plugins to load in the correct load order. + + + + Run the chainloader and load all plugins from the plugins folder. + + + + + Detects and loads all plugins in the specified directories. + + + It is better to collect all paths at once and use a single call to LoadPlugins than multiple calls. + This allows to run proper dependency resolving and to load all plugins in one go. + + Directories to search the plugins from. + List of loaded plugin infos. + + + + A cacheable metadata item. Can be used with and + to cache plugin metadata. + + + + + Serialize the object into a binary format. + + + + + + Loads the object from binary format. + + + + + + A cached assembly. + + + + + + List of cached items inside the assembly. + + + + + Hash of the assembly. Used to verify that the assembly hasn't been changed. + + + + + Provides methods for loading specified types from an assembly. + + + + + Default assembly resolved used by the + + + + + Default reader parameters used by + + + + + Event fired when fails to resolve a type during type loading. + + + + + Looks up assemblies in the given directory and locates all types that can be loaded and collects their metadata. + + The specific base type to search for. + The directory to search for assemblies. + A function to check if a type should be selected and to build the type metadata. + A filter function to quickly determine if the assembly can be loaded. + The name of the cache to get cached types from. + + A dictionary of all assemblies in the directory and the list of type metadatas of types that match the + selector. + + + + + Loads an index of type metadatas from a cache. + + Name of the cache + Cacheable item + + Cached type metadatas indexed by the path of the assembly that defines the type. If no cache is defined, + return null. + + + + + Saves indexed type metadata into a cache. + + Name of the cache + List of plugin metadatas indexed by the path to the assembly that contains the types + Hash values that can be used for checking similarity between cached and live assembly + Cacheable item + + + + Converts TypeLoadException to a readable string. + + TypeLoadException + Readable representation of the exception + + + + Base type of all classes representing and enforcing acceptable values of config settings. + + + + Type of values that this class can Clamp. + + + + Type of the supported values. + + + + + Change the value to be acceptable, if it's not already. + + + + + Check if the value is an acceptable value. + + + + + Get the string for use in config files. + + + + + Specify the list of acceptable values for a setting. + + + + + Specify the list of acceptable values for a setting. + If the setting does not equal any of the values, it will be set to the first one. + + + + + List of values that a setting can take. + + + + + + + + + + + + + + Specify the range of acceptable values for a setting. + + + + Lowest acceptable value + Highest acceptable value + + + + Lowest acceptable value + + + + + Highest acceptable value + + + + + + + + + + + + + + Section and key of a setting. Used as a unique key for identification within a + . + The same definition can be used in multiple config files, it will point to different settings then. + + + + + + Create a new definition. Definitions with same section and key are equal. + + Group of the setting, case sensitive. + Name of the setting, case sensitive. + + + + + + + Group of the setting. All settings within a config file are grouped by this. + + + + + Name of the setting. + + + + + Check if the definitions are the same. + + + + + + Check if the definitions are the same. + + + + + + + + Check if the definitions are the same. + + + + + Check if the definitions are the same. + + + + + + + + Metadata of a . + + + + + Create a new description. + + Text describing the function of the setting and any notes or warnings. + + Range of values that this setting can take. The setting's value will be automatically + clamped. + + Objects that can be used by user-made classes to add functionality. + + + + Text describing the function of the setting and any notes or warnings. + + + + + Range of acceptable values for a setting. + + + + + Objects that can be used by user-made classes to add functionality. + + + + + An empty description. + + + + + Provides access to a single setting inside of a . + + Type of the setting. + + + + Value of this setting. + + + + + + + + Fired when the setting is changed. Does not detect changes made outside from this object. + + + + + Container for a single setting of a . + Each config entry is linked to one config file. + + + + + Types of defaultValue and definition.AcceptableValues have to be the same as settingType. + + + + + Config file this entry is a part of. + + + + + Category and name of this setting. Used as a unique key for identification within a + . + + + + + Description / metadata of this setting. + + + + + Type of the that this setting holds. + + + + + Default value of this setting (set only if the setting was not changed before). + + + + + Get or set the value of the setting. + + + + + Get the serialized representation of the value. + + + + + Set the value by using its serialized form. + + + + + If necessary, clamp the value to acceptable value range. T has to be equal to settingType. + + + + + Trigger setting changed event. + + + + + Write a description of this setting using all available metadata. + + + + + A helper class to handle persistent data. All public methods are thread-safe. + + + + + + + + Create a new config file at the specified config path. + + Full path to a file that contains settings. The file will be created as needed. + If the config file/directory doesn't exist, create it immediately. + Information about the plugin that owns this setting file. + + + + All config entries inside + + + + + Create a list with all config entries inside of this config file. + + + + + Full path to the config file. The file might not exist until a setting is added and changed, or + is called. + + + + + If enabled, writes the config to disk every time a value is set. + If disabled, you have to manually use or the changes will be lost! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Returns the ConfigDefinitions that the ConfigFile contains. + Creates a new array when the property is accessed. Thread-safe. + + + + + Returns the ConfigEntryBase values that the ConfigFile contains. + Creates a new array when the property is accessed. Thread-safe. + + + + + Create an array with all config entries inside of this config file. Should be only used for metadata purposes. + If you want to access and modify an existing setting then use + + instead with no description. + + + + + Generate user-readable comments for each of the settings in the saved .cfg file. + + + + + Reloads the config from disk. Unsaved changes are lost. + + + + + Writes the config to disk. + + + + + Access one of the existing settings. If the setting has not been added yet, null is returned. + If the setting exists but has a different type than T, an exception is thrown. + New settings should be added with . + + Type of the value contained in this setting. + Section and Key of the setting. + + + + Access one of the existing settings. If the setting has not been added yet, null is returned. + If the setting exists but has a different type than T, an exception is thrown. + New settings should be added with . + + Type of the value contained in this setting. + Section/category/group of the setting. Settings are grouped by this. + Name of the setting. + + + + Access one of the existing settings. If the setting has not been added yet, false is returned. Otherwise, true. + If the setting exists but has a different type than T, an exception is thrown. + New settings should be added with + . + + Type of the value contained in this setting. + Section and Key of the setting. + The ConfigEntry value to return. + + + + Access one of the existing settings. If the setting has not been added yet, null is returned. + If the setting exists but has a different type than T, an exception is thrown. + New settings should be added with + . + + Type of the value contained in this setting. + Section/category/group of the setting. Settings are grouped by this. + Name of the setting. + The ConfigEntry value to return. + + + + Create a new setting. The setting is saved to drive and loaded automatically. + Each definition can be used to add only one setting, trying to add a second setting will throw an exception. + + Type of the value contained in this setting. + Section and Key of the setting. + Value of the setting if the setting was not created yet. + Description of the setting shown to the user and other metadata. + + + + Create a new setting. The setting is saved to drive and loaded automatically. + Each section and key pair can be used to add only one setting, trying to add a second setting will throw an + exception. + + Type of the value contained in this setting. + Section/category/group of the setting. Settings are grouped by this. + Name of the setting. + Value of the setting if the setting was not created yet. + Description of the setting shown to the user and other metadata. + + + + Create a new setting. The setting is saved to drive and loaded automatically. + Each section and key pair can be used to add only one setting, trying to add a second setting will throw an + exception. + + Type of the value contained in this setting. + Section/category/group of the setting. Settings are grouped by this. + Name of the setting. + Value of the setting if the setting was not created yet. + Simple description of the setting shown to the user. + + + + Create a new setting. The setting is saved to drive and loaded automatically. + Each definition can be used to add only one setting, trying to add a second setting will throw an exception. + + Type of the value contained in this setting. + Section and Key of the setting. + Value of the setting if the setting was not created yet. + Description of the setting shown to the user and other metadata. + + + + Create a new setting. The setting is saved to drive and loaded automatically. + Each section and key pair can be used to add only one setting, trying to add a second setting will throw an + exception. + + Type of the value contained in this setting. + Section/category/group of the setting. Settings are grouped by this. + Name of the setting. + Value of the setting if the setting was not created yet. + Description of the setting shown to the user and other metadata. + + + + Create a new setting. The setting is saved to drive and loaded automatically. + Each section and key pair can be used to add only one setting, trying to add a second setting will throw an + exception. + + Type of the value contained in this setting. + Section/category/group of the setting. Settings are grouped by this. + Name of the setting. + Value of the setting if the setting was not created yet. + Simple description of the setting shown to the user. + + + + Access a setting. Use Bind instead. + + + + + Access a setting. Use Bind instead. + + + + + An event that is fired every time the config is reloaded. + + + + + Fired when one of the settings is changed. + + + + + Provides access to a single setting inside of a . + + Type of the setting. + + + + Entry of this setting in the . + + + + + Unique definition of this setting. + + + + + Config file this setting is inside of. + + + + + Value of this setting. + + + + + Fired when the setting is changed. Does not detect changes made outside from this object. + + + + + Arguments for events concerning a change of a setting. + + + + + + + + + Setting that was changed + + + + + Serializer/deserializer used by the config system. + + + + + Convert object of a given type to a string using available converters. + + + + + Convert string to an object of a given type using available converters. + + + + + Convert string to an object of a given type using available converters. + + + + + Get a converter for a given type if there is any. + + + + + Add a new type converter for a given type. + If a different converter is already added, this call is ignored and false is returned. + + + + + Check if a given type can be converted to and from string. + + + + + Give a list of types with registered converters. + + + + + A serializer/deserializer combo for some type(s). Used by the config system. + + + + + Used to serialize the type into a (hopefully) human-readable string. + Object is the instance to serialize, Type is the object's type. + + + + + Used to deserialize the type from a string. + String is the data to deserialize, Type is the object's type, should return instance to an object of Type. + + + + + True if an external console has been started, false otherwise. + + + + + The stream that writes to the standard out stream of the process. Should never be null. + + + + + The stream that writes to an external console. Null if no such console exists + + + + + This attribute denotes that a class is a plugin, and specifies the required metadata. + + + + The unique identifier of the plugin. Should not change between plugin versions. + The user friendly name of the plugin. Is able to be changed between versions. + The specific version of the plugin. + + + + The unique identifier of the plugin. Should not change between plugin versions. + + + + + The user friendly name of the plugin. Is able to be changed between versions. + + + + + The specific version of the plugin. + + + + + This attribute specifies any dependencies that this plugin has on other plugins. + + + + + Flags that are applied to a dependency + + + + + The plugin has a hard dependency on the referenced plugin, and will not run without it. + + + + + This plugin has a soft dependency on the referenced plugin, and is able to run without it. + + + + + Marks this as dependent on another plugin. The other plugin will be loaded before + this one. + If the other plugin doesn't exist, what happens depends on the parameter. + + The GUID of the referenced plugin. + The flags associated with this dependency definition. + + + + Marks this as dependent on another plugin. The other plugin will be loaded before + this one. + If the other plugin doesn't exist or is of a version not satisfying , this plugin will + not load and an error will be logged instead. + + The GUID of the referenced plugin. + The version range of the referenced plugin. + When version is supplied the dependency is always treated as HardDependency + + + + The GUID of the referenced plugin. + + + + + The flags associated with this dependency definition. + + + + + The version range of the referenced plugin. + + + + + This attribute specifies other plugins that are incompatible with this plugin. + + + + + Marks this as incompatible with another plugin. + If the other plugin exists, this plugin will not be loaded and a warning will be shown. + + The GUID of the referenced plugin. + + + + The GUID of the referenced plugin. + + + + + This attribute specifies which processes this plugin should be run for. Not specifying this attribute will load the + plugin under every process. + + + + The name of the process that this plugin will run under. + + + + The name of the process that this plugin will run under. + + + + + Helper class to use for retrieving metadata about a plugin, defined as attributes. + + + + + Retrieves the BepInPlugin metadata from a plugin type. + + The plugin type. + The BepInPlugin metadata of the plugin type. + + + + Retrieves the BepInPlugin metadata from a plugin instance. + + The plugin instance. + The BepInPlugin metadata of the plugin instance. + + + + Gets the specified attributes of a type, if they exist. + + The attribute type to retrieve. + The plugin type. + The attributes of the type, if existing. + + + + Gets the specified attributes of an assembly, if they exist. + + The assembly. + The attribute type to retrieve. + The attributes of the type, if existing. + + + + Gets the specified attributes of an instance, if they exist. + + The attribute type to retrieve. + The plugin instance. + The attributes of the instance, if existing. + + + + Gets the specified attributes of a reflection metadata type, if they exist. + + The attribute type to retrieve. + The reflection metadata instance. + The attributes of the instance, if existing. + + + + Retrieves the dependencies of the specified plugin type. + + The plugin type. + A list of all plugin types that the specified plugin type depends upon. + + + + Data class that represents information about a loadable BepInEx plugin. + Contains all metadata and additional info required for plugin loading by . + + + + + General metadata about a plugin. + + + + + Collection of attributes that describe what processes the plugin can run on. + + + + + Collection of attributes that describe what plugins this plugin depends on. + + + + + Collection of attributes that describe what plugins this plugin + is incompatible with. + + + + + File path to the plugin DLL + + + + + Instance of the plugin that represents this info. NULL if no plugin is instantiated from info (yet) + + + + + + + + Interpolated string handler for BepInEx . This allows to conditionally skip logging certain + messages and speed up logging in certain places. + + + The class isn't meant to be constructed manually. + Instead, use with + string interpolation. + + + + + Constructs a log handler. + + Length of the literal string. + Number for formatted items. + Log level the message belongs to. + Whether this string should be logged. + + + + Whether the interpolation is enabled and string will be logged. + + + + + Appends a literal string to the interpolation. + + String to append. + + + + Appends a value to the interpolation. + + Value to append. + Type of the value to append. + + + + Append a formattable item. + + Item to append. + Format to append with. + Item type. + + + + Append an IntPtr. + + Item to append. + Format to append with. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Logs entries using a console spawned by BepInEx. + + + + + + + + + + + + + + Logs entries using Unity specific outputs. + + + + + Creates a new disk log listener. + + Path to the log. + Log levels to display. + Whether to append logs to an already existing log file. + + Whether to delay flushing to disk to improve performance. Useful to set this to false + when debugging crashes. + + Maximum amount of concurrently opened log files. Can help with infinite game boot loops. + + + + Log levels to display. + + + + + Writer for the disk log. + + + + + Timer for flushing the logs to a file. + + + + + + + + + + + + + + A generic log listener that receives log events and can route them to some output (e.g. file, console, socket). + + + + + What log levels the listener preliminarily wants. + + + The filter is used to more efficiently discard log messages that aren't being listened to. + As such, the filter should represent the log levels that the listener will always want to process. + It is up to the the implementation of whether the messages are going to be processed or + discarded. + + TODO: Right now the filter cannot be updated after the log listener has been attached to the logger. + + + + Handle an incoming log event. + + Log source that sent the event. Don't use; instead use + Information about the log message. + + + + Log source that can output log messages. + + + + + Name of the log source. + + + + + Event that sends the log message. Call to send a log message. + + + + + Log event arguments. Contains info about the log message. + + + + + Creates the log event args- + + Logged data. + Log level of the data. + Log source that emits these args. + + + + Logged data. + + + + + Log levels for the data. + + + + + Log source that emitted the log event. + + + + + + + + Like but appends newline at the end. + + Same output as but with new line. + + + + Handles pub-sub event marshalling across all log listeners and sources. + + + + + Log levels that are currently listened to by at least one listener. + + + + + Collection of all log listeners that receive log events. + + + + + Collection of all log source that output log events. + + + + + Logs an entry to the internal logger instance. + + The level of the entry. + The data of the entry. + + + + Logs an entry to the internal logger instance if any log listener wants the message. + + The level of the entry. + Log handler to resolve log from. + + + + Creates a new log source with a name and attaches it to . + + Name of the log source to create. + An instance of that allows to write logs. + + + + The level, or severity of a log entry. + + + + + No level selected. + + + + + A fatal error has occurred, which cannot be recovered from. + + + + + An error has occured, but can be recovered from. + + + + + A warning has been produced, but does not necessarily mean that something wrong has happened. + + + + + An important message that should be displayed to the user. + + + + + A message of low importance. + + + + + A message that would likely only interest a developer. + + + + + All log levels. + + + + + Helper methods for log level handling. + + + + + Gets the highest log level when there could potentially be multiple levels provided. + + The log level(s). + The highest log level supplied. + + + + Returns a translation of a log level to it's associated console colour. + + The log level(s). + A console color associated with the highest log level supplied. + + + + A generic, multi-purpose log source. Exposes simple API to manually emit logs. + + + + + Creates a manual log source. + + Name of the log source. + + + + + + + + + + + + + Logs a message with the specified log level. + + Log levels to attach to the message. Multiple can be used with bitwise ORing. + Data to log. + + + + Logs an interpolated string with the specified log level. + + Log levels to attach to the message. Multiple can be used with bitwise ORing. + Handler for the interpolated string. + + + + Logs a message with level. + + Data to log. + + + + Logs an interpolated string with level. + + Handler for the interpolated string. + + + + Logs a message with level. + + Data to log. + + + + Logs an interpolated string with level. + + Handler for the interpolated string. + + + + Logs a message with level. + + Data to log. + + + + Logs an interpolated string with level. + + Handler for the interpolated string. + + + + Logs a message with level. + + Data to log. + + + + Logs an interpolated string with level. + + Handler for the interpolated string. + + + + Logs a message with level. + + Data to log. + + + + Logs an interpolated string with level. + + Handler for the interpolated string. + + + + Logs a message with level. + + Data to log. + + + + Logs an interpolated string with level. + + Handler for the interpolated string. + + + + A source that routes all logs from the inbuilt .NET API to the BepInEx logging system. + + + + + + Creates a new trace log source. + + + + + Whether Trace logs are currently being rerouted. + + + + + Internal log source. + + + + + Creates a new trace log source. + + New log source (or already existing one). + + + + Writes a message to the underlying instance. + + The message to write. + + + + Writes a message and a newline to the underlying instance. + + The message to write. + + + + + + + + + + Paths used by BepInEx + + + + + BepInEx version. + + + + + The path to the Managed folder that contains the main managed assemblies. + + + + + The path to the game data folder of the currently running Unity game. + + + + + The directory that the core BepInEx DLLs reside in. + + + + + The path to the core BepInEx DLL. + + + + + The path to the main BepInEx folder. + + + + + The path of the currently executing program BepInEx is encapsulated in. + + + + + The directory that the currently executing process resides in. + On OSX however, this is the parent directory of the game.app folder. + + + + + The path to the config directory. + + + + + The path to the global BepInEx configuration file. + + + + + The path to temporary cache files. + + + + + The path to the patcher plugin folder which resides in the BepInEx folder. + + + + + The path to the plugin folder which resides in the BepInEx folder. + + This is ONLY guaranteed to be set correctly when Chainloader has been initialized. + + + + + + The name of the currently executing process. + + + + + List of directories from where Mono will search assemblies before assembly resolving is invoked. + + + + + Generic helper properties and methods. + + + + + Whether current Common Language Runtime supports dynamic method generation using + namespace. + + + + + An encoding for UTF-8 which does not emit a byte order mark (BOM). + + + + + Try to perform an action. + + Action to perform. + Possible exception that gets returned. + True, if action succeeded, false if an exception occured. + + + + Combines multiple paths together, as the specific method is not available in .NET 3.5. + + The multiple paths to combine together. + A combined path. + + + + Returns the parent directory of a path, optionally specifying the amount of levels. + + The path to get the parent directory of. + The amount of levels to traverse. Defaults to 1 + The parent directory. + + + + Tries to parse a bool, with a default value if unable to parse. + + The string to parse + The value to return if parsing is unsuccessful. + Boolean value of input if able to be parsed, otherwise default value. + + + + Converts a file path into a UnityEngine.WWW format. + + The file path to convert. + A converted file path. + + + + Indicates whether a specified string is null, empty, or consists only of white-space characters. + + The string to test. + True if the value parameter is null or empty, or if value consists exclusively of white-space characters. + + + + Sorts a given dependency graph using a direct toposort, reporting possible cyclic dependencies. + + Nodes to sort + Function that maps a node to a collection of its dependencies. + Type of the node in a dependency graph. + Collection of nodes sorted in the order of least dependencies to the most. + Thrown when a cyclic dependency occurs. + + + + Try to resolve and load the given assembly DLL. + + Name of the assembly, of the type . + Directory to search the assembly from. + The loaded assembly. + True, if the assembly was found and loaded. Otherwise, false. + + + + Checks whether a given cecil type definition is a subtype of a provided type. + + Cecil type definition + Type to check against + Whether the given cecil type is a subtype of the type. + + + + Try to resolve and load the given assembly DLL. + + Name of the assembly, of the type . + Directory to search the assembly from. + The loaded assembly. + True, if the assembly was found and loaded. Otherwise, false. + + + + Try to resolve and load the given assembly DLL. + + Name of the assembly, of the type . + Directory to search the assembly from. + Reader parameters that contain possible custom assembly resolver. + The loaded assembly. + True, if the assembly was found and loaded. Otherwise, false. + + + + Tries to create a file with the given name + + Path of the file to create + File open mode + Resulting filestream + File access options + File share options + + + + + Compute a MD5 hash of the given stream. + + Stream to hash + MD5 hash as a hex string + + + + Hash a list of strings using MD5 + + Strings to hash + MD5 of the strings + + + + Convert the given array to a hex string. + + Bytes to convert. + Bytes reinterpreted as a hex number. + + + + Get a value of a command line argument + + Argument name + Next argument after the given argument name. If not found, returns null. + + + + Try to parse given string as an assembly name + + Fully qualified assembly name + Resulting instance + true, if parsing was successful, otherwise false + + On some versions of mono, using fails because it runs on unmanaged side + which has problems with encoding. + Using solves this by doing parsing on managed side instead. + + + + + Gets unique files in all given directories. If the file with the same name exists in multiple directories, + only the first occurrence is returned. + + Directories to search from. + File pattern to search. + Collection of all files in the directories. + + + + Console class with safe handlers for Unity 4.x, which does not have a proper Console implementation + + + + diff --git a/Release/BepInEx/core/BepInEx.Preloader.Core.dll b/Release/BepInEx/core/BepInEx.Preloader.Core.dll new file mode 100644 index 0000000..d1b55a1 Binary files /dev/null and b/Release/BepInEx/core/BepInEx.Preloader.Core.dll differ diff --git a/Release/BepInEx/core/BepInEx.Preloader.Core.xml b/Release/BepInEx/core/BepInEx.Preloader.Core.xml new file mode 100644 index 0000000..c591252 --- /dev/null +++ b/Release/BepInEx/core/BepInEx.Preloader.Core.xml @@ -0,0 +1,313 @@ + + + + BepInEx.Preloader.Core + + + + + + + + Doorstop environment variables, passed into the BepInEx preloader. + https://github.com/NeighTools/UnityDoorstop/wiki#environment-variables + + + + + Path to the assembly that was invoked via Doorstop. Contains the same value as in "targetAssembly" configuration + option in the config file. + + + + + Full path to the game's "Managed" folder that contains all the game's managed assemblies + + + + + Full path to the game executable currently running. + + + + + Array of paths where Mono searches DLLs from before assembly resolvers are invoked. + + + + + Path of the DLL that contains mono imports. + + + + + Log listener that listens to logs during preloading time and buffers messages for output in Unity logs later. + + + + + A list of all objects that this listener has received. + + + + + + + + + + + + + + Worker class which is used for loading and patching entire folders of assemblies, or alternatively patching and + loading assemblies one at a time. + + + + + The context of this assembly patcher instance that is passed to all patcher plugins. + + + + + A cloned version of to ensure that any foreach loops do not break when the collection + gets modified. + + + + + Performs work to dispose collection objects. + + + + + Adds all patchers from all managed assemblies specified in a directory. + + Directory to search patcher DLLs from. + + + + Adds all .dll assemblies in given directories to be patched and loaded by this patcher instance. Non-managed + assemblies + are skipped. + + The directories to search. + + + + Adds all assemblies in given directories to be patched and loaded by this patcher instance. Non-managed assemblies + are + skipped. + + The directory to search. + The file extensions to attempt to load. + + + + Attempts to load a managed assembly as an . Returns true if successful. + + The path of the assembly. + The loaded assembly. Null if not successful in loading. + + + + Applies patchers to all assemblies loaded into this assembly patcher and then loads patched assemblies into memory. + + + + + This attribute denotes that a class is a patcher plugin, and specifies the required metadata. + + + + The unique identifier of the plugin. Should not change between plugin versions. + The user friendly name of the plugin. Is able to be changed between versions. + The specific version of the plugin. + + + + The unique identifier of the plugin. Should not change between plugin versions. + + + + + The user friendly name of the plugin. Is able to be changed between versions. + + + + + The specific version of the plugin. + + + + + Defines an assembly that a patch method will target. + + + + + Marker used to indicate all possible assemblies to be targeted by a patch method. + + + + + The short filename of the assembly. Use to mark all possible + assemblies as targets. + + + + + The short filename of the assembly to target. + + + + + Defines a type that a patch method will target. + + + + The short filename of the assembly of which belongs to. + The full name of the type to target for patching. + + + + The short filename of the assembly to target. + + + + + The full name of the type to target for patching. + + + + + A patcher that can contain multiple methods for patching assemblies. + + + + + A instance created for use by this patcher plugin. + + + + + A configuration file binding created with the of this plugin as the + filename. + + + + + Metadata associated with this patcher plugin. + + + + + The context of the this BasePatcher is associated with. + + + + + Executed before any patches from any plugin are applied. + + + + + Executed after all patches from all plugins have been applied. + + + + + A definition of an individual patch for use by . + + + + + The assembly / assemblies this patch will target, if there any. + + + + + The type / types this patch will target, if there are any. + + + + + The instance of the this originates from. + + + + + The method that will perform the patching logic defined by this instance. + + + + + A friendly name for this patch definition, for use in logging and error tracking. + + + + + Context provided to patcher plugins from the associated patcher engine. + + + + + Contains a list of assemblies that will be patched and loaded into the runtime. + + The dictionary has the name of the file, without any directories. These are used by the dumping + functionality, and as such, these are also required to be unique. They do not have to be exactly the same as + the real filename, however they have to be mapped deterministically. + + Order is not respected, as it will be sorted by dependencies. + + + + + Contains a mapping of available assembly name to their original filenames. + + + + + Contains a dictionary of assemblies that have been loaded as part of executing this assembly patcher. + + The key is the same key as used in , while the value is the actual assembly + itself. + + + + + + A list of plugins that will be initialized and executed, in the order of the list. + + + + + A list of individual patches that will execute, generated by parsing + . + + + + + + A single cached assembly patcher. + + + + + Type name of the patcher. + + + + + + + + + + + Recreation of MonoMod's PlatformHelper.DeterminePlatform method, but with libc calls instead of creating processes. + + + + diff --git a/Release/BepInEx/core/BepInEx.Unity.Common.dll b/Release/BepInEx/core/BepInEx.Unity.Common.dll new file mode 100644 index 0000000..68edff4 Binary files /dev/null and b/Release/BepInEx/core/BepInEx.Unity.Common.dll differ diff --git a/Release/BepInEx/core/BepInEx.Unity.Common.xml b/Release/BepInEx/core/BepInEx.Unity.Common.xml new file mode 100644 index 0000000..82e2572 --- /dev/null +++ b/Release/BepInEx/core/BepInEx.Unity.Common.xml @@ -0,0 +1,32 @@ + + + + BepInEx.Unity.Common + + + + + Various information about the currently executing Unity player. + + + + + Path to the player executable. + + + + + Path to the game data directory (directory that contains the game assets). + + + + + Version of the Unity player + + + Because BepInEx can execute very early, the exact Unity version might not be available in early + bootstrapping phases. The version should be treated as an estimation of the actual version of the Unity player. + + + + diff --git a/Release/BepInEx/core/BepInEx.Unity.IL2CPP.dll b/Release/BepInEx/core/BepInEx.Unity.IL2CPP.dll new file mode 100644 index 0000000..07c2594 Binary files /dev/null and b/Release/BepInEx/core/BepInEx.Unity.IL2CPP.dll differ diff --git a/Release/BepInEx/core/BepInEx.Unity.IL2CPP.dll.config b/Release/BepInEx/core/BepInEx.Unity.IL2CPP.dll.config new file mode 100644 index 0000000..4cb6f5e --- /dev/null +++ b/Release/BepInEx/core/BepInEx.Unity.IL2CPP.dll.config @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/Release/BepInEx/core/BepInEx.Unity.IL2CPP.xml b/Release/BepInEx/core/BepInEx.Unity.IL2CPP.xml new file mode 100644 index 0000000..b22fdc7 --- /dev/null +++ b/Release/BepInEx/core/BepInEx.Unity.IL2CPP.xml @@ -0,0 +1,39 @@ + + + + BepInEx.Unity.IL2CPP + + + + + Add a Component (e.g. MonoBehaviour) into Unity scene. + Automatically registers the type with Il2Cpp Type system if it isn't already. + + Type of the component to add. + + + + Register and add a Unity Component (for example MonoBehaviour) into BepInEx global manager. + Automatically registers the type with Il2Cpp type system if it isn't initialised already. + + Type of the component to add. + + + + Register and add a Unity Component (for example MonoBehaviour) into BepInEx global manager. + Automatically registers the type with Il2Cpp type system if it isn't initialised already. + + Type of the component to add + + + + Occurs after a plugin is instantiated and just before is called. + + + + + The main entrypoint of BepInEx, called from Doorstop. + + + + diff --git a/Release/BepInEx/core/Cpp2IL.Core.dll b/Release/BepInEx/core/Cpp2IL.Core.dll new file mode 100644 index 0000000..8a9e41e Binary files /dev/null and b/Release/BepInEx/core/Cpp2IL.Core.dll differ diff --git a/Release/BepInEx/core/Disarm.dll b/Release/BepInEx/core/Disarm.dll new file mode 100644 index 0000000..46b4eb7 Binary files /dev/null and b/Release/BepInEx/core/Disarm.dll differ diff --git a/Release/BepInEx/core/Gee.External.Capstone.dll b/Release/BepInEx/core/Gee.External.Capstone.dll new file mode 100644 index 0000000..ef22733 Binary files /dev/null and b/Release/BepInEx/core/Gee.External.Capstone.dll differ diff --git a/Release/BepInEx/core/Iced.dll b/Release/BepInEx/core/Iced.dll new file mode 100644 index 0000000..4f29817 Binary files /dev/null and b/Release/BepInEx/core/Iced.dll differ diff --git a/Release/BepInEx/core/Il2CppInterop.Common.dll b/Release/BepInEx/core/Il2CppInterop.Common.dll new file mode 100644 index 0000000..e4746d5 Binary files /dev/null and b/Release/BepInEx/core/Il2CppInterop.Common.dll differ diff --git a/Release/BepInEx/core/Il2CppInterop.Generator.dll b/Release/BepInEx/core/Il2CppInterop.Generator.dll new file mode 100644 index 0000000..2280e84 Binary files /dev/null and b/Release/BepInEx/core/Il2CppInterop.Generator.dll differ diff --git a/Release/BepInEx/core/Il2CppInterop.HarmonySupport.dll b/Release/BepInEx/core/Il2CppInterop.HarmonySupport.dll new file mode 100644 index 0000000..18845af Binary files /dev/null and b/Release/BepInEx/core/Il2CppInterop.HarmonySupport.dll differ diff --git a/Release/BepInEx/core/Il2CppInterop.Runtime.dll b/Release/BepInEx/core/Il2CppInterop.Runtime.dll new file mode 100644 index 0000000..7b17697 Binary files /dev/null and b/Release/BepInEx/core/Il2CppInterop.Runtime.dll differ diff --git a/Release/BepInEx/core/LibCpp2IL.dll b/Release/BepInEx/core/LibCpp2IL.dll new file mode 100644 index 0000000..61f510f Binary files /dev/null and b/Release/BepInEx/core/LibCpp2IL.dll differ diff --git a/Release/BepInEx/core/Mono.Cecil.Mdb.dll b/Release/BepInEx/core/Mono.Cecil.Mdb.dll new file mode 100644 index 0000000..c22998b Binary files /dev/null and b/Release/BepInEx/core/Mono.Cecil.Mdb.dll differ diff --git a/Release/BepInEx/core/Mono.Cecil.Pdb.dll b/Release/BepInEx/core/Mono.Cecil.Pdb.dll new file mode 100644 index 0000000..0d396b8 Binary files /dev/null and b/Release/BepInEx/core/Mono.Cecil.Pdb.dll differ diff --git a/Release/BepInEx/core/Mono.Cecil.Rocks.dll b/Release/BepInEx/core/Mono.Cecil.Rocks.dll new file mode 100644 index 0000000..785c186 Binary files /dev/null and b/Release/BepInEx/core/Mono.Cecil.Rocks.dll differ diff --git a/Release/BepInEx/core/Mono.Cecil.dll b/Release/BepInEx/core/Mono.Cecil.dll new file mode 100644 index 0000000..9b78a39 Binary files /dev/null and b/Release/BepInEx/core/Mono.Cecil.dll differ diff --git a/Release/BepInEx/core/MonoMod.RuntimeDetour.dll b/Release/BepInEx/core/MonoMod.RuntimeDetour.dll new file mode 100644 index 0000000..a770495 Binary files /dev/null and b/Release/BepInEx/core/MonoMod.RuntimeDetour.dll differ diff --git a/Release/BepInEx/core/MonoMod.Utils.dll b/Release/BepInEx/core/MonoMod.Utils.dll new file mode 100644 index 0000000..db243e6 Binary files /dev/null and b/Release/BepInEx/core/MonoMod.Utils.dll differ diff --git a/Release/BepInEx/core/SemanticVersioning.dll b/Release/BepInEx/core/SemanticVersioning.dll new file mode 100644 index 0000000..e021672 Binary files /dev/null and b/Release/BepInEx/core/SemanticVersioning.dll differ diff --git a/Release/BepInEx/core/StableNameDotNet.dll b/Release/BepInEx/core/StableNameDotNet.dll new file mode 100644 index 0000000..0297a3b Binary files /dev/null and b/Release/BepInEx/core/StableNameDotNet.dll differ diff --git a/Release/BepInEx/core/WasmDisassembler.dll b/Release/BepInEx/core/WasmDisassembler.dll new file mode 100644 index 0000000..631f4a2 Binary files /dev/null and b/Release/BepInEx/core/WasmDisassembler.dll differ diff --git a/Release/BepInEx/core/dobby.dll b/Release/BepInEx/core/dobby.dll new file mode 100644 index 0000000..f707b98 Binary files /dev/null and b/Release/BepInEx/core/dobby.dll differ diff --git a/Release/BepInEx/plugins/SuisHack.dll b/Release/BepInEx/plugins/SuisHack.dll new file mode 100644 index 0000000..e02dec5 Binary files /dev/null and b/Release/BepInEx/plugins/SuisHack.dll differ diff --git a/Release/LICENSE.md b/Release/LICENSE.md index 603c01d..8b99af8 100644 --- a/Release/LICENSE.md +++ b/Release/LICENSE.md @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 SuiMachine +Copyright (c) 2024 SuiMachine Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Release/LICENSE_BepInEx.txt b/Release/LICENSE_BepInEx.txt new file mode 100644 index 0000000..bb491d7 --- /dev/null +++ b/Release/LICENSE_BepInEx.txt @@ -0,0 +1,482 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + + NOTICE + +BepInEx - Unity +Copyright (C) 2020 BepInEx Team + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 +USA + + +Exemptions / alternate licenses are available for negotiation. diff --git a/Release/Mods/SuisHack.deps.json b/Release/Mods/SuisHack.deps.json deleted file mode 100644 index 60d6fff..0000000 --- a/Release/Mods/SuisHack.deps.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "runtimeTarget": { - "name": ".NETCoreApp,Version=v6.0", - "signature": "" - }, - "compilationOptions": {}, - "targets": { - ".NETCoreApp,Version=v6.0": { - "SuisHack/1.0.0": { - "runtime": { - "SuisHack.dll": {} - } - } - } - }, - "libraries": { - "SuisHack/1.0.0": { - "type": "project", - "serviceable": false, - "sha512": "" - } - } -} \ No newline at end of file diff --git a/Release/Mods/SuisHack.dll b/Release/Mods/SuisHack.dll deleted file mode 100644 index 5277a18..0000000 Binary files a/Release/Mods/SuisHack.dll and /dev/null differ diff --git a/Release/Mods/SuisHack.pdb b/Release/Mods/SuisHack.pdb deleted file mode 100644 index 57da2a0..0000000 Binary files a/Release/Mods/SuisHack.pdb and /dev/null differ diff --git a/Release/changelog.txt b/Release/changelog.txt new file mode 100644 index 0000000..af4df3e --- /dev/null +++ b/Release/changelog.txt @@ -0,0 +1,115 @@ +120 changes since v6.0.0-pre.1 + +Changelog (excluding merge commits): +* (42a6727) [js6pak] Bump Il2CppInterop +* (c36d9c4) [js6pak] Bump Dobby version +* (f611f9a) [Kasuromi] Bump Il2CppInterop +* (de2d03e) [Kasuromi] Bump Il2CppInterop +* (200dceb) [Kasuromi] Bump Cpp2IL +* (6aabdb5) [ds5678] Switch to the `development` branch of Cpp2IL (#533) +* (0b23557) [js6pak] Bump Il2CppInterop +* (5796f53) [ghorsington] Bump Il2CppInterop, HarmonyX +* (582f4d0) [js6pak] Bump Il2CppInterop +* (bea5106) [js6pak] Add a config option to disable xref and disable it by default on x32 +* (40bf261) [ghorsington] Bump Il2CppInterop +* (0106719) [ghorsington] Bump Cpp2IL version +* (7b8c677) [ghorsington] Temporarily downgrade to Cpp2IL 2022.0.5 +* (684959d) [ghorsington] Bump Cpp2IL and Il2CppInterop +* (b3485f4) [ghorsington] Bump Dobby version +* (b9fe507) [ghorsington] Use Assembly.LoadFrom for loading assemblies +* (c0b9eae) [ghorsington] Bump Dobby version +* (44cb650) [ghorsington] Bump Il2CppInterop version +* (736138b) [ghorsington] Bump Il2CppInterop version +* (8621f84) [ghorsington] Bump Il2CppInterop +* (a77efac) [js6pak] Warn about outdated wine +* (0d2cbe6) [js6pak] Add chainloader events +* (78b5b58) [ghorsington] Build: Fix NuGet packages not being pushed +* (b41697c) [ghorsington] CI: Fix BE file lookup; fix last build commit check +* (e8ba62b) [ghorsington] Specify correct .NET version in README +* (b917345) [ghorsington] Bump Doorstop version +* (0e8ff5c) [ghorsington] Use dotnet 6.0.7 +* (9e8c0bd) [ghorsington] Move extra docs to docs/ +* (add17f1) [ghorsington] Add build types to build script; enable CI for all branches +* (27016a3) [ghorsington] Update build guide +* (6773609) [ghorsington] Add package descriptions +* (4695db1) [ghorsington] CI: Update workflow scripts to work with new args +* (6232925) [ghorsington] Remove old tests project +* (008f835) [ghorsington] Port Cakebuild script to Cake.Frosting +* (f7857c7) [ghorsington] Restructure project names and folder layout +* (ae18f16) [ghorsington] Il2Cpp: Redirect stderr on Windows to log CoreCLR crash messages +* (c5ca4a8) [ghorsington] Il2Cpp: Add missing Console redirect fix +* (ad5ca9d) [ghorsington] Bump Doorstop +* (531bda7) [ghorsington] Use Doorstop 4.0.0-rc.6 +* (8d743ff) [ghorsington] run_bepinex_mono: Fix target name +* (c770455) [ghorsington] Port #443 from upstream +* (cb344fb) [ghorsington] Disable linux x86 build for Il2Cpp +* (6bb83b5) [ghorsington] Bump Il2CppInterop version +* (ad85dbb) [ghorsington] Fix style +* (39b84a2) [ghorsington] Remove remaining "unhollow" wording +* (4b240fc) [ghorsington] Select better entrypoint for Unity 4; restore ThreadingHelper +* (9e87075) [ghorsington] Use new version handler for Il2CppInteropManager +* (579ee85) [ghorsington] Add extended Unity version resolver; reorganise projects +* (f27cfd7) [ghorsington] Fix MonoAssemblyHelper not working on Unity 5 and older +* (5ef040f) [ghorsington] Add Doorstop folders as solution items +* (ea6af5f) [ghorsington] Bump Doorstop version +* (24d2395) [ghorsington] Bump CakeBuild version +* (2751056) [ghorsington] Remove extra logging +* (828ef20) [ghorsington] UnityMono: Resolve assemblies into memory using mono API +* (f400445) [ghorsington] Refactor Unity -> UnityMono +* (46d9dd4) [ghorsington] Fix Wine check not working on UnityMono version +* (f658a4f) [ghorsington] Adjust hash info message +* (d232386) [ghorsington] Use release .NET 6.0.6 builds +* (d190b06) [ghorsington] Restructure versioning and project configuration +* (28487d2) [ghorsington] Disable Il2CppInterop parallel writing on Wine +* (60147c7) [ghorsington] Add platform check for Wine, report Wine version +* (d42f342) [ghorsington] Bump Il2CppInterop +* (dcab274) [ghorsington] Bump Il2CppInterop version +* (cbb864d) [Kasuromi] Pass in delegate instead of function pointer +* (e0023bb) [Kasuromi] Wrap detour on create +* (ef89754) [js6pak] Add the using back +* (0c0b8cf) [Kasuromi] it was still needed +* (cad26ff) [ghorsington] Update Doorstop +* (8122165) [ghorsington] Update README +* (9224a2a) [ghorsington] Update Il2CppInterop +* (0e58099) [js6pak] Allow changing preloader log name with an env variable +* (9743fb4) [js6pak] Preloader fail fast +* (c184450) [ghorsington] Fix BepInExLogger not logging exceptions +* (0bc9578) [ghorsington] Update Cakebuild script +* (5ba3199) [js6pak] Add linux support +* (8d26da3) [js6pak] Centralize the delegate workaround +* (5dce490) [js6pak] ConsoleOut workaround isn't needed anymore +* (97998e7) [ghorsington] Use latest dotnet; fix *nix scripts +* (3538abf) [js6pak] Support macos +* (12079ae) [js6pak] Improve ConsoleWindow exceptions +* (1315427) [js6pak] Fix console on wine +* (266a2c8) [ghorsington] Use new Il2CppInterop detour provider, add Il2CppInterop.HarmonySupport +* (59097db) [ghorsington] Update Il2CppInterop; use new runner API +* (abb1073) [ghorsington] Target latest Il2CppInterop code +* (01635d9) [Kasuromi] Cache Harmony Delegates & Runtime Invoke +* (68cadbf) [ghorsington] Fix hook logs not showing +* (6ca26f4) [ghorsington] Clean up after merge +* (83b72d5) [Kasuromi] Add config option for forced detour provider +* (9432878) [Kasuromi] Remove unused method +* (2797bef) [Kasuromi] Add Dobby Detour Provider +* (1360639) [Kasuromi] Cleanup imports and rename region +* (8743674) [Kasuromi] Create NativeDetourHelper and internalize funchook +* (6897bb0) [Kasuromi] Deprecate FastNativeDetour in favor of Funchook +* (3a47049) [ghorsington] Add dobby to distribution +* (0da14c5) [ghorsington] BepInEx.IL2CPP: Move runtime info logging to preloader +* (5afef9a) [ghorsington] FastNativeDetour: temporary fix for net6.0 support +* (7a54a77) [ghorsington] BepInEx.IL2CPP: Remove old MonoExtensions +* (b80f297) [ghorsington] BepInEx.IL2CPP: Fix mutex checks +* (8dc326c) [ghorsington] ConsoleManager: enable console by default +* (a8dbe2c) [ghorsington] BepInEx.IL2CPP: fix ReferenceLibs copying to output +* (a1c7f5c) [ghorsington] ConsoleManager: refactor useWinApiEncoder -> useManagedEncoder +* (57658bd) [ghorsington] BepInEx.IL2CPP: retarget to net6.0, switch to Il2CppInterop +* (514d273) [ghorsington] Use RC builds for Doorstop 4 +* (c2dfd63) [ghorsington] CakeBuild: Revert "task" -> "target" +* (b927279) [ghorsington] Il2Cpp: bundle dotnet runtime, add linux/macos +* (f1146a2) [Dusk Banks] General build.cake clean-up +* (ab5d882) [Dusk Banks] Normalize target triples (platform names) +* (a431814) [ghorsington] Add note about platform name +* (ae9232a) [ghorsington] Add nightly.link comment bot for PRs +* (f4334f5) [ghorsington] Update CI to work with Doorstop 4 +* (43c8831) [Dusk Banks] [WIP] UnityDoorstop 4 support +* (643ab34) [Dusk Banks] TODO(Bepis): commit your UnityChainloader patch diff --git a/Release/doorstop_config.ini b/Release/doorstop_config.ini new file mode 100644 index 0000000..ed1f29a --- /dev/null +++ b/Release/doorstop_config.ini @@ -0,0 +1,48 @@ +# General options for Unity Doorstop +[General] + +# Enable Doorstop? +enabled = true + +# Path to the assembly to load and execute +# NOTE: The entrypoint must be of format `static void Doorstop.Entrypoint.Start()` +target_assembly = BepInEx\core\BepInEx.Unity.IL2CPP.dll + +# If true, Unity's output log is redirected to \output_log.txt +redirect_output_log = false + +# If enabled, DOORSTOP_DISABLE env var value is ignored +# USE THIS ONLY WHEN ASKED TO OR YOU KNOW WHAT THIS MEANS +ignore_disable_switch = false + +# Options specific to running under Unity Mono runtime +[UnityMono] + +# Overrides default Mono DLL search path +# Sometimes it is needed to instruct Mono to seek its assemblies from a different path +# (e.g. mscorlib is stripped in original game) +# This option causes Mono to seek mscorlib and core libraries from a different folder before Managed +# Original Managed folder is added as a secondary folder in the search path +dll_search_path_override = + +# If true, Mono debugger server will be enabled +debug_enabled = false + +# When debug_enabled is true, this option specifies whether Doorstop should initialize the debugger server +# If you experience crashes when starting the debugger on debug UnityPlayer builds, try setting this to false +debug_start_server = true + +# When debug_enabled is true, specifies the address to use for the debugger server +debug_address = 127.0.0.1:10000 + +# If true and debug_enabled is true, Mono debugger server will suspend the game execution until a debugger is attached +debug_suspend = false + +# Options sepcific to running under Il2Cpp runtime +[Il2Cpp] + +# Path to coreclr.dll that contains the CoreCLR runtime +coreclr_path = dotnet\coreclr.dll + +# Path to the directory containing the managed core libraries for CoreCLR (mscorlib, System, etc.) +corlib_dir = dotnet diff --git a/Release/dotnet/.version b/Release/dotnet/.version new file mode 100644 index 0000000..ccfc552 --- /dev/null +++ b/Release/dotnet/.version @@ -0,0 +1,2 @@ +0ec02c8c96e2eda06dc5b5edfdbdba0f36415082 +6.0.7 diff --git a/Release/dotnet/Microsoft.Bcl.AsyncInterfaces.dll b/Release/dotnet/Microsoft.Bcl.AsyncInterfaces.dll new file mode 100644 index 0000000..fe6ba4c Binary files /dev/null and b/Release/dotnet/Microsoft.Bcl.AsyncInterfaces.dll differ diff --git a/Release/dotnet/Microsoft.CSharp.dll b/Release/dotnet/Microsoft.CSharp.dll new file mode 100644 index 0000000..c6fde98 Binary files /dev/null and b/Release/dotnet/Microsoft.CSharp.dll differ diff --git a/Release/dotnet/Microsoft.DiaSymReader.Native.amd64.dll b/Release/dotnet/Microsoft.DiaSymReader.Native.amd64.dll new file mode 100644 index 0000000..78c90cd Binary files /dev/null and b/Release/dotnet/Microsoft.DiaSymReader.Native.amd64.dll differ diff --git a/Release/dotnet/Microsoft.Extensions.DependencyInjection.Abstractions.dll b/Release/dotnet/Microsoft.Extensions.DependencyInjection.Abstractions.dll new file mode 100644 index 0000000..b4ee93d Binary files /dev/null and b/Release/dotnet/Microsoft.Extensions.DependencyInjection.Abstractions.dll differ diff --git a/Release/dotnet/Microsoft.Extensions.DependencyInjection.dll b/Release/dotnet/Microsoft.Extensions.DependencyInjection.dll new file mode 100644 index 0000000..97525f7 Binary files /dev/null and b/Release/dotnet/Microsoft.Extensions.DependencyInjection.dll differ diff --git a/Release/dotnet/Microsoft.Extensions.Logging.Abstractions.dll b/Release/dotnet/Microsoft.Extensions.Logging.Abstractions.dll new file mode 100644 index 0000000..bb27a2f Binary files /dev/null and b/Release/dotnet/Microsoft.Extensions.Logging.Abstractions.dll differ diff --git a/Release/dotnet/Microsoft.Extensions.Logging.dll b/Release/dotnet/Microsoft.Extensions.Logging.dll new file mode 100644 index 0000000..9e2d7f9 Binary files /dev/null and b/Release/dotnet/Microsoft.Extensions.Logging.dll differ diff --git a/Release/dotnet/Microsoft.Extensions.Options.dll b/Release/dotnet/Microsoft.Extensions.Options.dll new file mode 100644 index 0000000..604b602 Binary files /dev/null and b/Release/dotnet/Microsoft.Extensions.Options.dll differ diff --git a/Release/dotnet/Microsoft.Extensions.Primitives.dll b/Release/dotnet/Microsoft.Extensions.Primitives.dll new file mode 100644 index 0000000..1b2c43a Binary files /dev/null and b/Release/dotnet/Microsoft.Extensions.Primitives.dll differ diff --git a/Release/dotnet/Microsoft.NETCore.App.deps.json b/Release/dotnet/Microsoft.NETCore.App.deps.json new file mode 100644 index 0000000..5e04425 --- /dev/null +++ b/Release/dotnet/Microsoft.NETCore.App.deps.json @@ -0,0 +1,981 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v6.0/win-x64", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v6.0": {}, + ".NETCoreApp,Version=v6.0/win-x64": { + "Microsoft.NETCore.App.Runtime.win-x64/6.0.7": { + "runtime": { + "System.Private.CoreLib.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "Microsoft.VisualBasic.dll": { + "assemblyVersion": "10.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "mscorlib.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "netstandard.dll": { + "assemblyVersion": "2.1.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.AppContext.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Buffers.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.ComponentModel.DataAnnotations.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Configuration.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Core.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Data.DataSetExtensions.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Data.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Diagnostics.Contracts.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Diagnostics.Debug.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Diagnostics.Tools.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Diagnostics.Tracing.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Drawing.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Dynamic.Runtime.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Globalization.Calendars.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Globalization.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Globalization.Extensions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.IO.Compression.FileSystem.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.IO.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.IO.FileSystem.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.IO.FileSystem.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.IO.Pipes.AccessControl.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.IO.UnmanagedMemoryStream.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Net.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Numerics.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Numerics.Vectors.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Reflection.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Reflection.Emit.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Reflection.Emit.ILGeneration.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Reflection.Emit.Lightweight.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Reflection.Extensions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Reflection.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Resources.Reader.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Resources.ResourceManager.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Runtime.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Runtime.Extensions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Runtime.Handles.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Runtime.Intrinsics.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Runtime.Loader.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Runtime.Serialization.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Runtime.Serialization.Json.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Runtime.Serialization.Xml.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Security.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Security.Principal.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Security.SecureString.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.ServiceModel.Web.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.ServiceProcess.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Text.Encoding.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Text.Encoding.Extensions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Threading.Overlapped.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Threading.Tasks.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Threading.Tasks.Extensions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Threading.Thread.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Threading.ThreadPool.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Threading.Timer.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Transactions.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.ValueTuple.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Web.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Windows.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Xml.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Xml.Linq.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Xml.ReaderWriter.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Xml.Serialization.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Xml.XDocument.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Xml.XmlDocument.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Xml.XmlSerializer.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Xml.XPath.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "WindowsBase.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "Microsoft.CSharp.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "Microsoft.VisualBasic.Core.dll": { + "assemblyVersion": "11.0.0.0", + "fileVersion": "11.100.722.32202" + }, + "Microsoft.Win32.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "Microsoft.Win32.Registry.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Collections.Concurrent.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Collections.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Collections.Immutable.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Collections.NonGeneric.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Collections.Specialized.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.ComponentModel.Annotations.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.ComponentModel.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.ComponentModel.EventBasedAsync.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.ComponentModel.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.ComponentModel.TypeConverter.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Console.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Data.Common.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Diagnostics.DiagnosticSource.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Diagnostics.FileVersionInfo.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Diagnostics.Process.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Diagnostics.StackTrace.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Diagnostics.TextWriterTraceListener.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Diagnostics.TraceSource.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Drawing.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Formats.Asn1.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.IO.Compression.Brotli.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.IO.Compression.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.IO.Compression.ZipFile.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.IO.FileSystem.AccessControl.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.IO.FileSystem.DriveInfo.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.IO.FileSystem.Watcher.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.IO.IsolatedStorage.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.IO.MemoryMappedFiles.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.IO.Pipes.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Linq.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Linq.Expressions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Linq.Parallel.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Linq.Queryable.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Memory.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Net.Http.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Net.Http.Json.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Net.HttpListener.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Net.Mail.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Net.NameResolution.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Net.NetworkInformation.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Net.Ping.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Net.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Net.Quic.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Net.Requests.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Net.Security.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Net.ServicePoint.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Net.Sockets.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Net.WebClient.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Net.WebHeaderCollection.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Net.WebProxy.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Net.WebSockets.Client.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Net.WebSockets.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.ObjectModel.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Private.DataContractSerialization.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Private.Uri.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Private.Xml.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Private.Xml.Linq.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Reflection.DispatchProxy.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Reflection.Metadata.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Reflection.TypeExtensions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Resources.Writer.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Runtime.CompilerServices.Unsafe.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Runtime.CompilerServices.VisualC.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Runtime.InteropServices.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Runtime.InteropServices.RuntimeInformation.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Runtime.Numerics.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Runtime.Serialization.Formatters.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Runtime.Serialization.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Security.AccessControl.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Security.Claims.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Security.Cryptography.Algorithms.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Security.Cryptography.Cng.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Security.Cryptography.Csp.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Security.Cryptography.Encoding.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Security.Cryptography.OpenSsl.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Security.Cryptography.Primitives.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Security.Cryptography.X509Certificates.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Security.Principal.Windows.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Text.Encoding.CodePages.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Text.Encodings.Web.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Text.Json.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Text.RegularExpressions.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Threading.Channels.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Threading.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Threading.Tasks.Dataflow.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Threading.Tasks.Parallel.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Transactions.Local.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Web.HttpUtility.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + }, + "System.Xml.XPath.XDocument.dll": { + "assemblyVersion": "6.0.0.0", + "fileVersion": "6.0.722.32202" + } + }, + "native": { + "clretwrc.dll": { + "fileVersion": "6.0.722.32202" + }, + "clrjit.dll": { + "fileVersion": "6.0.722.32202" + }, + "coreclr.dll": { + "fileVersion": "6.0.722.32202" + }, + "createdump.exe": { + "fileVersion": "6.0.722.32202" + }, + "dbgshim.dll": { + "fileVersion": "6.0.722.32202" + }, + "mscordaccore.dll": { + "fileVersion": "6.0.722.32202" + }, + "mscordaccore_amd64_amd64_6.0.722.32202.dll": { + "fileVersion": "6.0.722.32202" + }, + "mscordbi.dll": { + "fileVersion": "6.0.722.32202" + }, + "mscorrc.dll": { + "fileVersion": "6.0.722.32202" + }, + "api-ms-win-core-console-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-console-l1-2-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-datetime-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-debug-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-errorhandling-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-fibers-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-file-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-file-l1-2-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-file-l2-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-handle-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-heap-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-interlocked-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-libraryloader-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-localization-l1-2-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-memory-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-namedpipe-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-processenvironment-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-processthreads-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-processthreads-l1-1-1.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-profile-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-rtlsupport-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-string-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-synch-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-synch-l1-2-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-sysinfo-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-timezone-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-core-util-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-conio-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-convert-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-environment-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-filesystem-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-heap-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-locale-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-math-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-multibyte-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-private-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-process-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-runtime-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-stdio-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-string-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-time-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "api-ms-win-crt-utility-l1-1-0.dll": { + "fileVersion": "10.0.22000.194" + }, + "ucrtbase.dll": { + "fileVersion": "10.0.22000.194" + }, + "msquic.dll": { + "fileVersion": "1.7.0.0" + }, + "System.IO.Compression.Native.dll": { + "fileVersion": "42.42.42.42424" + }, + "hostpolicy.dll": { + "fileVersion": "6.0.722.32202" + }, + "Microsoft.DiaSymReader.Native.amd64.dll": { + "fileVersion": "14.28.29715.1" + } + } + } + } + }, + "libraries": { + "Microsoft.NETCore.App.Runtime.win-x64/6.0.7": { + "type": "package", + "serviceable": true, + "sha512": "", + "path": "microsoft.netcore.app.runtime.win-x64/6.0.7" + } + }, + "runtimes": { + "win-x64": [ + "win", + "any", + "base" + ], + "win-x64-aot": [ + "win-aot", + "win-x64", + "win", + "aot", + "any", + "base" + ], + "win10-x64": [ + "win10", + "win81-x64", + "win81", + "win8-x64", + "win8", + "win7-x64", + "win7", + "win-x64", + "win", + "any", + "base" + ], + "win10-x64-aot": [ + "win10-aot", + "win10-x64", + "win10", + "win81-x64-aot", + "win81-aot", + "win81-x64", + "win81", + "win8-x64-aot", + "win8-aot", + "win8-x64", + "win8", + "win7-x64-aot", + "win7-aot", + "win7-x64", + "win7", + "win-x64-aot", + "win-aot", + "win-x64", + "win", + "aot", + "any", + "base" + ], + "win7-x64": [ + "win7", + "win-x64", + "win", + "any", + "base" + ], + "win7-x64-aot": [ + "win7-aot", + "win7-x64", + "win7", + "win-x64-aot", + "win-aot", + "win-x64", + "win", + "aot", + "any", + "base" + ], + "win8-x64": [ + "win8", + "win7-x64", + "win7", + "win-x64", + "win", + "any", + "base" + ], + "win8-x64-aot": [ + "win8-aot", + "win8-x64", + "win8", + "win7-x64-aot", + "win7-aot", + "win7-x64", + "win7", + "win-x64-aot", + "win-aot", + "win-x64", + "win", + "aot", + "any", + "base" + ], + "win81-x64": [ + "win81", + "win8-x64", + "win8", + "win7-x64", + "win7", + "win-x64", + "win", + "any", + "base" + ], + "win81-x64-aot": [ + "win81-aot", + "win81-x64", + "win81", + "win8-x64-aot", + "win8-aot", + "win8-x64", + "win8", + "win7-x64-aot", + "win7-aot", + "win7-x64", + "win7", + "win-x64-aot", + "win-aot", + "win-x64", + "win", + "aot", + "any", + "base" + ] + } +} \ No newline at end of file diff --git a/Release/dotnet/Microsoft.NETCore.App.runtimeconfig.json b/Release/dotnet/Microsoft.NETCore.App.runtimeconfig.json new file mode 100644 index 0000000..3d37d8e --- /dev/null +++ b/Release/dotnet/Microsoft.NETCore.App.runtimeconfig.json @@ -0,0 +1,8 @@ +{ + "runtimeOptions": { + "tfm": "net6.0", + "configProperties": { + "System.Reflection.Metadata.MetadataUpdater.IsSupported": false + } + } +} \ No newline at end of file diff --git a/Release/dotnet/Microsoft.VisualBasic.Core.dll b/Release/dotnet/Microsoft.VisualBasic.Core.dll new file mode 100644 index 0000000..0a96629 Binary files /dev/null and b/Release/dotnet/Microsoft.VisualBasic.Core.dll differ diff --git a/Release/dotnet/Microsoft.VisualBasic.dll b/Release/dotnet/Microsoft.VisualBasic.dll new file mode 100644 index 0000000..d07f110 Binary files /dev/null and b/Release/dotnet/Microsoft.VisualBasic.dll differ diff --git a/Release/dotnet/Microsoft.Win32.Primitives.dll b/Release/dotnet/Microsoft.Win32.Primitives.dll new file mode 100644 index 0000000..db95d8b Binary files /dev/null and b/Release/dotnet/Microsoft.Win32.Primitives.dll differ diff --git a/Release/dotnet/Microsoft.Win32.Registry.dll b/Release/dotnet/Microsoft.Win32.Registry.dll new file mode 100644 index 0000000..b3c5063 Binary files /dev/null and b/Release/dotnet/Microsoft.Win32.Registry.dll differ diff --git a/Release/dotnet/System.AppContext.dll b/Release/dotnet/System.AppContext.dll new file mode 100644 index 0000000..5cf68be Binary files /dev/null and b/Release/dotnet/System.AppContext.dll differ diff --git a/Release/dotnet/System.Buffers.dll b/Release/dotnet/System.Buffers.dll new file mode 100644 index 0000000..02aaac7 Binary files /dev/null and b/Release/dotnet/System.Buffers.dll differ diff --git a/Release/dotnet/System.Collections.Concurrent.dll b/Release/dotnet/System.Collections.Concurrent.dll new file mode 100644 index 0000000..6713cc0 Binary files /dev/null and b/Release/dotnet/System.Collections.Concurrent.dll differ diff --git a/Release/dotnet/System.Collections.Immutable.dll b/Release/dotnet/System.Collections.Immutable.dll new file mode 100644 index 0000000..2ab5fae Binary files /dev/null and b/Release/dotnet/System.Collections.Immutable.dll differ diff --git a/Release/dotnet/System.Collections.NonGeneric.dll b/Release/dotnet/System.Collections.NonGeneric.dll new file mode 100644 index 0000000..9caf05b Binary files /dev/null and b/Release/dotnet/System.Collections.NonGeneric.dll differ diff --git a/Release/dotnet/System.Collections.Specialized.dll b/Release/dotnet/System.Collections.Specialized.dll new file mode 100644 index 0000000..0ee4196 Binary files /dev/null and b/Release/dotnet/System.Collections.Specialized.dll differ diff --git a/Release/dotnet/System.Collections.dll b/Release/dotnet/System.Collections.dll new file mode 100644 index 0000000..07fe928 Binary files /dev/null and b/Release/dotnet/System.Collections.dll differ diff --git a/Release/dotnet/System.ComponentModel.Annotations.dll b/Release/dotnet/System.ComponentModel.Annotations.dll new file mode 100644 index 0000000..430a8f2 Binary files /dev/null and b/Release/dotnet/System.ComponentModel.Annotations.dll differ diff --git a/Release/dotnet/System.ComponentModel.DataAnnotations.dll b/Release/dotnet/System.ComponentModel.DataAnnotations.dll new file mode 100644 index 0000000..176eef2 Binary files /dev/null and b/Release/dotnet/System.ComponentModel.DataAnnotations.dll differ diff --git a/Release/dotnet/System.ComponentModel.EventBasedAsync.dll b/Release/dotnet/System.ComponentModel.EventBasedAsync.dll new file mode 100644 index 0000000..2d8b891 Binary files /dev/null and b/Release/dotnet/System.ComponentModel.EventBasedAsync.dll differ diff --git a/Release/dotnet/System.ComponentModel.Primitives.dll b/Release/dotnet/System.ComponentModel.Primitives.dll new file mode 100644 index 0000000..bae7ad5 Binary files /dev/null and b/Release/dotnet/System.ComponentModel.Primitives.dll differ diff --git a/Release/dotnet/System.ComponentModel.TypeConverter.dll b/Release/dotnet/System.ComponentModel.TypeConverter.dll new file mode 100644 index 0000000..73f409d Binary files /dev/null and b/Release/dotnet/System.ComponentModel.TypeConverter.dll differ diff --git a/Release/dotnet/System.ComponentModel.dll b/Release/dotnet/System.ComponentModel.dll new file mode 100644 index 0000000..dd1075f Binary files /dev/null and b/Release/dotnet/System.ComponentModel.dll differ diff --git a/Release/dotnet/System.Configuration.dll b/Release/dotnet/System.Configuration.dll new file mode 100644 index 0000000..42ab7cd Binary files /dev/null and b/Release/dotnet/System.Configuration.dll differ diff --git a/Release/dotnet/System.Console.dll b/Release/dotnet/System.Console.dll new file mode 100644 index 0000000..d229e03 Binary files /dev/null and b/Release/dotnet/System.Console.dll differ diff --git a/Release/dotnet/System.Core.dll b/Release/dotnet/System.Core.dll new file mode 100644 index 0000000..f8076d1 Binary files /dev/null and b/Release/dotnet/System.Core.dll differ diff --git a/Release/dotnet/System.Data.Common.dll b/Release/dotnet/System.Data.Common.dll new file mode 100644 index 0000000..88144fc Binary files /dev/null and b/Release/dotnet/System.Data.Common.dll differ diff --git a/Release/dotnet/System.Data.DataSetExtensions.dll b/Release/dotnet/System.Data.DataSetExtensions.dll new file mode 100644 index 0000000..431d40b Binary files /dev/null and b/Release/dotnet/System.Data.DataSetExtensions.dll differ diff --git a/Release/dotnet/System.Data.dll b/Release/dotnet/System.Data.dll new file mode 100644 index 0000000..f0f83b7 Binary files /dev/null and b/Release/dotnet/System.Data.dll differ diff --git a/Release/dotnet/System.Diagnostics.Contracts.dll b/Release/dotnet/System.Diagnostics.Contracts.dll new file mode 100644 index 0000000..8ff313b Binary files /dev/null and b/Release/dotnet/System.Diagnostics.Contracts.dll differ diff --git a/Release/dotnet/System.Diagnostics.Debug.dll b/Release/dotnet/System.Diagnostics.Debug.dll new file mode 100644 index 0000000..6add2d2 Binary files /dev/null and b/Release/dotnet/System.Diagnostics.Debug.dll differ diff --git a/Release/dotnet/System.Diagnostics.DiagnosticSource.dll b/Release/dotnet/System.Diagnostics.DiagnosticSource.dll new file mode 100644 index 0000000..1665712 Binary files /dev/null and b/Release/dotnet/System.Diagnostics.DiagnosticSource.dll differ diff --git a/Release/dotnet/System.Diagnostics.FileVersionInfo.dll b/Release/dotnet/System.Diagnostics.FileVersionInfo.dll new file mode 100644 index 0000000..564a1cf Binary files /dev/null and b/Release/dotnet/System.Diagnostics.FileVersionInfo.dll differ diff --git a/Release/dotnet/System.Diagnostics.Process.dll b/Release/dotnet/System.Diagnostics.Process.dll new file mode 100644 index 0000000..516dfa0 Binary files /dev/null and b/Release/dotnet/System.Diagnostics.Process.dll differ diff --git a/Release/dotnet/System.Diagnostics.StackTrace.dll b/Release/dotnet/System.Diagnostics.StackTrace.dll new file mode 100644 index 0000000..de03d5a Binary files /dev/null and b/Release/dotnet/System.Diagnostics.StackTrace.dll differ diff --git a/Release/dotnet/System.Diagnostics.TextWriterTraceListener.dll b/Release/dotnet/System.Diagnostics.TextWriterTraceListener.dll new file mode 100644 index 0000000..bf4139a Binary files /dev/null and b/Release/dotnet/System.Diagnostics.TextWriterTraceListener.dll differ diff --git a/Release/dotnet/System.Diagnostics.Tools.dll b/Release/dotnet/System.Diagnostics.Tools.dll new file mode 100644 index 0000000..33052ab Binary files /dev/null and b/Release/dotnet/System.Diagnostics.Tools.dll differ diff --git a/Release/dotnet/System.Diagnostics.TraceSource.dll b/Release/dotnet/System.Diagnostics.TraceSource.dll new file mode 100644 index 0000000..abb8fd0 Binary files /dev/null and b/Release/dotnet/System.Diagnostics.TraceSource.dll differ diff --git a/Release/dotnet/System.Diagnostics.Tracing.dll b/Release/dotnet/System.Diagnostics.Tracing.dll new file mode 100644 index 0000000..abd356e Binary files /dev/null and b/Release/dotnet/System.Diagnostics.Tracing.dll differ diff --git a/Release/dotnet/System.Drawing.Primitives.dll b/Release/dotnet/System.Drawing.Primitives.dll new file mode 100644 index 0000000..859de3c Binary files /dev/null and b/Release/dotnet/System.Drawing.Primitives.dll differ diff --git a/Release/dotnet/System.Drawing.dll b/Release/dotnet/System.Drawing.dll new file mode 100644 index 0000000..1bdd258 Binary files /dev/null and b/Release/dotnet/System.Drawing.dll differ diff --git a/Release/dotnet/System.Dynamic.Runtime.dll b/Release/dotnet/System.Dynamic.Runtime.dll new file mode 100644 index 0000000..b1d1de7 Binary files /dev/null and b/Release/dotnet/System.Dynamic.Runtime.dll differ diff --git a/Release/dotnet/System.Formats.Asn1.dll b/Release/dotnet/System.Formats.Asn1.dll new file mode 100644 index 0000000..9191d85 Binary files /dev/null and b/Release/dotnet/System.Formats.Asn1.dll differ diff --git a/Release/dotnet/System.Globalization.Calendars.dll b/Release/dotnet/System.Globalization.Calendars.dll new file mode 100644 index 0000000..de6a579 Binary files /dev/null and b/Release/dotnet/System.Globalization.Calendars.dll differ diff --git a/Release/dotnet/System.Globalization.Extensions.dll b/Release/dotnet/System.Globalization.Extensions.dll new file mode 100644 index 0000000..c15e4ed Binary files /dev/null and b/Release/dotnet/System.Globalization.Extensions.dll differ diff --git a/Release/dotnet/System.Globalization.dll b/Release/dotnet/System.Globalization.dll new file mode 100644 index 0000000..0acc52d Binary files /dev/null and b/Release/dotnet/System.Globalization.dll differ diff --git a/Release/dotnet/System.IO.Compression.Brotli.dll b/Release/dotnet/System.IO.Compression.Brotli.dll new file mode 100644 index 0000000..579f44b Binary files /dev/null and b/Release/dotnet/System.IO.Compression.Brotli.dll differ diff --git a/Release/dotnet/System.IO.Compression.FileSystem.dll b/Release/dotnet/System.IO.Compression.FileSystem.dll new file mode 100644 index 0000000..727c186 Binary files /dev/null and b/Release/dotnet/System.IO.Compression.FileSystem.dll differ diff --git a/Release/dotnet/System.IO.Compression.Native.dll b/Release/dotnet/System.IO.Compression.Native.dll new file mode 100644 index 0000000..0c47262 Binary files /dev/null and b/Release/dotnet/System.IO.Compression.Native.dll differ diff --git a/Release/dotnet/System.IO.Compression.ZipFile.dll b/Release/dotnet/System.IO.Compression.ZipFile.dll new file mode 100644 index 0000000..3ccb8f8 Binary files /dev/null and b/Release/dotnet/System.IO.Compression.ZipFile.dll differ diff --git a/Release/dotnet/System.IO.Compression.dll b/Release/dotnet/System.IO.Compression.dll new file mode 100644 index 0000000..ae66ca1 Binary files /dev/null and b/Release/dotnet/System.IO.Compression.dll differ diff --git a/Release/dotnet/System.IO.FileSystem.AccessControl.dll b/Release/dotnet/System.IO.FileSystem.AccessControl.dll new file mode 100644 index 0000000..381dfdc Binary files /dev/null and b/Release/dotnet/System.IO.FileSystem.AccessControl.dll differ diff --git a/Release/dotnet/System.IO.FileSystem.DriveInfo.dll b/Release/dotnet/System.IO.FileSystem.DriveInfo.dll new file mode 100644 index 0000000..6ddcba5 Binary files /dev/null and b/Release/dotnet/System.IO.FileSystem.DriveInfo.dll differ diff --git a/Release/dotnet/System.IO.FileSystem.Primitives.dll b/Release/dotnet/System.IO.FileSystem.Primitives.dll new file mode 100644 index 0000000..5ae73a9 Binary files /dev/null and b/Release/dotnet/System.IO.FileSystem.Primitives.dll differ diff --git a/Release/dotnet/System.IO.FileSystem.Watcher.dll b/Release/dotnet/System.IO.FileSystem.Watcher.dll new file mode 100644 index 0000000..6210adf Binary files /dev/null and b/Release/dotnet/System.IO.FileSystem.Watcher.dll differ diff --git a/Release/dotnet/System.IO.FileSystem.dll b/Release/dotnet/System.IO.FileSystem.dll new file mode 100644 index 0000000..21fb9e6 Binary files /dev/null and b/Release/dotnet/System.IO.FileSystem.dll differ diff --git a/Release/dotnet/System.IO.IsolatedStorage.dll b/Release/dotnet/System.IO.IsolatedStorage.dll new file mode 100644 index 0000000..5ed3206 Binary files /dev/null and b/Release/dotnet/System.IO.IsolatedStorage.dll differ diff --git a/Release/dotnet/System.IO.MemoryMappedFiles.dll b/Release/dotnet/System.IO.MemoryMappedFiles.dll new file mode 100644 index 0000000..a55346a Binary files /dev/null and b/Release/dotnet/System.IO.MemoryMappedFiles.dll differ diff --git a/Release/dotnet/System.IO.Pipes.AccessControl.dll b/Release/dotnet/System.IO.Pipes.AccessControl.dll new file mode 100644 index 0000000..354e6eb Binary files /dev/null and b/Release/dotnet/System.IO.Pipes.AccessControl.dll differ diff --git a/Release/dotnet/System.IO.Pipes.dll b/Release/dotnet/System.IO.Pipes.dll new file mode 100644 index 0000000..837f5b7 Binary files /dev/null and b/Release/dotnet/System.IO.Pipes.dll differ diff --git a/Release/dotnet/System.IO.UnmanagedMemoryStream.dll b/Release/dotnet/System.IO.UnmanagedMemoryStream.dll new file mode 100644 index 0000000..fa04af3 Binary files /dev/null and b/Release/dotnet/System.IO.UnmanagedMemoryStream.dll differ diff --git a/Release/dotnet/System.IO.dll b/Release/dotnet/System.IO.dll new file mode 100644 index 0000000..70bc0bc Binary files /dev/null and b/Release/dotnet/System.IO.dll differ diff --git a/Release/dotnet/System.Linq.Expressions.dll b/Release/dotnet/System.Linq.Expressions.dll new file mode 100644 index 0000000..ff31eed Binary files /dev/null and b/Release/dotnet/System.Linq.Expressions.dll differ diff --git a/Release/dotnet/System.Linq.Parallel.dll b/Release/dotnet/System.Linq.Parallel.dll new file mode 100644 index 0000000..4c5ffa8 Binary files /dev/null and b/Release/dotnet/System.Linq.Parallel.dll differ diff --git a/Release/dotnet/System.Linq.Queryable.dll b/Release/dotnet/System.Linq.Queryable.dll new file mode 100644 index 0000000..f059a88 Binary files /dev/null and b/Release/dotnet/System.Linq.Queryable.dll differ diff --git a/Release/dotnet/System.Linq.dll b/Release/dotnet/System.Linq.dll new file mode 100644 index 0000000..8bf5ec4 Binary files /dev/null and b/Release/dotnet/System.Linq.dll differ diff --git a/Release/dotnet/System.Memory.dll b/Release/dotnet/System.Memory.dll new file mode 100644 index 0000000..30d53de Binary files /dev/null and b/Release/dotnet/System.Memory.dll differ diff --git a/Release/dotnet/System.Net.Http.Json.dll b/Release/dotnet/System.Net.Http.Json.dll new file mode 100644 index 0000000..db6fc88 Binary files /dev/null and b/Release/dotnet/System.Net.Http.Json.dll differ diff --git a/Release/dotnet/System.Net.Http.dll b/Release/dotnet/System.Net.Http.dll new file mode 100644 index 0000000..b38b2c8 Binary files /dev/null and b/Release/dotnet/System.Net.Http.dll differ diff --git a/Release/dotnet/System.Net.HttpListener.dll b/Release/dotnet/System.Net.HttpListener.dll new file mode 100644 index 0000000..57c8028 Binary files /dev/null and b/Release/dotnet/System.Net.HttpListener.dll differ diff --git a/Release/dotnet/System.Net.Mail.dll b/Release/dotnet/System.Net.Mail.dll new file mode 100644 index 0000000..ff5d425 Binary files /dev/null and b/Release/dotnet/System.Net.Mail.dll differ diff --git a/Release/dotnet/System.Net.NameResolution.dll b/Release/dotnet/System.Net.NameResolution.dll new file mode 100644 index 0000000..2db4170 Binary files /dev/null and b/Release/dotnet/System.Net.NameResolution.dll differ diff --git a/Release/dotnet/System.Net.NetworkInformation.dll b/Release/dotnet/System.Net.NetworkInformation.dll new file mode 100644 index 0000000..e840cbf Binary files /dev/null and b/Release/dotnet/System.Net.NetworkInformation.dll differ diff --git a/Release/dotnet/System.Net.Ping.dll b/Release/dotnet/System.Net.Ping.dll new file mode 100644 index 0000000..57e6e75 Binary files /dev/null and b/Release/dotnet/System.Net.Ping.dll differ diff --git a/Release/dotnet/System.Net.Primitives.dll b/Release/dotnet/System.Net.Primitives.dll new file mode 100644 index 0000000..c408704 Binary files /dev/null and b/Release/dotnet/System.Net.Primitives.dll differ diff --git a/Release/dotnet/System.Net.Quic.dll b/Release/dotnet/System.Net.Quic.dll new file mode 100644 index 0000000..6ec2b9d Binary files /dev/null and b/Release/dotnet/System.Net.Quic.dll differ diff --git a/Release/dotnet/System.Net.Requests.dll b/Release/dotnet/System.Net.Requests.dll new file mode 100644 index 0000000..89f5ee3 Binary files /dev/null and b/Release/dotnet/System.Net.Requests.dll differ diff --git a/Release/dotnet/System.Net.Security.dll b/Release/dotnet/System.Net.Security.dll new file mode 100644 index 0000000..895c833 Binary files /dev/null and b/Release/dotnet/System.Net.Security.dll differ diff --git a/Release/dotnet/System.Net.ServicePoint.dll b/Release/dotnet/System.Net.ServicePoint.dll new file mode 100644 index 0000000..1ba7b1f Binary files /dev/null and b/Release/dotnet/System.Net.ServicePoint.dll differ diff --git a/Release/dotnet/System.Net.Sockets.dll b/Release/dotnet/System.Net.Sockets.dll new file mode 100644 index 0000000..93c26c3 Binary files /dev/null and b/Release/dotnet/System.Net.Sockets.dll differ diff --git a/Release/dotnet/System.Net.WebClient.dll b/Release/dotnet/System.Net.WebClient.dll new file mode 100644 index 0000000..0b0db9b Binary files /dev/null and b/Release/dotnet/System.Net.WebClient.dll differ diff --git a/Release/dotnet/System.Net.WebHeaderCollection.dll b/Release/dotnet/System.Net.WebHeaderCollection.dll new file mode 100644 index 0000000..91d255c Binary files /dev/null and b/Release/dotnet/System.Net.WebHeaderCollection.dll differ diff --git a/Release/dotnet/System.Net.WebProxy.dll b/Release/dotnet/System.Net.WebProxy.dll new file mode 100644 index 0000000..a2a20a5 Binary files /dev/null and b/Release/dotnet/System.Net.WebProxy.dll differ diff --git a/Release/dotnet/System.Net.WebSockets.Client.dll b/Release/dotnet/System.Net.WebSockets.Client.dll new file mode 100644 index 0000000..f926be0 Binary files /dev/null and b/Release/dotnet/System.Net.WebSockets.Client.dll differ diff --git a/Release/dotnet/System.Net.WebSockets.dll b/Release/dotnet/System.Net.WebSockets.dll new file mode 100644 index 0000000..8e094c3 Binary files /dev/null and b/Release/dotnet/System.Net.WebSockets.dll differ diff --git a/Release/dotnet/System.Net.dll b/Release/dotnet/System.Net.dll new file mode 100644 index 0000000..de8d7b7 Binary files /dev/null and b/Release/dotnet/System.Net.dll differ diff --git a/Release/dotnet/System.Numerics.Vectors.dll b/Release/dotnet/System.Numerics.Vectors.dll new file mode 100644 index 0000000..cd6c00a Binary files /dev/null and b/Release/dotnet/System.Numerics.Vectors.dll differ diff --git a/Release/dotnet/System.Numerics.dll b/Release/dotnet/System.Numerics.dll new file mode 100644 index 0000000..253f0fe Binary files /dev/null and b/Release/dotnet/System.Numerics.dll differ diff --git a/Release/dotnet/System.ObjectModel.dll b/Release/dotnet/System.ObjectModel.dll new file mode 100644 index 0000000..ace7d9b Binary files /dev/null and b/Release/dotnet/System.ObjectModel.dll differ diff --git a/Release/dotnet/System.Private.CoreLib.dll b/Release/dotnet/System.Private.CoreLib.dll new file mode 100644 index 0000000..983eccd Binary files /dev/null and b/Release/dotnet/System.Private.CoreLib.dll differ diff --git a/Release/dotnet/System.Private.DataContractSerialization.dll b/Release/dotnet/System.Private.DataContractSerialization.dll new file mode 100644 index 0000000..824f1f7 Binary files /dev/null and b/Release/dotnet/System.Private.DataContractSerialization.dll differ diff --git a/Release/dotnet/System.Private.Uri.dll b/Release/dotnet/System.Private.Uri.dll new file mode 100644 index 0000000..476cdb4 Binary files /dev/null and b/Release/dotnet/System.Private.Uri.dll differ diff --git a/Release/dotnet/System.Private.Xml.Linq.dll b/Release/dotnet/System.Private.Xml.Linq.dll new file mode 100644 index 0000000..14f26e2 Binary files /dev/null and b/Release/dotnet/System.Private.Xml.Linq.dll differ diff --git a/Release/dotnet/System.Private.Xml.dll b/Release/dotnet/System.Private.Xml.dll new file mode 100644 index 0000000..d1da277 Binary files /dev/null and b/Release/dotnet/System.Private.Xml.dll differ diff --git a/Release/dotnet/System.Reflection.DispatchProxy.dll b/Release/dotnet/System.Reflection.DispatchProxy.dll new file mode 100644 index 0000000..73d2f64 Binary files /dev/null and b/Release/dotnet/System.Reflection.DispatchProxy.dll differ diff --git a/Release/dotnet/System.Reflection.Emit.ILGeneration.dll b/Release/dotnet/System.Reflection.Emit.ILGeneration.dll new file mode 100644 index 0000000..42f4f46 Binary files /dev/null and b/Release/dotnet/System.Reflection.Emit.ILGeneration.dll differ diff --git a/Release/dotnet/System.Reflection.Emit.Lightweight.dll b/Release/dotnet/System.Reflection.Emit.Lightweight.dll new file mode 100644 index 0000000..05f6542 Binary files /dev/null and b/Release/dotnet/System.Reflection.Emit.Lightweight.dll differ diff --git a/Release/dotnet/System.Reflection.Emit.dll b/Release/dotnet/System.Reflection.Emit.dll new file mode 100644 index 0000000..193cc8b Binary files /dev/null and b/Release/dotnet/System.Reflection.Emit.dll differ diff --git a/Release/dotnet/System.Reflection.Extensions.dll b/Release/dotnet/System.Reflection.Extensions.dll new file mode 100644 index 0000000..aee132f Binary files /dev/null and b/Release/dotnet/System.Reflection.Extensions.dll differ diff --git a/Release/dotnet/System.Reflection.Metadata.dll b/Release/dotnet/System.Reflection.Metadata.dll new file mode 100644 index 0000000..8d3d027 Binary files /dev/null and b/Release/dotnet/System.Reflection.Metadata.dll differ diff --git a/Release/dotnet/System.Reflection.Primitives.dll b/Release/dotnet/System.Reflection.Primitives.dll new file mode 100644 index 0000000..af25bc6 Binary files /dev/null and b/Release/dotnet/System.Reflection.Primitives.dll differ diff --git a/Release/dotnet/System.Reflection.TypeExtensions.dll b/Release/dotnet/System.Reflection.TypeExtensions.dll new file mode 100644 index 0000000..d70a91f Binary files /dev/null and b/Release/dotnet/System.Reflection.TypeExtensions.dll differ diff --git a/Release/dotnet/System.Reflection.dll b/Release/dotnet/System.Reflection.dll new file mode 100644 index 0000000..9898047 Binary files /dev/null and b/Release/dotnet/System.Reflection.dll differ diff --git a/Release/dotnet/System.Resources.Reader.dll b/Release/dotnet/System.Resources.Reader.dll new file mode 100644 index 0000000..a51d64f Binary files /dev/null and b/Release/dotnet/System.Resources.Reader.dll differ diff --git a/Release/dotnet/System.Resources.ResourceManager.dll b/Release/dotnet/System.Resources.ResourceManager.dll new file mode 100644 index 0000000..3ec7374 Binary files /dev/null and b/Release/dotnet/System.Resources.ResourceManager.dll differ diff --git a/Release/dotnet/System.Resources.Writer.dll b/Release/dotnet/System.Resources.Writer.dll new file mode 100644 index 0000000..612dfe0 Binary files /dev/null and b/Release/dotnet/System.Resources.Writer.dll differ diff --git a/Release/dotnet/System.Runtime.CompilerServices.Unsafe.dll b/Release/dotnet/System.Runtime.CompilerServices.Unsafe.dll new file mode 100644 index 0000000..11d9b96 Binary files /dev/null and b/Release/dotnet/System.Runtime.CompilerServices.Unsafe.dll differ diff --git a/Release/dotnet/System.Runtime.CompilerServices.VisualC.dll b/Release/dotnet/System.Runtime.CompilerServices.VisualC.dll new file mode 100644 index 0000000..2143fa3 Binary files /dev/null and b/Release/dotnet/System.Runtime.CompilerServices.VisualC.dll differ diff --git a/Release/dotnet/System.Runtime.Extensions.dll b/Release/dotnet/System.Runtime.Extensions.dll new file mode 100644 index 0000000..a7a699c Binary files /dev/null and b/Release/dotnet/System.Runtime.Extensions.dll differ diff --git a/Release/dotnet/System.Runtime.Handles.dll b/Release/dotnet/System.Runtime.Handles.dll new file mode 100644 index 0000000..a916183 Binary files /dev/null and b/Release/dotnet/System.Runtime.Handles.dll differ diff --git a/Release/dotnet/System.Runtime.InteropServices.RuntimeInformation.dll b/Release/dotnet/System.Runtime.InteropServices.RuntimeInformation.dll new file mode 100644 index 0000000..9a57740 Binary files /dev/null and b/Release/dotnet/System.Runtime.InteropServices.RuntimeInformation.dll differ diff --git a/Release/dotnet/System.Runtime.InteropServices.dll b/Release/dotnet/System.Runtime.InteropServices.dll new file mode 100644 index 0000000..b86534a Binary files /dev/null and b/Release/dotnet/System.Runtime.InteropServices.dll differ diff --git a/Release/dotnet/System.Runtime.Intrinsics.dll b/Release/dotnet/System.Runtime.Intrinsics.dll new file mode 100644 index 0000000..e20f05c Binary files /dev/null and b/Release/dotnet/System.Runtime.Intrinsics.dll differ diff --git a/Release/dotnet/System.Runtime.Loader.dll b/Release/dotnet/System.Runtime.Loader.dll new file mode 100644 index 0000000..5d7206a Binary files /dev/null and b/Release/dotnet/System.Runtime.Loader.dll differ diff --git a/Release/dotnet/System.Runtime.Numerics.dll b/Release/dotnet/System.Runtime.Numerics.dll new file mode 100644 index 0000000..228117a Binary files /dev/null and b/Release/dotnet/System.Runtime.Numerics.dll differ diff --git a/Release/dotnet/System.Runtime.Serialization.Formatters.dll b/Release/dotnet/System.Runtime.Serialization.Formatters.dll new file mode 100644 index 0000000..1b5de98 Binary files /dev/null and b/Release/dotnet/System.Runtime.Serialization.Formatters.dll differ diff --git a/Release/dotnet/System.Runtime.Serialization.Json.dll b/Release/dotnet/System.Runtime.Serialization.Json.dll new file mode 100644 index 0000000..acf7a69 Binary files /dev/null and b/Release/dotnet/System.Runtime.Serialization.Json.dll differ diff --git a/Release/dotnet/System.Runtime.Serialization.Primitives.dll b/Release/dotnet/System.Runtime.Serialization.Primitives.dll new file mode 100644 index 0000000..dc30e72 Binary files /dev/null and b/Release/dotnet/System.Runtime.Serialization.Primitives.dll differ diff --git a/Release/dotnet/System.Runtime.Serialization.Xml.dll b/Release/dotnet/System.Runtime.Serialization.Xml.dll new file mode 100644 index 0000000..00aa385 Binary files /dev/null and b/Release/dotnet/System.Runtime.Serialization.Xml.dll differ diff --git a/Release/dotnet/System.Runtime.Serialization.dll b/Release/dotnet/System.Runtime.Serialization.dll new file mode 100644 index 0000000..7571039 Binary files /dev/null and b/Release/dotnet/System.Runtime.Serialization.dll differ diff --git a/Release/dotnet/System.Runtime.dll b/Release/dotnet/System.Runtime.dll new file mode 100644 index 0000000..2ead984 Binary files /dev/null and b/Release/dotnet/System.Runtime.dll differ diff --git a/Release/dotnet/System.Security.AccessControl.dll b/Release/dotnet/System.Security.AccessControl.dll new file mode 100644 index 0000000..7493742 Binary files /dev/null and b/Release/dotnet/System.Security.AccessControl.dll differ diff --git a/Release/dotnet/System.Security.Claims.dll b/Release/dotnet/System.Security.Claims.dll new file mode 100644 index 0000000..0960db5 Binary files /dev/null and b/Release/dotnet/System.Security.Claims.dll differ diff --git a/Release/dotnet/System.Security.Cryptography.Algorithms.dll b/Release/dotnet/System.Security.Cryptography.Algorithms.dll new file mode 100644 index 0000000..b262364 Binary files /dev/null and b/Release/dotnet/System.Security.Cryptography.Algorithms.dll differ diff --git a/Release/dotnet/System.Security.Cryptography.Cng.dll b/Release/dotnet/System.Security.Cryptography.Cng.dll new file mode 100644 index 0000000..7783d31 Binary files /dev/null and b/Release/dotnet/System.Security.Cryptography.Cng.dll differ diff --git a/Release/dotnet/System.Security.Cryptography.Csp.dll b/Release/dotnet/System.Security.Cryptography.Csp.dll new file mode 100644 index 0000000..14ba332 Binary files /dev/null and b/Release/dotnet/System.Security.Cryptography.Csp.dll differ diff --git a/Release/dotnet/System.Security.Cryptography.Encoding.dll b/Release/dotnet/System.Security.Cryptography.Encoding.dll new file mode 100644 index 0000000..e6ae275 Binary files /dev/null and b/Release/dotnet/System.Security.Cryptography.Encoding.dll differ diff --git a/Release/dotnet/System.Security.Cryptography.OpenSsl.dll b/Release/dotnet/System.Security.Cryptography.OpenSsl.dll new file mode 100644 index 0000000..7e51e33 Binary files /dev/null and b/Release/dotnet/System.Security.Cryptography.OpenSsl.dll differ diff --git a/Release/dotnet/System.Security.Cryptography.Primitives.dll b/Release/dotnet/System.Security.Cryptography.Primitives.dll new file mode 100644 index 0000000..9aeafdd Binary files /dev/null and b/Release/dotnet/System.Security.Cryptography.Primitives.dll differ diff --git a/Release/dotnet/System.Security.Cryptography.X509Certificates.dll b/Release/dotnet/System.Security.Cryptography.X509Certificates.dll new file mode 100644 index 0000000..7617a99 Binary files /dev/null and b/Release/dotnet/System.Security.Cryptography.X509Certificates.dll differ diff --git a/Release/dotnet/System.Security.Principal.Windows.dll b/Release/dotnet/System.Security.Principal.Windows.dll new file mode 100644 index 0000000..1981d16 Binary files /dev/null and b/Release/dotnet/System.Security.Principal.Windows.dll differ diff --git a/Release/dotnet/System.Security.Principal.dll b/Release/dotnet/System.Security.Principal.dll new file mode 100644 index 0000000..7c72f99 Binary files /dev/null and b/Release/dotnet/System.Security.Principal.dll differ diff --git a/Release/dotnet/System.Security.SecureString.dll b/Release/dotnet/System.Security.SecureString.dll new file mode 100644 index 0000000..67d6f15 Binary files /dev/null and b/Release/dotnet/System.Security.SecureString.dll differ diff --git a/Release/dotnet/System.Security.dll b/Release/dotnet/System.Security.dll new file mode 100644 index 0000000..6f8af07 Binary files /dev/null and b/Release/dotnet/System.Security.dll differ diff --git a/Release/dotnet/System.ServiceModel.Web.dll b/Release/dotnet/System.ServiceModel.Web.dll new file mode 100644 index 0000000..0e891ff Binary files /dev/null and b/Release/dotnet/System.ServiceModel.Web.dll differ diff --git a/Release/dotnet/System.ServiceProcess.dll b/Release/dotnet/System.ServiceProcess.dll new file mode 100644 index 0000000..e044238 Binary files /dev/null and b/Release/dotnet/System.ServiceProcess.dll differ diff --git a/Release/dotnet/System.Text.Encoding.CodePages.dll b/Release/dotnet/System.Text.Encoding.CodePages.dll new file mode 100644 index 0000000..c430854 Binary files /dev/null and b/Release/dotnet/System.Text.Encoding.CodePages.dll differ diff --git a/Release/dotnet/System.Text.Encoding.Extensions.dll b/Release/dotnet/System.Text.Encoding.Extensions.dll new file mode 100644 index 0000000..12c997a Binary files /dev/null and b/Release/dotnet/System.Text.Encoding.Extensions.dll differ diff --git a/Release/dotnet/System.Text.Encoding.dll b/Release/dotnet/System.Text.Encoding.dll new file mode 100644 index 0000000..4b9cdfb Binary files /dev/null and b/Release/dotnet/System.Text.Encoding.dll differ diff --git a/Release/dotnet/System.Text.Encodings.Web.dll b/Release/dotnet/System.Text.Encodings.Web.dll new file mode 100644 index 0000000..c467b41 Binary files /dev/null and b/Release/dotnet/System.Text.Encodings.Web.dll differ diff --git a/Release/dotnet/System.Text.Json.dll b/Release/dotnet/System.Text.Json.dll new file mode 100644 index 0000000..61d9f10 Binary files /dev/null and b/Release/dotnet/System.Text.Json.dll differ diff --git a/Release/dotnet/System.Text.RegularExpressions.dll b/Release/dotnet/System.Text.RegularExpressions.dll new file mode 100644 index 0000000..7437bfc Binary files /dev/null and b/Release/dotnet/System.Text.RegularExpressions.dll differ diff --git a/Release/dotnet/System.Threading.Channels.dll b/Release/dotnet/System.Threading.Channels.dll new file mode 100644 index 0000000..4e81581 Binary files /dev/null and b/Release/dotnet/System.Threading.Channels.dll differ diff --git a/Release/dotnet/System.Threading.Overlapped.dll b/Release/dotnet/System.Threading.Overlapped.dll new file mode 100644 index 0000000..d073935 Binary files /dev/null and b/Release/dotnet/System.Threading.Overlapped.dll differ diff --git a/Release/dotnet/System.Threading.Tasks.Dataflow.dll b/Release/dotnet/System.Threading.Tasks.Dataflow.dll new file mode 100644 index 0000000..720f1b2 Binary files /dev/null and b/Release/dotnet/System.Threading.Tasks.Dataflow.dll differ diff --git a/Release/dotnet/System.Threading.Tasks.Extensions.dll b/Release/dotnet/System.Threading.Tasks.Extensions.dll new file mode 100644 index 0000000..ed8eb04 Binary files /dev/null and b/Release/dotnet/System.Threading.Tasks.Extensions.dll differ diff --git a/Release/dotnet/System.Threading.Tasks.Parallel.dll b/Release/dotnet/System.Threading.Tasks.Parallel.dll new file mode 100644 index 0000000..cd08572 Binary files /dev/null and b/Release/dotnet/System.Threading.Tasks.Parallel.dll differ diff --git a/Release/dotnet/System.Threading.Tasks.dll b/Release/dotnet/System.Threading.Tasks.dll new file mode 100644 index 0000000..91b3e53 Binary files /dev/null and b/Release/dotnet/System.Threading.Tasks.dll differ diff --git a/Release/dotnet/System.Threading.Thread.dll b/Release/dotnet/System.Threading.Thread.dll new file mode 100644 index 0000000..eef48ff Binary files /dev/null and b/Release/dotnet/System.Threading.Thread.dll differ diff --git a/Release/dotnet/System.Threading.ThreadPool.dll b/Release/dotnet/System.Threading.ThreadPool.dll new file mode 100644 index 0000000..0c8bd8d Binary files /dev/null and b/Release/dotnet/System.Threading.ThreadPool.dll differ diff --git a/Release/dotnet/System.Threading.Timer.dll b/Release/dotnet/System.Threading.Timer.dll new file mode 100644 index 0000000..5eeff6d Binary files /dev/null and b/Release/dotnet/System.Threading.Timer.dll differ diff --git a/Release/dotnet/System.Threading.dll b/Release/dotnet/System.Threading.dll new file mode 100644 index 0000000..55d5288 Binary files /dev/null and b/Release/dotnet/System.Threading.dll differ diff --git a/Release/dotnet/System.Transactions.Local.dll b/Release/dotnet/System.Transactions.Local.dll new file mode 100644 index 0000000..fe0fcc6 Binary files /dev/null and b/Release/dotnet/System.Transactions.Local.dll differ diff --git a/Release/dotnet/System.Transactions.dll b/Release/dotnet/System.Transactions.dll new file mode 100644 index 0000000..c5691e6 Binary files /dev/null and b/Release/dotnet/System.Transactions.dll differ diff --git a/Release/dotnet/System.ValueTuple.dll b/Release/dotnet/System.ValueTuple.dll new file mode 100644 index 0000000..3a79f86 Binary files /dev/null and b/Release/dotnet/System.ValueTuple.dll differ diff --git a/Release/dotnet/System.Web.HttpUtility.dll b/Release/dotnet/System.Web.HttpUtility.dll new file mode 100644 index 0000000..26310e0 Binary files /dev/null and b/Release/dotnet/System.Web.HttpUtility.dll differ diff --git a/Release/dotnet/System.Web.dll b/Release/dotnet/System.Web.dll new file mode 100644 index 0000000..874e2dd Binary files /dev/null and b/Release/dotnet/System.Web.dll differ diff --git a/Release/dotnet/System.Windows.dll b/Release/dotnet/System.Windows.dll new file mode 100644 index 0000000..75939b5 Binary files /dev/null and b/Release/dotnet/System.Windows.dll differ diff --git a/Release/dotnet/System.Xml.Linq.dll b/Release/dotnet/System.Xml.Linq.dll new file mode 100644 index 0000000..3145628 Binary files /dev/null and b/Release/dotnet/System.Xml.Linq.dll differ diff --git a/Release/dotnet/System.Xml.ReaderWriter.dll b/Release/dotnet/System.Xml.ReaderWriter.dll new file mode 100644 index 0000000..eb906c3 Binary files /dev/null and b/Release/dotnet/System.Xml.ReaderWriter.dll differ diff --git a/Release/dotnet/System.Xml.Serialization.dll b/Release/dotnet/System.Xml.Serialization.dll new file mode 100644 index 0000000..97a09d3 Binary files /dev/null and b/Release/dotnet/System.Xml.Serialization.dll differ diff --git a/Release/dotnet/System.Xml.XDocument.dll b/Release/dotnet/System.Xml.XDocument.dll new file mode 100644 index 0000000..553442d Binary files /dev/null and b/Release/dotnet/System.Xml.XDocument.dll differ diff --git a/Release/dotnet/System.Xml.XPath.XDocument.dll b/Release/dotnet/System.Xml.XPath.XDocument.dll new file mode 100644 index 0000000..b5cf120 Binary files /dev/null and b/Release/dotnet/System.Xml.XPath.XDocument.dll differ diff --git a/Release/dotnet/System.Xml.XPath.dll b/Release/dotnet/System.Xml.XPath.dll new file mode 100644 index 0000000..0ab841c Binary files /dev/null and b/Release/dotnet/System.Xml.XPath.dll differ diff --git a/Release/dotnet/System.Xml.XmlDocument.dll b/Release/dotnet/System.Xml.XmlDocument.dll new file mode 100644 index 0000000..b2d6400 Binary files /dev/null and b/Release/dotnet/System.Xml.XmlDocument.dll differ diff --git a/Release/dotnet/System.Xml.XmlSerializer.dll b/Release/dotnet/System.Xml.XmlSerializer.dll new file mode 100644 index 0000000..76905fd Binary files /dev/null and b/Release/dotnet/System.Xml.XmlSerializer.dll differ diff --git a/Release/dotnet/System.Xml.dll b/Release/dotnet/System.Xml.dll new file mode 100644 index 0000000..9041c7a Binary files /dev/null and b/Release/dotnet/System.Xml.dll differ diff --git a/Release/dotnet/System.dll b/Release/dotnet/System.dll new file mode 100644 index 0000000..7aa9be9 Binary files /dev/null and b/Release/dotnet/System.dll differ diff --git a/Release/dotnet/WindowsBase.dll b/Release/dotnet/WindowsBase.dll new file mode 100644 index 0000000..6528b1e Binary files /dev/null and b/Release/dotnet/WindowsBase.dll differ diff --git a/Release/dotnet/clretwrc.dll b/Release/dotnet/clretwrc.dll new file mode 100644 index 0000000..ea87644 Binary files /dev/null and b/Release/dotnet/clretwrc.dll differ diff --git a/Release/dotnet/clrjit.dll b/Release/dotnet/clrjit.dll new file mode 100644 index 0000000..28f6bb9 Binary files /dev/null and b/Release/dotnet/clrjit.dll differ diff --git a/Release/dotnet/coreclr.dll b/Release/dotnet/coreclr.dll new file mode 100644 index 0000000..caf3ddc Binary files /dev/null and b/Release/dotnet/coreclr.dll differ diff --git a/Release/dotnet/dbgshim.dll b/Release/dotnet/dbgshim.dll new file mode 100644 index 0000000..1eee556 Binary files /dev/null and b/Release/dotnet/dbgshim.dll differ diff --git a/Release/dotnet/hostpolicy.dll b/Release/dotnet/hostpolicy.dll new file mode 100644 index 0000000..58cb5d0 Binary files /dev/null and b/Release/dotnet/hostpolicy.dll differ diff --git a/Release/dotnet/mscordaccore.dll b/Release/dotnet/mscordaccore.dll new file mode 100644 index 0000000..9501339 Binary files /dev/null and b/Release/dotnet/mscordaccore.dll differ diff --git a/Release/dotnet/mscordaccore_amd64_amd64_6.0.722.32202.dll b/Release/dotnet/mscordaccore_amd64_amd64_6.0.722.32202.dll new file mode 100644 index 0000000..f4797a3 Binary files /dev/null and b/Release/dotnet/mscordaccore_amd64_amd64_6.0.722.32202.dll differ diff --git a/Release/dotnet/mscordbi.dll b/Release/dotnet/mscordbi.dll new file mode 100644 index 0000000..f4f794d Binary files /dev/null and b/Release/dotnet/mscordbi.dll differ diff --git a/Release/dotnet/mscorlib.dll b/Release/dotnet/mscorlib.dll new file mode 100644 index 0000000..36be31d Binary files /dev/null and b/Release/dotnet/mscorlib.dll differ diff --git a/Release/dotnet/mscorrc.dll b/Release/dotnet/mscorrc.dll new file mode 100644 index 0000000..8d270aa Binary files /dev/null and b/Release/dotnet/mscorrc.dll differ diff --git a/Release/dotnet/msquic.dll b/Release/dotnet/msquic.dll new file mode 100644 index 0000000..e5565ec Binary files /dev/null and b/Release/dotnet/msquic.dll differ diff --git a/Release/dotnet/netstandard.dll b/Release/dotnet/netstandard.dll new file mode 100644 index 0000000..23d9101 Binary files /dev/null and b/Release/dotnet/netstandard.dll differ diff --git a/Release/winhttp.dll b/Release/winhttp.dll new file mode 100644 index 0000000..e9816fd Binary files /dev/null and b/Release/winhttp.dll differ diff --git a/Source/Components/GlobalGeometryChecker.cs b/Source/Components/GlobalGeometryChecker.cs index aba1efc..57776b9 100644 --- a/Source/Components/GlobalGeometryChecker.cs +++ b/Source/Components/GlobalGeometryChecker.cs @@ -1,23 +1,24 @@ -using Il2Cpp; -using MelonLoader; +using BepInEx.Unity.IL2CPP.Utils; +using Il2CppInterop.Runtime.Attributes; +using System; +using System.Linq; using UnityEngine; namespace SuisHack.Components { - [RegisterTypeInIl2Cpp] public class GlobalGeometryChecker : MonoBehaviour { public GlobalGeometryChecker(IntPtr ptr) : base(ptr) { } const string OpenWorldPrefix = "OpenWorld_"; const string Terrain = "Terrain_Mesh"; - private object? CheckerCoroutine; + private Coroutine CheckerCoroutine; private void OnEnable() { if (CheckerCoroutine != null) - MelonCoroutines.Stop(CheckerCoroutine); - CheckerCoroutine = MelonCoroutines.Start(Checker()); + StopCoroutine(CheckerCoroutine); + CheckerCoroutine = MonoBehaviourExtensions.StartCoroutine(this, Checker()); var normalMapHash = Shader.PropertyToID("_BumpMap"); var metalicGlossMapHash = Shader.PropertyToID("_MetallicGlossMap"); @@ -57,10 +58,11 @@ private void OnEnable() } else { - SuisHackMain.loggerInst!.Error("No mesh found!"); + Plugin.Error("No mesh found!"); } } + [HideFromIl2Cpp] private System.Collections.IEnumerator Checker() { while (true) @@ -127,7 +129,7 @@ private void OnDisable() { if (CheckerCoroutine != null) { - MelonCoroutines.Stop(CheckerCoroutine); + StopCoroutine(CheckerCoroutine); CheckerCoroutine = null; } } diff --git a/Source/Components/Interpolation/BoatFollowInterpolation.cs b/Source/Components/Interpolation/BoatFollowInterpolation.cs index 403c224..39e8ed8 100644 --- a/Source/Components/Interpolation/BoatFollowInterpolation.cs +++ b/Source/Components/Interpolation/BoatFollowInterpolation.cs @@ -1,16 +1,14 @@ -using Il2Cpp; -using MelonLoader; +using System; using UnityEngine; namespace SuisHack.Components.Interpolation { - [RegisterTypeInIl2Cpp] class BoatFollowInterpolation : MonoBehaviour { public BoatFollowInterpolation(IntPtr ptr) : base(ptr) { } - BoatCameraFollow? boatFollowReference; - GameObjectInterpolation? interpolator; + BoatCameraFollow boatFollowReference; + GameObjectInterpolation interpolator; void Start() { diff --git a/Source/Components/Interpolation/GameObjectInterpolation.cs b/Source/Components/Interpolation/GameObjectInterpolation.cs index cb88542..17bc7df 100644 --- a/Source/Components/Interpolation/GameObjectInterpolation.cs +++ b/Source/Components/Interpolation/GameObjectInterpolation.cs @@ -1,12 +1,12 @@ -using MelonLoader; +using System; +using System.Collections.Generic; using UnityEngine; namespace SuisHack.Components.Interpolation { - [RegisterTypeInIl2Cpp] public class GameObjectInterpolation : MonoBehaviour { - public GameObjectInterpolation(IntPtr ptr): base(ptr) { } + public GameObjectInterpolation(IntPtr ptr) : base(ptr) { } public static List ActiveObjects = new List(); @@ -66,7 +66,7 @@ public RigidBodiesStoredVelocities(Rigidbody riggedBodyRef) } } - public RigidBodiesStoredVelocities[]? riggidBodiesStored; + public RigidBodiesStoredVelocities[] riggidBodiesStored; PositionRecording[] records = new PositionRecording[2]; Vector3 restorePosition; diff --git a/Source/Components/Interpolation/SmootherController.cs b/Source/Components/Interpolation/SmootherController.cs index dd0b40d..2860419 100644 --- a/Source/Components/Interpolation/SmootherController.cs +++ b/Source/Components/Interpolation/SmootherController.cs @@ -1,17 +1,15 @@ -using Il2Cpp; -using MelonLoader; +using System; using UnityEngine; namespace SuisHack.Components.Interpolation { - [RegisterTypeInIl2Cpp] public class SmootherController : MonoBehaviour { public SmootherController(IntPtr ptr) : base(ptr) { } public static bool InterpolateMovement; - public GameObject? visionCameraReference; + public GameObject visionCameraReference; private bool DontInterpolate => VisionModeActive || CutscenePlaying; private bool VisionModeActive => visionCameraReference != null && visionCameraReference.activeInHierarchy; diff --git a/Source/Components/TerrainCorrection.cs b/Source/Components/TerrainCorrection.cs index f516aa9..4a17a78 100644 --- a/Source/Components/TerrainCorrection.cs +++ b/Source/Components/TerrainCorrection.cs @@ -1,11 +1,9 @@ -using Il2CppSystem.Collections.Generic; -using MelonLoader; -using System; +using System; +using System.IO; using UnityEngine; namespace SuisHack.Components { - [RegisterTypeInIl2Cpp] public class TerrainCorrectionData : MonoBehaviour { public TerrainCorrectionData(IntPtr ptr) : base(ptr) { } @@ -48,7 +46,7 @@ public void Import() } catch (Exception e) { - SuisHackMain.loggerInst!.Error($"Error when loading {path}: {e}"); + Plugin.Error($"Error when loading {path}: {e}"); } finally { diff --git a/Source/Components/VibrationController.cs b/Source/Components/VibrationController.cs deleted file mode 100644 index 4b69487..0000000 --- a/Source/Components/VibrationController.cs +++ /dev/null @@ -1,107 +0,0 @@ -using Il2CppSteamworks; -using MelonLoader; -using System; -using UnityEngine; - -namespace SuisHack.Components -{ - [RegisterTypeInIl2Cpp] - public class VibrationController : MonoBehaviour - { - private InputHandle_t ControllerHandle; - public VibrationController(IntPtr ptr) : base(ptr) { } - - public static VibrationController? Instance { get; private set; } - private object? RumbleRoutine = null; - public static bool UseRumble = false; - - public static void Initialize() - { - if (Instance == null) - { - var go = new GameObject("VibrationController"); - GameObject.DontDestroyOnLoad(go); - Instance = go.AddComponent(); - UseRumble = SuisHackMain.Settings!.Input_Controller_Vibration!.Value; - } - - if (Instance != null) - Instance.GetHandle(); - } - - public void GetHandle() - { - if (UseRumble && ControllerHandle.m_InputHandle == 0) - { - if (ControllerHandle.m_InputHandle == 0) - { - var controllers = new Il2CppInterop.Runtime.InteropTypes.Arrays.Il2CppStructArray(16); - var amountOfControllers = SteamInput.GetConnectedControllers(controllers); - if (amountOfControllers > 0) - { - ControllerHandle = controllers[0]; - } - } - } - } - - public void TriggleRumble(ushort strenght, float lenght) - { - if (UseRumble && ControllerHandle.m_InputHandle != 0) - { - if (RumbleRoutine != null) - MelonCoroutines.Stop(RumbleRoutine); - RumbleRoutine = MelonCoroutines.Start(FireRumble(strenght, strenght, lenght)); - } - } - - public void TriggerChargeRumble(ushort startStrenght, ushort maxStrenght, float lenght) - { - if (UseRumble && ControllerHandle.m_InputHandle != 0) - { - if (RumbleRoutine != null) - MelonCoroutines.Stop(RumbleRoutine); - RumbleRoutine = MelonCoroutines.Start(ChargeRumble(startStrenght, maxStrenght, lenght)); - } - } - - internal void CancelRumble() - { - if (UseRumble && ControllerHandle.m_InputHandle != 0) - { - StopAllCoroutines(); - SteamInput.TriggerVibration(ControllerHandle, 0, 0); - } - } - - public void TriggleRumble(ushort lStrenght, ushort rStrenght, float lenght) - { - if (UseRumble && ControllerHandle.m_InputHandle != 0) - { - if (RumbleRoutine != null) - MelonCoroutines.Stop(RumbleRoutine); - RumbleRoutine = MelonCoroutines.Start(FireRumble(lStrenght, rStrenght, lenght)); - } - } - - private System.Collections.IEnumerator ChargeRumble(ushort startRumble, ushort maxRumble, float lenght) - { - float t = 0; - while (t < lenght) - { - t += Time.deltaTime; - var value = (ushort)Mathf.Lerp(startRumble, maxRumble, t); - SteamInput.TriggerVibration(ControllerHandle, value, value); - yield return null; - } - SteamInput.TriggerVibration(ControllerHandle, maxRumble, maxRumble); - } - - private System.Collections.IEnumerator FireRumble(ushort lStrenght, ushort rStrenght, float lenght) - { - SteamInput.TriggerVibration(ControllerHandle, lStrenght, rStrenght); - yield return new WaitForSecondsRealtime(lenght); - SteamInput.TriggerVibration(ControllerHandle, 0, 0); - } - } -} diff --git a/Source/Components/WireRendererCorrection.cs b/Source/Components/WireRendererCorrection.cs index 9fca52a..e0c1c3c 100644 --- a/Source/Components/WireRendererCorrection.cs +++ b/Source/Components/WireRendererCorrection.cs @@ -1,12 +1,12 @@ -using MelonLoader; +using System; +using System.Collections.Generic; using UnityEngine; namespace SuisHack.Components { - [RegisterTypeInIl2Cpp] public class WireRendererCorrection : MonoBehaviour { - public WireRendererCorrection(IntPtr ptr): base(ptr) { } + public WireRendererCorrection(IntPtr ptr) : base(ptr) { } public static Dictionary> DisableUtterlyBroken = new Dictionary>() { @@ -102,7 +102,7 @@ protected override bool IsValidCompare(Transform transform) public override void Process(Transform transform, SkinnedMeshRenderer[] skinnedMeshes) { - SuisHackMain.loggerInst!.Error("Implement that!"); + Plugin.Error("Implement that!"); } } @@ -123,7 +123,7 @@ protected override bool IsValidCompare(Transform transform) public override void Process(Transform transform, SkinnedMeshRenderer[] skinnedMeshes) { - SuisHackMain.loggerInst!.Msg("Implement that!"); + Plugin.Warning("Implement that!"); } } @@ -157,7 +157,7 @@ public override void Process(Transform transform, SkinnedMeshRenderer[] skinnedM { child.gameObject.SetActive(false); #if DEBUG - SuisHackMain.loggerInst!.Msg($"[WireCorrection] Disabled broken child root at \"{child.transform.position.x}, {child.transform.position.y}, {child.transform.position.z}\""); + Plugin.Message($"[WireCorrection] Disabled broken child root at \"{child.transform.position.x}, {child.transform.position.y}, {child.transform.position.z}\""); #endif break; } diff --git a/Source/ConfigParsing.cs b/Source/ConfigParsing.cs index 2077ed5..6994385 100644 --- a/Source/ConfigParsing.cs +++ b/Source/ConfigParsing.cs @@ -1,11 +1,11 @@ -using MelonLoader; +using System; using System.Text.RegularExpressions; namespace SuisHack { public static class ConfigParsing { - public static bool ParseResolution(string text, out LemonTuple? desiredResolution) + public static bool ParseResolution(string text, out Tuple desiredResolution) { desiredResolution = null; while (text.IndexOf(' ') >= 0) @@ -28,11 +28,7 @@ public static bool ParseResolution(string text, out LemonTuple? desire return false; else { - desiredResolution = new LemonTuple - { - Item1 = (int)desiredResolutionX, - Item2 = (int)desiredResolutionY - }; + desiredResolution = new Tuple((int)desiredResolutionX, (int)desiredResolutionY); return true; } } diff --git a/Source/ConfigValidators.cs b/Source/ConfigValidators.cs deleted file mode 100644 index f46931e..0000000 --- a/Source/ConfigValidators.cs +++ /dev/null @@ -1,37 +0,0 @@ -using MelonLoader.Preferences; - -namespace SuisHack -{ - public class PowerOfTwoValidatorWithRange : ValueValidator - { - public int MinValue { get; } - public int MaxValue { get; } - - public PowerOfTwoValidatorWithRange(int minValue, int maxValue) - { - if (minValue >= maxValue) - throw new System.ArgumentException($"Min value ({minValue}) must be less than max value ({maxValue})!"); - - this.MinValue = minValue; - this.MaxValue = maxValue; - } - - public override bool IsValid(object value) - { - int number = (int)value; - double log = Math.Log(number, 2d); - double pow = Math.Pow(2, Math.Round(log)); - return pow == number; - } - - public override object EnsureValid(object value) - { - int number = (int)value; - if (number > MaxValue) - return MaxValue; - if (number < MinValue) - return MinValue; - return number; - } - } -} diff --git a/Source/ExposedSettings.cs b/Source/ExposedSettings.cs index 6a446ad..77ffaf3 100644 --- a/Source/ExposedSettings.cs +++ b/Source/ExposedSettings.cs @@ -1,7 +1,6 @@ -using Il2Cpp; -using MelonLoader; -using MelonLoader.Preferences; +using BepInEx.Configuration; using SuisHack.KeyboardSupport; +using System; using UnityEngine; using UnityEngine.Rendering.PostProcessing; @@ -9,6 +8,15 @@ namespace SuisHack { public class ExposedSettings { + public static ExposedSettings Instance { get; private set; } + + private const string CATEGORYNAME_MAINDISPLAY = "Suis Hack Main Display"; + private const string CATEGORYNAME_GRAPHICS = "Suis Hack Graphics Settings"; + private const string CATEGORYNAME_INPUT = "Suis Hack Input Settings"; + private const string CATEGORYNAME_OTHER = "Suis Hack Other Settings"; + + private ConfigFile Config; + public enum InputType { SteamInput, @@ -28,96 +36,87 @@ public enum LightImprovements All } - //Categories - MelonPreferences_Category? Category_mainDisplay; - MelonPreferences_Category? Category_graphicsSettings; - MelonPreferences_Category? Category_inputSettings; - MelonPreferences_Category? Category_otherSettings; - //Display settings - public MelonPreferences_Entry? Entry_Display_Resolution; - public MelonPreferences_Entry? Entry_Display_RefreshRate; - public MelonPreferences_Entry? Entry_DesiredFramerate; - public MelonPreferences_Entry? Entry_Display_DisplayMode; - public MelonPreferences_Entry? Entry_Display_Vsync; + public ConfigEntry Entry_Display_Resolution; + public ConfigEntry Entry_Display_RefreshRate; + public ConfigEntry Entry_DesiredFramerate; + public ConfigEntry Entry_Display_DisplayMode; + public ConfigEntry Entry_Display_Vsync; //Quality settings - public MelonPreferences_Entry? Entry_Antialiasing; - public MelonPreferences_Entry? Entry_AnistropicFiltering; - public MelonPreferences_Entry? Entry_AnistropicFilteringValue; - - public MelonPreferences_Entry? Entry_Quality_CameraFarPlaneDistance; - - public MelonPreferences_Entry? Entry_Quality_ShadowDistance; - public MelonPreferences_Entry? Entry_Quality_Use4ShadowCascades; - public MelonPreferences_Entry? Entry_Quality_ShadowsQuality; - public MelonPreferences_Entry? Entry_Quality_ShadowsResolution; - public MelonPreferences_Entry? Entry_Quality_ShadowTwoSplitValue; - public MelonPreferences_Entry? Entry_Quality_ShadowFourSplitValue1; - public MelonPreferences_Entry? Entry_Quality_ShadowFourSplitValue2; - public MelonPreferences_Entry? Entry_Quality_ShadowFourSplitValue3; - - public MelonPreferences_Entry? Entry_Quality_LODBias; - public MelonPreferences_Entry? Entry_Quality_PixelLightCount; - public MelonPreferences_Entry? Entry_Quality_TextureQuality; - public MelonPreferences_Entry? Entry_Quality_MirrorReflectionResolution; - public MelonPreferences_Entry? Entry_Quality_HBAO_Preset; - public MelonPreferences_Entry? Entry_Quality_HBAO_Intensity; - - public MelonPreferences_Entry? Entry_Quality_SSR_Enable; - public MelonPreferences_Entry? Entry_Quality_SSR_Preset; - public MelonPreferences_Entry? Entry_Quality_SSR_Resolution; - public MelonPreferences_Entry? Entry_Quality_SSR_Tickness; - public MelonPreferences_Entry? Entry_Quality_SSR_Vignette; - public MelonPreferences_Entry? Entry_Quality_SSR_DistanceFade; - public MelonPreferences_Entry? Entry_Quality_SSR_MaxMarchingDistance; - public MelonPreferences_Entry? Entry_Quality_EdgeDetection; - public MelonPreferences_Entry? Entry_Quality_EdgeDetectionDepth; + public ConfigEntry Entry_Antialiasing; + public ConfigEntry Entry_AnistropicFiltering; + public ConfigEntry Entry_AnistropicFilteringValue; + + public ConfigEntry Entry_Quality_CameraFarPlaneDistance; + + public ConfigEntry Entry_Quality_ShadowDistance; + public ConfigEntry Entry_Quality_Use4ShadowCascades; + public ConfigEntry Entry_Quality_ShadowsQuality; + public ConfigEntry Entry_Quality_ShadowsResolution; + public ConfigEntry Entry_Quality_ShadowTwoSplitValue; + public ConfigEntry Entry_Quality_ShadowFourSplitValue1; + public ConfigEntry Entry_Quality_ShadowFourSplitValue2; + public ConfigEntry Entry_Quality_ShadowFourSplitValue3; + + public ConfigEntry Entry_Quality_LODBias; + public ConfigEntry Entry_Quality_PixelLightCount; + public ConfigEntry Entry_Quality_TextureQuality; + public ConfigEntry Entry_Quality_MirrorReflectionResolution; + public ConfigEntry Entry_Quality_HBAO_Preset; + public ConfigEntry Entry_Quality_HBAO_Intensity; + + public ConfigEntry Entry_Quality_SSR_Enable; + public ConfigEntry Entry_Quality_SSR_Preset; + public ConfigEntry Entry_Quality_SSR_Resolution; + public ConfigEntry Entry_Quality_SSR_Tickness; + public ConfigEntry Entry_Quality_SSR_Vignette; + public ConfigEntry Entry_Quality_SSR_DistanceFade; + public ConfigEntry Entry_Quality_SSR_MaxMarchingDistance; + public ConfigEntry Entry_Quality_EdgeDetection; + public ConfigEntry Entry_Quality_EdgeDetectionDepth; //Input settings - public MelonPreferences_Entry? Input_Override; - public MelonPreferences_Entry? Input_Analog_LeftStickFloatTime; - public MelonPreferences_Entry? Input_Analog_LeftStick_Up; - public MelonPreferences_Entry? Input_Analog_LeftStick_Right; - public MelonPreferences_Entry? Input_Analog_LeftStick_Down; - public MelonPreferences_Entry? Input_Analog_LeftStick_Left; - public MelonPreferences_Entry? Input_Digital_A_Button; - public MelonPreferences_Entry? Input_Digital_B_Button; - public MelonPreferences_Entry? Input_Digital_X_Button; - public MelonPreferences_Entry? Input_Digital_Y_Button; - public MelonPreferences_Entry? Input_Digital_LB; - public MelonPreferences_Entry? Input_Digital_RB; - public MelonPreferences_Entry? Input_Digital_Back_Button; - public MelonPreferences_Entry? Input_Digital_Start_Button; - public MelonPreferences_Entry? Input_Digital_L_Stick_Button; - public MelonPreferences_Entry? Input_Digital_R_Stick_Button; - public MelonPreferences_Entry? Input_Digital_Up_Button; - public MelonPreferences_Entry? Input_Digital_Right_Button; - public MelonPreferences_Entry? Input_Digital_Down_Button; - public MelonPreferences_Entry? Input_Digital_Left_Button; - public MelonPreferences_Entry? Input_Digital_LT; - public MelonPreferences_Entry? Input_Digital_RT; - public MelonPreferences_Entry? Input_Mouse_Sensitivity; - public MelonPreferences_Entry? Input_MouseYAxisInversion; - public MelonPreferences_Entry? Input_Controller_Vibration; + public ConfigEntry Input_Override; + public ConfigEntry Input_Analog_LeftStickFloatTime; + public ConfigEntry Input_Analog_LeftStick_Up; + public ConfigEntry Input_Analog_LeftStick_Right; + public ConfigEntry Input_Analog_LeftStick_Down; + public ConfigEntry Input_Analog_LeftStick_Left; + public ConfigEntry Input_Digital_A_Button; + public ConfigEntry Input_Digital_B_Button; + public ConfigEntry Input_Digital_X_Button; + public ConfigEntry Input_Digital_Y_Button; + public ConfigEntry Input_Digital_LB; + public ConfigEntry Input_Digital_RB; + public ConfigEntry Input_Digital_Back_Button; + public ConfigEntry Input_Digital_Start_Button; + public ConfigEntry Input_Digital_L_Stick_Button; + public ConfigEntry Input_Digital_R_Stick_Button; + public ConfigEntry Input_Digital_Up_Button; + public ConfigEntry Input_Digital_Right_Button; + public ConfigEntry Input_Digital_Down_Button; + public ConfigEntry Input_Digital_Left_Button; + public ConfigEntry Input_Digital_LT; + public ConfigEntry Input_Digital_RT; + public ConfigEntry Input_Mouse_Sensitivity; + public ConfigEntry Input_MouseYAxisInversion; //Other settings - public MelonPreferences_Entry? Entry_Other_SkipIntros; - public MelonPreferences_Entry? Entry_Other_Prompts; - public MelonPreferences_Entry? Entry_Other_ShowAdvanced; - public MelonPreferences_Entry? Entry_Other_InterpolateMovement; - public MelonPreferences_Entry? Entry_Other_GeometryImprovements; - public MelonPreferences_Entry? Entry_Other_LightImprovements; - public MelonPreferences_Entry? Entry_Other_EnableCheats; - - public ExposedSettings() + public ConfigEntry Entry_Other_SkipIntros; + public ConfigEntry Entry_Other_Prompts; + public ConfigEntry Entry_Other_ShowAdvanced; + public ConfigEntry Entry_Other_InterpolateMovement; + public ConfigEntry Entry_Other_GeometryImprovements; + public ConfigEntry Entry_Other_LightImprovements; + public ConfigEntry Entry_Other_EnableCheats; + + public ExposedSettings(ConfigFile fileInst) { - Category_mainDisplay = MelonPreferences.CreateCategory("Suis Hack Main Display"); - Category_graphicsSettings = MelonPreferences.CreateCategory("Suis Hack Graphics Settings"); - Category_inputSettings = MelonPreferences.CreateCategory("Suis Hack Input Settings"); - Category_otherSettings = MelonPreferences.CreateCategory("Suis Hack Other Settings"); + Instance = this; + Config = fileInst; RegisterMainDisplay(); RegisterGraphicsSettings(); @@ -127,193 +126,203 @@ public ExposedSettings() private void RegisterMainDisplay() { - Entry_Display_Resolution = Category_mainDisplay!.CreateEntry("Resolution", "0x0", description: "Screen or game resolution depending on display mode - if invalid resolution is specified - main screen resolution is used"); - Entry_Display_RefreshRate = Category_mainDisplay.CreateEntry("Refresh_Rate", 0, description: "Refresh rate used in fullscreen. Normally it should be 0 (uses screen default). Only really matters if the game is set to Exclusive Fullscreen mode.", validator: new ValueRange(0, 560)); - Entry_DesiredFramerate = Category_mainDisplay.CreateEntry("DesiredFPS", -1, description: "Desired framerate. This is only used when Vsync is disabled. -1 is platform default, 0 is uncapped, max is 1000.", validator: new ValueRange(-1, 1000)); - Entry_DesiredFramerate.OnEntryValueChanged.Subscribe((int oldValue, int newValue) => { Application.targetFrameRate = newValue; }); + Entry_Display_Resolution = Config.Bind(CATEGORYNAME_MAINDISPLAY, "Resolution", "0x0", "Screen or game resolution depending on display mode - if invalid resolution is specified - main screen resolution is used"); + Entry_Display_RefreshRate = Config.Bind(CATEGORYNAME_MAINDISPLAY, "Refresh_Rate", 0, "Refresh rate used in fullscreen. Normally it should be 0 (uses screen default). Only really matters if the game is set to Exclusive Fullscreen mode."); //validator: new ValueRange(0, 560) + Entry_DesiredFramerate = Config.Bind(CATEGORYNAME_MAINDISPLAY, "DesiredFPS", -1, "Desired framerate. This is only used when Vsync is disabled. -1 is platform default, 0 is uncapped, max is 1000."); //validator: new ValueRange(-1, 1000)); + //Entry_DesiredFramerate.OnEntryValueChanged.Subscribe((int oldValue, int newValue) => { Application.targetFrameRate = newValue; }); - if (ConfigParsing.ParseResolution(Entry_Display_Resolution.Value, out LemonTuple? desiredResolution)) + if (ConfigParsing.ParseResolution(Entry_Display_Resolution.Value, out Tuple desiredResolution)) Resolution = desiredResolution; else Entry_Display_Resolution.Value = "0x0"; - Entry_Display_DisplayMode = Category_mainDisplay.CreateEntry("Mode", FullScreenMode.FullScreenWindow, description: "Unity's display mode. Options are: ExclusiveFullScreen / FullScreenWindow / MaximizedWindow / Windowed"); - Entry_Display_Vsync = Category_mainDisplay.CreateEntry("Vsync", true, description: "Enable vSync. True by default. If this is false and refresh rate is not 0, FPS cap is used."); + Entry_Display_DisplayMode = Config.Bind(CATEGORYNAME_MAINDISPLAY, "Mode", FullScreenMode.FullScreenWindow, "Unity's display mode. Options are: ExclusiveFullScreen / FullScreenWindow / MaximizedWindow / Windowed"); + Entry_Display_Vsync = Config.Bind(CATEGORYNAME_MAINDISPLAY, "Vsync", true, "Enable vSync. True by default. If this is false and refresh rate is not 0, FPS cap is used."); } private void RegisterGraphicsSettings() { //I was originally planning on writting some wrapper to set up these events, but why should I when I can have a wall of text! - Entry_Antialiasing = Category_graphicsSettings!.CreateEntry("Antialiasing", PostProcessLayer.Antialiasing.FastApproximateAntialiasing, description: "Experimental: Antialiasing used by the game. Options are: \"None\" (disables AA) / \"FastApproximateAntialiasing\" (FXAA) / \"SubpixelMorphologicalAntialiasing\" (SMAA) / \"TemporalAntialiasing\" (TAA). Default on PC is \"FastApproximateAntialiasing\". MSAA is not available due to the game using deferred rendering path. TAA causes issues with phantoms and as such SMAA is recommended."); - Entry_Antialiasing.OnEntryValueChanged.Subscribe((PostProcessLayer.Antialiasing oldVal, PostProcessLayer.Antialiasing newVal) => { Hacks.PostProcessLayerHook.Antialiasing = newVal; }); + Entry_Antialiasing = Config.Bind(CATEGORYNAME_GRAPHICS, "Antialiasing", PostProcessLayer.Antialiasing.FastApproximateAntialiasing, description: "Experimental: Antialiasing used by the game. Options are: \"None\" (disables AA) / \"FastApproximateAntialiasing\" (FXAA) / \"SubpixelMorphologicalAntialiasing\" (SMAA) / \"TemporalAntialiasing\" (TAA). Default on PC is \"FastApproximateAntialiasing\". MSAA is not available due to the game using deferred rendering path. TAA causes issues with phantoms and as such SMAA is recommended."); + Entry_Antialiasing.SettingChanged += (object sender, EventArgs e) => { Hacks.PostProcessLayerHook.Antialiasing = Entry_Antialiasing.Value; }; - Entry_AnistropicFiltering = Category_graphicsSettings.CreateEntry("Anisotropic filtering", AnisotropicFiltering.ForceEnable, description: "Main anisotropic setting that applies to all textures. Options are \"Disable\" (disables all Anisotropic filtering) / \"Enable\" (makes it so the game uses per texture settings that were specified by the developer) / \"ForceEnable\" (Forces override - see \"Anisotropic filtering override min\" and \"Anisotropic filtering override max\"). Default on PC is ForceEnable (on Switch it was probably Enable)"); - Entry_AnistropicFiltering.OnEntryValueChanged.Subscribe((AnisotropicFiltering oldAF, AnisotropicFiltering newAF) => { QualitySettings.anisotropicFiltering = newAF; }); + Entry_AnistropicFiltering = Config.Bind(CATEGORYNAME_GRAPHICS, "Anisotropic filtering", AnisotropicFiltering.ForceEnable, description: "Main anisotropic setting that applies to all textures. Options are \"Disable\" (disables all Anisotropic filtering) / \"Enable\" (makes it so the game uses per texture settings that were specified by the developer) / \"ForceEnable\" (Forces override - see \"Anisotropic filtering override min\" and \"Anisotropic filtering override max\"). Default on PC is ForceEnable (on Switch it was probably Enable)"); + Entry_AnistropicFiltering.SettingChanged += (object sender, EventArgs e) => { QualitySettings.anisotropicFiltering = Entry_AnistropicFiltering.Value; }; - Entry_AnistropicFilteringValue = Category_graphicsSettings.CreateEntry("Anisotropic filtering override value", 8, description: "Anisotropic filtering level when using ForceEnable anisotropic filtering", validator: new ValueRange(-1, 16)); - Entry_AnistropicFilteringValue.OnEntryValueChanged.Subscribe((int oldValue, int newValue) => { Texture.SetGlobalAnisotropicFilteringLimits(newValue, newValue); }); + Entry_AnistropicFilteringValue = Config.Bind(CATEGORYNAME_GRAPHICS, "Anisotropic filtering override value", 8, description: "Anisotropic filtering level when using ForceEnable anisotropic filtering"); // validator: new ValueRange(-1, 16)); + Entry_AnistropicFilteringValue.SettingChanged += (object sender, EventArgs e) => { Texture.SetGlobalAnisotropicFilteringLimits(Entry_AnistropicFilteringValue.Value, Entry_AnistropicFilteringValue.Value); }; - Entry_Quality_CameraFarPlaneDistance = Category_graphicsSettings.CreateEntry("Far plane distance", 700f, description: "Sets camera's maximum draw distance (far clip plane). The default is: 700."); - Entry_Quality_CameraFarPlaneDistance.OnEntryValueChanged.Subscribe((float oldValue, float newValue) => { Hacks.PostProcessLayerHook.FarClipDistance = newValue; }); + Entry_Quality_CameraFarPlaneDistance = Config.Bind(CATEGORYNAME_GRAPHICS, "Far plane distance", 700f, description: "Sets camera's maximum draw distance (far clip plane). The default is: 700."); + Entry_Quality_CameraFarPlaneDistance.SettingChanged += (object sender, EventArgs e) => { Hacks.PostProcessLayerHook.FarClipDistance = Entry_Quality_CameraFarPlaneDistance.Value; }; - Entry_Quality_ShadowDistance = Category_graphicsSettings.CreateEntry("Shadow distance", 150f, description: "Affects the distance at which the shadows are rendered. The default is 150. Careful as this option is tied with shadow cascades. Min. is 10, max 1000", validator: new ValueRange(10, 1000)); - Entry_Quality_ShadowDistance.OnEntryValueChanged.Subscribe((float oldValue, float newValue) => { QualitySettings.shadowDistance = newValue; }); + Entry_Quality_ShadowDistance = Config.Bind(CATEGORYNAME_GRAPHICS, "Shadow distance", 150f, description: "Affects the distance at which the shadows are rendered. The default is 150. Careful as this option is tied with shadow cascades. Min. is 10, max 1000"); // validator: new ValueRange(10, 1000)); + Entry_Quality_ShadowDistance.SettingChanged += (object sender, EventArgs e) => { QualitySettings.shadowDistance = Entry_Quality_ShadowDistance.Value; }; - Entry_Quality_ShadowsQuality = Category_graphicsSettings.CreateEntry("Shadows quality", ShadowQuality.All, description: "Sets Unity\'s shadadow quality, which is actually the types of shadows allowed. Options are \"Disable\" (to disable any shadows) / \"HardOnly\" (to allow only hard shadows) / All (to allow both smooth shadows). By default the game uses All."); - Entry_Quality_ShadowsQuality.OnEntryValueChanged.Subscribe((ShadowQuality oldValue, ShadowQuality newValue) => { QualitySettings.shadows = newValue; }); + Entry_Quality_ShadowsQuality = Config.Bind(CATEGORYNAME_GRAPHICS, "Shadows quality", ShadowQuality.All, description: "Sets Unity\'s shadadow quality, which is actually the types of shadows allowed. Options are \"Disable\" (to disable any shadows) / \"HardOnly\" (to allow only hard shadows) / All (to allow both smooth shadows). By default the game uses All."); + Entry_Quality_ShadowsQuality.SettingChanged += (object sender, EventArgs e) => { QualitySettings.shadows = Entry_Quality_ShadowsQuality.Value; }; - Entry_Quality_ShadowsResolution = Category_graphicsSettings.CreateEntry("Shadows resolution", ShadowResolution.High, description: "Sets shadow resolution. There are 4 options: Low / Medium / High / VeryHigh. By default the PC version uses High. Very high shouldn't provide much of a difference above High unless 4 cascades are used."); - Entry_Quality_ShadowsResolution.OnEntryValueChanged.Subscribe((ShadowResolution oldValue, ShadowResolution newValue) => { QualitySettings.shadowResolution = newValue; }); + Entry_Quality_ShadowsResolution = Config.Bind(CATEGORYNAME_GRAPHICS, "Shadows resolution", ShadowResolution.High, description: "Sets shadow resolution. There are 4 options: Low / Medium / High / VeryHigh. By default the PC version uses High. Very high shouldn't provide much of a difference above High unless 4 cascades are used."); + Entry_Quality_ShadowsResolution.SettingChanged += (object sender, EventArgs e) => { QualitySettings.shadowResolution = Entry_Quality_ShadowsResolution.Value; }; - Entry_Quality_Use4ShadowCascades = Category_graphicsSettings.CreateEntry("Use 4 Shadow cascades", false, description: "Makes it so the game uses 4 shadow cascades instead of 2. This should significently increase shadows quality in the game if used. By default in PC version the game uses 2 cascades."); - Entry_Quality_Use4ShadowCascades.OnEntryValueChanged.Subscribe((bool oldValue, bool newValue) => { QualitySettings.shadowCascades = newValue ? 4 : 2; }); + Entry_Quality_Use4ShadowCascades = Config.Bind(CATEGORYNAME_GRAPHICS, "Use 4 Shadow cascades", false, description: "Makes it so the game uses 4 shadow cascades instead of 2. This should significently increase shadows quality in the game if used. By default in PC version the game uses 2 cascades."); + Entry_Quality_Use4ShadowCascades.SettingChanged += (object sender, EventArgs e) => { QualitySettings.shadowCascades = Entry_Quality_Use4ShadowCascades.Value ? 4 : 2; }; - Entry_Quality_LODBias = Category_graphicsSettings.CreateEntry("LODBias", 2f, description: "LOD Bias - affects how far from camera the LOD changes - bigger values, push the LOD change further from camera - min. 0.5, max. 4.0. Default game value is 2.0. Originally it was probably 1.0 on Nintendo Switch.", validator: new ValueRange(0.5f, 4f)); - Entry_Quality_LODBias.OnEntryValueChanged.Subscribe((float oldValue, float newValue) => { QualitySettings.lodBias = newValue; }); + Entry_Quality_LODBias = Config.Bind(CATEGORYNAME_GRAPHICS, "LODBias", 2f, description: "LOD Bias - affects how far from camera the LOD changes - bigger values, push the LOD change further from camera - min. 0.5, max. 4.0. Default game value is 2.0. Originally it was probably 1.0 on Nintendo Switch."); // validator: new ValueRange(0.5f, 4f)); + Entry_Quality_LODBias.SettingChanged += (object sender, EventArgs e) => { QualitySettings.lodBias = Entry_Quality_LODBias.Value; }; - Entry_Quality_ShadowTwoSplitValue = Category_graphicsSettings.CreateEntry("Shadow split 2 percent", 0.333333333f, description: "Sets percentage distance from maximum shadow distance where first cascade transitions to second one. Default value is 0.333333333. This value is not used when using 4 cascades. Essentially what this means that with a default shadow distance of 150 and value split percentage 0.333333333, the first cascade will transition to second one at a distance of approx. 50 units from camera. Min value is 0.01, max is 0.5", validator: new ValueRange(0.01f, 0.5f)); - Entry_Quality_ShadowTwoSplitValue.OnEntryValueChanged.Subscribe((float oldValue, float newValue) => { QualitySettings.shadowCascade2Split = newValue; }); + Entry_Quality_ShadowTwoSplitValue = Config.Bind(CATEGORYNAME_GRAPHICS, "Shadow split 2 percent", 0.333333333f, description: "Sets percentage distance from maximum shadow distance where first cascade transitions to second one. Default value is 0.333333333. This value is not used when using 4 cascades. Essentially what this means that with a default shadow distance of 150 and value split percentage 0.333333333, the first cascade will transition to second one at a distance of approx. 50 units from camera. Min value is 0.01, max is 0.5"); //validator: new ValueRange(0.01f, 0.5f)); + Entry_Quality_ShadowTwoSplitValue.SettingChanged += (object sender, EventArgs e) => { QualitySettings.shadowCascade2Split = Entry_Quality_ShadowTwoSplitValue.Value; }; - Entry_Quality_ShadowFourSplitValue1 = Category_graphicsSettings.CreateEntry("Shadow split 4 percent 1", 0.06666667f, description: "See \"Shadow split 2 percent\" - this is the same, except used for 4 cascades - this one is percentage distance between cascade 1 and 2. Default value is 0.06666667f. Min value is 0.01, max is 0.5", validator: new ValueRange(0.01f, 0.5f)); - Entry_Quality_ShadowFourSplitValue2 = Category_graphicsSettings.CreateEntry("Shadow split 4 percent 2", 0.2f, description: "See \"Shadow split 2 percent\" - this is the same, except used for 4 cascades - this one is percentage distance between cascade 2 and 3. Default value is 0.2. Min value is 0.1, max is 0.8", validator: new ValueRange(0.1f, 0.8f)); - Entry_Quality_ShadowFourSplitValue3 = Category_graphicsSettings.CreateEntry("Shadow split 4 percent 3", 0.4666667f, description: "See \"Shadow split 2 percent\" - this is the same, except used for 4 cascades - this one is percentage distance between cascade 3 and 4. Default value is 0.4666667. Min value is 0.02, max is 0.9", validator: new ValueRange(0.02f, 0.9f)); + Entry_Quality_ShadowFourSplitValue1 = Config.Bind(CATEGORYNAME_GRAPHICS, "Shadow split 4 percent 1", 0.06666667f, description: "See \"Shadow split 2 percent\" - this is the same, except used for 4 cascades - this one is percentage distance between cascade 1 and 2. Default value is 0.06666667f. Min value is 0.01, max is 0.5"); //validator: new ValueRange(0.01f, 0.5f)); + Entry_Quality_ShadowFourSplitValue2 = Config.Bind(CATEGORYNAME_GRAPHICS, "Shadow split 4 percent 2", 0.2f, description: "See \"Shadow split 2 percent\" - this is the same, except used for 4 cascades - this one is percentage distance between cascade 2 and 3. Default value is 0.2. Min value is 0.1, max is 0.8"); // validator: new ValueRange(0.1f, 0.8f)); + Entry_Quality_ShadowFourSplitValue3 = Config.Bind(CATEGORYNAME_GRAPHICS, "Shadow split 4 percent 3", 0.4666667f, description: "See \"Shadow split 2 percent\" - this is the same, except used for 4 cascades - this one is percentage distance between cascade 3 and 4. Default value is 0.4666667. Min value is 0.02, max is 0.9"); //validator: new ValueRange(0.02f, 0.9f)); - Entry_Quality_MirrorReflectionResolution = Category_graphicsSettings.CreateEntry("Mirrors reflection reflection", 512, description: "Overrides render texture resolution for planar reflections - the resolution has to be a number that is a power of 2 and at least 128 and at most 2048. Default is 512.", validator: new PowerOfTwoValidatorWithRange(128, 2048)); - Entry_Quality_MirrorReflectionResolution.OnEntryValueChanged.Subscribe((int oldValue, int newValue) => { Hacks.MirrorReflectionHook.ReflectionSize = newValue; }); + Entry_Quality_MirrorReflectionResolution = Config.Bind(CATEGORYNAME_GRAPHICS, "Mirrors reflection reflection", 512, description: "Overrides render texture resolution for planar reflections - the resolution has to be a number that is a power of 2 and at least 128 and at most 2048. Default is 512."); //validator: new PowerOfTwoValidatorWithRange(128, 2048)); + Entry_Quality_MirrorReflectionResolution.SettingChanged += (object sender, EventArgs e) => { Hacks.MirrorReflectionHook.ReflectionSize = Entry_Quality_MirrorReflectionResolution.Value; }; Hacks.MirrorReflectionHook.ReflectionSize = Entry_Quality_MirrorReflectionResolution.Value; - Entry_Quality_HBAO_Preset = Category_graphicsSettings.CreateEntry("HBAO Preset", HBAO_Core.Preset.FastestPerformance, description: "Preset to use to override HBAO. Options are: FastestPerformance / FastPerformance / Normal / HighQuality / HighestQuality. Default is FastestPerformance. For Normal and higher, consider lowering HBAO intensity."); - Entry_Quality_HBAO_Preset.OnEntryValueChanged.Subscribe((HBAO_Core.Preset oldValue, HBAO_Core.Preset newValue) => { Hacks.PostProcessLayerHook.HBAO_Preset = newValue; }); + Entry_Quality_HBAO_Preset = Config.Bind(CATEGORYNAME_GRAPHICS, "HBAO Preset", HBAO_Core.Preset.FastestPerformance, description: "Preset to use to override HBAO. Options are: FastestPerformance / FastPerformance / Normal / HighQuality / HighestQuality. Default is FastestPerformance. For Normal and higher, consider lowering HBAO intensity."); + Entry_Quality_HBAO_Preset.SettingChanged += (object sender, EventArgs e) => { Hacks.PostProcessLayerHook.HBAO_Preset = Entry_Quality_HBAO_Preset.Value; }; Hacks.PostProcessLayerHook.HBAO_Preset = Entry_Quality_HBAO_Preset.Value; - Entry_Quality_HBAO_Intensity = Category_graphicsSettings.CreateEntry("HBAO Intensity", 1.0f, description: "HBAO intensity - this probably should be lower than 1.0 when using Normal and higher presets.", validator: new ValueRange(0, 1)); - Entry_Quality_HBAO_Intensity.OnEntryValueChanged.Subscribe((float oldValue, float newValue) => { Hacks.PostProcessLayerHook.HBAO_Intensity = newValue; }); + Entry_Quality_HBAO_Intensity = Config.Bind(CATEGORYNAME_GRAPHICS, "HBAO Intensity", 1.0f, description: "HBAO intensity - this probably should be lower than 1.0 when using Normal and higher presets."); //validator: new ValueRange(0, 1)); + Entry_Quality_HBAO_Intensity.SettingChanged += (object sender, EventArgs e) => { Hacks.PostProcessLayerHook.HBAO_Intensity = Entry_Quality_HBAO_Intensity.Value; }; Hacks.PostProcessLayerHook.HBAO_Intensity = Entry_Quality_HBAO_Intensity.Value; - Entry_Quality_SSR_Enable = Category_graphicsSettings.CreateEntry("SSR Enable", false, description: "Enables Screen Space Reflection override"); - Entry_Quality_SSR_Enable.OnEntryValueChanged.Subscribe((bool oldValue, bool newValue) => { Hacks.PostProcessLayerHook.SSR_Enabled = newValue; }); + Entry_Quality_SSR_Enable = Config.Bind(CATEGORYNAME_GRAPHICS, "SSR Enable", false, description: "Enables Screen Space Reflection override"); + Entry_Quality_SSR_Enable.SettingChanged += (object sender, EventArgs e) => { Hacks.PostProcessLayerHook.SSR_Enabled = Entry_Quality_SSR_Enable.Value; }; Hacks.PostProcessLayerHook.SSR_Enabled = Entry_Quality_SSR_Enable.Value; - Entry_Quality_SSR_Preset = Category_graphicsSettings.CreateEntry("SSR Preset", ScreenSpaceReflectionPreset.Medium, description: "Sets Screen Space Reflection preset. Can be Lower / Low / Medium / High / Higher / Ultra / Overkill. Generally you shouldn't use Overkill."); - Entry_Quality_SSR_Preset.OnEntryValueChanged.Subscribe((ScreenSpaceReflectionPreset oldValue, ScreenSpaceReflectionPreset newValue) => { Hacks.PostProcessLayerHook.SSR_Preset = newValue; }); + Entry_Quality_SSR_Preset = Config.Bind(CATEGORYNAME_GRAPHICS, "SSR Preset", ScreenSpaceReflectionPreset.Medium, description: "Sets Screen Space Reflection preset. Can be Lower / Low / Medium / High / Higher / Ultra / Overkill. Generally you shouldn't use Overkill."); + Entry_Quality_SSR_Preset.SettingChanged += (object sender, EventArgs e) => { Hacks.PostProcessLayerHook.SSR_Preset = Entry_Quality_SSR_Preset.Value; }; Hacks.PostProcessLayerHook.SSR_Preset = Entry_Quality_SSR_Preset.Value; - Entry_Quality_SSR_Resolution = Category_graphicsSettings.CreateEntry("SSR Resolution", ScreenSpaceReflectionResolution.Downsampled, description: "Sets Screen Space Reflections resolution. Can be Downsampled / FullSize / Supersampled. Generally you shouldn't use Supersampled."); - Entry_Quality_SSR_Resolution.OnEntryValueChanged.Subscribe((ScreenSpaceReflectionResolution oldValue, ScreenSpaceReflectionResolution newValue) => { Hacks.PostProcessLayerHook.SSR_Resolution = newValue; }); + Entry_Quality_SSR_Resolution = Config.Bind(CATEGORYNAME_GRAPHICS, "SSR Resolution", ScreenSpaceReflectionResolution.Downsampled, description: "Sets Screen Space Reflections resolution. Can be Downsampled / FullSize / Supersampled. Generally you shouldn't use Supersampled."); + Entry_Quality_SSR_Resolution.SettingChanged += (object sender, EventArgs e) => { Hacks.PostProcessLayerHook.SSR_Resolution = Entry_Quality_SSR_Resolution.Value; }; Hacks.PostProcessLayerHook.SSR_Resolution = Entry_Quality_SSR_Resolution.Value; - Entry_Quality_SSR_Tickness = Category_graphicsSettings.CreateEntry("SSR Tickness", 1f, description: "Sets Screen Space Reflections tickness value", validator: new ValueRange(0, 1)); - Entry_Quality_SSR_Tickness.OnEntryValueChanged.Subscribe((float oldValue, float newValue) => { Hacks.PostProcessLayerHook.SSR_Tickness = newValue; }); + Entry_Quality_SSR_Tickness = Config.Bind(CATEGORYNAME_GRAPHICS, "SSR Tickness", 1f, description: "Sets Screen Space Reflections tickness value"); //validator: new ValueRange(0, 1)); + Entry_Quality_SSR_Tickness.SettingChanged += (object sender, EventArgs e) => { Hacks.PostProcessLayerHook.SSR_Tickness = Entry_Quality_SSR_Tickness.Value; }; Hacks.PostProcessLayerHook.SSR_Tickness = Entry_Quality_SSR_Tickness.Value; - Entry_Quality_SSR_Vignette = Category_graphicsSettings.CreateEntry("SSR Vignette", 0.15f, description: "Sets Screen Space Reflections vigniette value, which smoothly disables reflections towards the edges of the screen", validator: new ValueRange(0, 1)); - Entry_Quality_SSR_Vignette.OnEntryValueChanged.Subscribe((float oldValue, float newValue) => { Hacks.PostProcessLayerHook.SSR_Vignette = newValue; }); + Entry_Quality_SSR_Vignette = Config.Bind(CATEGORYNAME_GRAPHICS, "SSR Vignette", 0.15f, description: "Sets Screen Space Reflections vigniette value, which smoothly disables reflections towards the edges of the screen"); // validator: new ValueRange(0, 1)); + Entry_Quality_SSR_Vignette.SettingChanged += (object sender, EventArgs e) => { Hacks.PostProcessLayerHook.SSR_Vignette = Entry_Quality_SSR_Vignette.Value; }; Hacks.PostProcessLayerHook.SSR_Vignette = Entry_Quality_SSR_Vignette.Value; - Entry_Quality_SSR_DistanceFade = Category_graphicsSettings.CreateEntry("SSR Distance fade", 0.01f, description: "Sets Screen Space Reflections distance fade value. Keep it really low to reduce SSR glow-like effect around silhouettes", validator: new ValueRange(0, 0.5f)); - Entry_Quality_SSR_DistanceFade.OnEntryValueChanged.Subscribe((float oldValue, float newValue) => { Hacks.PostProcessLayerHook.SSR_DistanceFade = newValue; }); + Entry_Quality_SSR_DistanceFade = Config.Bind(CATEGORYNAME_GRAPHICS, "SSR Distance fade", 0.01f, description: "Sets Screen Space Reflections distance fade value. Keep it really low to reduce SSR glow-like effect around silhouettes"); //validator: new ValueRange(0, 0.5f)); + Entry_Quality_SSR_DistanceFade.SettingChanged += (object sender, EventArgs e) => { Hacks.PostProcessLayerHook.SSR_DistanceFade = Entry_Quality_SSR_DistanceFade.Value; }; Hacks.PostProcessLayerHook.SSR_DistanceFade = Entry_Quality_SSR_DistanceFade.Value; - Entry_Quality_SSR_MaxMarchingDistance = Category_graphicsSettings.CreateEntry("SSR Max Marching Distance", 100f, description: "Sets Screen Space Reflections max maching distance value, after which the ray is terminated.", validator: new ValueRange(50, 250)); - Entry_Quality_SSR_MaxMarchingDistance.OnEntryValueChanged.Subscribe((float oldValue, float newValue) => { Hacks.PostProcessLayerHook.SSR_MaxMarchingDistance = newValue; }); + Entry_Quality_SSR_MaxMarchingDistance = Config.Bind(CATEGORYNAME_GRAPHICS, "SSR Max Marching Distance", 100f, description: "Sets Screen Space Reflections max maching distance value, after which the ray is terminated."); //validator: new ValueRange(50, 250)); + Entry_Quality_SSR_MaxMarchingDistance.SettingChanged += (object sender, EventArgs e) => { Hacks.PostProcessLayerHook.SSR_MaxMarchingDistance = Entry_Quality_SSR_MaxMarchingDistance.Value; }; Hacks.PostProcessLayerHook.SSR_MaxMarchingDistance = Entry_Quality_SSR_MaxMarchingDistance.Value; - Entry_Quality_PixelLightCount = Category_graphicsSettings.CreateEntry("PixelLightCount", 4, description: "Pixel Light Count - Default is 4. Affects the maximum number of pixel lights that should affect any object. If there are more lights illuminating an object, the dimmest ones will be rendered as vertex lights.", validator: new ValueRange(0, 8)); - Entry_Quality_PixelLightCount.OnEntryValueChanged.Subscribe((int oldValue, int newValue) => { QualitySettings.pixelLightCount = newValue; }); + Entry_Quality_PixelLightCount = Config.Bind(CATEGORYNAME_GRAPHICS, "PixelLightCount", 4, description: "Pixel Light Count - Default is 4. Affects the maximum number of pixel lights that should affect any object. If there are more lights illuminating an object, the dimmest ones will be rendered as vertex lights."); //validator: new ValueRange(0, 8)); + Entry_Quality_PixelLightCount.SettingChanged += (object sender, EventArgs e) => { QualitySettings.pixelLightCount = Entry_Quality_PixelLightCount.Value; }; - Entry_Quality_TextureQuality = Category_graphicsSettings.CreateEntry("Texture quality", 0, description: "Texture quality - default is 0. Higher values cause lower mip maps to be used. Can be used to reduce VRAM usage on low-end devices. 1 will cause half of the original resolution to be used", validator: new ValueRange(0, 1)); - Entry_Quality_TextureQuality.OnEntryValueChanged.Subscribe((int oldValue, int newValue) => { QualitySettings.masterTextureLimit = newValue; }); + Entry_Quality_TextureQuality = Config.Bind(CATEGORYNAME_GRAPHICS, "Texture quality", 0, description: "Texture quality - default is 0. Higher values cause lower mip maps to be used. Can be used to reduce VRAM usage on low-end devices. 1 will cause half of the original resolution to be used"); //validator: new ValueRange(0, 1)); + Entry_Quality_TextureQuality.SettingChanged += (object sender, EventArgs e) => { QualitySettings.masterTextureLimit = Entry_Quality_TextureQuality.Value; }; - Entry_Quality_EdgeDetection = Category_graphicsSettings.CreateEntry("Edge Detection Filter", true, description: "Responsible for Enabling/Disabling edge detection post process filter."); - Entry_Quality_EdgeDetection.OnEntryValueChanged.Subscribe((bool oldValue, bool newValue) => { Hacks.PostProcessLayerHook.EnableEdgeDetectionFilter = newValue; }); + Entry_Quality_EdgeDetection = Config.Bind(CATEGORYNAME_GRAPHICS, "Edge Detection Filter", true, description: "Responsible for Enabling/Disabling edge detection post process filter."); + Entry_Quality_EdgeDetection.SettingChanged += (object sender, EventArgs e) => { Hacks.PostProcessLayerHook.EnableEdgeDetectionFilter = Entry_Quality_EdgeDetection.Value; }; Hacks.PostProcessLayerHook.EnableEdgeDetectionFilter = Entry_Quality_EdgeDetection.Value; - Entry_Quality_EdgeDetectionDepth = Category_graphicsSettings.CreateEntry("Edge Detection Filter Depth", 1.0f, description: "Responsible for figuring out how to apply edges based on distance from camera. This might have to be changed to lower values when extending camera's far plane to avoid glitches."); - Entry_Quality_EdgeDetectionDepth.OnEntryValueChanged.Subscribe((float oldValue, float newValue) => { Hacks.PostProcessLayerHook.EnableEdgeDetectionFilterDepth = newValue; }); + Entry_Quality_EdgeDetectionDepth = Config.Bind(CATEGORYNAME_GRAPHICS, "Edge Detection Filter Depth", 1.0f, description: "Responsible for figuring out how to apply edges based on distance from camera. This might have to be changed to lower values when extending camera's far plane to avoid glitches."); + Entry_Quality_EdgeDetectionDepth.SettingChanged += (object sender, EventArgs e) => { Hacks.PostProcessLayerHook.EnableEdgeDetectionFilterDepth = Entry_Quality_EdgeDetectionDepth.Value; }; Hacks.PostProcessLayerHook.EnableEdgeDetectionFilterDepth = Entry_Quality_EdgeDetectionDepth.Value; } private void RegisterInputSettings() { - Input_Override = Category_inputSettings!.CreateEntry("Input type", InputType.SteamInput, description: "Overrides controls handling - options are: SteamInput (leaves the game using Steam Input as it is) / KeyboardAndMouse (hooks input to read keyboard and mouse instead)"); - Input_Analog_LeftStickFloatTime = Category_inputSettings.CreateEntry("Left Stick Float Time", 0.1f, description: "How long does it take a stick to get to desired spot - this allows the game to handle rotations slightly better, although prevents the input from being instantanious. Min value: 0.01, Max 1.", validator: new ValueRange(0.01f, 1f)); - Input_Analog_LeftStickFloatTime.OnEntryValueChanged.Subscribe((float oldValue, float newValue) => { GlobalInputHookHandler.Instance!.AnalogInputToInput![SteamInputHook.SteamInputAnalog.L_Stick] = new KeyActionAnalog(Input_Analog_LeftStick_Up!.Value, Input_Analog_LeftStick_Down!.Value, Input_Analog_LeftStick_Left!.Value, Input_Analog_LeftStick_Right!.Value, newValue); GlobalInputHookHandler.Instance?.InitializeInputs(); }); - - Input_Analog_LeftStick_Up = Category_inputSettings.CreateEntry("Left Stick Key Up", KeyCode.W, description: "Key used to as replacement for reading up on left analog's Y axis"); - Input_Analog_LeftStick_Up.OnEntryValueChanged.Subscribe((KeyCode oldValue, KeyCode newValue) => { GlobalInputHookHandler.Instance!.AnalogInputToInput![SteamInputHook.SteamInputAnalog.L_Stick] = new KeyActionAnalog(newValue, Input_Analog_LeftStick_Down!.Value, Input_Analog_LeftStick_Left!.Value, Input_Analog_LeftStick_Right!.Value, Input_Analog_LeftStickFloatTime.Value); GlobalInputHookHandler.Instance?.InitializeInputs(); }); - Input_Analog_LeftStick_Right = Category_inputSettings.CreateEntry("Left Stick Key Right", KeyCode.D, description: "Key used to as replacement for reading left on left analog's X axis"); - Input_Analog_LeftStick_Right.OnEntryValueChanged.Subscribe((KeyCode oldValue, KeyCode newValue) => { GlobalInputHookHandler.Instance!.AnalogInputToInput![SteamInputHook.SteamInputAnalog.L_Stick] = new KeyActionAnalog(Input_Analog_LeftStick_Up.Value, Input_Analog_LeftStick_Down!.Value, Input_Analog_LeftStick_Left!.Value, newValue, Input_Analog_LeftStickFloatTime.Value); GlobalInputHookHandler.Instance?.InitializeInputs(); }); - Input_Analog_LeftStick_Down = Category_inputSettings.CreateEntry("Left Stick Key Down", KeyCode.S, description: "Key used to as replacement for reading down on left analog's Y axis"); - Input_Analog_LeftStick_Down.OnEntryValueChanged.Subscribe((KeyCode oldValue, KeyCode newValue) => { GlobalInputHookHandler.Instance!.AnalogInputToInput![SteamInputHook.SteamInputAnalog.L_Stick] = new KeyActionAnalog(Input_Analog_LeftStick_Up.Value, newValue, Input_Analog_LeftStick_Left!.Value, Input_Analog_LeftStick_Right.Value, Input_Analog_LeftStickFloatTime.Value); GlobalInputHookHandler.Instance?.InitializeInputs(); }); - Input_Analog_LeftStick_Left = Category_inputSettings.CreateEntry("Left Stick Key Left", KeyCode.A, description: "Key used to as replacement for reading right on left analog's X axis"); - Input_Analog_LeftStick_Left.OnEntryValueChanged.Subscribe((KeyCode oldValue, KeyCode newValue) => { GlobalInputHookHandler.Instance!.AnalogInputToInput![SteamInputHook.SteamInputAnalog.L_Stick] = new KeyActionAnalog(Input_Analog_LeftStick_Up.Value, Input_Analog_LeftStick_Down.Value, newValue, Input_Analog_LeftStick_Right.Value, Input_Analog_LeftStickFloatTime.Value); GlobalInputHookHandler.Instance?.InitializeInputs(); }); - - Input_Digital_A_Button = Category_inputSettings.CreateEntry("Controller button B", KeyCode.Q, description: "Key used as replacement for Xbox's B key (originally Switch's A key) - generally cancel action"); - Input_Digital_A_Button.OnEntryValueChanged.Subscribe((KeyCode oldValue, KeyCode newValue) => { GlobalInputHookHandler.Instance!.DigitalInputToInput![SteamInputHook.SteamInputDigital.A_Button] = new KeySteamDigitalAction(newValue, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }); - Input_Digital_B_Button = Category_inputSettings.CreateEntry("Controller button A", KeyCode.E, description: "Key used as replacement for Xbox's A key (originally Switch's B key) - generally confirm and contextual action"); - Input_Digital_B_Button.OnEntryValueChanged.Subscribe((KeyCode oldValue, KeyCode newValue) => { GlobalInputHookHandler.Instance!.DigitalInputToInput![SteamInputHook.SteamInputDigital.B_Button] = new KeySteamDigitalAction(newValue, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }); - Input_Digital_X_Button = Category_inputSettings.CreateEntry("Controller button Y", KeyCode.Space, description: "Key used as replacement for Xbox's Y key (originally Switch's X key) - generally used for skateboard"); - Input_Digital_X_Button.OnEntryValueChanged.Subscribe((KeyCode oldValue, KeyCode newValue) => { GlobalInputHookHandler.Instance!.DigitalInputToInput![SteamInputHook.SteamInputDigital.X_Button] = new KeySteamDigitalAction(newValue, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }); - Input_Digital_Y_Button = Category_inputSettings.CreateEntry("Controller button X", KeyCode.Escape, description: "Key used as replacement for Xbox's Y key (originally Switch's X key) - generally used for opening Red Room"); - Input_Digital_Y_Button.OnEntryValueChanged.Subscribe((KeyCode oldValue, KeyCode newValue) => { GlobalInputHookHandler.Instance!.DigitalInputToInput![SteamInputHook.SteamInputDigital.Y_Button] = new KeySteamDigitalAction(newValue, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }); - - Input_Digital_LB = Category_inputSettings.CreateEntry("Controller LB", KeyCode.Alpha2, description: "Key used as replacement for Left Bumper - generally used for vision mode"); - Input_Digital_LB.OnEntryValueChanged.Subscribe((KeyCode oldValue, KeyCode newValue) => { GlobalInputHookHandler.Instance!.DigitalInputToInput![SteamInputHook.SteamInputDigital.LB] = new KeySteamDigitalAction(newValue, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }); - Input_Digital_RB = Category_inputSettings.CreateEntry("Controller RB", KeyCode.LeftShift, description: "Key used as replacement for Right Bumper - generally used for sprint"); - Input_Digital_RB.OnEntryValueChanged.Subscribe((KeyCode oldValue, KeyCode newValue) => { GlobalInputHookHandler.Instance!.DigitalInputToInput![SteamInputHook.SteamInputDigital.RB] = new KeySteamDigitalAction(newValue, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }); - - Input_Digital_Back_Button = Category_inputSettings.CreateEntry("Controller Back", KeyCode.Tab, description: "Key used as replacement for Back / Select button"); - Input_Digital_Back_Button.OnEntryValueChanged.Subscribe((KeyCode oldValue, KeyCode newValue) => { GlobalInputHookHandler.Instance!.DigitalInputToInput![SteamInputHook.SteamInputDigital.Back_Button] = new KeySteamDigitalAction(newValue, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }); - Input_Digital_Start_Button = Category_inputSettings.CreateEntry("Controller Start", KeyCode.O, description: "Key used as replacement for Start button"); - Input_Digital_Start_Button.OnEntryValueChanged.Subscribe((KeyCode oldValue, KeyCode newValue) => { GlobalInputHookHandler.Instance!.DigitalInputToInput![SteamInputHook.SteamInputDigital.Start_Button] = new KeySteamDigitalAction(newValue, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }); - - Input_Digital_L_Stick_Button = Category_inputSettings.CreateEntry("Controller Left Stick Click", KeyCode.LeftControl, description: "Key used as replacement for Left stick click - generally used for crouching"); - Input_Digital_L_Stick_Button.OnEntryValueChanged.Subscribe((KeyCode oldValue, KeyCode newValue) => { GlobalInputHookHandler.Instance!.DigitalInputToInput![SteamInputHook.SteamInputDigital.L_Stick_Button] = new KeySteamDigitalAction(newValue, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }); - Input_Digital_R_Stick_Button = Category_inputSettings.CreateEntry("Controller Right Stick Click", KeyCode.Mouse2, description: "Key used as replacement for Right stick click"); - Input_Digital_R_Stick_Button.OnEntryValueChanged.Subscribe((KeyCode oldValue, KeyCode newValue) => { GlobalInputHookHandler.Instance!.DigitalInputToInput![SteamInputHook.SteamInputDigital.R_Stick_Button] = new KeySteamDigitalAction(newValue, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }); - - Input_Digital_Up_Button = Category_inputSettings.CreateEntry("Controller Dpad up", KeyCode.UpArrow, description: "Key used as replacement for D-pad up"); - Input_Digital_Up_Button.OnEntryValueChanged.Subscribe((KeyCode oldValue, KeyCode newValue) => { GlobalInputHookHandler.Instance!.DigitalInputToInput![SteamInputHook.SteamInputDigital.Up_Button] = new KeySteamDigitalAction(newValue, true); GlobalInputHookHandler.Instance?.InitializeInputs(); }); - Input_Digital_Right_Button = Category_inputSettings.CreateEntry("Controller Dpad right", KeyCode.RightArrow, description: "Key used as replacement for D-pad right"); - Input_Digital_Right_Button.OnEntryValueChanged.Subscribe((KeyCode oldValue, KeyCode newValue) => { GlobalInputHookHandler.Instance!.DigitalInputToInput![SteamInputHook.SteamInputDigital.Right_Button] = new KeySteamDigitalAction(newValue, true); GlobalInputHookHandler.Instance?.InitializeInputs(); }); - Input_Digital_Down_Button = Category_inputSettings.CreateEntry("Controller Dpad down", KeyCode.DownArrow, description: "Key used as replacement for D-pad down"); - Input_Digital_Down_Button.OnEntryValueChanged.Subscribe((KeyCode oldValue, KeyCode newValue) => { GlobalInputHookHandler.Instance!.DigitalInputToInput![SteamInputHook.SteamInputDigital.Down_Button] = new KeySteamDigitalAction(newValue, true); GlobalInputHookHandler.Instance?.InitializeInputs(); }); - Input_Digital_Left_Button = Category_inputSettings.CreateEntry("Controller Dpad left", KeyCode.LeftArrow, description: "Key used as replacement for D-pad left"); - Input_Digital_Left_Button.OnEntryValueChanged.Subscribe((KeyCode oldValue, KeyCode newValue) => { GlobalInputHookHandler.Instance!.DigitalInputToInput![SteamInputHook.SteamInputDigital.Left_Button] = new KeySteamDigitalAction(newValue, true); GlobalInputHookHandler.Instance?.InitializeInputs(); }); - - Input_Digital_LT = Category_inputSettings.CreateEntry("Controller Left Trigger", KeyCode.Mouse1, description: "Key used as replacemen for Left trigger pull - generally aiming"); - Input_Digital_LT.OnEntryValueChanged.Subscribe((KeyCode oldValue, KeyCode newValue) => { GlobalInputHookHandler.Instance!.DigitalInputToInput![SteamInputHook.SteamInputDigital.LT] = new KeySteamDigitalAction(newValue, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }); - Input_Digital_RT = Category_inputSettings.CreateEntry("Controller Right Trigger", KeyCode.Mouse0, description: "Key used as replacemen for Right trigger pull - generally punching / shooting"); - Input_Digital_RT.OnEntryValueChanged.Subscribe((KeyCode oldValue, KeyCode newValue) => { GlobalInputHookHandler.Instance!.DigitalInputToInput![SteamInputHook.SteamInputDigital.RT] = new KeySteamDigitalAction(newValue, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }); - - Input_Mouse_Sensitivity = Category_inputSettings.CreateEntry("Mouse sensitivity", 1.0f, description: "Mouse sensitivity multiplier.", validator: new ValueRange(0.05f, 2f)); - Input_Mouse_Sensitivity.OnEntryValueChanged.Subscribe((float oldValue, float newValue) => { MouseAnalog.Sensitivity = newValue; }); + Input_Override = Config.Bind(CATEGORYNAME_INPUT, "Input type", InputType.SteamInput, description: "Overrides controls handling - options are: SteamInput (leaves the game using Steam Input as it is) / KeyboardAndMouse (hooks input to read keyboard and mouse instead)"); + Input_Analog_LeftStickFloatTime = Config.Bind(CATEGORYNAME_INPUT, "Left Stick Float Time", 0.1f, description: "How long does it take a stick to get to desired spot - this allows the game to handle rotations slightly better, although prevents the input from being instantanious. Min value: 0.01, Max 1."); // validator: new ValueRange(0.01f, 1f)); + Input_Analog_LeftStickFloatTime.SettingChanged += (object sender, EventArgs e) => { GlobalInputHookHandler.Instance.AnalogInputToInput[SteamInputHook.SteamInputAnalog.L_Stick] = new KeyActionAnalog(Input_Analog_LeftStick_Up.Value, Input_Analog_LeftStick_Down.Value, Input_Analog_LeftStick_Left.Value, Input_Analog_LeftStick_Right.Value, Input_Analog_LeftStickFloatTime.Value); GlobalInputHookHandler.Instance?.InitializeInputs(); }; + + Input_Analog_LeftStick_Up = Config.Bind(CATEGORYNAME_INPUT, "Left Stick Key Up", KeyCode.W, description: "Key used to as replacement for reading up on left analog's Y axis"); + Input_Analog_LeftStick_Up.SettingChanged += (object sender, EventArgs e) => { GlobalInputHookHandler.Instance.AnalogInputToInput[SteamInputHook.SteamInputAnalog.L_Stick] = new KeyActionAnalog(Input_Analog_LeftStick_Up.Value, Input_Analog_LeftStick_Down.Value, Input_Analog_LeftStick_Left.Value, Input_Analog_LeftStick_Right.Value, Input_Analog_LeftStickFloatTime.Value); GlobalInputHookHandler.Instance?.InitializeInputs(); }; + + Input_Analog_LeftStick_Right = Config.Bind(CATEGORYNAME_INPUT, "Left Stick Key Right", KeyCode.D, description: "Key used to as replacement for reading left on left analog's X axis"); + Input_Analog_LeftStick_Right.SettingChanged += (object sender, EventArgs e) => { GlobalInputHookHandler.Instance.AnalogInputToInput[SteamInputHook.SteamInputAnalog.L_Stick] = new KeyActionAnalog(Input_Analog_LeftStick_Up.Value, Input_Analog_LeftStick_Down.Value, Input_Analog_LeftStick_Left.Value, Input_Analog_LeftStick_Right.Value, Input_Analog_LeftStickFloatTime.Value); GlobalInputHookHandler.Instance?.InitializeInputs(); }; + + Input_Analog_LeftStick_Down = Config.Bind(CATEGORYNAME_INPUT, "Left Stick Key Down", KeyCode.S, description: "Key used to as replacement for reading down on left analog's Y axis"); + Input_Analog_LeftStick_Down.SettingChanged += (object sender, EventArgs e) => { GlobalInputHookHandler.Instance.AnalogInputToInput[SteamInputHook.SteamInputAnalog.L_Stick] = new KeyActionAnalog(Input_Analog_LeftStick_Up.Value, Input_Analog_LeftStick_Down.Value, Input_Analog_LeftStick_Left.Value, Input_Analog_LeftStick_Right.Value, Input_Analog_LeftStickFloatTime.Value); GlobalInputHookHandler.Instance?.InitializeInputs(); }; + + Input_Analog_LeftStick_Left = Config.Bind(CATEGORYNAME_INPUT, "Left Stick Key Left", KeyCode.A, description: "Key used to as replacement for reading right on left analog's X axis"); + Input_Analog_LeftStick_Left.SettingChanged += (object sender, EventArgs e) => { GlobalInputHookHandler.Instance.AnalogInputToInput[SteamInputHook.SteamInputAnalog.L_Stick] = new KeyActionAnalog(Input_Analog_LeftStick_Up.Value, Input_Analog_LeftStick_Down.Value, Input_Analog_LeftStick_Left.Value, Input_Analog_LeftStick_Right.Value, Input_Analog_LeftStickFloatTime.Value); GlobalInputHookHandler.Instance?.InitializeInputs(); }; + + Input_Digital_A_Button = Config.Bind(CATEGORYNAME_INPUT, "Controller button B", KeyCode.Q, description: "Key used as replacement for Xbox's B key (originally Switch's A key) - generally cancel action"); + Input_Digital_A_Button.SettingChanged += (object sender, EventArgs e) => { GlobalInputHookHandler.Instance.DigitalInputToInput[SteamInputHook.SteamInputDigital.A_Button] = new KeySteamDigitalAction(Input_Digital_A_Button.Value, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }; + + Input_Digital_B_Button = Config.Bind(CATEGORYNAME_INPUT, "Controller button A", KeyCode.E, description: "Key used as replacement for Xbox's A key (originally Switch's B key) - generally confirm and contextual action"); + Input_Digital_B_Button.SettingChanged += (object sender, EventArgs e) => { GlobalInputHookHandler.Instance.DigitalInputToInput[SteamInputHook.SteamInputDigital.B_Button] = new KeySteamDigitalAction(Input_Digital_B_Button.Value, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }; + + Input_Digital_X_Button = Config.Bind(CATEGORYNAME_INPUT, "Controller button Y", KeyCode.Space, description: "Key used as replacement for Xbox's Y key (originally Switch's X key) - generally used for skateboard"); + Input_Digital_X_Button.SettingChanged += (object sender, EventArgs e) => { GlobalInputHookHandler.Instance.DigitalInputToInput[SteamInputHook.SteamInputDigital.X_Button] = new KeySteamDigitalAction(Input_Digital_X_Button.Value, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }; + + Input_Digital_Y_Button = Config.Bind(CATEGORYNAME_INPUT, "Controller button X", KeyCode.Escape, description: "Key used as replacement for Xbox's Y key (originally Switch's X key) - generally used for opening Red Room"); + Input_Digital_Y_Button.SettingChanged += (object sender, EventArgs e) => { GlobalInputHookHandler.Instance.DigitalInputToInput[SteamInputHook.SteamInputDigital.Y_Button] = new KeySteamDigitalAction(Input_Digital_Y_Button.Value, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }; + + Input_Digital_LB = Config.Bind(CATEGORYNAME_INPUT, "Controller LB", KeyCode.Alpha2, description: "Key used as replacement for Left Bumper - generally used for vision mode"); + Input_Digital_LB.SettingChanged += (object sender, EventArgs e) => { GlobalInputHookHandler.Instance.DigitalInputToInput[SteamInputHook.SteamInputDigital.LB] = new KeySteamDigitalAction(Input_Digital_LB.Value, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }; + + Input_Digital_RB = Config.Bind(CATEGORYNAME_INPUT, "Controller RB", KeyCode.LeftShift, description: "Key used as replacement for Right Bumper - generally used for sprint"); + Input_Digital_RB.SettingChanged += (object sender, EventArgs e) => { GlobalInputHookHandler.Instance.DigitalInputToInput[SteamInputHook.SteamInputDigital.RB] = new KeySteamDigitalAction(Input_Digital_RB.Value, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }; + + Input_Digital_Back_Button = Config.Bind(CATEGORYNAME_INPUT, "Controller Back", KeyCode.Tab, description: "Key used as replacement for Back / Select button"); + Input_Digital_Back_Button.SettingChanged += (object sender, EventArgs e) => { GlobalInputHookHandler.Instance.DigitalInputToInput[SteamInputHook.SteamInputDigital.Back_Button] = new KeySteamDigitalAction(Input_Digital_Back_Button.Value, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }; + + Input_Digital_Start_Button = Config.Bind(CATEGORYNAME_INPUT, "Controller Start", KeyCode.O, description: "Key used as replacement for Start button"); + Input_Digital_Start_Button.SettingChanged += (object sender, EventArgs e) => { GlobalInputHookHandler.Instance.DigitalInputToInput[SteamInputHook.SteamInputDigital.Start_Button] = new KeySteamDigitalAction(Input_Digital_Start_Button.Value, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }; + + Input_Digital_L_Stick_Button = Config.Bind(CATEGORYNAME_INPUT, "Controller Left Stick Click", KeyCode.LeftControl, description: "Key used as replacement for Left stick click - generally used for crouching"); + Input_Digital_L_Stick_Button.SettingChanged += (object sender, EventArgs e) => { GlobalInputHookHandler.Instance.DigitalInputToInput[SteamInputHook.SteamInputDigital.L_Stick_Button] = new KeySteamDigitalAction(Input_Digital_L_Stick_Button.Value, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }; + + Input_Digital_R_Stick_Button = Config.Bind(CATEGORYNAME_INPUT, "Controller Right Stick Click", KeyCode.Mouse2, description: "Key used as replacement for Right stick click"); + Input_Digital_R_Stick_Button.SettingChanged += (object sender, EventArgs e) => { GlobalInputHookHandler.Instance.DigitalInputToInput[SteamInputHook.SteamInputDigital.R_Stick_Button] = new KeySteamDigitalAction(Input_Digital_R_Stick_Button.Value, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }; + + Input_Digital_Up_Button = Config.Bind(CATEGORYNAME_INPUT, "Controller Dpad up", KeyCode.UpArrow, description: "Key used as replacement for D-pad up"); + Input_Digital_Up_Button.SettingChanged += (object sender, EventArgs e) => { GlobalInputHookHandler.Instance.DigitalInputToInput[SteamInputHook.SteamInputDigital.Up_Button] = new KeySteamDigitalAction(Input_Digital_Up_Button.Value, true); GlobalInputHookHandler.Instance?.InitializeInputs(); }; + + Input_Digital_Right_Button = Config.Bind(CATEGORYNAME_INPUT, "Controller Dpad right", KeyCode.RightArrow, description: "Key used as replacement for D-pad right"); + Input_Digital_Right_Button.SettingChanged += (object sender, EventArgs e) => { GlobalInputHookHandler.Instance.DigitalInputToInput[SteamInputHook.SteamInputDigital.Right_Button] = new KeySteamDigitalAction(Input_Digital_Right_Button.Value, true); GlobalInputHookHandler.Instance?.InitializeInputs(); }; + + Input_Digital_Down_Button = Config.Bind(CATEGORYNAME_INPUT, "Controller Dpad down", KeyCode.DownArrow, description: "Key used as replacement for D-pad down"); + Input_Digital_Down_Button.SettingChanged += (object sender, EventArgs e) => { GlobalInputHookHandler.Instance.DigitalInputToInput[SteamInputHook.SteamInputDigital.Down_Button] = new KeySteamDigitalAction(Input_Digital_Down_Button.Value, true); GlobalInputHookHandler.Instance?.InitializeInputs(); }; + + Input_Digital_Left_Button = Config.Bind(CATEGORYNAME_INPUT, "Controller Dpad left", KeyCode.LeftArrow, description: "Key used as replacement for D-pad left"); + Input_Digital_Left_Button.SettingChanged += (object sender, EventArgs e) => { GlobalInputHookHandler.Instance.DigitalInputToInput[SteamInputHook.SteamInputDigital.Left_Button] = new KeySteamDigitalAction(Input_Digital_Left_Button.Value, true); GlobalInputHookHandler.Instance?.InitializeInputs(); }; + + Input_Digital_LT = Config.Bind(CATEGORYNAME_INPUT, "Controller Left Trigger", KeyCode.Mouse1, description: "Key used as replacemen for Left trigger pull - generally aiming"); + Input_Digital_LT.SettingChanged += (object sender, EventArgs e) => { GlobalInputHookHandler.Instance.DigitalInputToInput![SteamInputHook.SteamInputDigital.LT] = new KeySteamDigitalAction(Input_Digital_LT.Value, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }; + + Input_Digital_RT = Config.Bind(CATEGORYNAME_INPUT, "Controller Right Trigger", KeyCode.Mouse0, description: "Key used as replacemen for Right trigger pull - generally punching / shooting"); + Input_Digital_RT.SettingChanged += (object sender, EventArgs e) => { GlobalInputHookHandler.Instance.DigitalInputToInput![SteamInputHook.SteamInputDigital.RT] = new KeySteamDigitalAction(Input_Digital_RT.Value, false); GlobalInputHookHandler.Instance?.InitializeInputs(); }; + + Input_Mouse_Sensitivity = Config.Bind(CATEGORYNAME_INPUT, "Mouse sensitivity", 1.0f, description: "Mouse sensitivity multiplier."); //validator: new ValueRange(0.05f, 2f)); + Input_Mouse_Sensitivity.SettingChanged += (object sender, EventArgs e) => { MouseAnalog.Sensitivity = Input_Mouse_Sensitivity.Value; }; MouseAnalog.Sensitivity = Input_Mouse_Sensitivity.Value; - Input_MouseYAxisInversion = Category_inputSettings.CreateEntry("Mouse Y axis inversion", false, description: "Inverts mouse's Y axis."); - Input_MouseYAxisInversion.OnEntryValueChanged.Subscribe((bool oldValue, bool newValue) => { MouseAnalog.InvertYAxis = newValue; }); + Input_MouseYAxisInversion = Config.Bind(CATEGORYNAME_INPUT, "Mouse Y axis inversion", false, description: "Inverts mouse's Y axis."); + Input_MouseYAxisInversion.SettingChanged += (object sender, EventArgs e) => { MouseAnalog.InvertYAxis = Input_MouseYAxisInversion.Value; }; MouseAnalog.InvertYAxis = Input_MouseYAxisInversion.Value; - - Input_Controller_Vibration = Category_inputSettings.CreateEntry("Controller vibration", false, description: "Adds controller vibration in few places."); - Input_Controller_Vibration.OnEntryValueChanged.Subscribe((bool oldValue, bool newValue) => { Components.VibrationController.UseRumble = newValue; }); - Components.VibrationController.UseRumble = Input_Controller_Vibration.Value; } private void RegisterOtherSettings() { - Entry_Other_SkipIntros = Category_otherSettings!.CreateEntry("Skip intros", true, description: "Allows to skip splash screns / intros and go straight to menu! Disable in case of issues"); - Entry_Other_Prompts = Category_otherSettings.CreateEntry("Controller Prompts", "", description: "Asset bundle file name that is containing replacement prompts atlas. Make sure to use correct Steam Input binding for the keys to correspond to displayed prompts."); - Entry_Other_ShowAdvanced = Category_otherSettings.CreateEntry("Show advanced settings", false, description: "Shows advanced options in GUI."); + Entry_Other_SkipIntros = Config.Bind(CATEGORYNAME_OTHER, "Skip intros", true, description: "Allows to skip splash screns / intros and go straight to menu! Disable in case of issues"); + Entry_Other_Prompts = Config.Bind(CATEGORYNAME_OTHER, "Controller Prompts", "", description: "Asset bundle file name that is containing replacement prompts atlas. Make sure to use correct Steam Input binding for the keys to correspond to displayed prompts."); + Entry_Other_ShowAdvanced = Config.Bind(CATEGORYNAME_OTHER, "Show advanced settings", false, description: "Shows advanced options in GUI."); - Entry_Other_InterpolateMovement = Category_otherSettings.CreateEntry("Interpolate movement", true, description: "Experimental: Enabled hooks related to movement interpolation of some rendered objects (protagonist and camera) to work around 50Hz Fixed Update stuttering - to my speedrunning friends: DO NOT allow this option for speedrunning."); - Entry_Other_InterpolateMovement.OnEntryValueChanged.Subscribe((bool oldValue, bool newVal) => { Components.Interpolation.SmootherController.InterpolateMovement = newVal; }); + Entry_Other_InterpolateMovement = Config.Bind(CATEGORYNAME_OTHER, "Interpolate movement", true, description: "Experimental: Enabled hooks related to movement interpolation of some rendered objects (protagonist and camera) to work around 50Hz Fixed Update stuttering - to my speedrunning friends: DO NOT allow this option for speedrunning."); + Entry_Other_InterpolateMovement.SettingChanged += (object sender, EventArgs e) => { Components.Interpolation.SmootherController.InterpolateMovement = Entry_Other_InterpolateMovement.Value; }; Components.Interpolation.SmootherController.InterpolateMovement = Entry_Other_InterpolateMovement.Value; - Entry_Other_GeometryImprovements = Category_otherSettings.CreateEntry("Geometry improvements", GeometryImprovements.Enabled, description: "Runs additional scripts and shader replacement to improve geometry. Options are: \"Disabled\" / \"Enabled\" (only fixes some geometry issues and modifiers a few really bad LOD distance groups)"); - Entry_Other_LightImprovements = Category_otherSettings.CreateEntry("Improve lights", LightImprovements.Minor, description: "Modifies light sources to improve the game's looks. Options are: Disabled / Minor / All - All can introduce some performance problems. Minor should be generally safe."); - Entry_Other_EnableCheats = Category_otherSettings.CreateEntry("Enable cheats", true, description: "Enables access to custom cheat menu."); + Entry_Other_GeometryImprovements = Config.Bind(CATEGORYNAME_OTHER, "Geometry improvements", GeometryImprovements.Enabled, description: "Runs additional scripts and shader replacement to improve geometry. Options are: \"Disabled\" / \"Enabled\" (only fixes some geometry issues and modifiers a few really bad LOD distance groups)"); + Entry_Other_LightImprovements = Config.Bind(CATEGORYNAME_OTHER, "Improve lights", LightImprovements.Minor, description: "Modifies light sources to improve the game's looks. Options are: Disabled / Minor / All - All can introduce some performance problems. Minor should be generally safe."); + Entry_Other_EnableCheats = Config.Bind(CATEGORYNAME_OTHER, "Enable cheats", true, description: "Enables access to custom cheat menu."); } - public LemonTuple? Resolution; + public Tuple Resolution; } + } diff --git a/Source/GameStateMachine.cs b/Source/GameStateMachine.cs index bf70251..aee4dc7 100644 --- a/Source/GameStateMachine.cs +++ b/Source/GameStateMachine.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace SuisHack +namespace SuisHack { public static class GameStateMachine { @@ -98,7 +92,7 @@ private static void RunStateMachine() if (oldState != CurrentGameState) { - SuisHackMain.loggerInst!.Msg($"Changed state to: {CurrentGameState}"); + Plugin.Message($"Changed state to: {CurrentGameState}"); } } } diff --git a/Source/GamepadSupport/GamepadPrompts.cs b/Source/GamepadSupport/GamepadPrompts.cs index a9dab7e..f208e34 100644 --- a/Source/GamepadSupport/GamepadPrompts.cs +++ b/Source/GamepadSupport/GamepadPrompts.cs @@ -1,5 +1,4 @@ using HarmonyLib; -using Il2Cpp; using SuisHack.GlobalGameObjects; namespace SuisHack.GamepadSupport @@ -8,25 +7,25 @@ public static class GamepadPrompts { public static void Initialize() { - if (SuisHackMain.Settings!.Input_Override!.Value == ExposedSettings.InputType.SteamInput) + if (ExposedSettings.Instance.Input_Override.Value == ExposedSettings.InputType.SteamInput) { var source = typeof(UISprite).GetMethod(nameof(UISprite.OnInit), System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public); var target = typeof(GamepadPrompts).GetMethod(nameof(GamepadPrompts.UISpriteOn), System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public); if (source == null) { - SuisHackMain.loggerInst!.Msg("Failed to find source method for GamepadPrompts"); + Plugin.Message("Failed to find source method for GamepadPrompts"); return; } if (target == null) { - SuisHackMain.loggerInst!.Msg("Failed to find target method for GamepadPrompts"); + Plugin.Message("Failed to find target method for GamepadPrompts"); return; } - SuisHackMain.harmonyInst!.Patch(source, postfix: new HarmonyMethod(target)); - SuisHackMain.loggerInst!.Msg("Initialized GamepadPrompts patch"); + Plugin.HarmonyInstance.Patch(source, postfix: new HarmonyMethod(target)); + Plugin.Message("Initialized GamepadPrompts patch"); } } diff --git a/Source/GamepadSupport/GamepadRumble.cs b/Source/GamepadSupport/GamepadRumble.cs deleted file mode 100644 index 7eb29d2..0000000 --- a/Source/GamepadSupport/GamepadRumble.cs +++ /dev/null @@ -1,45 +0,0 @@ -using HarmonyLib; -using Il2Cpp; - -namespace SuisHack.GamepadSupport -{ - [HarmonyPatch] - public class GamepadRumble - { - [HarmonyPostfix] - [HarmonyPatch(typeof(Gun), nameof(Gun.Fire))] - public static void FirePostfix() - { - Components.VibrationController.Instance?.TriggleRumble(60000, 0.15f); - } - - [HarmonyPostfix] - [HarmonyPatch(typeof(Gun), nameof(Gun.ChargeShot))] - public static void ChargeShot() - { - Components.VibrationController.Instance?.TriggleRumble(ushort.MaxValue, 0.20f); - } - - - [HarmonyPostfix] - [HarmonyPatch(typeof(Gun), nameof(Gun.ChargeShotNoTarget))] - public static void ChargeShotNoTarget() - { - Components.VibrationController.Instance?.TriggleRumble(ushort.MaxValue, 0.20f); - } - - [HarmonyPostfix] - [HarmonyPatch(typeof(Gun), nameof(Gun.UnDispChargeFlash))] - public static void UnDispChargeFlash() - { - Components.VibrationController.Instance?.CancelRumble(); - } - - [HarmonyPostfix] - [HarmonyPatch(typeof(Gun), nameof(Gun.CancelChargeFlash))] - public static void CancelChargeFlash() - { - Components.VibrationController.Instance?.CancelRumble(); - } - } -} diff --git a/Source/GlobalGameObjects/GlobalReplacementAtlas.cs b/Source/GlobalGameObjects/GlobalReplacementAtlas.cs index 18fc599..84b13b2 100644 --- a/Source/GlobalGameObjects/GlobalReplacementAtlas.cs +++ b/Source/GlobalGameObjects/GlobalReplacementAtlas.cs @@ -1,10 +1,10 @@ -using Il2Cpp; -using System; +using System; +using System.Collections; +using System.IO; using UnityEngine; namespace SuisHack.GlobalGameObjects { - [MelonLoader.RegisterTypeInIl2Cpp] public class GlobalReplacementAtlas : MonoBehaviour { public GlobalReplacementAtlas(IntPtr ptr) : base(ptr) { } @@ -15,9 +15,9 @@ public enum ReplacementType KeyboardAndMouse } - public static GlobalReplacementAtlas? Instance { get; private set; } - private UIAtlas? Atlas; - public IPromptCache? Cache { get; private set; } + public static GlobalReplacementAtlas Instance { get; private set; } + private UIAtlas Atlas; + public IPromptCache Cache { get; private set; } public ReplacementType ReplacementTypeUsed { get; private set; } public static void Initialize() @@ -26,29 +26,33 @@ public static void Initialize() { var GlobalAtlasGO = new GameObject("GlobalAtlas"); DontDestroyOnLoad(GlobalAtlasGO); + GlobalAtlasGO.hideFlags = HideFlags.HideAndDontSave; Instance = GlobalAtlasGO.AddComponent(); } } void Awake() { - if (SuisHackMain.Settings!.Entry_Other_Prompts!.Value != "" || SuisHackMain.Settings.Input_Override!.Value == ExposedSettings.InputType.KeyboardAndMouse) + DontDestroyOnLoad(this.gameObject); + this.hideFlags = HideFlags.HideAndDontSave; + var settings = ExposedSettings.Instance; + if (settings.Entry_Other_Prompts.Value != "" || settings.Input_Override.Value == ExposedSettings.InputType.KeyboardAndMouse) { - var assetBundlePath = SuisHackMain.Settings.Entry_Other_Prompts.Value; + var assetBundlePath = settings.Entry_Other_Prompts.Value; this.ReplacementTypeUsed = ReplacementType.Basic; - if (SuisHackMain.Settings.Input_Override!.Value == ExposedSettings.InputType.KeyboardAndMouse) + if (settings.Input_Override.Value == ExposedSettings.InputType.KeyboardAndMouse) { this.ReplacementTypeUsed = ReplacementType.KeyboardAndMouse; assetBundlePath = "keyboard"; } string path = Path.Combine(Path.Combine(Application.streamingAssetsPath, "prompts"), assetBundlePath); - SuisHackMain.loggerInst!.Msg("Trying to load replacement prompts using bundle: " + path); + Plugin.Message("Trying to load replacement prompts using bundle: " + path); var assetBundle = AssetBundle.LoadFromFile(path); if (assetBundle == null) { - SuisHackMain.loggerInst.Error("Failed to load asset bundle!"); + Plugin.Error("Failed to load asset bundle!"); return; } @@ -65,6 +69,7 @@ void Awake() instanitate.transform.SetParent(this.transform); instanitate.transform.localPosition = Vector3.zero; instanitate.transform.localRotation = Quaternion.identity; + instanitate.gameObject.hideFlags = HideFlags.HideAndDontSave; Atlas = instanitate.GetComponentInChildren(); switch (ReplacementTypeUsed) @@ -79,21 +84,21 @@ void Awake() } else { - SuisHackMain.loggerInst.Error("Atlas Game object was found, but UIAtlas was null. Crap!"); + Plugin.Error("Atlas Game object was found, but UIAtlas was null. Crap!"); return; } } else { - SuisHackMain.loggerInst.Error("Atlas game object cast failed - object might be invalid."); + Plugin.Error("Atlas game object cast failed - object might be invalid."); return; } } else - SuisHackMain.loggerInst.Error("Failed to find Xbox atlas... fuck!"); + Plugin.Error("Failed to find Xbox atlas... fuck!"); if (Atlas != null) - SuisHackMain.loggerInst.Msg("Replacement atlas loaded correctly!!"); + Plugin.Message("Replacement atlas loaded correctly!!"); } } @@ -107,7 +112,7 @@ public void Replace(UISprite instance, Enum keyEnum) if (replacement != null) { instance.atlas = Atlas; - instance.SetAtlasSprite(replacement!); + instance.SetAtlasSprite(replacement); } } } diff --git a/Source/GlobalGameObjects/PromptCache.cs b/Source/GlobalGameObjects/PromptCache.cs index 4e076f5..3e3c045 100644 --- a/Source/GlobalGameObjects/PromptCache.cs +++ b/Source/GlobalGameObjects/PromptCache.cs @@ -1,5 +1,4 @@ -using Il2Cpp; -using System; +using System; using System.Collections.Generic; using UnityEngine; @@ -37,10 +36,10 @@ public PromptCache(UIAtlas atlas) } } - SuisHackMain.loggerInst!.Msg("Atlas cache created!"); + Plugin.Message("Atlas cache created!"); } - UISpriteData? GetSpriteDataFromAtlas(UIAtlas atlas, string enumName) + UISpriteData GetSpriteDataFromAtlas(UIAtlas atlas, string enumName) { for (int i = 0; i < atlas.spriteList.Count; i++) { @@ -52,9 +51,9 @@ public PromptCache(UIAtlas atlas) return null; } - public UISpriteData? GetReplacement(Enum keyEnum) + public UISpriteData GetReplacement(Enum keyEnum) { - if (translation.TryGetValue((T)keyEnum, out UISpriteData? result)) + if (translation.TryGetValue((T)keyEnum, out UISpriteData result)) { return result; } diff --git a/Source/Hacks/Interpolation/BoatSceneSetupHook.cs b/Source/Hacks/Interpolation/BoatSceneSetupHook.cs index 672d581..e06d3cf 100644 --- a/Source/Hacks/Interpolation/BoatSceneSetupHook.cs +++ b/Source/Hacks/Interpolation/BoatSceneSetupHook.cs @@ -1,5 +1,4 @@ using HarmonyLib; -using Il2Cpp; using UnityEngine; namespace SuisHack.Hacks.Interpolation diff --git a/Source/Hacks/Interpolation/CameraBoatFollowHook.cs b/Source/Hacks/Interpolation/CameraBoatFollowHook.cs index 86d594a..46948e9 100644 --- a/Source/Hacks/Interpolation/CameraBoatFollowHook.cs +++ b/Source/Hacks/Interpolation/CameraBoatFollowHook.cs @@ -1,5 +1,4 @@ using HarmonyLib; -using Il2Cpp; using UnityEngine; namespace SuisHack.Hacks.Interpolation @@ -7,7 +6,7 @@ namespace SuisHack.Hacks.Interpolation [HarmonyPatch] public static class BoatCameraFollowHook { - public static BoatCameraFollow? LastCheckBehaviour; + public static BoatCameraFollow LastCheckBehaviour; [HarmonyPostfix] [HarmonyPatch(typeof(BoatCameraFollow), nameof(BoatCameraFollow.LateUpdate))] diff --git a/Source/Hacks/Interpolation/CameraFollowHook.cs b/Source/Hacks/Interpolation/CameraFollowHook.cs index 8be525f..2ad3c38 100644 --- a/Source/Hacks/Interpolation/CameraFollowHook.cs +++ b/Source/Hacks/Interpolation/CameraFollowHook.cs @@ -1,5 +1,4 @@ using HarmonyLib; -using Il2Cpp; namespace SuisHack.Hacks { diff --git a/Source/Hacks/Interpolation/CharaControlHook.cs b/Source/Hacks/Interpolation/CharaControlHook.cs index 41ef4ed..917ea1c 100644 --- a/Source/Hacks/Interpolation/CharaControlHook.cs +++ b/Source/Hacks/Interpolation/CharaControlHook.cs @@ -1,5 +1,4 @@ using HarmonyLib; -using Il2Cpp; using UnityEngine; namespace SuisHack.Hacks @@ -17,7 +16,7 @@ public static void CharaControlHookInit(CharaControl __instance) __instance.gameObject.AddComponent(); } - if (SuisHackMain.Settings!.Entry_Other_LightImprovements!.Value >= ExposedSettings.LightImprovements.Minor) + if (ExposedSettings.Instance.Entry_Other_LightImprovements.Value >= ExposedSettings.LightImprovements.Minor) { var lights = __instance.GetComponentsInChildren(true); for (int i = 0; i < lights.Length; i++) diff --git a/Source/Hacks/Lights/LightActiveCheckHook.cs b/Source/Hacks/Lights/LightActiveCheckHook.cs index e5e710a..9e01ec5 100644 --- a/Source/Hacks/Lights/LightActiveCheckHook.cs +++ b/Source/Hacks/Lights/LightActiveCheckHook.cs @@ -1,31 +1,29 @@ using HarmonyLib; -using Il2Cpp; namespace SuisHack.Hacks.Lights { - [HarmonyPatch] public static class LightActiveCheckHook { public static void Initialize() { - if (SuisHackMain.Settings!.Entry_Other_LightImprovements!.Value == ExposedSettings.LightImprovements.All) + if (ExposedSettings.Instance.Entry_Other_LightImprovements.Value == ExposedSettings.LightImprovements.All) { var sourceHook = typeof(LightActiveCheck).GetMethod(nameof(LightActiveCheck.Start), System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); var targetHook = typeof(LightActiveCheckHook).GetMethod(nameof(LightActiveCheckHook.StartPostifx), System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public); if (sourceHook == null) { - SuisHackMain.loggerInst!.Error("Failed to found source for LightActiveCheckHook"); + Plugin.Error("Failed to found source for LightActiveCheckHook"); return; } if (targetHook == null) { - SuisHackMain.loggerInst!.Error("Failed to found target for LightActiveCheckHook"); + Plugin.Error("Failed to found target for LightActiveCheckHook"); return; } - SuisHackMain.harmonyInst!.Patch(sourceHook, postfix: new HarmonyMethod(targetHook)); + Plugin.HarmonyInstance.Patch(sourceHook, postfix: new HarmonyMethod(targetHook)); } } diff --git a/Source/Hacks/Lights/NpcVehicleHook.cs b/Source/Hacks/Lights/NpcVehicleHook.cs index c5c042b..ecc0281 100644 --- a/Source/Hacks/Lights/NpcVehicleHook.cs +++ b/Source/Hacks/Lights/NpcVehicleHook.cs @@ -1,5 +1,4 @@ using HarmonyLib; -using Il2Cpp; using UnityEngine; namespace SuisHack.Hacks.Lights @@ -8,24 +7,24 @@ public static class NpcVehicleHook { public static void Initialize() { - if (SuisHackMain.Settings!.Entry_Other_LightImprovements!.Value == ExposedSettings.LightImprovements.All) + if (ExposedSettings.Instance.Entry_Other_LightImprovements.Value == ExposedSettings.LightImprovements.All) { var sourceHook = typeof(NpcVehicle).GetMethod(nameof(NpcVehicle.Awake), System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); var targetHook = typeof(NpcVehicleHook).GetMethod(nameof(NpcVehicleHook.NpcVehiclePostfix), System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public); if (sourceHook == null) { - SuisHackMain.loggerInst!.Error("Failed to found source for NpcTestHook"); + Plugin.Error("Failed to found source for NpcTestHook"); return; } if (targetHook == null) { - SuisHackMain.loggerInst!.Error("Failed to found target for NpcTestHook"); + Plugin.Error("Failed to found target for NpcTestHook"); return; } - SuisHackMain.harmonyInst!.Patch(sourceHook, postfix: new HarmonyMethod(targetHook)); + Plugin.HarmonyInstance.Patch(sourceHook, postfix: new HarmonyMethod(targetHook)); } } diff --git a/Source/Hacks/LogoMainHook.cs b/Source/Hacks/LogoMainHook.cs index 7b5c3be..f216061 100644 --- a/Source/Hacks/LogoMainHook.cs +++ b/Source/Hacks/LogoMainHook.cs @@ -1,6 +1,5 @@ -using HarmonyLib; -using Il2Cpp; -using MelonLoader; +using BepInEx.Unity.IL2CPP.Utils; +using HarmonyLib; using UnityEngine; namespace SuisHack.Hacks @@ -12,25 +11,27 @@ public static class LogoMainHook [HarmonyPatch(typeof(LogoMain), "Start")] public static void StartPostfix(LogoMain __instance) { - var Settings = SuisHackMain.Settings!; + ExposedSettings Settings = ExposedSettings.Instance; - QualitySettings.anisotropicFiltering = Settings.Entry_AnistropicFiltering!.Value; - Texture.SetGlobalAnisotropicFilteringLimits(Settings.Entry_AnistropicFilteringValue!.Value, Settings.Entry_AnistropicFilteringValue.Value); - PostProcessLayerHook.Antialiasing = Settings.Entry_Antialiasing!.Value; - PostProcessLayerHook.FarClipDistance = Settings.Entry_Quality_CameraFarPlaneDistance!.Value; - QualitySettings.lodBias = Settings.Entry_Quality_LODBias!.Value; - QualitySettings.pixelLightCount = Settings.Entry_Quality_PixelLightCount!.Value; - QualitySettings.shadowDistance = Settings.Entry_Quality_ShadowDistance!.Value; - QualitySettings.shadowCascade4Split = new Vector3(Settings.Entry_Quality_ShadowFourSplitValue1!.Value, Settings.Entry_Quality_ShadowFourSplitValue2!.Value, Settings.Entry_Quality_ShadowFourSplitValue3!.Value); - QualitySettings.shadows = Settings.Entry_Quality_ShadowsQuality!.Value; - QualitySettings.shadowResolution = Settings.Entry_Quality_ShadowsResolution!.Value; - QualitySettings.shadowCascade2Split = Settings.Entry_Quality_ShadowTwoSplitValue!.Value; - QualitySettings.masterTextureLimit = Settings.Entry_Quality_TextureQuality!.Value; - QualitySettings.shadowCascades = Settings.Entry_Quality_Use4ShadowCascades!.Value ? 4 : 2; + QualitySettings.anisotropicFiltering = Settings.Entry_AnistropicFiltering.Value; + Texture.SetGlobalAnisotropicFilteringLimits(Settings.Entry_AnistropicFilteringValue.Value, Settings.Entry_AnistropicFilteringValue.Value); + PostProcessLayerHook.Antialiasing = Settings.Entry_Antialiasing.Value; + PostProcessLayerHook.FarClipDistance = Settings.Entry_Quality_CameraFarPlaneDistance.Value; + QualitySettings.lodBias = Settings.Entry_Quality_LODBias.Value; + QualitySettings.pixelLightCount = Settings.Entry_Quality_PixelLightCount.Value; + QualitySettings.shadowDistance = Settings.Entry_Quality_ShadowDistance.Value; + QualitySettings.shadowCascade4Split = new Vector3(Settings.Entry_Quality_ShadowFourSplitValue1.Value, Settings.Entry_Quality_ShadowFourSplitValue2.Value, Settings.Entry_Quality_ShadowFourSplitValue3.Value); + QualitySettings.shadows = Settings.Entry_Quality_ShadowsQuality.Value; + QualitySettings.shadowResolution = Settings.Entry_Quality_ShadowsResolution.Value; + QualitySettings.shadowCascade2Split = Settings.Entry_Quality_ShadowTwoSplitValue.Value; + QualitySettings.masterTextureLimit = Settings.Entry_Quality_TextureQuality.Value; + QualitySettings.shadowCascades = Settings.Entry_Quality_Use4ShadowCascades.Value ? 4 : 2; - if (Settings.Entry_Other_SkipIntros!.Value) - MelonCoroutines.Start(StartMenu(__instance.gameObject.scene)); - SuisHackMain.loggerInst!.Msg($"Done applying settings!"); + if (Settings.Entry_Other_SkipIntros.Value) + { + MonoBehaviourExtensions.StartCoroutine(__instance, StartMenu(__instance.gameObject.scene)); + } + Plugin.Message("Done applying settings!"); } private static System.Collections.IEnumerator StartMenu(UnityEngine.SceneManagement.Scene scene) @@ -40,7 +41,7 @@ private static System.Collections.IEnumerator StartMenu(UnityEngine.SceneManagem yield return null; //Just to be extra sure stuff is loaded UnityEngine.SceneManagement.SceneManager.LoadScene(5, UnityEngine.SceneManagement.LoadSceneMode.Single); - SuisHackMain.loggerInst!.Msg($"Skipped scene"); + Plugin.Message("Skipped scene"); } } } diff --git a/Source/Hacks/MirrorReflectionHook.cs b/Source/Hacks/MirrorReflectionHook.cs index b8ff250..1575a9a 100644 --- a/Source/Hacks/MirrorReflectionHook.cs +++ b/Source/Hacks/MirrorReflectionHook.cs @@ -1,5 +1,4 @@ using HarmonyLib; -using Il2Cpp; namespace SuisHack.Hacks { diff --git a/Source/Hacks/NpcTestHook.cs b/Source/Hacks/NpcTestHook.cs index eb83f89..bf8dc1f 100644 --- a/Source/Hacks/NpcTestHook.cs +++ b/Source/Hacks/NpcTestHook.cs @@ -1,5 +1,4 @@ using HarmonyLib; -using Il2Cpp; using UnityEngine; namespace SuisHack.Hacks @@ -8,24 +7,24 @@ public static class NpcTestHook { public static void Initialize() { - if (SuisHackMain.Settings!.Entry_Other_GeometryImprovements!.Value >= ExposedSettings.GeometryImprovements.Enabled) + if (ExposedSettings.Instance.Entry_Other_GeometryImprovements.Value >= ExposedSettings.GeometryImprovements.Enabled) { var sourceHook = typeof(NpcTest).GetMethod(nameof(NpcTest.Init), System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); var targetHook = typeof(NpcTestHook).GetMethod(nameof(NpcTestHook.InitPostfix), System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public); if (sourceHook == null) { - SuisHackMain.loggerInst!.Error("Failed to found source for NpcTestHook"); + Plugin.Error("Failed to found source for NpcTestHook"); return; } if (targetHook == null) { - SuisHackMain.loggerInst!.Error("Failed to found target for NpcTestHook"); + Plugin.Error("Failed to found target for NpcTestHook"); return; } - SuisHackMain.harmonyInst!.Patch(sourceHook, postfix: new HarmonyMethod(targetHook)); + Plugin.HarmonyInstance.Patch(sourceHook, postfix: new HarmonyMethod(targetHook)); } } diff --git a/Source/Hacks/PostProcessLayerHook.cs b/Source/Hacks/PostProcessLayerHook.cs index 69b6417..552dc30 100644 --- a/Source/Hacks/PostProcessLayerHook.cs +++ b/Source/Hacks/PostProcessLayerHook.cs @@ -1,6 +1,8 @@ using HarmonyLib; -using Il2Cpp; -using Il2CppSCPE; +using SCPE; +using System; +using System.Collections.Generic; +using System.Linq; using UnityEngine; using UnityEngine.Rendering.PostProcessing; @@ -9,8 +11,8 @@ namespace SuisHack.Hacks [HarmonyPatch] public static class PostProcessLayerHook { - static List PostProcessLayerInstances = new List(); - static List PostProcessVolumeInstances = new List(); + static List PostProcessLayerInstances = new List(); + static List PostProcessVolumeInstances = new List(); #region Antialiasing @@ -25,7 +27,7 @@ public static PostProcessLayer.Antialiasing Antialiasing m_Antialiasing = value; foreach (var postProcess in PostProcessLayerInstances) { - postProcess!.antialiasingMode = value; + postProcess.antialiasingMode = value; postProcess.subpixelMorphologicalAntialiasing.quality = SubpixelMorphologicalAntialiasing.Quality.High; } } @@ -79,7 +81,7 @@ public static float FarClipDistance m_FarClipDistance = value; foreach (var postProcess in PostProcessLayerInstances) { - var camera = postProcess!.GetComponent(); + var camera = postProcess.GetComponent(); if (camera != null) { camera.farClipPlane = m_FarClipDistance; @@ -239,9 +241,11 @@ public static float EnableEdgeDetectionFilterDepth private static void ApplyHBAOChange() { + CleanupLayersAndVolumes(); + foreach (var postprocess in PostProcessLayerInstances) { - var hbao = postprocess!.GetComponent(); + HBAO hbao = postprocess.GetComponent(); if (hbao != null) { hbao.ApplyPreset(m_HBAO_Preset); @@ -258,19 +262,19 @@ private static void ApplySSRChange() { if (volume == null) { - SuisHackMain.loggerInst!.Msg("Volume was null!"); + Plugin.Error("Volume was null!"); continue; } - else if (volume!.profile == null) + else if (volume.profile == null) { - SuisHackMain.loggerInst!.Msg("Profile was null!"); + Plugin.Error("Profile was null!"); continue; } - ScreenSpaceReflections ssr = volume!.profile!.GetSetting(); + ScreenSpaceReflections ssr = volume.profile.GetSetting(); if (ssr == null) { - SuisHackMain.loggerInst!.Msg("Ssr was null"); + Plugin.Error("Ssr was null"); continue; } @@ -317,23 +321,23 @@ private static void ApplyEdgeDetectionChange() { if (volume == null) { - SuisHackMain.loggerInst!.Msg("Volume was null!"); + Plugin.Error("Volume was null!"); continue; } - else if (volume!.profile == null) + else if (volume.profile == null) { - SuisHackMain.loggerInst!.Msg("Profile was null!"); + Plugin.Error("Profile was null!"); continue; } - EdgeDetection edgeDetection = volume!.profile!.GetSetting(); + EdgeDetection edgeDetection = volume.profile.GetSetting(); if (edgeDetection == null) { - SuisHackMain.loggerInst!.Msg("EdgeDetection was null"); + Plugin.Error("EdgeDetection was null"); continue; } - edgeDetection!.enabled.value = m_EnableEdgeDetectionFilter; - edgeDetection!.sensitivityDepth.value = m_EnableEdgeDetectionFilterDepth; + edgeDetection.enabled.value = m_EnableEdgeDetectionFilter; + edgeDetection.sensitivityDepth.value = m_EnableEdgeDetectionFilterDepth; } } @@ -347,7 +351,7 @@ public static void ClearNullReferences() [HarmonyPostfix] [HarmonyPatch(typeof(PostProcessLayer), "OnEnable")] - public static void PostProcessLayerAwakePostfix(PostProcessLayer __instance) + public static void PostProcessLayerOnEnablePostfix(PostProcessLayer __instance) { __instance.antialiasingMode = m_Antialiasing; __instance.subpixelMorphologicalAntialiasing.quality = SubpixelMorphologicalAntialiasing.Quality.High; @@ -379,7 +383,7 @@ public static void PostProcessVolumeOnEnablePostfix(PostProcessVolume __instance else if (__instance.profile == null) { - SuisHackMain.loggerInst!.Msg("Profile was null!"); + Plugin.Error("Profile was null!"); return; } @@ -437,6 +441,21 @@ public static void PostProcessVolumeOnDisablePostfix(PostProcessVolume __instanc PostProcessVolumeInstances.Remove(__instance); } + private static void CleanupLayersAndVolumes() + { + for (int i = PostProcessLayerInstances.Count - 1; i >= 0; i--) + { + if (PostProcessLayerInstances[i] == null) + PostProcessLayerInstances.RemoveAt(i); + } + + for (int i = PostProcessVolumeInstances.Count - 1; i >= 0; i--) + { + if (PostProcessVolumeInstances[i] == null) + PostProcessVolumeInstances.RemoveAt(i); + } + } + internal static string GetShortName() { switch (m_Antialiasing) diff --git a/Source/Hacks/ScreenHook.cs b/Source/Hacks/ScreenHook.cs index 9f8b1b5..1d06a88 100644 --- a/Source/Hacks/ScreenHook.cs +++ b/Source/Hacks/ScreenHook.cs @@ -7,28 +7,28 @@ namespace SuisHack.Hacks public static class ScreenHook { [HarmonyPrefix] - [HarmonyPatch(typeof(Screen), "SetResolution", new Type[] { typeof(int), typeof(int), typeof(bool) })] + [HarmonyPatch(typeof(Screen), "SetResolution", [typeof(int), typeof(int), typeof(bool)])] public static bool SetResolution1() { - var settings = SuisHackMain.Settings; + var settings = ExposedSettings.Instance; if (settings == null) return true; - var refreshRate = settings.Entry_Display_RefreshRate!.Value; + var refreshRate = settings.Entry_Display_RefreshRate.Value; if (settings.Resolution != null) { var resolution = settings.Resolution; - SuisHackMain.loggerInst!.Msg($"Setting screen resolution as: {resolution.Item1}x{resolution.Item2}@{refreshRate}. Display mode: {settings.Entry_Display_DisplayMode!.Value}"); + Plugin.Message($"Setting screen resolution as: {resolution.Item1}x{resolution.Item2}@{refreshRate}. Display mode: {settings.Entry_Display_DisplayMode.Value}"); Screen.SetResolution(resolution.Item1, resolution.Item2, settings.Entry_Display_DisplayMode.Value, refreshRate); } else { var mainScreen = Display.main; - SuisHackMain.loggerInst!.Msg($"No valid resolution provided - going with main screen resolution: {mainScreen.systemWidth}x{mainScreen.systemHeight}@{refreshRate}. Display mode: {settings.Entry_Display_DisplayMode!.Value}"); + Plugin.Message($"No valid resolution provided - going with main screen resolution: {mainScreen.systemWidth}x{mainScreen.systemHeight}@{refreshRate}. Display mode: {settings.Entry_Display_DisplayMode.Value}"); Screen.SetResolution(mainScreen.systemWidth, mainScreen.systemHeight, settings.Entry_Display_DisplayMode.Value, refreshRate); } - QualitySettings.vSyncCount = settings.Entry_Display_Vsync!.Value ? 1 : 0; - SuisHackMain.loggerInst.Msg($"Setting vSyncCount: {QualitySettings.vSyncCount}"); + QualitySettings.vSyncCount = settings.Entry_Display_Vsync.Value ? 1 : 0; + Plugin.Message($"Setting vSyncCount: {QualitySettings.vSyncCount}"); return false; } } diff --git a/Source/Hacks/StateStracking/MapMenuHook.cs b/Source/Hacks/StateStracking/MapMenuHook.cs index ea8bab0..813796f 100644 --- a/Source/Hacks/StateStracking/MapMenuHook.cs +++ b/Source/Hacks/StateStracking/MapMenuHook.cs @@ -1,5 +1,5 @@ using HarmonyLib; -using Il2Cpp; +using System; using UnityEngine; namespace SuisHack.Hacks.StateStracking @@ -18,7 +18,6 @@ public static void OpenMenuPrefix(MapUI __instance) } } - [MelonLoader.RegisterTypeInIl2Cpp] public class MapUIManagerTracking : MonoBehaviour { public MapUIManagerTracking(IntPtr ptr) : base(ptr) { } diff --git a/Source/Hacks/StateStracking/RedRoomHook.cs b/Source/Hacks/StateStracking/RedRoomHook.cs index 5ce55c0..982b009 100644 --- a/Source/Hacks/StateStracking/RedRoomHook.cs +++ b/Source/Hacks/StateStracking/RedRoomHook.cs @@ -1,5 +1,5 @@ using HarmonyLib; -using Il2Cpp; +using System; using UnityEngine; namespace SuisHack.Hacks.StateStracking @@ -21,11 +21,10 @@ public static void OpenMenuPrefix(RedRoomMain __instance) } } else - SuisHackMain.loggerInst!.Error("RedRoomMain has no child!"); + Plugin.Error("RedRoomMain has no child!"); } } - [MelonLoader.RegisterTypeInIl2Cpp] public class RedRoomTracking : MonoBehaviour { public RedRoomTracking(IntPtr ptr) : base(ptr) { } @@ -38,7 +37,6 @@ void OnEnable() void OnDisable() { GameStateMachine.RedRoomOpened = false; - } } } diff --git a/Source/KeyboardSupport/GlobalInputHookHandler.cs b/Source/KeyboardSupport/GlobalInputHookHandler.cs index df4dd25..3e4b12a 100644 --- a/Source/KeyboardSupport/GlobalInputHookHandler.cs +++ b/Source/KeyboardSupport/GlobalInputHookHandler.cs @@ -1,19 +1,19 @@ -using Il2CppSteamworks; +using Steamworks; +using System; +using System.Collections.Generic; using UnityEngine; using static SuisHack.KeyboardSupport.SteamInputHook; namespace SuisHack.KeyboardSupport { - [MelonLoader.RegisterTypeInIl2Cpp] class GlobalInputHookHandler : MonoBehaviour { public GlobalInputHookHandler(IntPtr ptr) : base(ptr) { } - public ExposedSettings? Settings; - - public static GlobalInputHookHandler? Instance { get; private set; } - public Dictionary? AnalogInputToInput; - public Dictionary? DigitalInputToInput; + private bool m_Initiated = false; + public static GlobalInputHookHandler Instance { get; private set; } + public Dictionary AnalogInputToInput; + public Dictionary DigitalInputToInput; public static KeyCode GetInputForRebinding(RebindingActions action) { @@ -22,43 +22,43 @@ public static KeyCode GetInputForRebinding(RebindingActions action) switch (action) { case RebindingActions.Forward: - return Instance!.AnalogInputToInput![SteamInputAnalog.L_Stick].GetUpKeyCode(); + return Instance.AnalogInputToInput[SteamInputAnalog.L_Stick].GetUpKeyCode(); case RebindingActions.Backward: - return Instance!.AnalogInputToInput![SteamInputAnalog.L_Stick].GetDownKeyCode(); + return Instance.AnalogInputToInput[SteamInputAnalog.L_Stick].GetDownKeyCode(); case RebindingActions.Left: - return Instance!.AnalogInputToInput![SteamInputAnalog.L_Stick].GetLeftKeyCode(); + return Instance.AnalogInputToInput[SteamInputAnalog.L_Stick].GetLeftKeyCode(); case RebindingActions.Right: - return Instance!.AnalogInputToInput![SteamInputAnalog.L_Stick].GetRightKeyCode(); + return Instance.AnalogInputToInput[SteamInputAnalog.L_Stick].GetRightKeyCode(); case RebindingActions.Crouch: - return Instance!.DigitalInputToInput![SteamInputDigital.L_Stick_Button].GetBind(); + return Instance.DigitalInputToInput[SteamInputDigital.L_Stick_Button].GetBind(); case RebindingActions.Dash_Dodge: - return Instance!.DigitalInputToInput![SteamInputDigital.RB].GetBind(); + return Instance.DigitalInputToInput[SteamInputDigital.RB].GetBind(); case RebindingActions.Fire_Weapon_Punch: - return Instance!.DigitalInputToInput![SteamInputDigital.RT].GetBind(); + return Instance.DigitalInputToInput[SteamInputDigital.RT].GetBind(); case RebindingActions.Point_Gun: - return Instance!.DigitalInputToInput![SteamInputDigital.LT].GetBind(); + return Instance.DigitalInputToInput[SteamInputDigital.LT].GetBind(); case RebindingActions.Vision: - return Instance!.DigitalInputToInput![SteamInputDigital.LB].GetBind(); + return Instance.DigitalInputToInput[SteamInputDigital.LB].GetBind(); case RebindingActions.Interact_Reload_Accellerate: - return Instance!.DigitalInputToInput![SteamInputDigital.A_Button].GetBind(); + return Instance.DigitalInputToInput[SteamInputDigital.A_Button].GetBind(); case RebindingActions.Cancel_Brake: - return Instance!.DigitalInputToInput![SteamInputDigital.B_Button].GetBind(); + return Instance.DigitalInputToInput[SteamInputDigital.B_Button].GetBind(); case RebindingActions.Reset_Camera_Fighting_Style: - return Instance!.DigitalInputToInput![SteamInputDigital.R_Stick_Button].GetBind(); + return Instance.DigitalInputToInput[SteamInputDigital.R_Stick_Button].GetBind(); case RebindingActions.Display_Map: - return Instance!.DigitalInputToInput![SteamInputDigital.Back_Button].GetBind(); + return Instance.DigitalInputToInput[SteamInputDigital.Back_Button].GetBind(); case RebindingActions.Quest_Display: - return Instance!.DigitalInputToInput![SteamInputDigital.Start_Button].GetBind(); + return Instance.DigitalInputToInput[SteamInputDigital.Start_Button].GetBind(); case RebindingActions.Skateboard: - return Instance!.DigitalInputToInput![SteamInputDigital.Y_Button].GetBind(); + return Instance.DigitalInputToInput[SteamInputDigital.Y_Button].GetBind(); case RebindingActions.SwitchSlotLeft: - return Instance!.DigitalInputToInput![SteamInputDigital.Left_Button].GetBind(); + return Instance.DigitalInputToInput[SteamInputDigital.Left_Button].GetBind(); case RebindingActions.SwitchSlotRight: - return Instance!.DigitalInputToInput![SteamInputDigital.Right_Button].GetBind(); + return Instance.DigitalInputToInput[SteamInputDigital.Right_Button].GetBind(); case RebindingActions.SwitchAlbumDisplayDown: - return Instance!.DigitalInputToInput![SteamInputDigital.Down_Button].GetBind(); + return Instance.DigitalInputToInput[SteamInputDigital.Down_Button].GetBind(); case RebindingActions.SwitchAlbumDisplayUp: - return Instance!.DigitalInputToInput![SteamInputDigital.Up_Button].GetBind(); + return Instance.DigitalInputToInput[SteamInputDigital.Up_Button].GetBind(); default: return KeyCode.None; } @@ -185,7 +185,8 @@ public static void Initialize() if (Instance == null) { var gameObject = new GameObject("GlobalInputHandler"); - GameObject.DontDestroyOnLoad(gameObject); + DontDestroyOnLoad(gameObject); + gameObject.hideFlags = HideFlags.HideAndDontSave; Instance = gameObject.AddComponent(); } } @@ -201,50 +202,58 @@ public KeyCode GetReplacementPrompt(SteamInputHook.SteamInputDigital gamepadKey) case GameStateMachine.Gamestate.Map: return MapTranslateDigitalBackToInput[(int)gamepadKey]; default: - return DigitalInputToInput![gamepadKey].GetBind(); + return DigitalInputToInput[gamepadKey].GetBind(); } } private void Awake() { - SuisHackMain.loggerInst!.Msg("Initialized Global Input Hook Handler"); - Settings = SuisHackMain.Settings; + Plugin.Message("Initialized Global Input Hook Handler"); + this.hideFlags = HideFlags.HideAndDontSave; + DontDestroyOnLoad(this.gameObject); + Start(); } private void Start() { - InitializeInputs(); - InitializeInputsMenu(); - InitializeRedRoomMenu(); - InitializeInputsMap(); + if (!m_Initiated) + { + m_Initiated = true; + InitializeInputs(); + InitializeInputsMenu(); + InitializeRedRoomMenu(); + InitializeInputsMap(); + } } public void InitializeInputs() { + var Settings = ExposedSettings.Instance; + AnalogInputToInput = new Dictionary() { - { SteamInputHook.SteamInputAnalog.L_Stick, new KeyActionAnalog(Settings!.Input_Analog_LeftStick_Up!.Value, Settings.Input_Analog_LeftStick_Down!.Value, Settings.Input_Analog_LeftStick_Left!.Value, Settings.Input_Analog_LeftStick_Right!.Value, Settings.Input_Analog_LeftStickFloatTime!.Value) }, + { SteamInputHook.SteamInputAnalog.L_Stick, new KeyActionAnalog(Settings.Input_Analog_LeftStick_Up.Value, Settings.Input_Analog_LeftStick_Down.Value, Settings.Input_Analog_LeftStick_Left.Value, Settings.Input_Analog_LeftStick_Right.Value, Settings.Input_Analog_LeftStickFloatTime.Value) }, { SteamInputHook.SteamInputAnalog.R_Stick, new MouseAnalog() }, }; DigitalInputToInput = new Dictionary() { - { SteamInputHook.SteamInputDigital.A_Button, new KeySteamDigitalAction(Settings!.Input_Digital_A_Button!.Value, false) }, - { SteamInputHook.SteamInputDigital.B_Button, new KeySteamDigitalAction(Settings!.Input_Digital_B_Button!.Value, false) }, - { SteamInputHook.SteamInputDigital.X_Button, new KeySteamDigitalAction(Settings!.Input_Digital_X_Button!.Value, false) }, - { SteamInputHook.SteamInputDigital.Y_Button, new KeySteamDigitalAction(Settings!.Input_Digital_Y_Button!.Value, false) }, - { SteamInputHook.SteamInputDigital.Back_Button, new KeySteamDigitalAction(Settings!.Input_Digital_Back_Button!.Value, false) }, - { SteamInputHook.SteamInputDigital.Start_Button, new KeySteamDigitalAction(Settings!.Input_Digital_Start_Button!.Value, false) }, - { SteamInputHook.SteamInputDigital.Up_Button, new KeySteamDigitalAction(Settings!.Input_Digital_Up_Button!.Value, true) }, - { SteamInputHook.SteamInputDigital.Down_Button, new KeySteamDigitalAction(Settings!.Input_Digital_Down_Button!.Value, true) }, - { SteamInputHook.SteamInputDigital.Left_Button, new KeySteamDigitalAction(Settings!.Input_Digital_Left_Button!.Value, true) }, - { SteamInputHook.SteamInputDigital.Right_Button, new KeySteamDigitalAction(Settings!.Input_Digital_Right_Button!.Value, true) }, - { SteamInputHook.SteamInputDigital.LB, new KeySteamDigitalAction(Settings!.Input_Digital_LB!.Value, false) }, - { SteamInputHook.SteamInputDigital.RB, new KeySteamDigitalAction(Settings!.Input_Digital_RB!.Value, false) }, - { SteamInputHook.SteamInputDigital.LT, new KeySteamDigitalAction(Settings!.Input_Digital_LT!.Value, false) }, - { SteamInputHook.SteamInputDigital.RT, new KeySteamDigitalAction(Settings!.Input_Digital_RT!.Value, false) }, - { SteamInputHook.SteamInputDigital.L_Stick_Button, new KeySteamDigitalAction(Settings!.Input_Digital_L_Stick_Button!.Value, false) }, - { SteamInputHook.SteamInputDigital.R_Stick_Button, new KeySteamDigitalAction(Settings!.Input_Digital_Right_Button!.Value, false) }, + { SteamInputHook.SteamInputDigital.A_Button, new KeySteamDigitalAction(Settings.Input_Digital_A_Button.Value, false) }, + { SteamInputHook.SteamInputDigital.B_Button, new KeySteamDigitalAction(Settings.Input_Digital_B_Button.Value, false) }, + { SteamInputHook.SteamInputDigital.X_Button, new KeySteamDigitalAction(Settings.Input_Digital_X_Button.Value, false) }, + { SteamInputHook.SteamInputDigital.Y_Button, new KeySteamDigitalAction(Settings.Input_Digital_Y_Button.Value, false) }, + { SteamInputHook.SteamInputDigital.Back_Button, new KeySteamDigitalAction(Settings.Input_Digital_Back_Button.Value, false) }, + { SteamInputHook.SteamInputDigital.Start_Button, new KeySteamDigitalAction(Settings.Input_Digital_Start_Button.Value, false) }, + { SteamInputHook.SteamInputDigital.Up_Button, new KeySteamDigitalAction(Settings.Input_Digital_Up_Button.Value, true) }, + { SteamInputHook.SteamInputDigital.Down_Button, new KeySteamDigitalAction(Settings.Input_Digital_Down_Button.Value, true) }, + { SteamInputHook.SteamInputDigital.Left_Button, new KeySteamDigitalAction(Settings.Input_Digital_Left_Button.Value, true) }, + { SteamInputHook.SteamInputDigital.Right_Button, new KeySteamDigitalAction(Settings.Input_Digital_Right_Button.Value, true) }, + { SteamInputHook.SteamInputDigital.LB, new KeySteamDigitalAction(Settings.Input_Digital_LB.Value, false) }, + { SteamInputHook.SteamInputDigital.RB, new KeySteamDigitalAction(Settings.Input_Digital_RB.Value, false) }, + { SteamInputHook.SteamInputDigital.LT, new KeySteamDigitalAction(Settings.Input_Digital_LT.Value, false) }, + { SteamInputHook.SteamInputDigital.RT, new KeySteamDigitalAction(Settings.Input_Digital_RT.Value, false) }, + { SteamInputHook.SteamInputDigital.L_Stick_Button, new KeySteamDigitalAction(Settings.Input_Digital_L_Stick_Button.Value, false) }, + { SteamInputHook.SteamInputDigital.R_Stick_Button, new KeySteamDigitalAction(Settings.Input_Digital_Right_Button.Value, false) }, }; TranslateAnalogBackToInput[0] = new KeyActionAnalog(KeyCode.None, KeyCode.None, KeyCode.None, KeyCode.None, 1); diff --git a/Source/KeyboardSupport/KeySteamAnalogAction.cs b/Source/KeyboardSupport/KeySteamAnalogAction.cs index 1ba33f1..3aed7f1 100644 --- a/Source/KeyboardSupport/KeySteamAnalogAction.cs +++ b/Source/KeyboardSupport/KeySteamAnalogAction.cs @@ -1,4 +1,4 @@ -using Il2CppSteamworks; +using Steamworks; using UnityEngine; namespace SuisHack.KeyboardSupport diff --git a/Source/KeyboardSupport/KeySteamDigitalAction.cs b/Source/KeyboardSupport/KeySteamDigitalAction.cs index 72a8dd0..435fe1a 100644 --- a/Source/KeyboardSupport/KeySteamDigitalAction.cs +++ b/Source/KeyboardSupport/KeySteamDigitalAction.cs @@ -1,4 +1,4 @@ -using Il2CppSteamworks; +using Steamworks; using UnityEngine; namespace SuisHack.KeyboardSupport diff --git a/Source/KeyboardSupport/KeyboardPrompts.cs b/Source/KeyboardSupport/KeyboardPrompts.cs index 8010a45..c1009dd 100644 --- a/Source/KeyboardSupport/KeyboardPrompts.cs +++ b/Source/KeyboardSupport/KeyboardPrompts.cs @@ -1,5 +1,4 @@ using HarmonyLib; -using Il2Cpp; using SuisHack.GlobalGameObjects; using static SuisHack.KeyboardSupport.GlobalInputHookHandler; @@ -9,25 +8,25 @@ public static class KeyboardPrompts { public static void Initialize() { - if (SuisHackMain.Settings!.Input_Override!.Value == ExposedSettings.InputType.KeyboardAndMouse) + if (ExposedSettings.Instance.Input_Override.Value == ExposedSettings.InputType.KeyboardAndMouse) { var source = typeof(UISprite).GetMethod(nameof(UISprite.OnInit), System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public); var target = typeof(KeyboardPrompts).GetMethod(nameof(KeyboardPrompts.UISpriteOn), System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public); if (source == null) { - SuisHackMain.loggerInst!.Msg("Failed to find source method for GamepadPrompts"); + Plugin.Message("Failed to find source method for GamepadPrompts"); return; } if (target == null) { - SuisHackMain.loggerInst!.Msg("Failed to find target method for GamepadPrompts"); + Plugin.Message("Failed to find target method for GamepadPrompts"); return; } - SuisHackMain.harmonyInst!.Patch(source, postfix: new HarmonyMethod(target)); - SuisHackMain.loggerInst!.Msg("Initialized keyboard/mouse patch"); + Plugin.HarmonyInstance.Patch(source, postfix: new HarmonyMethod(target)); + Plugin.Message("Initialized keyboard/mouse patch"); } } @@ -42,53 +41,53 @@ public static void UISpriteOn(UISprite __instance) //Seriously - fuck Nintendo and their layout! case "NX_Cont_Button_A": case "common_intaract_A": - GlobalReplacementAtlas.Instance.Replace(__instance, Instance!.GetReplacementPrompt(SteamInputHook.SteamInputDigital.B_Button)); + GlobalReplacementAtlas.Instance.Replace(__instance, Instance.GetReplacementPrompt(SteamInputHook.SteamInputDigital.B_Button)); break; case "NX_Cont_Button_B": - GlobalReplacementAtlas.Instance.Replace(__instance, Instance!.GetReplacementPrompt(SteamInputHook.SteamInputDigital.A_Button)); + GlobalReplacementAtlas.Instance.Replace(__instance, Instance.GetReplacementPrompt(SteamInputHook.SteamInputDigital.A_Button)); break; case "NX_Cont_Button_X": - GlobalReplacementAtlas.Instance.Replace(__instance, Instance!.GetReplacementPrompt(SteamInputHook.SteamInputDigital.Y_Button)); + GlobalReplacementAtlas.Instance.Replace(__instance, Instance.GetReplacementPrompt(SteamInputHook.SteamInputDigital.Y_Button)); break; case "NX_Cont_Button_Y": - GlobalReplacementAtlas.Instance.Replace(__instance, Instance!.GetReplacementPrompt(SteamInputHook.SteamInputDigital.X_Button)); + GlobalReplacementAtlas.Instance.Replace(__instance, Instance.GetReplacementPrompt(SteamInputHook.SteamInputDigital.X_Button)); break; case "NX_Cont_Button_-": - GlobalReplacementAtlas.Instance.Replace(__instance, Instance!.GetReplacementPrompt(SteamInputHook.SteamInputDigital.Back_Button)); + GlobalReplacementAtlas.Instance.Replace(__instance, Instance.GetReplacementPrompt(SteamInputHook.SteamInputDigital.Back_Button)); break; case "NX_Cont_Button_ZL": - GlobalReplacementAtlas.Instance.Replace(__instance, Instance!.GetReplacementPrompt(SteamInputHook.SteamInputDigital.LT)); + GlobalReplacementAtlas.Instance.Replace(__instance, Instance.GetReplacementPrompt(SteamInputHook.SteamInputDigital.LT)); break; case "NX_Cont_Button_L": - GlobalReplacementAtlas.Instance.Replace(__instance, Instance!.GetReplacementPrompt(SteamInputHook.SteamInputDigital.LB)); + GlobalReplacementAtlas.Instance.Replace(__instance, Instance.GetReplacementPrompt(SteamInputHook.SteamInputDigital.LB)); break; case "NX_Cont_Button_+": - GlobalReplacementAtlas.Instance.Replace(__instance, Instance!.GetReplacementPrompt(SteamInputHook.SteamInputDigital.Start_Button)); + GlobalReplacementAtlas.Instance.Replace(__instance, Instance.GetReplacementPrompt(SteamInputHook.SteamInputDigital.Start_Button)); break; case "NX_Cont_Button_ZR": - GlobalReplacementAtlas.Instance.Replace(__instance, Instance!.GetReplacementPrompt(SteamInputHook.SteamInputDigital.RT)); + GlobalReplacementAtlas.Instance.Replace(__instance, Instance.GetReplacementPrompt(SteamInputHook.SteamInputDigital.RT)); break; case "NX_Cont_Button_R": - GlobalReplacementAtlas.Instance.Replace(__instance, Instance!.GetReplacementPrompt(SteamInputHook.SteamInputDigital.RB)); + GlobalReplacementAtlas.Instance.Replace(__instance, Instance.GetReplacementPrompt(SteamInputHook.SteamInputDigital.RB)); break; case "NX_stick_button_Stick_Button_L_Push": case "common_intaract_Lpush": - GlobalReplacementAtlas.Instance.Replace(__instance, Instance!.GetReplacementPrompt(SteamInputHook.SteamInputDigital.L_Stick_Button)); + GlobalReplacementAtlas.Instance.Replace(__instance, Instance.GetReplacementPrompt(SteamInputHook.SteamInputDigital.L_Stick_Button)); break; case "NX_stick_button_Stick_Button_R_Push": - GlobalReplacementAtlas.Instance.Replace(__instance, Instance!.GetReplacementPrompt(SteamInputHook.SteamInputDigital.R_Stick_Button)); + GlobalReplacementAtlas.Instance.Replace(__instance, Instance.GetReplacementPrompt(SteamInputHook.SteamInputDigital.R_Stick_Button)); break; case "NX_Cont_Button_ARROW_L": - GlobalReplacementAtlas.Instance.Replace(__instance, Instance!.GetReplacementPrompt(SteamInputHook.SteamInputDigital.Left_Button)); + GlobalReplacementAtlas.Instance.Replace(__instance, Instance.GetReplacementPrompt(SteamInputHook.SteamInputDigital.Left_Button)); break; case "NX_Cont_Button_ARROW_U": - GlobalReplacementAtlas.Instance.Replace(__instance, Instance!.GetReplacementPrompt(SteamInputHook.SteamInputDigital.Up_Button)); + GlobalReplacementAtlas.Instance.Replace(__instance, Instance.GetReplacementPrompt(SteamInputHook.SteamInputDigital.Up_Button)); break; case "NX_Cont_Button_ARROW_D": - GlobalReplacementAtlas.Instance.Replace(__instance, Instance!.GetReplacementPrompt(SteamInputHook.SteamInputDigital.Down_Button)); + GlobalReplacementAtlas.Instance.Replace(__instance, Instance.GetReplacementPrompt(SteamInputHook.SteamInputDigital.Down_Button)); break; case "NX_Cont_Button_ARROW_R": - GlobalReplacementAtlas.Instance.Replace(__instance, Instance!.GetReplacementPrompt(SteamInputHook.SteamInputDigital.Right_Button)); + GlobalReplacementAtlas.Instance.Replace(__instance, Instance.GetReplacementPrompt(SteamInputHook.SteamInputDigital.Right_Button)); break; } } diff --git a/Source/KeyboardSupport/SteamInputKeyboardHook.cs b/Source/KeyboardSupport/SteamInputKeyboardHook.cs index 4d195b1..93acf04 100644 --- a/Source/KeyboardSupport/SteamInputKeyboardHook.cs +++ b/Source/KeyboardSupport/SteamInputKeyboardHook.cs @@ -1,4 +1,5 @@ -using Il2CppSteamworks; +using Steamworks; +using System.Collections.Generic; namespace SuisHack.KeyboardSupport { @@ -86,18 +87,18 @@ public enum SteamInputDigital public static void InitializeKeyboardAndMouse() { - var harmonyInstance = SuisHackMain.harmonyInst; + HarmonyLib.Harmony harmonyInstance = Plugin.HarmonyInstance; var originalGetAnalogActionMethod = typeof(SteamInput).GetMethod(nameof(SteamInput.GetAnalogActionData), System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static); var targetGetAnalogActionMethod = typeof(SteamInputHook).GetMethod(nameof(GetAnalogActionDataPrefix), System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static); if (originalGetAnalogActionMethod == null) { - SuisHackMain.loggerInst!.Error("Original GetAnalogActionData was null"); + Plugin.Error("Original GetAnalogActionData was null"); return; } if (targetGetAnalogActionMethod == null) { - SuisHackMain.loggerInst!.Error("Target GetAnalogActionData was null"); + Plugin.Error("Target GetAnalogActionData was null"); return; } @@ -106,13 +107,13 @@ public static void InitializeKeyboardAndMouse() if (originalGetDigitalActionMethod == null) { - SuisHackMain.loggerInst!.Error("Original GetDigitalActionData was null"); + Plugin.Error("Original GetDigitalActionData was null"); return; } if (targetGetDigitalActionMethod == null) { - SuisHackMain.loggerInst!.Error("Target GetDigitalActionData was null"); + Plugin.Error("Target GetDigitalActionData was null"); return; } @@ -121,13 +122,13 @@ public static void InitializeKeyboardAndMouse() if (originalGetAnalogActionHandle == null) { - SuisHackMain.loggerInst!.Error("Original GetAnalogActionHandle was null"); + Plugin.Error("Original GetAnalogActionHandle was null"); return; } if (targetGetAnalogActionHandle == null) { - SuisHackMain.loggerInst!.Error("Target GetAnalogActionHandle was null"); + Plugin.Error("Target GetAnalogActionHandle was null"); return; } @@ -136,21 +137,21 @@ public static void InitializeKeyboardAndMouse() if (originalGetDigitalActionHandle == null) { - SuisHackMain.loggerInst!.Error("Original GetDigitalActionHandle was null"); + Plugin.Error("Original GetDigitalActionHandle was null"); return; } if (targetGetDigitalActionHandle == null) { - SuisHackMain.loggerInst!.Error("Target GetDigitalActionHandle was null"); + Plugin.Error("Target GetDigitalActionHandle was null"); return; } - harmonyInstance!.Patch(originalGetAnalogActionMethod, prefix: new HarmonyLib.HarmonyMethod(targetGetAnalogActionMethod)); + harmonyInstance.Patch(originalGetAnalogActionMethod, prefix: new HarmonyLib.HarmonyMethod(targetGetAnalogActionMethod)); harmonyInstance.Patch(originalGetDigitalActionMethod, prefix: new HarmonyLib.HarmonyMethod(targetGetDigitalActionMethod)); harmonyInstance.Patch(originalGetAnalogActionHandle, prefix: new HarmonyLib.HarmonyMethod(targetGetAnalogActionHandle)); harmonyInstance.Patch(originalGetDigitalActionHandle, prefix: new HarmonyLib.HarmonyMethod(targetGetDigitalActionHandle)); - SuisHackMain.loggerInst!.Msg("Patched Steam Input to redirect to keyboard mouse manager"); + Plugin.Message("Patched Steam Input to redirect to keyboard mouse manager"); } public static bool GetDigitalActionHandle(ref InputDigitalActionHandle_t __result, string pszActionName) @@ -173,7 +174,7 @@ public static bool GetAnalogActionDataPrefix(ref InputAnalogActionData_t __resul return false; } - __result = GlobalInputHookHandler.Instance!.GetAnalogInputReplacement((SteamInputAnalog)analogActionHandle.m_InputAnalogActionHandle); + __result = GlobalInputHookHandler.Instance.GetAnalogInputReplacement((SteamInputAnalog)analogActionHandle.m_InputAnalogActionHandle); return false; } @@ -185,7 +186,7 @@ public static bool GetDigitalActionDataPrefix(ref InputDigitalActionData_t __res return false; } - __result = GlobalInputHookHandler.Instance!.GetDigitalInputReplacement((SteamInputDigital)digitalActionHandle.m_InputDigitalActionHandle); + __result = GlobalInputHookHandler.Instance.GetDigitalInputReplacement((SteamInputDigital)digitalActionHandle.m_InputDigitalActionHandle); return false; } diff --git a/Source/LightImprovement/LightImprovement.cs b/Source/Other/LightImprovement.cs similarity index 91% rename from Source/LightImprovement/LightImprovement.cs rename to Source/Other/LightImprovement.cs index a9e592a..5ffcccf 100644 --- a/Source/LightImprovement/LightImprovement.cs +++ b/Source/Other/LightImprovement.cs @@ -7,7 +7,7 @@ static class ModifyLights { public static void ModifyOnSceneLoad(string sceneLowercase) { - if (SuisHackMain.Settings!.Entry_Other_LightImprovements!.Value == ExposedSettings.LightImprovements.All) + if (ExposedSettings.Instance.Entry_Other_LightImprovements.Value == ExposedSettings.LightImprovements.All) { var lights = GameObject.FindObjectsOfType(); diff --git a/Source/Plugin.cs b/Source/Plugin.cs new file mode 100644 index 0000000..58adefd --- /dev/null +++ b/Source/Plugin.cs @@ -0,0 +1,129 @@ +using BepInEx; +using BepInEx.Unity.IL2CPP; +using HarmonyLib; +using Il2CppInterop.Runtime.Injection; +using SuisHack.Components; +using SuisHack.Components.Interpolation; +using SuisHack.GlobalGameObjects; +using SuisHack.Hacks.StateStracking; +using SuisHack.KeyboardSupport; +using System; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace SuisHack; + +[BepInPlugin(MyPluginInfo.PLUGIN_GUID, MyPluginInfo.PLUGIN_NAME, MyPluginInfo.PLUGIN_VERSION)] +public class Plugin : BasePlugin +{ + private const string OPENWORLDSCENENAME = "OpenWorld"; + public static Harmony HarmonyInstance { get; private set; } + private static BepInEx.Logging.ManualLogSource m_Logger; + public static ExposedSettings Settings; + + private bool AppliedResolutionInMainMenu; + + + public override void Load() + { + Log.LogInfo($"{MyPluginInfo.PLUGIN_GUID} starting to load - report problems if there are errors between this message and notification that it finished loading!"); + HarmonyInstance = new Harmony("local.suimachine.suihack"); + m_Logger = Log; + Settings = new ExposedSettings(Config); + + RegisterTypesForIll2cpp(); + + switch (Settings.Input_Override.Value) + { + case ExposedSettings.InputType.SteamInput: + GamepadSupport.GamepadPrompts.Initialize(); + break; + case ExposedSettings.InputType.KeyboardAndMouse: + KeyboardPrompts.Initialize(); + SteamInputHook.InitializeKeyboardAndMouse(); + break; + } + + Log.LogInfo($"{MyPluginInfo.PLUGIN_GUID} is initializing hacks!"); + + if (Settings.Input_Override.Value == ExposedSettings.InputType.KeyboardAndMouse) + { + GlobalInputHookHandler.Initialize(); + } + + SettingsGUI.Initialize(); + HarmonyInstance.PatchAll(); + InitializeManualHarmonyHooks(); + + Log.LogInfo($"{MyPluginInfo.PLUGIN_GUID} has finished loading!"); + SceneManager.add_sceneLoaded((Action)((scene, loadMode) => + { + var sceneName = scene.name; + + if (Settings != null) + { + Application.targetFrameRate = Settings.Entry_DesiredFramerate.Value; + + if (sceneName == "TitleTest2") + { + if (!AppliedResolutionInMainMenu) + Hacks.ScreenHook.SetResolution1(); + AppliedResolutionInMainMenu = true; + GameStateMachine.MainMenu = true; + } + else if (sceneName == OPENWORLDSCENENAME) + { + GameStateMachine.Gameplay = true; + if (Settings.Entry_Other_GeometryImprovements.Value >= ExposedSettings.GeometryImprovements.Enabled) + { + if (GameObject.FindObjectOfType() == null) + { + var oldActiveScene = SceneManager.GetActiveScene(); + SceneManager.SetActiveScene(scene); + var newGameObject = new GameObject("WireRendererCorrection"); + SceneManager.SetActiveScene(oldActiveScene); + newGameObject.AddComponent(); + } + } + } + else + { + GameStateMachine.Gameplay = true; + LightImprovement.ModifyLights.ModifyOnSceneLoad(sceneName.ToLower()); + } + } + })); + } + + private void InitializeManualHarmonyHooks() + { + GlobalReplacementAtlas.Initialize(); + Hacks.NpcTestHook.Initialize(); + Hacks.Lights.LightActiveCheckHook.Initialize(); + Hacks.Lights.NpcVehicleHook.Initialize(); + } + + private void RegisterTypesForIll2cpp() + { + ClassInjector.RegisterTypeInIl2Cpp(); + ClassInjector.RegisterTypeInIl2Cpp(); + ClassInjector.RegisterTypeInIl2Cpp(); + ClassInjector.RegisterTypeInIl2Cpp(); + ClassInjector.RegisterTypeInIl2Cpp(); + ClassInjector.RegisterTypeInIl2Cpp(); + ClassInjector.RegisterTypeInIl2Cpp(); + ClassInjector.RegisterTypeInIl2Cpp(); + ClassInjector.RegisterTypeInIl2Cpp(); + ClassInjector.RegisterTypeInIl2Cpp(); + ClassInjector.RegisterTypeInIl2Cpp(); + } + + public override bool Unload() + { + return false; + } + + public static void Error(string errorTest) => m_Logger.LogError(errorTest); + public static void Message(string message) => m_Logger.LogMessage(message); + public static void Warning(string warning) => m_Logger.LogWarning(warning); +} diff --git a/Source/Properties/AssemblyInfo.cs b/Source/Properties/AssemblyInfo.cs deleted file mode 100644 index 4f0d4c6..0000000 --- a/Source/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,22 +0,0 @@ -using MelonLoader; -using System.Reflection; -using System.Runtime.InteropServices; - -// In SDK-style projects such as this one, several assembly attributes that were historically -// defined in this file are now automatically added during build and populated with -// values defined in project properties. For details of which attributes are included -// and how to customise this process see: https://aka.ms/assembly-info-properties - - -// Setting ComVisible to false makes the types in this assembly not visible to COM -// components. If you need to access a type in this assembly from COM, set the ComVisible -// attribute to true on that type. - -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM. - -[assembly: Guid("d8f834c8-2b43-49f6-88f5-afe5873b8972")] - -[assembly: MelonInfo(typeof(SuisHack.SuisHackMain), "SuisHack", "1.2.0", "SuicideMachine", "https://github.com/SuiMachine/Deadly-Premonition-2---Sui-s-hack/releases")] -[assembly: MelonGame("ToyBox Inc.", "DeadlyPremonition2")] \ No newline at end of file diff --git a/Source/SettingsGUI.cs b/Source/SettingsGUI.cs index bd19658..088e3ab 100644 --- a/Source/SettingsGUI.cs +++ b/Source/SettingsGUI.cs @@ -1,13 +1,12 @@ -using Il2Cpp; -using MelonLoader; +using Il2CppSystem.IO; using SuisHack.KeyboardSupport; +using System; using UnityEngine; using UnityEngine.Rendering.PostProcessing; using static SuisHack.KeyboardSupport.SteamInputHook; namespace SuisHack { - [RegisterTypeInIl2Cpp] public class SettingsGUI : MonoBehaviour { enum Category @@ -19,13 +18,14 @@ enum Category Other } - public static SettingsGUI? Instance { get; private set; } + public SettingsGUI(IntPtr handle) : base(handle) { } + + public static SettingsGUI Instance { get; private set; } public static bool Display { get; private set; } private Category category = Category.Root; - private ExposedSettings? Settings; - string? resolutionX; - string? resolutionY; - string? refreshRate; + string resolutionX; + string resolutionY; + string refreshRate; float restartingToDefault = 0; private RebindingActions CurrentRebinding; @@ -35,16 +35,13 @@ public static void Initialize() { var gameObject = new GameObject("SuisHackSettingsGUI"); Instance = gameObject.AddComponent(); - DontDestroyOnLoad(gameObject); } } - void Start() + public void Awake() { - Settings = SuisHackMain.Settings; - resolutionX = Screen.width.ToString(); - resolutionY = Screen.height.ToString(); - refreshRate = Settings!.Entry_Display_RefreshRate!.Value.ToString(); + DontDestroyOnLoad(this.gameObject); + this.gameObject.hideFlags = HideFlags.HideAndDontSave; } void Update() @@ -66,7 +63,6 @@ void Update() } } - public void OnGUI() { if (Display) @@ -88,7 +84,7 @@ public void OnGUI() DrawQuality(); break; case Category.Input: - switch (Settings!.Input_Override!.Value) + switch (ExposedSettings.Instance.Input_Override.Value) { case ExposedSettings.InputType.SteamInput: DrawSteamInput(); @@ -105,229 +101,6 @@ public void OnGUI() } } - private void DrawSteamInput() - { - GUIStyle richText = GUI.skin.label; - richText.richText = true; - - { - GUILayout.BeginVertical(GUI.skin.box); - GUILayout.Label("Options starting with * requires full game restart"); - GUILayout.BeginHorizontal(); - GUILayout.Label("* Input mode:"); - if (GUILayout.Button("Change to keyboard and mouse")) - Settings!.Input_Override!.Value = ExposedSettings.InputType.KeyboardAndMouse; - GUILayout.EndHorizontal(); - GUILayout.EndVertical(); - } - - { - GUILayout.BeginVertical(GUI.skin.box); - Settings!.Input_Controller_Vibration!.Value = GUILayout.Toggle(Settings.Input_Controller_Vibration.Value, "Controller rumble / vibration"); - GUILayout.EndVertical(); - } - - } - - private void DrawKeyboardAndMouseInput() - { - GUIStyle richText = GUI.skin.label; - richText.richText = true; - - { - GUILayout.BeginVertical(GUI.skin.box); - GUILayout.BeginHorizontal(); - GUILayout.Label("* Input mode:"); - if (GUILayout.Button("Change to gamepad")) - Settings!.Input_Override!.Value = ExposedSettings.InputType.SteamInput; - - GUILayout.EndHorizontal(); - GUILayout.EndVertical(); - } - { - GUILayout.BeginVertical(GUI.skin.box); - GUILayout.Label("Options starting with * requires full game restart"); - GUILayout.Label("For keyboard and mouse to work a controller is still required!"); - GUILayout.Label("A fake / emulated controller can work, provided it is detected by SteamInput."); - GUILayout.Label("For mouse support to work, a modified gamemangers file is required."); - GUILayout.EndVertical(); - } - - { - GUILayout.BeginVertical(GUI.skin.box); - GUILayout.BeginHorizontal(); - GUILayout.Label($"Mouse sensitivity: {Settings!.Input_Mouse_Sensitivity!.Value:0.00}"); - Settings.Input_Mouse_Sensitivity.Value = GUILayout.HorizontalSlider(Settings.Input_Mouse_Sensitivity.Value, 0.05f, 2); - Settings.Input_MouseYAxisInversion!.Value = GUILayout.Toggle(Settings.Input_MouseYAxisInversion.Value, "Mouse Y Axis inversion"); - GUILayout.EndHorizontal(); - GUILayout.EndVertical(); - } - - { - GUILayout.BeginVertical(GUI.skin.box); - if (GlobalInputHookHandler.Instance != null) - { - GUILayout.Label("Key rebinding (affects only gameplay section)", richText); - - GUILayout.Label(""); - GUILayout.Label("Movement", richText); - DrawRebind("Move forward", RebindingActions.Forward); - DrawRebind("Move backward", RebindingActions.Backward); - DrawRebind("Move left", RebindingActions.Left); - DrawRebind("Move right", RebindingActions.Right); - DrawRebind("Crouch", RebindingActions.Crouch); - DrawRebind("Sprint / dodge", RebindingActions.Dash_Dodge); - - GUILayout.Label(""); - GUILayout.Label("Actions", richText); - DrawRebind("Fire / Punch", RebindingActions.Fire_Weapon_Punch); - DrawRebind("Aim a gun", RebindingActions.Point_Gun); - DrawRebind("Vision", RebindingActions.Vision); - DrawRebind("Interact / Reload / Accelerate", RebindingActions.Interact_Reload_Accellerate); - DrawRebind("Cancel / Break", RebindingActions.Cancel_Brake); - DrawRebind("Reset camera / fighting style", RebindingActions.Reset_Camera_Fighting_Style); - - GUILayout.Label(""); - GUILayout.Label("Actions", richText); - DrawRebind("Display map", RebindingActions.Display_Map); - DrawRebind("Quest display", RebindingActions.Quest_Display); - DrawRebind("Skateboard", RebindingActions.Skateboard); - - DrawRebind("Switch slot to left", RebindingActions.SwitchSlotLeft); - DrawRebind("Switch slot to right", RebindingActions.SwitchSlotRight); - DrawRebind("Switch album display up", RebindingActions.SwitchAlbumDisplayUp); - DrawRebind("Switch album display down", RebindingActions.SwitchAlbumDisplayDown); - - if (CurrentRebinding != RebindingActions.None) - { - Event e = Event.current; - if (e.type != EventType.Used) - { - var tempKey = KeyCode.None; - if (e.isKey) - tempKey = e.keyCode; - else if (e.isMouse) - { - if (Input.GetKeyDown(KeyCode.Mouse0)) - tempKey = KeyCode.Mouse0; - else if (Input.GetKeyDown(KeyCode.Mouse1)) - tempKey = KeyCode.Mouse1; - else if (Input.GetKeyDown(KeyCode.Mouse2)) - tempKey = KeyCode.Mouse2; - else if (Input.GetKeyDown(KeyCode.Mouse3)) - tempKey = KeyCode.Mouse3; - else if (Input.GetKeyDown(KeyCode.Mouse4)) - tempKey = KeyCode.Mouse4; - } - - if (tempKey != KeyCode.None) - { - RebindingAction(CurrentRebinding, tempKey); - CurrentRebinding = RebindingActions.None; - } - } - } - } - else - { - GUILayout.Label("Keyboard / mouse not initialized - please restart the game!", richText); - } - - GUILayout.EndVertical(); - } - } - - private void RebindingAction(RebindingActions currentRebinding, KeyCode tempKey) - { - switch (currentRebinding) - { - case RebindingActions.Forward: - Settings!.Input_Analog_LeftStick_Up!.Value = tempKey; - break; - case RebindingActions.Backward: - Settings!.Input_Analog_LeftStick_Down!.Value = tempKey; - break; - case RebindingActions.Left: - Settings!.Input_Analog_LeftStick_Left!.Value = tempKey; - break; - case RebindingActions.Right: - Settings!.Input_Analog_LeftStick_Right!.Value = tempKey; - break; - case RebindingActions.Display_Map: - Settings!.Input_Digital_Back_Button!.Value = tempKey; - break; - case RebindingActions.Quest_Display: - Settings!.Input_Digital_Start_Button!.Value = tempKey; - break; - case RebindingActions.Point_Gun: - Settings!.Input_Digital_LT!.Value = tempKey; - break; - case RebindingActions.Vision: - Settings!.Input_Digital_LB!.Value = tempKey; - break; - case RebindingActions.Crouch: - Settings!.Input_Digital_L_Stick_Button!.Value = tempKey; - break; - case RebindingActions.Fire_Weapon_Punch: - Settings!.Input_Digital_RT!.Value = tempKey; - break; - case RebindingActions.Cancel_Brake: - Settings!.Input_Digital_B_Button!.Value = tempKey; - break; - case RebindingActions.Dash_Dodge: - Settings!.Input_Digital_RB!.Value = tempKey; - break; - case RebindingActions.Interact_Reload_Accellerate: - Settings!.Input_Digital_A_Button!.Value = tempKey; - break; - case RebindingActions.Reset_Camera_Fighting_Style: - Settings!.Input_Digital_R_Stick_Button!.Value = tempKey; - break; - case RebindingActions.Skateboard: - Settings!.Input_Digital_Y_Button!.Value = tempKey; - break; - case RebindingActions.SwitchAlbumDisplayDown: - Settings!.Input_Digital_Down_Button!.Value = tempKey; - break; - case RebindingActions.SwitchAlbumDisplayUp: - Settings!.Input_Digital_Up_Button!.Value = tempKey; - break; - case RebindingActions.SwitchSlotLeft: - Settings!.Input_Digital_Left_Button!.Value = tempKey; - break; - case RebindingActions.SwitchSlotRight: - Settings!.Input_Digital_Right_Button!.Value = tempKey; - break; - } - } - - public void DrawRebind(string text, RebindingActions rebindingKey) - { - var fixedwidth = new Il2CppInterop.Runtime.InteropTypes.Arrays.Il2CppReferenceArray(1); - fixedwidth[0] = GUILayout.Width(300); - - GUILayout.BeginHorizontal(); - GUILayout.Label(text, fixedwidth); - GUILayout.Label(GlobalInputHookHandler.GetInputForRebinding(rebindingKey).ToString(), fixedwidth); - if (rebindingKey == CurrentRebinding) - { - GUIStyle richText = GUI.skin.label; - richText.richText = true; - GUILayout.Label("Awaiting key", richText, fixedwidth); - } - else if (rebindingKey != RebindingActions.None) - { - if (GUILayout.Button("Rebind", fixedwidth)) - { - CurrentRebinding = rebindingKey; - Event.current.type = EventType.Used; - } - } - - GUILayout.EndHorizontal(); - } - - private void DrawRoot() { GUILayout.Label("Options category:"); @@ -347,7 +120,7 @@ private void DrawRoot() { category = Category.Other; } - Settings!.Entry_Other_ShowAdvanced!.Value = GUILayout.Toggle(Settings.Entry_Other_ShowAdvanced.Value, "Show advanced and experimental options"); + ExposedSettings.Instance.Entry_Other_ShowAdvanced.Value = GUILayout.Toggle(ExposedSettings.Instance.Entry_Other_ShowAdvanced.Value, "Show advanced and experimental options"); } private void DrawDisplay() @@ -398,8 +171,8 @@ private void DrawDisplay() newRefreshRate = refr; } - Screen.SetResolution(newResX, newResY, Settings!.Entry_Display_DisplayMode!.Value, newRefreshRate); - Settings.Entry_Display_Resolution!.Value = $"{newResX}x{newResY}"; + Screen.SetResolution(newResX, newResY, ExposedSettings.Instance.Entry_Display_DisplayMode.Value, newRefreshRate); + ExposedSettings.Instance.Entry_Display_Resolution.Value = $"{newResX}x{newResY}"; resolutionX = newResX.ToString(); resolutionY = newResY.ToString(); refreshRate = newRefreshRate.ToString(); @@ -415,25 +188,25 @@ private void DrawDisplay() if (GUILayout.Button("Exclusive fullscreen")) { - Settings!.Entry_Display_DisplayMode!.Value = FullScreenMode.ExclusiveFullScreen; - Screen.SetResolution(Screen.currentResolution.width, Screen.currentResolution.height, Settings.Entry_Display_DisplayMode.Value, Screen.currentResolution.refreshRate); - if (Settings.Entry_Display_Vsync!.Value) - Settings.Entry_Display_RefreshRate!.Value = Screen.currentResolution.refreshRate; + ExposedSettings.Instance.Entry_Display_DisplayMode.Value = FullScreenMode.ExclusiveFullScreen; + Screen.SetResolution(Screen.currentResolution.width, Screen.currentResolution.height, ExposedSettings.Instance.Entry_Display_DisplayMode.Value, Screen.currentResolution.refreshRate); + if (ExposedSettings.Instance.Entry_Display_Vsync.Value) + ExposedSettings.Instance.Entry_Display_RefreshRate.Value = Screen.currentResolution.refreshRate; } if (GUILayout.Button("Maximized window")) { - Settings!.Entry_Display_DisplayMode!.Value = FullScreenMode.MaximizedWindow; - Screen.SetResolution(Screen.width, Screen.height, Settings.Entry_Display_DisplayMode.Value, 0); + ExposedSettings.Instance.Entry_Display_DisplayMode.Value = FullScreenMode.MaximizedWindow; + Screen.SetResolution(Screen.width, Screen.height, ExposedSettings.Instance.Entry_Display_DisplayMode.Value, 0); } if (GUILayout.Button("Borderless window")) { - Settings!.Entry_Display_DisplayMode!.Value = FullScreenMode.FullScreenWindow; - Screen.SetResolution(Screen.width, Screen.height, Settings.Entry_Display_DisplayMode.Value, 0); + ExposedSettings.Instance.Entry_Display_DisplayMode.Value = FullScreenMode.FullScreenWindow; + Screen.SetResolution(Screen.width, Screen.height, ExposedSettings.Instance.Entry_Display_DisplayMode.Value, 0); } if (GUILayout.Button("Windowed")) { - Settings!.Entry_Display_DisplayMode!.Value = FullScreenMode.Windowed; - Screen.SetResolution(Screen.width, Screen.height, Settings.Entry_Display_DisplayMode.Value, 0); + ExposedSettings.Instance.Entry_Display_DisplayMode.Value = FullScreenMode.Windowed; + Screen.SetResolution(Screen.width, Screen.height, ExposedSettings.Instance.Entry_Display_DisplayMode.Value, 0); } GUILayout.EndHorizontal(); @@ -442,15 +215,15 @@ private void DrawDisplay() //Vsync { GUILayout.BeginHorizontal(GUI.skin.box); - var oldValue = QualitySettings.vSyncCount > 0 ? true : false; + var oldValue = QualitySettings.vSyncCount > 0; var newValue = GUILayout.Toggle(oldValue, "V-sync"); if (newValue != oldValue) { QualitySettings.vSyncCount = newValue ? 1 : 0; - Settings!.Entry_Display_Vsync!.Value = newValue; + ExposedSettings.Instance.Entry_Display_Vsync.Value = newValue; if (!newValue) { - Application.targetFrameRate = Settings!.Entry_DesiredFramerate!.Value; + Application.targetFrameRate = ExposedSettings.Instance.Entry_DesiredFramerate.Value; } } GUILayout.EndHorizontal(); @@ -461,8 +234,8 @@ private void DrawDisplay() if (QualitySettings.vSyncCount == 0) { GUILayout.BeginHorizontal(GUI.skin.box); - GUILayout.Label($"FPS cap ({Settings!.Entry_DesiredFramerate!.Value})"); - Settings.Entry_DesiredFramerate.Value = (int)GUILayout.HorizontalSlider(Settings.Entry_DesiredFramerate.Value, -1, 1000); + GUILayout.Label($"FPS cap ({ExposedSettings.Instance.Entry_DesiredFramerate.Value})"); + ExposedSettings.Instance.Entry_DesiredFramerate.Value = (int)GUILayout.HorizontalSlider(ExposedSettings.Instance.Entry_DesiredFramerate.Value, -1, 1000); GUILayout.EndHorizontal(); } } @@ -481,16 +254,16 @@ private void DrawQuality() GUILayout.BeginHorizontal(GUI.skin.box); GUILayout.Label($"Antialiasing filter: ({Hacks.PostProcessLayerHook.GetShortName()}):"); if (GUILayout.Button("None")) - Settings!.Entry_Antialiasing!.Value = PostProcessLayer.Antialiasing.None; + ExposedSettings.Instance.Entry_Antialiasing.Value = PostProcessLayer.Antialiasing.None; if (GUILayout.Button("FXAA")) - Settings!.Entry_Antialiasing!.Value = PostProcessLayer.Antialiasing.FastApproximateAntialiasing; + ExposedSettings.Instance.Entry_Antialiasing.Value = PostProcessLayer.Antialiasing.FastApproximateAntialiasing; if (GUILayout.Button("SMAA")) - Settings!.Entry_Antialiasing!.Value = PostProcessLayer.Antialiasing.SubpixelMorphologicalAntialiasing; - if (Settings!.Entry_Other_ShowAdvanced!.Value) + ExposedSettings.Instance.Entry_Antialiasing.Value = PostProcessLayer.Antialiasing.SubpixelMorphologicalAntialiasing; + if (ExposedSettings.Instance.Entry_Other_ShowAdvanced.Value) { if (GUILayout.Button("TAA (Epilepsy warning!)")) - Settings.Entry_Antialiasing!.Value = PostProcessLayer.Antialiasing.TemporalAntialiasing; + ExposedSettings.Instance.Entry_Antialiasing.Value = PostProcessLayer.Antialiasing.TemporalAntialiasing; } @@ -504,22 +277,22 @@ private void DrawQuality() GUILayout.Label($"Anisotropic filtering mode: ({QualitySettings.anisotropicFiltering}):"); if (GUILayout.Button("Force disabled")) - Settings!.Entry_AnistropicFiltering!.Value = AnisotropicFiltering.Disable; + ExposedSettings.Instance.Entry_AnistropicFiltering.Value = AnisotropicFiltering.Disable; if (GUILayout.Button("Per texture")) - Settings!.Entry_AnistropicFiltering!.Value = AnisotropicFiltering.Enable; + ExposedSettings.Instance.Entry_AnistropicFiltering.Value = AnisotropicFiltering.Enable; if (GUILayout.Button("Force enabled")) - Settings!.Entry_AnistropicFiltering!.Value = AnisotropicFiltering.ForceEnable; + ExposedSettings.Instance.Entry_AnistropicFiltering.Value = AnisotropicFiltering.ForceEnable; GUILayout.EndHorizontal(); if (QualitySettings.anisotropicFiltering == AnisotropicFiltering.ForceEnable) { - var oldValue = Settings!.Entry_AnistropicFilteringValue!.Value; + var oldValue = ExposedSettings.Instance.Entry_AnistropicFilteringValue.Value; GUILayout.BeginHorizontal(); GUILayout.Label($"Anisotropic filtering level ({oldValue}): "); - Settings.Entry_AnistropicFilteringValue.Value = (int)GUILayout.HorizontalSlider(Settings.Entry_AnistropicFilteringValue.Value, -1, 16); + ExposedSettings.Instance.Entry_AnistropicFilteringValue.Value = (int)GUILayout.HorizontalSlider(ExposedSettings.Instance.Entry_AnistropicFilteringValue.Value, -1, 16); GUILayout.EndHorizontal(); } @@ -531,18 +304,18 @@ private void DrawQuality() GUILayout.BeginVertical(GUI.skin.box); //Shadow mode - if (Settings!.Entry_Other_ShowAdvanced.Value) + if (ExposedSettings.Instance.Entry_Other_ShowAdvanced.Value) { GUILayout.BeginHorizontal(); GUILayout.Label($"Shadows ({QualitySettings.shadows}):"); if (GUILayout.Button("None")) - Settings.Entry_Quality_ShadowsQuality!.Value = ShadowQuality.Disable; + ExposedSettings.Instance.Entry_Quality_ShadowsQuality.Value = ShadowQuality.Disable; if (GUILayout.Button("Hard only")) - Settings.Entry_Quality_ShadowsQuality!.Value = ShadowQuality.HardOnly; + ExposedSettings.Instance.Entry_Quality_ShadowsQuality.Value = ShadowQuality.HardOnly; if (GUILayout.Button("Soft")) - Settings.Entry_Quality_ShadowsQuality!.Value = ShadowQuality.All; + ExposedSettings.Instance.Entry_Quality_ShadowsQuality.Value = ShadowQuality.All; GUILayout.EndHorizontal(); } @@ -552,16 +325,16 @@ private void DrawQuality() GUILayout.BeginHorizontal(); GUILayout.Label($"Shadow resolution ({QualitySettings.shadowResolution}):"); if (GUILayout.Button("Low")) - Settings.Entry_Quality_ShadowsResolution!.Value = ShadowResolution.Low; + ExposedSettings.Instance.Entry_Quality_ShadowsResolution.Value = ShadowResolution.Low; if (GUILayout.Button("Medium")) - Settings.Entry_Quality_ShadowsResolution!.Value = ShadowResolution.Medium; + ExposedSettings.Instance.Entry_Quality_ShadowsResolution.Value = ShadowResolution.Medium; if (GUILayout.Button("High")) - Settings.Entry_Quality_ShadowsResolution!.Value = ShadowResolution.High; + ExposedSettings.Instance.Entry_Quality_ShadowsResolution.Value = ShadowResolution.High; if (GUILayout.Button("Very High")) - Settings.Entry_Quality_ShadowsResolution!.Value = ShadowResolution.VeryHigh; + ExposedSettings.Instance.Entry_Quality_ShadowsResolution.Value = ShadowResolution.VeryHigh; GUILayout.EndHorizontal(); } @@ -585,16 +358,16 @@ private void DrawQuality() GUILayout.Label($"Shadow cascades: ({QualitySettings.shadowCascades}):"); if (GUILayout.Button("2")) { - Settings.Entry_Quality_Use4ShadowCascades!.Value = false; + ExposedSettings.Instance.Entry_Quality_Use4ShadowCascades.Value = false; } if (GUILayout.Button("4")) { - Settings.Entry_Quality_Use4ShadowCascades!.Value = true; + ExposedSettings.Instance.Entry_Quality_Use4ShadowCascades.Value = true; } GUILayout.EndHorizontal(); } - if (Settings.Entry_Other_ShowAdvanced.Value) + if (ExposedSettings.Instance.Entry_Other_ShowAdvanced.Value) { if (QualitySettings.shadowCascades == 2) { @@ -603,7 +376,7 @@ private void DrawQuality() float value = QualitySettings.shadowCascade2Split; QualitySettings.shadowCascade2Split = GUILayout.HorizontalSlider(value, 0.01f, 0.5f); if (QualitySettings.shadowCascade2Split != value) - Settings.Entry_Quality_ShadowTwoSplitValue!.Value = QualitySettings.shadowCascade2Split; + ExposedSettings.Instance.Entry_Quality_ShadowTwoSplitValue.Value = QualitySettings.shadowCascade2Split; GUILayout.EndHorizontal(); } else @@ -633,9 +406,9 @@ private void DrawQuality() if (cascade1 != QualitySettings.shadowCascade4Split.x || cascade2 != QualitySettings.shadowCascade4Split.y || cascade3 != QualitySettings.shadowCascade4Split.z) { QualitySettings.shadowCascade4Split = new Vector3(cascade1, cascade2, cascade3); - Settings.Entry_Quality_ShadowFourSplitValue1!.Value = cascade1; - Settings.Entry_Quality_ShadowFourSplitValue2!.Value = cascade2; - Settings.Entry_Quality_ShadowFourSplitValue3!.Value = cascade3; + ExposedSettings.Instance.Entry_Quality_ShadowFourSplitValue1.Value = cascade1; + ExposedSettings.Instance.Entry_Quality_ShadowFourSplitValue2.Value = cascade2; + ExposedSettings.Instance.Entry_Quality_ShadowFourSplitValue3.Value = cascade3; } } } @@ -648,7 +421,7 @@ private void DrawQuality() GUILayout.Label($"Far clip distance ({Hacks.PostProcessLayerHook.FarClipDistance}):"); var newValue = Mathf.Round(GUILayout.HorizontalSlider(oldValue, 400, 2000f)); if (newValue != oldValue) - Settings!.Entry_Quality_CameraFarPlaneDistance!.Value = newValue; + ExposedSettings.Instance.Entry_Quality_CameraFarPlaneDistance.Value = newValue; GUILayout.EndHorizontal(); } @@ -660,20 +433,20 @@ private void DrawQuality() GUILayout.Label($"LOD Bias ({QualitySettings.lodBias:0.0}):"); QualitySettings.lodBias = GUILayout.HorizontalSlider(QualitySettings.lodBias, 0.5f, 4f); if (oldValue != QualitySettings.lodBias) - Settings.Entry_Quality_LODBias!.Value = QualitySettings.lodBias; + ExposedSettings.Instance.Entry_Quality_LODBias.Value = QualitySettings.lodBias; GUILayout.EndHorizontal(); } //Pixel Light Count - if (Settings.Entry_Other_ShowAdvanced.Value) + if (ExposedSettings.Instance.Entry_Other_ShowAdvanced.Value) { GUILayout.BeginHorizontal(GUI.skin.box); var oldValue = QualitySettings.pixelLightCount; GUILayout.Label($"Pixel light count: ({QualitySettings.pixelLightCount}):"); QualitySettings.pixelLightCount = (int)GUILayout.HorizontalSlider(QualitySettings.pixelLightCount, 0, 8); if (oldValue != QualitySettings.pixelLightCount) - Settings.Entry_Quality_PixelLightCount!.Value = QualitySettings.pixelLightCount; + ExposedSettings.Instance.Entry_Quality_PixelLightCount.Value = QualitySettings.pixelLightCount; GUILayout.EndHorizontal(); } @@ -684,9 +457,9 @@ private void DrawQuality() GUILayout.Label($"Texture resolution ({GetTextureString(QualitySettings.masterTextureLimit)}):"); if (GUILayout.Button("Full")) - Settings.Entry_Quality_TextureQuality!.Value = 0; + ExposedSettings.Instance.Entry_Quality_TextureQuality.Value = 0; if (GUILayout.Button("Half")) - Settings.Entry_Quality_TextureQuality!.Value = 1; + ExposedSettings.Instance.Entry_Quality_TextureQuality.Value = 1; GUILayout.EndHorizontal(); } @@ -698,7 +471,7 @@ private void DrawQuality() var log = Mathf.RoundToInt(Mathf.Log(Hacks.MirrorReflectionHook.ReflectionSize, 2)); var newLog = (int)GUILayout.HorizontalSlider(log, 7, 11); if (newLog != log) - Settings.Entry_Quality_MirrorReflectionResolution!.Value = (int)Mathf.Pow(2, newLog); + ExposedSettings.Instance.Entry_Quality_MirrorReflectionResolution.Value = (int)Mathf.Pow(2, newLog); GUILayout.EndHorizontal(); } @@ -709,20 +482,20 @@ private void DrawQuality() GUILayout.BeginHorizontal(); GUILayout.Label($"HBAO preset ({Hacks.PostProcessLayerHook.HBAO_Preset}):"); if (GUILayout.Button("Fastest")) - Settings.Entry_Quality_HBAO_Preset!.Value = HBAO_Core.Preset.FastestPerformance; + ExposedSettings.Instance.Entry_Quality_HBAO_Preset.Value = HBAO_Core.Preset.FastestPerformance; if (GUILayout.Button("Fast")) - Settings.Entry_Quality_HBAO_Preset!.Value = HBAO_Core.Preset.FastPerformance; + ExposedSettings.Instance.Entry_Quality_HBAO_Preset.Value = HBAO_Core.Preset.FastPerformance; if (GUILayout.Button("Normal")) - Settings.Entry_Quality_HBAO_Preset!.Value = HBAO_Core.Preset.Normal; + ExposedSettings.Instance.Entry_Quality_HBAO_Preset.Value = HBAO_Core.Preset.Normal; if (GUILayout.Button("High")) - Settings.Entry_Quality_HBAO_Preset!.Value = HBAO_Core.Preset.HighQuality; + ExposedSettings.Instance.Entry_Quality_HBAO_Preset.Value = HBAO_Core.Preset.HighQuality; if (GUILayout.Button("Highest")) - Settings.Entry_Quality_HBAO_Preset!.Value = HBAO_Core.Preset.HighestQuality; + ExposedSettings.Instance.Entry_Quality_HBAO_Preset.Value = HBAO_Core.Preset.HighestQuality; GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label($"HBAO intensity ({Hacks.PostProcessLayerHook.HBAO_Intensity:0.0}):"); - Settings.Entry_Quality_HBAO_Intensity!.Value = GUILayout.HorizontalSlider(Settings.Entry_Quality_HBAO_Intensity.Value, 0.0f, 1.0f); + ExposedSettings.Instance.Entry_Quality_HBAO_Intensity.Value = GUILayout.HorizontalSlider(ExposedSettings.Instance.Entry_Quality_HBAO_Intensity.Value, 0.0f, 1.0f); GUILayout.EndHorizontal(); GUILayout.EndVertical(); } @@ -730,18 +503,18 @@ private void DrawQuality() //Meh { GUILayout.BeginVertical(GUI.skin.box); - Settings.Entry_Quality_EdgeDetection!.Value = GUILayout.Toggle(Settings.Entry_Quality_EdgeDetection.Value, "Edge detection post process filter"); + ExposedSettings.Instance.Entry_Quality_EdgeDetection.Value = GUILayout.Toggle(ExposedSettings.Instance.Entry_Quality_EdgeDetection.Value, "Edge detection post process filter"); - if (Settings.Entry_Quality_EdgeDetection.Value && Settings.Entry_Quality_CameraFarPlaneDistance!.Value > 800) + if (ExposedSettings.Instance.Entry_Quality_EdgeDetection.Value && ExposedSettings.Instance.Entry_Quality_CameraFarPlaneDistance.Value > 800) { GUILayout.Label("Warning - extending far clip camera plane distance can cause issues with edge detection filter.\nIf you experience issues with lines on characters being displayed up close, try lowering the value below:"); GUILayout.BeginHorizontal(); - GUILayout.Label($"Edge detection depth {Settings.Entry_Quality_EdgeDetectionDepth!.Value:0.00}"); - Settings.Entry_Quality_EdgeDetectionDepth.Value = GUILayout.HorizontalSlider(Settings.Entry_Quality_EdgeDetectionDepth.Value, 0, 1); + GUILayout.Label($"Edge detection depth {ExposedSettings.Instance.Entry_Quality_EdgeDetectionDepth.Value:0.00}"); + ExposedSettings.Instance.Entry_Quality_EdgeDetectionDepth.Value = GUILayout.HorizontalSlider(ExposedSettings.Instance.Entry_Quality_EdgeDetectionDepth.Value, 0, 1); GUILayout.EndHorizontal(); } else - Settings.Entry_Quality_EdgeDetectionDepth!.Value = 1; + ExposedSettings.Instance.Entry_Quality_EdgeDetectionDepth.Value = 1; GUILayout.EndVertical(); } @@ -749,58 +522,58 @@ private void DrawQuality() //SSR { GUILayout.BeginVertical(GUI.skin.box); - Settings.Entry_Quality_SSR_Enable!.Value = GUILayout.Toggle(Settings.Entry_Quality_SSR_Enable.Value, "Enable SSR override"); + ExposedSettings.Instance.Entry_Quality_SSR_Enable.Value = GUILayout.Toggle(ExposedSettings.Instance.Entry_Quality_SSR_Enable.Value, "Enable SSR override"); - if (Settings.Entry_Quality_SSR_Enable.Value) + if (ExposedSettings.Instance.Entry_Quality_SSR_Enable.Value) { GUILayout.BeginHorizontal(); GUILayout.Label($"SSR preset ({Hacks.PostProcessLayerHook.SSR_Preset}):"); if (GUILayout.Button("Lower")) - Settings.Entry_Quality_SSR_Preset!.Value = ScreenSpaceReflectionPreset.Lower; + ExposedSettings.Instance.Entry_Quality_SSR_Preset.Value = ScreenSpaceReflectionPreset.Lower; if (GUILayout.Button("Low")) - Settings.Entry_Quality_SSR_Preset!.Value = ScreenSpaceReflectionPreset.Low; + ExposedSettings.Instance.Entry_Quality_SSR_Preset.Value = ScreenSpaceReflectionPreset.Low; if (GUILayout.Button("Medium")) - Settings.Entry_Quality_SSR_Preset!.Value = ScreenSpaceReflectionPreset.Medium; + ExposedSettings.Instance.Entry_Quality_SSR_Preset.Value = ScreenSpaceReflectionPreset.Medium; if (GUILayout.Button("High")) - Settings.Entry_Quality_SSR_Preset!.Value = ScreenSpaceReflectionPreset.High; + ExposedSettings.Instance.Entry_Quality_SSR_Preset.Value = ScreenSpaceReflectionPreset.High; if (GUILayout.Button("Higher")) - Settings.Entry_Quality_SSR_Preset!.Value = ScreenSpaceReflectionPreset.Higher; + ExposedSettings.Instance.Entry_Quality_SSR_Preset.Value = ScreenSpaceReflectionPreset.Higher; if (GUILayout.Button("Ultra")) - Settings.Entry_Quality_SSR_Preset!.Value = ScreenSpaceReflectionPreset.Ultra; + ExposedSettings.Instance.Entry_Quality_SSR_Preset.Value = ScreenSpaceReflectionPreset.Ultra; if (GUILayout.Button("Overkill")) - Settings.Entry_Quality_SSR_Preset!.Value = ScreenSpaceReflectionPreset.Overkill; + ExposedSettings.Instance.Entry_Quality_SSR_Preset.Value = ScreenSpaceReflectionPreset.Overkill; GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label($"SSR resolution ({Hacks.PostProcessLayerHook.SSR_Resolution}):"); if (GUILayout.Button("Downsampled")) - Settings.Entry_Quality_SSR_Resolution!.Value = ScreenSpaceReflectionResolution.Downsampled; + ExposedSettings.Instance.Entry_Quality_SSR_Resolution.Value = ScreenSpaceReflectionResolution.Downsampled; if (GUILayout.Button("FullSize")) - Settings.Entry_Quality_SSR_Resolution!.Value = ScreenSpaceReflectionResolution.FullSize; + ExposedSettings.Instance.Entry_Quality_SSR_Resolution.Value = ScreenSpaceReflectionResolution.FullSize; if (GUILayout.Button("Supersampled")) - Settings.Entry_Quality_SSR_Resolution!.Value = ScreenSpaceReflectionResolution.Supersampled; + ExposedSettings.Instance.Entry_Quality_SSR_Resolution.Value = ScreenSpaceReflectionResolution.Supersampled; GUILayout.EndHorizontal(); - if (Settings.Entry_Other_ShowAdvanced.Value) + if (ExposedSettings.Instance.Entry_Other_ShowAdvanced.Value) { GUILayout.BeginHorizontal(); GUILayout.Label($"SSR Tickness ({Hacks.PostProcessLayerHook.SSR_Tickness:0.0}):"); - Settings.Entry_Quality_SSR_Tickness!.Value = GUILayout.HorizontalSlider(Settings.Entry_Quality_SSR_Tickness.Value, 0, 1); + ExposedSettings.Instance.Entry_Quality_SSR_Tickness.Value = GUILayout.HorizontalSlider(ExposedSettings.Instance.Entry_Quality_SSR_Tickness.Value, 0, 1); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label($"SSR Vignette ({Hacks.PostProcessLayerHook.SSR_Vignette:0.0}):"); - Settings.Entry_Quality_SSR_Vignette!.Value = GUILayout.HorizontalSlider(Settings.Entry_Quality_SSR_Vignette.Value, 0, 1); + ExposedSettings.Instance.Entry_Quality_SSR_Vignette.Value = GUILayout.HorizontalSlider(ExposedSettings.Instance.Entry_Quality_SSR_Vignette.Value, 0, 1); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label($"SSR Distance Fade ({Hacks.PostProcessLayerHook.SSR_DistanceFade:0.00}):"); - Settings.Entry_Quality_SSR_DistanceFade!.Value = GUILayout.HorizontalSlider(Settings.Entry_Quality_SSR_DistanceFade.Value, 0, 0.5f); + ExposedSettings.Instance.Entry_Quality_SSR_DistanceFade.Value = GUILayout.HorizontalSlider(ExposedSettings.Instance.Entry_Quality_SSR_DistanceFade.Value, 0, 0.5f); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label($"SSR Max Marching Distance ({Hacks.PostProcessLayerHook.SSR_MaxMarchingDistance:0}):"); - Settings.Entry_Quality_SSR_MaxMarchingDistance!.Value = GUILayout.HorizontalSlider(Settings.Entry_Quality_SSR_MaxMarchingDistance.Value, 50, 250); + ExposedSettings.Instance.Entry_Quality_SSR_MaxMarchingDistance.Value = GUILayout.HorizontalSlider(ExposedSettings.Instance.Entry_Quality_SSR_MaxMarchingDistance.Value, 50, 250); GUILayout.EndHorizontal(); } } @@ -808,7 +581,7 @@ private void DrawQuality() } //Color space - if (Settings.Entry_Other_ShowAdvanced.Value) + if (ExposedSettings.Instance.Entry_Other_ShowAdvanced.Value) { GUILayout.BeginHorizontal(GUI.skin.box); GUILayout.Label($"Color space: {QualitySettings.activeColorSpace}"); @@ -831,59 +604,266 @@ private void DrawQuality() private void RestartToDefault() { - Settings!.Entry_AnistropicFiltering!.Value = Settings.Entry_AnistropicFiltering.DefaultValue; - QualitySettings.anisotropicFiltering = Settings.Entry_AnistropicFiltering.Value; + ExposedSettings.Instance.Entry_AnistropicFiltering.Value = (AnisotropicFiltering)ExposedSettings.Instance.Entry_AnistropicFiltering.DefaultValue; + QualitySettings.anisotropicFiltering = ExposedSettings.Instance.Entry_AnistropicFiltering.Value; - Settings.Entry_AnistropicFilteringValue!.Value = Settings.Entry_AnistropicFilteringValue.DefaultValue; + ExposedSettings.Instance.Entry_AnistropicFilteringValue.Value = (int)ExposedSettings.Instance.Entry_AnistropicFilteringValue.DefaultValue; Texture.SetGlobalAnisotropicFilteringLimits(8, 16); - Settings.Entry_Antialiasing!.Value = Settings.Entry_Antialiasing.DefaultValue; - Settings.Entry_Quality_CameraFarPlaneDistance!.Value = Settings.Entry_Quality_CameraFarPlaneDistance.DefaultValue; + ExposedSettings.Instance.Entry_Antialiasing.Value = (PostProcessLayer.Antialiasing)ExposedSettings.Instance.Entry_Antialiasing.DefaultValue; + ExposedSettings.Instance.Entry_Quality_CameraFarPlaneDistance.Value = (float)ExposedSettings.Instance.Entry_Quality_CameraFarPlaneDistance.DefaultValue; - Settings.Entry_Quality_LODBias!.Value = Settings.Entry_Quality_LODBias.DefaultValue; - Settings.Entry_Quality_PixelLightCount!.Value = Settings.Entry_Quality_PixelLightCount.DefaultValue; - Settings.Entry_Quality_ShadowDistance!.Value = Settings.Entry_Quality_ShadowDistance.DefaultValue; + ExposedSettings.Instance.Entry_Quality_LODBias.Value = (float)ExposedSettings.Instance.Entry_Quality_LODBias.DefaultValue; + ExposedSettings.Instance.Entry_Quality_PixelLightCount.Value = (int)ExposedSettings.Instance.Entry_Quality_PixelLightCount.DefaultValue; + ExposedSettings.Instance.Entry_Quality_ShadowDistance.Value = (float)ExposedSettings.Instance.Entry_Quality_ShadowDistance.DefaultValue; - Settings.Entry_Quality_ShadowFourSplitValue1!.Value = Settings.Entry_Quality_ShadowFourSplitValue1.DefaultValue; - Settings.Entry_Quality_ShadowFourSplitValue2!.Value = Settings.Entry_Quality_ShadowFourSplitValue2.DefaultValue; - Settings.Entry_Quality_ShadowFourSplitValue3!.Value = Settings.Entry_Quality_ShadowFourSplitValue3.DefaultValue; - QualitySettings.shadowCascade4Split = new Vector3(Settings.Entry_Quality_ShadowFourSplitValue1.Value, Settings.Entry_Quality_ShadowFourSplitValue2.Value, Settings.Entry_Quality_ShadowFourSplitValue3.Value); + ExposedSettings.Instance.Entry_Quality_ShadowFourSplitValue1.Value = (float)ExposedSettings.Instance.Entry_Quality_ShadowFourSplitValue1.DefaultValue; + ExposedSettings.Instance.Entry_Quality_ShadowFourSplitValue2.Value = (float)ExposedSettings.Instance.Entry_Quality_ShadowFourSplitValue2.DefaultValue; + ExposedSettings.Instance.Entry_Quality_ShadowFourSplitValue3.Value = (float)ExposedSettings.Instance.Entry_Quality_ShadowFourSplitValue3.DefaultValue; + QualitySettings.shadowCascade4Split = new Vector3(ExposedSettings.Instance.Entry_Quality_ShadowFourSplitValue1.Value, ExposedSettings.Instance.Entry_Quality_ShadowFourSplitValue2.Value, ExposedSettings.Instance.Entry_Quality_ShadowFourSplitValue3.Value); - Settings.Entry_Quality_ShadowsQuality!.Value = Settings.Entry_Quality_ShadowsQuality.DefaultValue; - Settings.Entry_Quality_ShadowsResolution!.Value = Settings.Entry_Quality_ShadowsResolution.DefaultValue; - Settings.Entry_Quality_ShadowTwoSplitValue!.Value = Settings.Entry_Quality_ShadowTwoSplitValue.DefaultValue; - Settings.Entry_Quality_MirrorReflectionResolution!.Value = Settings.Entry_Quality_MirrorReflectionResolution.DefaultValue; + ExposedSettings.Instance.Entry_Quality_ShadowsQuality.Value = (ShadowQuality)ExposedSettings.Instance.Entry_Quality_ShadowsQuality.DefaultValue; + ExposedSettings.Instance.Entry_Quality_ShadowsResolution.Value = (ShadowResolution)ExposedSettings.Instance.Entry_Quality_ShadowsResolution.DefaultValue; + ExposedSettings.Instance.Entry_Quality_ShadowTwoSplitValue.Value = (float)ExposedSettings.Instance.Entry_Quality_ShadowTwoSplitValue.DefaultValue; + ExposedSettings.Instance.Entry_Quality_MirrorReflectionResolution.Value = (int)ExposedSettings.Instance.Entry_Quality_MirrorReflectionResolution.DefaultValue; - Settings.Entry_Quality_TextureQuality!.Value = Settings.Entry_Quality_TextureQuality.DefaultValue; - Settings.Entry_Quality_Use4ShadowCascades!.Value = Settings.Entry_Quality_Use4ShadowCascades.DefaultValue; + ExposedSettings.Instance.Entry_Quality_TextureQuality.Value = (int)ExposedSettings.Instance.Entry_Quality_TextureQuality.DefaultValue; + ExposedSettings.Instance.Entry_Quality_Use4ShadowCascades.Value = (bool)ExposedSettings.Instance.Entry_Quality_Use4ShadowCascades.DefaultValue; - Settings.Entry_Quality_SSR_Enable!.Value = Settings.Entry_Quality_SSR_Enable.DefaultValue; - Settings.Entry_Quality_SSR_DistanceFade!.Value = Settings.Entry_Quality_SSR_DistanceFade.DefaultValue; - Settings.Entry_Quality_SSR_MaxMarchingDistance!.Value = Settings.Entry_Quality_SSR_MaxMarchingDistance.DefaultValue; - Settings.Entry_Quality_SSR_Preset!.Value = Settings.Entry_Quality_SSR_Preset.DefaultValue; - Settings.Entry_Quality_SSR_Resolution!.Value = Settings.Entry_Quality_SSR_Resolution.DefaultValue; - Settings.Entry_Quality_SSR_Tickness!.Value = Settings.Entry_Quality_SSR_Tickness.DefaultValue; - Settings.Entry_Quality_SSR_Vignette!.Value = Settings.Entry_Quality_SSR_Vignette.DefaultValue; + ExposedSettings.Instance.Entry_Quality_SSR_Enable.Value = (bool)ExposedSettings.Instance.Entry_Quality_SSR_Enable.DefaultValue; + ExposedSettings.Instance.Entry_Quality_SSR_DistanceFade.Value = (float)ExposedSettings.Instance.Entry_Quality_SSR_DistanceFade.DefaultValue; + ExposedSettings.Instance.Entry_Quality_SSR_MaxMarchingDistance.Value = (float)ExposedSettings.Instance.Entry_Quality_SSR_MaxMarchingDistance.DefaultValue; + ExposedSettings.Instance.Entry_Quality_SSR_Preset.Value = (ScreenSpaceReflectionPreset)ExposedSettings.Instance.Entry_Quality_SSR_Preset.DefaultValue; + ExposedSettings.Instance.Entry_Quality_SSR_Resolution.Value = (ScreenSpaceReflectionResolution)ExposedSettings.Instance.Entry_Quality_SSR_Resolution.DefaultValue; + ExposedSettings.Instance.Entry_Quality_SSR_Tickness.Value = (float)ExposedSettings.Instance.Entry_Quality_SSR_Tickness.DefaultValue; + ExposedSettings.Instance.Entry_Quality_SSR_Vignette.Value = (float)ExposedSettings.Instance.Entry_Quality_SSR_Vignette.DefaultValue; - Settings.Entry_Quality_HBAO_Preset!.Value = Settings.Entry_Quality_HBAO_Preset.DefaultValue; - Settings.Entry_Quality_HBAO_Intensity!.Value = Settings.Entry_Quality_HBAO_Intensity.DefaultValue; + ExposedSettings.Instance.Entry_Quality_HBAO_Preset.Value = (HBAO_Core.Preset)ExposedSettings.Instance.Entry_Quality_HBAO_Preset.DefaultValue; + ExposedSettings.Instance.Entry_Quality_HBAO_Intensity.Value = (float)ExposedSettings.Instance.Entry_Quality_HBAO_Intensity.DefaultValue; - Settings.Entry_Quality_EdgeDetection!.Value = Settings.Entry_Quality_EdgeDetection.DefaultValue; - Settings.Entry_Quality_EdgeDetectionDepth!.Value = Settings.Entry_Quality_EdgeDetectionDepth.DefaultValue; + ExposedSettings.Instance.Entry_Quality_EdgeDetection.Value = (bool)ExposedSettings.Instance.Entry_Quality_EdgeDetection.DefaultValue; + ExposedSettings.Instance.Entry_Quality_EdgeDetectionDepth.Value = (float)ExposedSettings.Instance.Entry_Quality_EdgeDetectionDepth.DefaultValue; } - private string GetTextureString(int masterTextureLimit) + private void DrawSteamInput() { - //I wish I could use 8.0 recursive patern - switch (masterTextureLimit) + GUIStyle richText = GUI.skin.label; + richText.richText = true; + + { + GUILayout.BeginVertical(GUI.skin.box); + GUILayout.Label("Options starting with * requires full game restart"); + GUILayout.BeginHorizontal(); + GUILayout.Label("* Input mode:"); + if (GUILayout.Button("Change to keyboard and mouse")) + ExposedSettings.Instance.Input_Override.Value = ExposedSettings.InputType.KeyboardAndMouse; + GUILayout.EndHorizontal(); + GUILayout.EndVertical(); + } + } + + private void DrawKeyboardAndMouseInput() + { + GUIStyle richText = GUI.skin.label; + richText.richText = true; + + var Settings = ExposedSettings.Instance; + { + GUILayout.BeginVertical(GUI.skin.box); + GUILayout.BeginHorizontal(); + GUILayout.Label("* Input mode:"); + if (GUILayout.Button("Change to gamepad")) + Settings.Input_Override.Value = ExposedSettings.InputType.SteamInput; + + GUILayout.EndHorizontal(); + GUILayout.EndVertical(); + } + { + GUILayout.BeginVertical(GUI.skin.box); + GUILayout.Label("Options starting with * requires full game restart"); + GUILayout.Label("For keyboard and mouse to work a controller is still required!"); + GUILayout.Label("A fake / emulated controller can work, provided it is detected by SteamInput."); + GUILayout.Label("For mouse support to work, a modified gamemangers file is required."); + GUILayout.EndVertical(); + } + + { + GUILayout.BeginVertical(GUI.skin.box); + GUILayout.BeginHorizontal(); + GUILayout.Label($"Mouse sensitivity: {Settings.Input_Mouse_Sensitivity.Value:0.00}"); + Settings.Input_Mouse_Sensitivity.Value = GUILayout.HorizontalSlider(Settings.Input_Mouse_Sensitivity.Value, 0.05f, 2); + Settings.Input_MouseYAxisInversion.Value = GUILayout.Toggle(Settings.Input_MouseYAxisInversion.Value, "Mouse Y Axis inversion"); + GUILayout.EndHorizontal(); + GUILayout.EndVertical(); + } + + { + GUILayout.BeginVertical(GUI.skin.box); + if (GlobalInputHookHandler.Instance != null) + { + GUILayout.Label("Key rebinding (affects only gameplay section)", richText); + + GUILayout.Label(""); + GUILayout.Label("Movement", richText); + DrawRebind("Move forward", RebindingActions.Forward); + DrawRebind("Move backward", RebindingActions.Backward); + DrawRebind("Move left", RebindingActions.Left); + DrawRebind("Move right", RebindingActions.Right); + DrawRebind("Crouch", RebindingActions.Crouch); + DrawRebind("Sprint / dodge", RebindingActions.Dash_Dodge); + + GUILayout.Label(""); + GUILayout.Label("Actions", richText); + DrawRebind("Fire / Punch", RebindingActions.Fire_Weapon_Punch); + DrawRebind("Aim a gun", RebindingActions.Point_Gun); + DrawRebind("Vision", RebindingActions.Vision); + DrawRebind("Interact / Reload / Accelerate", RebindingActions.Interact_Reload_Accellerate); + DrawRebind("Cancel / Break", RebindingActions.Cancel_Brake); + DrawRebind("Reset camera / fighting style", RebindingActions.Reset_Camera_Fighting_Style); + + GUILayout.Label(""); + GUILayout.Label("Actions", richText); + DrawRebind("Display map", RebindingActions.Display_Map); + DrawRebind("Quest display", RebindingActions.Quest_Display); + DrawRebind("Skateboard", RebindingActions.Skateboard); + + DrawRebind("Switch slot to left", RebindingActions.SwitchSlotLeft); + DrawRebind("Switch slot to right", RebindingActions.SwitchSlotRight); + DrawRebind("Switch album display up", RebindingActions.SwitchAlbumDisplayUp); + DrawRebind("Switch album display down", RebindingActions.SwitchAlbumDisplayDown); + + if (CurrentRebinding != RebindingActions.None) + { + Event e = Event.current; + if (e.type != EventType.Used) + { + var tempKey = KeyCode.None; + if (e.isKey) + tempKey = e.keyCode; + else if (e.isMouse) + { + if (Input.GetKeyDown(KeyCode.Mouse0)) + tempKey = KeyCode.Mouse0; + else if (Input.GetKeyDown(KeyCode.Mouse1)) + tempKey = KeyCode.Mouse1; + else if (Input.GetKeyDown(KeyCode.Mouse2)) + tempKey = KeyCode.Mouse2; + else if (Input.GetKeyDown(KeyCode.Mouse3)) + tempKey = KeyCode.Mouse3; + else if (Input.GetKeyDown(KeyCode.Mouse4)) + tempKey = KeyCode.Mouse4; + } + + if (tempKey != KeyCode.None) + { + RebindingAction(CurrentRebinding, tempKey); + CurrentRebinding = RebindingActions.None; + } + } + } + } + else + { + GUILayout.Label("Keyboard / mouse not initialized - please restart the game!", richText); + } + + GUILayout.EndVertical(); + } + } + + + private void RebindingAction(RebindingActions currentRebinding, KeyCode tempKey) + { + var Settings = ExposedSettings.Instance; + + switch (currentRebinding) { - case 1: - return "Half"; - default: - return "Full"; + case RebindingActions.Forward: + Settings.Input_Analog_LeftStick_Up.Value = tempKey; + break; + case RebindingActions.Backward: + Settings.Input_Analog_LeftStick_Down.Value = tempKey; + break; + case RebindingActions.Left: + Settings.Input_Analog_LeftStick_Left.Value = tempKey; + break; + case RebindingActions.Right: + Settings.Input_Analog_LeftStick_Right.Value = tempKey; + break; + case RebindingActions.Display_Map: + Settings.Input_Digital_Back_Button.Value = tempKey; + break; + case RebindingActions.Quest_Display: + Settings.Input_Digital_Start_Button.Value = tempKey; + break; + case RebindingActions.Point_Gun: + Settings.Input_Digital_LT.Value = tempKey; + break; + case RebindingActions.Vision: + Settings.Input_Digital_LB.Value = tempKey; + break; + case RebindingActions.Crouch: + Settings.Input_Digital_L_Stick_Button.Value = tempKey; + break; + case RebindingActions.Fire_Weapon_Punch: + Settings.Input_Digital_RT.Value = tempKey; + break; + case RebindingActions.Cancel_Brake: + Settings.Input_Digital_B_Button.Value = tempKey; + break; + case RebindingActions.Dash_Dodge: + Settings.Input_Digital_RB.Value = tempKey; + break; + case RebindingActions.Interact_Reload_Accellerate: + Settings.Input_Digital_A_Button.Value = tempKey; + break; + case RebindingActions.Reset_Camera_Fighting_Style: + Settings.Input_Digital_R_Stick_Button.Value = tempKey; + break; + case RebindingActions.Skateboard: + Settings.Input_Digital_Y_Button.Value = tempKey; + break; + case RebindingActions.SwitchAlbumDisplayDown: + Settings.Input_Digital_Down_Button.Value = tempKey; + break; + case RebindingActions.SwitchAlbumDisplayUp: + Settings.Input_Digital_Up_Button.Value = tempKey; + break; + case RebindingActions.SwitchSlotLeft: + Settings.Input_Digital_Left_Button.Value = tempKey; + break; + case RebindingActions.SwitchSlotRight: + Settings.Input_Digital_Right_Button.Value = tempKey; + break; } } + public void DrawRebind(string text, RebindingActions rebindingKey) + { + var fixedwidth = new Il2CppInterop.Runtime.InteropTypes.Arrays.Il2CppReferenceArray(1); + fixedwidth[0] = GUILayout.Width(300); + + GUILayout.BeginHorizontal(); + GUILayout.Label(text, fixedwidth); + GUILayout.Label(GlobalInputHookHandler.GetInputForRebinding(rebindingKey).ToString(), fixedwidth); + if (rebindingKey == CurrentRebinding) + { + GUIStyle richText = GUI.skin.label; + richText.richText = true; + GUILayout.Label("Awaiting key", richText, fixedwidth); + } + else if (rebindingKey != RebindingActions.None) + { + if (GUILayout.Button("Rebind", fixedwidth)) + { + CurrentRebinding = rebindingKey; + Event.current.type = EventType.Used; + } + } + + GUILayout.EndHorizontal(); + } + private void DrawOther() { GUIStyle richText = GUI.skin.label; @@ -895,50 +875,62 @@ private void DrawOther() GUILayout.Label("Settings with * at the beginning require game restart!"); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(GUI.skin.box); - Settings!.Entry_Other_SkipIntros!.Value = GUILayout.Toggle(Settings.Entry_Other_SkipIntros.Value, "* Skip intros"); + ExposedSettings.Instance.Entry_Other_SkipIntros.Value = GUILayout.Toggle(ExposedSettings.Instance.Entry_Other_SkipIntros.Value, "* Skip intros"); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(GUI.skin.box); - Settings.Entry_Other_InterpolateMovement!.Value = GUILayout.Toggle(Settings.Entry_Other_InterpolateMovement.Value, "Interpolate movement"); + ExposedSettings.Instance.Entry_Other_InterpolateMovement.Value = GUILayout.Toggle(ExposedSettings.Instance.Entry_Other_InterpolateMovement.Value, "Interpolate movement"); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(GUI.skin.box); - GUILayout.Label($"* Geometry improvements ({Settings.Entry_Other_GeometryImprovements!.Value}):"); + GUILayout.Label($"* Geometry improvements ({ExposedSettings.Instance.Entry_Other_GeometryImprovements.Value}):"); if (GUILayout.Button("Disabled")) - Settings.Entry_Other_GeometryImprovements.Value = ExposedSettings.GeometryImprovements.Disabled; + ExposedSettings.Instance.Entry_Other_GeometryImprovements.Value = ExposedSettings.GeometryImprovements.Disabled; if (GUILayout.Button("Enabled")) - Settings.Entry_Other_GeometryImprovements.Value = ExposedSettings.GeometryImprovements.Enabled; + ExposedSettings.Instance.Entry_Other_GeometryImprovements.Value = ExposedSettings.GeometryImprovements.Enabled; GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(GUI.skin.box); - GUILayout.Label($"* Light improvements ({Settings.Entry_Other_LightImprovements!.Value}):"); + GUILayout.Label($"* Light improvements ({ExposedSettings.Instance.Entry_Other_LightImprovements.Value}):"); if (GUILayout.Button("Disabled")) - Settings.Entry_Other_LightImprovements.Value = ExposedSettings.LightImprovements.Disabled; + ExposedSettings.Instance.Entry_Other_LightImprovements.Value = ExposedSettings.LightImprovements.Disabled; if (GUILayout.Button("Minor (performance safe)")) - Settings.Entry_Other_LightImprovements.Value = ExposedSettings.LightImprovements.Minor; + ExposedSettings.Instance.Entry_Other_LightImprovements.Value = ExposedSettings.LightImprovements.Minor; if (GUILayout.Button("All")) - Settings.Entry_Other_LightImprovements.Value = ExposedSettings.LightImprovements.All; + ExposedSettings.Instance.Entry_Other_LightImprovements.Value = ExposedSettings.LightImprovements.All; GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(GUI.skin.box); GUILayout.BeginVertical(); - var promptsUsed = Settings.Entry_Other_Prompts!.Value == "" ? "None" : Settings.Entry_Other_Prompts.Value; + var promptsUsed = ExposedSettings.Instance.Entry_Other_Prompts.Value == "" ? "None" : ExposedSettings.Instance.Entry_Other_Prompts.Value; GUILayout.Label($"* Prompts used: \"{promptsUsed}\" - possible:"); if (GUILayout.Button("None")) - Settings.Entry_Other_Prompts.Value = ""; + ExposedSettings.Instance.Entry_Other_Prompts.Value = ""; var files = Directory.GetFiles(Path.Combine(Application.streamingAssetsPath, "Prompts"), "*.manifest"); foreach (var file in files) { var split = file.Split('\\', '/', '.'); - var fileName = split[split.Length - 2]; + var fileName = split[^2]; if (fileName == "keyboard") continue; if (GUILayout.Button(fileName)) { - Settings.Entry_Other_Prompts.Value = fileName; + ExposedSettings.Instance.Entry_Other_Prompts.Value = fileName; } } GUILayout.EndVertical(); GUILayout.EndHorizontal(); } + + private static string GetTextureString(int masterTextureLimit) + { + //I wish I could use 8.0 recursive patern + return masterTextureLimit switch + { + 1 => "Half", + _ => "Full", + }; + } + + private void OnDestroy() => Plugin.Warning("GUI was destroyed - was this intended or Unity cleaned it up?"); } -} \ No newline at end of file +} diff --git a/Source/SuisHack.csproj b/Source/SuisHack.csproj index 29c30eb..aa1e7cf 100644 --- a/Source/SuisHack.csproj +++ b/Source/SuisHack.csproj @@ -1,71 +1,58 @@ - + net6.0 - enable - enable - False - false - F:\\Steam\\steamapps\\common\\Deadly Premonition 2\\Mods + SuisHack + A hack/mod made to make up for some of the port's shortcomings. + 2.0.0 + true + latest + + https://api.nuget.org/v3/index.json; + https://nuget.bepinex.dev/v3/index.json; + https://nuget.samboy.dev/v3/index.json + + SuisHack - - F:\Steam\steamapps\common\Deadly Premonition 2\MelonLoader\net6\0Harmony.dll - False - + + + + + - F:\Steam\steamapps\common\Deadly Premonition 2\MelonLoader\Il2CppAssemblies\Assembly-CSharp.dll - False + F:\Steam\steamapps\common\Deadly Premonition 2\BepInEx\interop\Assembly-CSharp.dll - F:\Steam\steamapps\common\Deadly Premonition 2\MelonLoader\Il2CppAssemblies\Assembly-CSharp-firstpass.dll - False - - - F:\Steam\steamapps\common\Deadly Premonition 2\MelonLoader\net6\Il2CppInterop.Runtime.dll - False + F:\Steam\steamapps\common\Deadly Premonition 2\BepInEx\interop\Assembly-CSharp-firstpass.dll - F:\Steam\steamapps\common\Deadly Premonition 2\MelonLoader\Il2CppAssemblies\Il2Cppmscorlib.dll - False - - - F:\Steam\steamapps\common\Deadly Premonition 2\MelonLoader\Il2CppAssemblies\Il2CppSystem.dll - False - - - F:\Steam\steamapps\common\Deadly Premonition 2\MelonLoader\net6\MelonLoader.dll - False + F:\Steam\steamapps\common\Deadly Premonition 2\BepInEx\interop\Il2Cppmscorlib.dll - F:\Steam\steamapps\common\Deadly Premonition 2\MelonLoader\Il2CppAssemblies\Unity.Postprocessing.Runtime.dll - False + F:\Steam\steamapps\common\Deadly Premonition 2\BepInEx\interop\Unity.Postprocessing.Runtime.dll + + + F:\Steam\steamapps\common\Deadly Premonition 2\BepInEx\interop\UnityEngine.dll - F:\Steam\steamapps\common\Deadly Premonition 2\MelonLoader\Il2CppAssemblies\UnityEngine.AssetBundleModule.dll + F:\Steam\steamapps\common\Deadly Premonition 2\BepInEx\interop\UnityEngine.AssetBundleModule.dll False - F:\Steam\steamapps\common\Deadly Premonition 2\MelonLoader\Il2CppAssemblies\UnityEngine.CoreModule.dll + F:\Steam\steamapps\common\Deadly Premonition 2\BepInEx\interop\UnityEngine.CoreModule.dll False - F:\Steam\steamapps\common\Deadly Premonition 2\MelonLoader\Il2CppAssemblies\UnityEngine.IMGUIModule.dll - False - - - F:\Steam\steamapps\common\Deadly Premonition 2\MelonLoader\Il2CppAssemblies\UnityEngine.InputModule.dll - False + F:\Steam\steamapps\common\Deadly Premonition 2\BepInEx\interop\UnityEngine.IMGUIModule.dll - F:\Steam\steamapps\common\Deadly Premonition 2\MelonLoader\Il2CppAssemblies\UnityEngine.PhysicsModule.dll - False - - - F:\Steam\steamapps\common\Deadly Premonition 2\MelonLoader\Il2CppAssemblies\UnityEngine.UI.dll - False + F:\Steam\steamapps\common\Deadly Premonition 2\BepInEx\interop\UnityEngine.PhysicsModule.dll + + + diff --git a/Source/SuisHack.sln b/Source/SuisHack.sln index 8831a76..ea2ce05 100644 --- a/Source/SuisHack.sln +++ b/Source/SuisHack.sln @@ -1,11 +1,9 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 -VisualStudioVersion = 17.7.34202.233 +VisualStudioVersion = 17.9.34728.123 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SuisHack", "SuisHack.csproj", "{B344E69C-7C48-4ACE-A753-8EDE330A412A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GlobalGameManagersPatcher", "..\GlobalGameManagersPatcher\GlobalGameManagersPatcher.csproj", "{D2A5DFE2-2149-463C-8CAC-C18158FE95E5}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SuisHack", "SuisHack.csproj", "{3F6052F3-FBCF-4E78-8DAA-44DCAA54C14C}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -13,19 +11,15 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B344E69C-7C48-4ACE-A753-8EDE330A412A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B344E69C-7C48-4ACE-A753-8EDE330A412A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B344E69C-7C48-4ACE-A753-8EDE330A412A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B344E69C-7C48-4ACE-A753-8EDE330A412A}.Release|Any CPU.Build.0 = Release|Any CPU - {D2A5DFE2-2149-463C-8CAC-C18158FE95E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D2A5DFE2-2149-463C-8CAC-C18158FE95E5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D2A5DFE2-2149-463C-8CAC-C18158FE95E5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D2A5DFE2-2149-463C-8CAC-C18158FE95E5}.Release|Any CPU.Build.0 = Release|Any CPU + {3F6052F3-FBCF-4E78-8DAA-44DCAA54C14C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3F6052F3-FBCF-4E78-8DAA-44DCAA54C14C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3F6052F3-FBCF-4E78-8DAA-44DCAA54C14C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3F6052F3-FBCF-4E78-8DAA-44DCAA54C14C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {48BAF355-71C9-493B-94FB-14535D1B9740} + SolutionGuid = {2E876B56-6039-49FE-86D5-3C08CF0F609D} EndGlobalSection EndGlobal diff --git a/Source/SuisHackMain.cs b/Source/SuisHackMain.cs deleted file mode 100644 index 3d3e1fd..0000000 --- a/Source/SuisHackMain.cs +++ /dev/null @@ -1,105 +0,0 @@ -using MelonLoader; -using UnityEngine; -using UnityEngine.SceneManagement; - -namespace SuisHack -{ - public class SuisHackMain : MelonMod - { - private const string OPENWORLDSCENENAME = "OpenWorld"; - - public static HarmonyLib.Harmony? harmonyInst { get; private set; } - public static MelonLogger.Instance? loggerInst { get; private set; } - - public static ExposedSettings? Settings; - private bool AppliedResolutionInMainMenu; - - public override void OnEarlyInitializeMelon() - { - loggerInst = LoggerInstance; - harmonyInst = HarmonyInstance; - LoggerInstance.Msg("Sui loaded"); - } - - public override void OnInitializeMelon() - { - LoggerInstance.Msg("Loading Sui's Hack loaded"); - Settings = new ExposedSettings(); - switch (Settings.Input_Override!.Value) - { - case ExposedSettings.InputType.SteamInput: - GamepadSupport.GamepadPrompts.Initialize(); - break; - case ExposedSettings.InputType.KeyboardAndMouse: - KeyboardSupport.KeyboardPrompts.Initialize(); - KeyboardSupport.SteamInputHook.InitializeKeyboardAndMouse(); - break; - } - } - - public override void OnLateInitializeMelon() - { - base.OnLateInitializeMelon(); - - if (Settings!.Input_Override!.Value == ExposedSettings.InputType.KeyboardAndMouse) - { - KeyboardSupport.GlobalInputHookHandler.Initialize(); - } - SettingsGUI.Initialize(); - InitializeManualHarmonyHooks(); - - - LoggerInstance.Msg("Sui's Hack loaded"); - } - - private void InitializeManualHarmonyHooks() - { - GlobalGameObjects.GlobalReplacementAtlas.Initialize(); - Hacks.NpcTestHook.Initialize(); - Hacks.Lights.LightActiveCheckHook.Initialize(); - Hacks.Lights.NpcVehicleHook.Initialize(); - } - - public override void OnSceneWasLoaded(int buildIndex, string sceneName) - { - base.OnSceneWasLoaded(buildIndex, sceneName); - if (Settings != null) - { - Application.targetFrameRate = Settings.Entry_DesiredFramerate!.Value; - if (Settings.Input_Override!.Value == ExposedSettings.InputType.SteamInput) - { - Components.VibrationController.Initialize(); - } - - if (sceneName == "TitleTest2") - { - if (!AppliedResolutionInMainMenu) - Hacks.ScreenHook.SetResolution1(); - AppliedResolutionInMainMenu = true; - GameStateMachine.MainMenu = true; - } - else if (sceneName == OPENWORLDSCENENAME) - { - GameStateMachine.Gameplay = true; - if (Settings.Entry_Other_GeometryImprovements!.Value >= ExposedSettings.GeometryImprovements.Enabled) - { - if (GameObject.FindObjectOfType() == null) - { - var scene = SceneManager.GetSceneByName(OPENWORLDSCENENAME); - var oldActiveScene = SceneManager.GetActiveScene(); - SceneManager.SetActiveScene(scene); - var newGameObject = new GameObject("WireRendererCorrection"); - SceneManager.SetActiveScene(oldActiveScene); - newGameObject.AddComponent(); - } - } - } - else - { - GameStateMachine.Gameplay = true; - LightImprovement.ModifyLights.ModifyOnSceneLoad(sceneName.ToLower()); - } - } - } - } -} \ No newline at end of file diff --git a/Source/global.json b/Source/global.json new file mode 100644 index 0000000..be21365 --- /dev/null +++ b/Source/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "7.0.408" + } +} \ No newline at end of file