├── AvatarLogger ├── ReMod.Core.dll ├── Reqirements.png ├── App.config ├── Config.cs ├── Models │ └── AvatarApi.cs ├── API │ ├── JSONSerializer.cs │ ├── QM │ │ ├── QMMenuBase.cs │ │ ├── QMButtonBase.cs │ │ ├── QMNestedButton.cs │ │ ├── QMToggleButton.cs │ │ ├── QMTabMenu.cs │ │ └── QMSingleButton.cs │ ├── ARES.cs │ └── APIUtils.cs ├── AvatarLogger.sln ├── Wrapper.cs ├── Properties │ └── AssemblyInfo.cs ├── BasicFunctions.cs ├── CustomNameplates.cs ├── ConfigHelper.cs ├── Patches.cs ├── Main.cs ├── AvatarLogger.csproj ├── Logging.cs └── Buttons.cs ├── A.R.E.S Plugin ├── Reqirements.png ├── ARESPlugin.sln ├── Properties │ └── AssemblyInfo.cs ├── ARESPlugin.cs ├── .gitattributes ├── ARESPlugin.csproj └── .gitignore ├── LICENSE ├── README.md ├── ARESPlugin.sln ├── .gitattributes └── .gitignore /AvatarLogger/ReMod.Core.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dean2k/ARESLogger/HEAD/AvatarLogger/ReMod.Core.dll -------------------------------------------------------------------------------- /A.R.E.S Plugin/Reqirements.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dean2k/ARESLogger/HEAD/A.R.E.S Plugin/Reqirements.png -------------------------------------------------------------------------------- /AvatarLogger/Reqirements.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dean2k/ARESLogger/HEAD/AvatarLogger/Reqirements.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Simple, you aren't free to use this code as you please, you are free to read it, learn from it, debug and understand it but redistributing copies of it is a no no. Even edited variants without the developers permission. -------------------------------------------------------------------------------- /AvatarLogger/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /AvatarLogger/Config.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace AvatarLogger 8 | { 9 | public class Config 10 | { 11 | public bool CustomNameplates { get; set; } = true; 12 | public bool Stealth { get; set; } = false; 13 | public bool LogAvatars { get; set; } = true; 14 | public bool LogWorlds { get; set; } = true; 15 | public bool LogFriendsAvatars { get; set; } = false; 16 | public bool LogOwnAvatars { get; set; } = false; 17 | public bool LogPublicAvatars { get; set; } = true; 18 | public bool LogPrivateAvatars { get; set; } = true; 19 | public bool LogToConsole { get; set; } = true; 20 | public bool ConsoleError { get; set; } = true; 21 | public bool HWIDSpoof { get; set; } = false; 22 | public bool AutoUpdate { get; set; } = true; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # A.R.E.S 2 | 3 | ARES is an avatar recovery tool! It is only for educational uses! We do not condone theft of avatars, the tool soley exists to recover avatars from within VRChat back onto new accounts and into their unity packages keeping as much of the avatar in-tact as possible! 4 | 5 | [Permanent Invite Link To Support Discord Server](https://discord.gg/AvatarRecovery ) 6 | 7 | This is the Plugins code for ARES for the main ARES Project and releases goto https://github.com/Dean2k/A.R.E.S/ 8 | 9 | Issues? Open an issue in the "Issues" tab, We will do our best to resolve your issue! 10 | 11 | License: 12 | 13 | For other software used within the project please refer to the LICENSE folder in our release binaries and GitHub repos. 14 | 15 | Simple, you aren't free to use this code as you please, you are free to read it, learn from it, debug and understand it but redistributing copies of it is a no no. Even edited variants without the developers permission. 16 | -------------------------------------------------------------------------------- /AvatarLogger/Models/AvatarApi.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace AvatarLogger.Models 8 | { 9 | public class AvatarApi 10 | { 11 | public string TimeDetected { get; set; } 12 | public string AvatarID { get; set; } 13 | public string AvatarName { get; set; } 14 | public string AvatarDescription { get; set; } 15 | public string AuthorName { get; set; } 16 | public string AuthorID { get; set; } 17 | public string PCAssetURL { get; set; } 18 | public string QUESTAssetURL { get; set; } 19 | public string ImageURL { get; set; } 20 | public string ThumbnailURL { get; set; } 21 | public string UnityVersion { get; set; } 22 | public string Releasestatus { get; set; } 23 | public string Tags { get; set; } 24 | public string Pin { get; set; } 25 | public string PinCode { get; set; } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /A.R.E.S Plugin/ARESPlugin.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.31702.278 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ARESPlugin", "ARESPlugin.csproj", "{7BF4D4C3-AB73-4678-AD20-E71E854AAB07}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {7BF4D4C3-AB73-4678-AD20-E71E854AAB07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {7BF4D4C3-AB73-4678-AD20-E71E854AAB07}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {7BF4D4C3-AB73-4678-AD20-E71E854AAB07}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {7BF4D4C3-AB73-4678-AD20-E71E854AAB07}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {B7F5574D-229F-4D23-9D2F-17CFA288D54C} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /AvatarLogger/API/JSONSerializer.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | using System.Runtime.Serialization.Json; 3 | using System.Text; 4 | 5 | namespace AvatarLogger.API 6 | { 7 | public static class JSONSerializer where TType : class 8 | { 9 | /// 10 | /// Serializes an object to JSON 11 | /// 12 | public static string Serialize(TType instance) 13 | { 14 | var serializer = new DataContractJsonSerializer(typeof(TType)); 15 | using (var stream = new MemoryStream()) 16 | { 17 | serializer.WriteObject(stream, instance); 18 | return Encoding.Default.GetString(stream.ToArray()); 19 | } 20 | } 21 | 22 | /// 23 | /// DeSerializes an object from JSON 24 | /// 25 | public static TType DeSerialize(string json) 26 | { 27 | using (var stream = new MemoryStream(Encoding.Default.GetBytes(json))) 28 | { 29 | var serializer = new DataContractJsonSerializer(typeof(TType)); 30 | return serializer.ReadObject(stream) as TType; 31 | } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /AvatarLogger/AvatarLogger.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.31702.278 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AvatarLogger", "AvatarLogger.csproj", "{49D69742-2163-4E70-8E73-7FA41C08C7A6}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {49D69742-2163-4E70-8E73-7FA41C08C7A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {49D69742-2163-4E70-8E73-7FA41C08C7A6}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {49D69742-2163-4E70-8E73-7FA41C08C7A6}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {49D69742-2163-4E70-8E73-7FA41C08C7A6}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {DD4B0273-966B-480B-8955-B5C553FDCCAF} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /AvatarLogger/API/QM/QMMenuBase.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using TMPro; 3 | using UnityEngine; 4 | using VRC.UI.Elements; 5 | using Object = UnityEngine.Object; 6 | 7 | namespace ApolloCore.API.QM 8 | { 9 | public class QMMenuBase 10 | { 11 | protected string btnQMLoc; 12 | protected GameObject MenuObject; 13 | protected TextMeshProUGUI MenuTitleText; 14 | protected UIPage MenuPage; 15 | protected string MenuName; 16 | 17 | public string GetMenuName() => MenuName; 18 | 19 | public UIPage GetMenuPage() => MenuPage; 20 | 21 | public GameObject GetMenuObject() => MenuObject; 22 | 23 | public void SetMenuTitle(string newTitle) => MenuObject.GetComponentInChildren(true).text = newTitle; 24 | 25 | public void ClearChildren() 26 | { 27 | for (int i = 0; i < MenuObject.transform.childCount; i++) 28 | { 29 | if (MenuObject.transform.GetChild(i).name != "Header_H1" && MenuObject.transform.GetChild(i).name != "ScrollRect") 30 | { 31 | Object.Destroy(MenuObject.transform.GetChild(i).gameObject); 32 | } 33 | } 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /AvatarLogger/API/QM/QMButtonBase.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using UnityEngine; 3 | using VRC.UI.Elements.Tooltips; 4 | 5 | namespace ApolloCore.API.QM 6 | { 7 | public class QMButtonBase 8 | { 9 | protected GameObject button; 10 | protected string btnQMLoc; 11 | protected int[] initShift = { 0, 0 }; 12 | 13 | public GameObject GetGameObject() => button; 14 | 15 | public void SetActive(bool state) => button.gameObject.SetActive(state); 16 | 17 | public void SetLocation(float buttonXLoc, float buttonYLoc) 18 | { 19 | button.GetComponent().anchoredPosition += Vector2.right * (232 * (buttonXLoc + initShift[0])); 20 | button.GetComponent().anchoredPosition += Vector2.down * (210 * (buttonYLoc + initShift[1])); 21 | } 22 | 23 | public void SetToolTip(string buttonToolTip) => button.GetComponents().ToList().ForEach(x => x.field_Public_String_0 = buttonToolTip); 24 | 25 | public void DestroyMe() 26 | { 27 | try 28 | { 29 | UnityEngine.Object.Destroy(button); 30 | } 31 | catch { } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /AvatarLogger/Wrapper.cs: -------------------------------------------------------------------------------- 1 | using VRC; 2 | using VRC.Core; 3 | using VRC.SDKBase; 4 | 5 | namespace AvatarLogger 6 | { 7 | internal static class Wrapper 8 | { 9 | public static VRCPlayerApi GetVrcPlayerApi(this Player instance) 10 | { 11 | return instance?.prop_VRCPlayerApi_0; 12 | } 13 | 14 | public static ApiAvatar GetAvatarInfo(this Player instance) 15 | { 16 | return instance?.prop_ApiAvatar_0; 17 | } 18 | 19 | public static string GetAvatarStatus(this Player player) 20 | { 21 | var status = player.GetAvatarInfo().releaseStatus.ToLower(); 22 | if (status == "public") 23 | return "" + status + ""; 24 | return "" + status + ""; 25 | } 26 | 27 | public static string GetPlatform(this Player player) 28 | { 29 | if (player != null) 30 | { 31 | if (player.field_Private_APIUser_0.IsOnMobile) 32 | return "Q"; 33 | if (player.GetVrcPlayerApi().IsUserInVR()) 34 | return "V"; 35 | return "PC"; 36 | } return ""; 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /A.R.E.S Plugin/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("AvatarLogger")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("AvatarLogger")] 13 | [assembly: AssemblyCopyright("Copyright © 2021")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("7bf4d4c3-ab73-4678-ad20-e71e854aab07")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /AvatarLogger/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("AvatarLogger")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("AvatarLogger")] 13 | [assembly: AssemblyCopyright("Copyright © 2021")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("49d69742-2163-4e70-8e73-7fa41c08c7a6")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /ARESPlugin.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.32126.315 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ARESPlugin", "A.R.E.S Plugin\ARESPlugin.csproj", "{7BF4D4C3-AB73-4678-AD20-E71E854AAB07}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AvatarLogger", "AvatarLogger\AvatarLogger.csproj", "{49D69742-2163-4E70-8E73-7FA41C08C7A6}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|Any CPU = Debug|Any CPU 13 | Release|Any CPU = Release|Any CPU 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {7BF4D4C3-AB73-4678-AD20-E71E854AAB07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 17 | {7BF4D4C3-AB73-4678-AD20-E71E854AAB07}.Debug|Any CPU.Build.0 = Debug|Any CPU 18 | {7BF4D4C3-AB73-4678-AD20-E71E854AAB07}.Release|Any CPU.ActiveCfg = Release|Any CPU 19 | {7BF4D4C3-AB73-4678-AD20-E71E854AAB07}.Release|Any CPU.Build.0 = Release|Any CPU 20 | {49D69742-2163-4E70-8E73-7FA41C08C7A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 21 | {49D69742-2163-4E70-8E73-7FA41C08C7A6}.Debug|Any CPU.Build.0 = Debug|Any CPU 22 | {49D69742-2163-4E70-8E73-7FA41C08C7A6}.Release|Any CPU.ActiveCfg = Release|Any CPU 23 | {49D69742-2163-4E70-8E73-7FA41C08C7A6}.Release|Any CPU.Build.0 = Release|Any CPU 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | GlobalSection(ExtensibilityGlobals) = postSolution 29 | SolutionGuid = {F4A62E0E-6F76-40D6-92F0-B3FDD27789A3} 30 | EndGlobalSection 31 | EndGlobal 32 | -------------------------------------------------------------------------------- /AvatarLogger/BasicFunctions.cs: -------------------------------------------------------------------------------- 1 | //Importing all reqired modules 2 | using System.IO; 3 | using UnityEngine; 4 | using MelonLoader; 5 | using UnhollowerBaseLib; 6 | using System; 7 | using System.Threading; 8 | using System.Security.Cryptography; 9 | using System.Collections.Generic; 10 | using System.Net; 11 | using static AvatarLogger.Buttons; 12 | 13 | namespace AvatarLogger 14 | { 15 | public static class BaseFunctions 16 | { 17 | internal static Sprite LoadSpriteFromDisk(string path) 18 | { 19 | if (string.IsNullOrEmpty(path)) 20 | { 21 | return null; 22 | } 23 | byte[] data = File.ReadAllBytes(path); 24 | 25 | if (data == null || data.Length <= 0) 26 | { 27 | return null; 28 | } 29 | Texture2D tex = new Texture2D(512, 512); 30 | if (!Il2CppImageConversionManager.LoadImage(tex, data)) 31 | { 32 | return null; 33 | } 34 | Sprite sprite = Sprite.CreateSprite(tex, new Rect(0.0f, 0.0f, tex.width, tex.height), new Vector2(0.5f, 0.5f), 100.0f, 0, 0, new Vector4(), false); 35 | sprite.hideFlags |= HideFlags.DontUnloadUnusedAsset; 36 | return sprite; 37 | } 38 | 39 | public static string Sha256CheckSum(string filePath) 40 | { 41 | using (var hash = SHA256.Create()) 42 | { 43 | using (FileStream fileStream = File.OpenRead(filePath)) 44 | { 45 | return Convert.ToBase64String(hash.ComputeHash(fileStream)); 46 | } 47 | } 48 | } 49 | 50 | public static void DownloadPlugin(KeyValuePair pair) 51 | { 52 | using (WebClient client = new WebClient()) 53 | { 54 | client.DownloadFile(pair.Value, pair.Key); 55 | } 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /AvatarLogger/CustomNameplates.cs: -------------------------------------------------------------------------------- 1 | using Photon.Realtime; 2 | using System; 3 | using System.Linq; 4 | using TMPro; 5 | using UnityEngine; 6 | using VRC; 7 | using Object = UnityEngine.Object; 8 | 9 | namespace AvatarLogger 10 | { 11 | public class CustomNameplate : MonoBehaviour, IDisposable 12 | { 13 | //private ImageThreeSlice _background; 14 | private TextMeshProUGUI _statsText; 15 | public VRC.Player Player; 16 | 17 | public CustomNameplate(IntPtr ptr) : base(ptr) 18 | { 19 | } 20 | 21 | public void Dispose() 22 | { 23 | _statsText.text = null; 24 | _statsText.OnDisable(); 25 | //_background.OnDisable(); 26 | enabled = false; 27 | } 28 | 29 | private void Start() 30 | { 31 | if (enabled) 32 | { 33 | var namePlateManager = Player._vrcplayer.field_Public_PlayerNameplate_0;//Object.FindObjectsOfType().FirstOrDefault(x=>x.prop_VRCPlayer_0._player == Player); 34 | var PlateTemplate = namePlateManager.field_Public_GameObject_5.transform; 35 | var stats = Instantiate(PlateTemplate,PlateTemplate); 36 | stats.parent = namePlateManager.transform; 37 | stats.gameObject.SetActive(true); 38 | _statsText = stats.Find("Trust Text").GetComponent(); 39 | _statsText.color = Color.white; 40 | stats.Find("Trust Icon").gameObject.SetActive(false); 41 | stats.Find("Performance Icon").gameObject.SetActive(false); 42 | stats.Find("Performance Text").gameObject.SetActive(false); 43 | stats.Find("Friend Anchor Stats").gameObject.SetActive(false); 44 | 45 | //_background = gameObject.transform.Find("Contents/Main/Background").GetComponent(); 46 | 47 | //_background._sprite = VRCPlayer.field_Internal_Static_VRCPlayer_0.transform 48 | // .Find("Player Nameplate/Canvas/Nameplate/Contents/Main/Glow").GetComponent() 49 | // ._sprite; 50 | //_background.color = Color.black; 51 | } 52 | } 53 | 54 | private void Update() 55 | { 56 | if (enabled) _statsText.text = $"[{Player.GetPlatform()}] | " + $"[{Player.GetAvatarStatus()}]"; 57 | } 58 | } 59 | } -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /A.R.E.S Plugin/ARESPlugin.cs: -------------------------------------------------------------------------------- 1 | using MelonLoader; 2 | using System; 3 | using System.IO; 4 | using System.Net; 5 | using System.Collections.Generic; 6 | using System.Security.Cryptography; 7 | 8 | [assembly: MelonInfo(typeof(ARESPlugin.Updater), "ARES Manager", "2.0", "ShrekamusChrist, LargestBoi (Retired)")] 9 | [assembly: MelonColor(ConsoleColor.Yellow)] 10 | [assembly: MelonGame("VRChat", "VRChat")] 11 | 12 | namespace ARESPlugin 13 | { 14 | public class Updater : MelonPlugin 15 | { 16 | private Dictionary _files = new Dictionary(); 17 | 18 | public override void OnPreInitialization() 19 | { 20 | bool skipUpdates = false; 21 | string[] arguments = Environment.GetCommandLineArgs(); 22 | foreach (string item in arguments) 23 | { 24 | if(item.ToLower() == "-shrekno") 25 | { 26 | skipUpdates = true; 27 | MelonLogger.Msg("Skipping Updating ARES"); 28 | } 29 | } 30 | 31 | if (!skipUpdates) 32 | { 33 | _files.Add($"{MelonHandler.ModsDirectory}\\AvatarLogger.dll", "https://github.com/Dean2k/ARESLogger/releases/latest/download/AvatarLogger.dll"); 34 | _files.Add($"{MelonUtils.GameDirectory}\\ARESLogo.png", "https://github.com/Dean2k/ARESLogger/releases/latest/download/ARESLogo.png"); 35 | 36 | foreach (KeyValuePair pair in _files) 37 | { 38 | string name = pair.Key.Substring(pair.Key.LastIndexOf('\\') + 1); 39 | if (File.Exists(pair.Key)) 40 | { 41 | var oldHash = Sha256CheckSum(pair.Key); 42 | DownloadMod(pair); 43 | if (Sha256CheckSum(pair.Key) != oldHash) 44 | { 45 | MelonLogger.Msg($"Updated: {name}!"); 46 | } 47 | } 48 | else 49 | { 50 | DownloadMod(pair); 51 | } 52 | } 53 | } 54 | } 55 | 56 | private static void DownloadMod(KeyValuePair pair) 57 | { 58 | using WebClient client = new WebClient(); 59 | client.DownloadFile(pair.Value, pair.Key); 60 | } 61 | 62 | private string Sha256CheckSum(string filePath) 63 | { 64 | using var hash = SHA256.Create(); 65 | using FileStream fileStream = File.OpenRead(filePath); 66 | return Convert.ToBase64String(hash.ComputeHash(fileStream)); 67 | } 68 | } 69 | } -------------------------------------------------------------------------------- /A.R.E.S Plugin/.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /A.R.E.S Plugin/ARESPlugin.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {7BF4D4C3-AB73-4678-AD20-E71E854AAB07} 8 | Library 9 | Properties 10 | ARESPlugin 11 | ARESPlugin 12 | v4.8 13 | 8.0 14 | 512 15 | true 16 | 17 | 18 | 19 | true 20 | full 21 | false 22 | bin\Debug\ 23 | DEBUG;TRACE 24 | prompt 25 | 4 26 | true 27 | 28 | 29 | pdbonly 30 | true 31 | bin\Release\ 32 | TRACE 33 | prompt 34 | 4 35 | true 36 | 37 | 38 | 39 | ..\..\ReModCE\3rdparty\ml\MelonLoader.dll 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /AvatarLogger/ConfigHelper.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using System.Reflection; 4 | using HarmonyLib; 5 | using Newtonsoft.Json; 6 | 7 | #pragma warning disable IDE0044 8 | 9 | namespace AvatarLogger 10 | { 11 | public class ConfigHelper where T : class 12 | { 13 | private static ConfigHelper _instance; 14 | private readonly string _configPath; 15 | private readonly HarmonyLib.Harmony _harmonyInstance = new HarmonyLib.Harmony($"ConfigHelper_[{typeof(T)}]"); 16 | private readonly bool _saveOnUpdate; 17 | public T Config; 18 | 19 | public ConfigHelper(string configPath, bool saveOnUpdate = false) 20 | { 21 | _instance = this; 22 | _configPath = configPath; 23 | _saveOnUpdate = saveOnUpdate; 24 | 25 | if (!File.Exists(_configPath)) 26 | File.WriteAllText(_configPath, 27 | JsonConvert.SerializeObject(Activator.CreateInstance(typeof(T)), Formatting.Indented)); 28 | Config = JsonConvert.DeserializeObject(File.ReadAllText(_configPath)); 29 | File.WriteAllText(_configPath, JsonConvert.SerializeObject(Config, Formatting.Indented)); 30 | 31 | var watcher = new FileSystemWatcher(Path.GetDirectoryName(_configPath), Path.GetFileName(_configPath)) 32 | { 33 | NotifyFilter = NotifyFilters.LastWrite, 34 | EnableRaisingEvents = true 35 | }; 36 | watcher.Changed += FileUpdated; 37 | 38 | foreach (var property in typeof(T).GetProperties()) 39 | _harmonyInstance.Patch(property.GetSetMethod(), 40 | postfix: new HarmonyMethod(GetType().GetMethod(nameof(PropertyUpdated), 41 | BindingFlags.NonPublic | BindingFlags.Static))); 42 | } 43 | 44 | public event Action OnConfigUpdated; 45 | 46 | private void FileUpdated(object obj, FileSystemEventArgs args) 47 | { 48 | var fileConfig = JsonConvert.DeserializeObject(File.ReadAllText(_configPath)); 49 | foreach (var property in fileConfig.GetType().GetProperties()) 50 | { 51 | var property0 = Config.GetType().GetProperty(nameof(property.Name)); 52 | if (property0 == null) continue; 53 | if (property.GetValue(fileConfig) != property0.GetValue(Config)) 54 | { 55 | Config = fileConfig; 56 | OnConfigUpdated?.Invoke(); 57 | break; 58 | } 59 | } 60 | } 61 | 62 | private static void PropertyUpdated() 63 | { 64 | if (_instance._saveOnUpdate) _instance.SaveConfig(); 65 | _instance.OnConfigUpdated?.Invoke(); 66 | } 67 | 68 | public void SaveConfig() 69 | { 70 | File.WriteAllText(_configPath, JsonConvert.SerializeObject(Config, Formatting.Indented)); 71 | } 72 | } 73 | } -------------------------------------------------------------------------------- /AvatarLogger/API/ARES.cs: -------------------------------------------------------------------------------- 1 | using AvatarLogger.Models; 2 | using MelonLoader; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.IO; 6 | using System.Linq; 7 | using System.Net; 8 | using System.Text; 9 | using System.Threading.Tasks; 10 | using VRC; 11 | using VRC.Core; 12 | 13 | namespace AvatarLogger.API 14 | { 15 | public static class ARES 16 | { 17 | private static List avatarsIds = new List(); 18 | public static void AddAvatar(ApiAvatar avatar, Player player) 19 | { 20 | try 21 | { 22 | if (avatarsIds.Contains(avatar.id)) 23 | { 24 | return; 25 | } 26 | AvatarApi avatarApi = new AvatarApi 27 | { 28 | PCAssetURL = avatar.assetUrl, 29 | ImageURL = avatar.imageUrl, 30 | ThumbnailURL = avatar.thumbnailImageUrl, 31 | AvatarID = avatar.id, 32 | Tags = "None", 33 | AuthorID = avatar.authorId, 34 | AuthorName = avatar.authorName, 35 | AvatarDescription = avatar.description, 36 | AvatarName = avatar.name, 37 | QUESTAssetURL = "None", //This can be QUESTAssetURL = "None", if no quest asseturl is there. 38 | Releasestatus = avatar.releaseStatus, 39 | UnityVersion = avatar.unityVersion, 40 | TimeDetected = "1649875469", 41 | Pin = "false", 42 | PinCode = "None" 43 | }; 44 | var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://api.ares-mod.com/records/Avatars"); 45 | httpWebRequest.ContentType = "application/json"; 46 | httpWebRequest.Method = "POST"; 47 | httpWebRequest.UserAgent = $"ARES Client"; 48 | 49 | string jsonPost = JSONSerializer.Serialize(avatarApi); 50 | using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) 51 | { 52 | streamWriter.Write(jsonPost); 53 | } 54 | try 55 | { 56 | var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 57 | using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) 58 | { 59 | var result = streamReader.ReadToEnd(); 60 | } 61 | MelonLogger.Msg(ConsoleColor.Green, $"Avatar: {avatar.id} uploaded to API | from player {player.field_Private_APIUser_0.displayName}"); 62 | } 63 | catch (Exception ex) 64 | { 65 | if (ex.Message.Contains("(409) Conflict")) 66 | { 67 | MelonLogger.Msg(ConsoleColor.Red, $"Avatar: {avatar.id} already on API | from player {player.field_Private_APIUser_0.displayName}"); 68 | } 69 | } 70 | avatarsIds.Add(avatar.id); 71 | } 72 | catch 73 | { 74 | MelonLogger.Msg(ConsoleColor.Red, "Avatar Logging Error"); 75 | } 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /AvatarLogger/Patches.cs: -------------------------------------------------------------------------------- 1 | //Importing reqired modules 2 | 3 | using System; 4 | using System.Linq; 5 | using System.Reflection; 6 | using System.Security.Cryptography; 7 | using System.Text; 8 | using ExitGames.Client.Photon; 9 | using HarmonyLib; 10 | using MelonLoader; 11 | using Photon.Realtime; 12 | using UnityEngine; 13 | using VRC.Core; 14 | using Object = UnityEngine.Object; 15 | using Random = System.Random; 16 | 17 | //Contains all patches ARES makes to VRChat 18 | namespace AvatarLogger 19 | { 20 | internal static class Patches 21 | { 22 | //Creates new instance to patch on 23 | private static HarmonyLib.Harmony _instance = new HarmonyLib.Harmony("ARES"); 24 | private static string newHWID = ""; 25 | 26 | //Enables avatar cloning regadless of what the person has their clone setting on 27 | public static void AllowAvatarCopyingPatch() 28 | { 29 | _instance.Patch(typeof(APIUser).GetProperty(nameof(APIUser.allowAvatarCopying)).GetSetMethod(), 30 | new HarmonyMethod(typeof(Patches).GetMethod(nameof(ForceClone), 31 | BindingFlags.NonPublic | BindingFlags.Static))); 32 | } 33 | 34 | public static void HWIDPatch() 35 | { 36 | _instance.Patch(typeof(SystemInfo).GetProperty("deviceUniqueIdentifier").GetGetMethod(), 37 | new HarmonyMethod(AccessTools.Method(typeof(Patches), nameof(FakeHWID)))); 38 | } 39 | 40 | private static bool FakeHWID(ref string __result) 41 | { 42 | if (newHWID == "") 43 | { 44 | newHWID = KeyedHashAlgorithm.Create().ComputeHash(Encoding.UTF8.GetBytes(string.Format( 45 | "{0}A-{1}{2}-{3}{4}-{5}{6}-3C-1F", new object[] 46 | { 47 | new Random().Next(0, 9), 48 | new Random().Next(0, 9), 49 | new Random().Next(0, 9), 50 | new Random().Next(0, 9), 51 | new Random().Next(0, 9), 52 | new Random().Next(0, 9), 53 | new Random().Next(0, 9) 54 | }))).Select(delegate (byte x) 55 | { 56 | byte b = x; 57 | return b.ToString("x2"); 58 | }).Aggregate((string x, string y) => x + y); 59 | MelonLogger.Msg("[HWID] new " + newHWID); 60 | } 61 | 62 | __result = newHWID; 63 | return false; 64 | } 65 | 66 | private static void ForceClone(ref bool __0) => __0 = true; 67 | 68 | //All the possible routes leading to an avatar being logged 69 | public static void OnEventPatch() 70 | { 71 | _instance.Patch(typeof(LoadBalancingClient).GetMethod("OnEvent"), 72 | new HarmonyMethod(typeof(Patches).GetMethod(nameof(OnEventLBC), 73 | BindingFlags.NonPublic | BindingFlags.Static)), null, null, null, null); 74 | } 75 | 76 | private static bool OnEventLBC(EventData __0) 77 | { 78 | var eventCode = __0.Code; 79 | switch (eventCode) 80 | { 81 | case 42: 82 | return LogAvatar(__0.sender); 83 | case 223: 84 | return LogAvatar(__0.sender); 85 | default: 86 | return true; 87 | } 88 | } 89 | 90 | 91 | private static bool LogAvatar(int sender) 92 | { 93 | if (sender != -1) 94 | { 95 | VRCPlayer player = Object.FindObjectsOfType().FirstOrDefault(x => x._playerNet.prop_Int32_1 == sender); 96 | Logging.ExecuteLog(player._player, true); 97 | } 98 | 99 | return true; 100 | } 101 | } 102 | } -------------------------------------------------------------------------------- /AvatarLogger/API/QM/QMNestedButton.cs: -------------------------------------------------------------------------------- 1 | using Il2CppSystem.Collections.Generic; 2 | using System; 3 | using System.Linq; 4 | using TMPro; 5 | using UnityEngine; 6 | using UnityEngine.UI; 7 | using VRC.UI.Elements; 8 | using VRC.UI.Elements.Menus; 9 | using static VRC.UI.Elements.UIPage; 10 | using Object = UnityEngine.Object; 11 | 12 | namespace ApolloCore.API.QM 13 | { 14 | public class QMNestedButton : QMMenuBase 15 | { 16 | protected bool IsMenuRoot; 17 | protected GameObject BackButton; 18 | protected QMSingleButton MainButton; 19 | 20 | public QMNestedButton(QMTabMenu location, float posX, float posY, string btnText, string toolTipText, string menuTitle, bool halfButton = false) 21 | { 22 | btnQMLoc = location.GetMenuName(); 23 | Initialize(false, btnText, posX, posY, toolTipText, menuTitle, halfButton); 24 | } 25 | 26 | public QMNestedButton(QMNestedButton location, float posX, float posY, string btnText, string toolTipText, string menuTitle, bool halfButton = false) 27 | { 28 | btnQMLoc = location.GetMenuName(); 29 | Initialize(false, btnText, posX, posY, toolTipText, menuTitle, halfButton); 30 | } 31 | 32 | private void Initialize(bool isRoot, string btnText, float btnPosX, float btnPosY, string btnToolTipText, string menuTitle, bool halfButton) 33 | { 34 | MenuName = $"{APIUtils.Identifier}-Menu-{APIUtils.RandomNumbers()}"; 35 | MenuObject = Object.Instantiate(APIUtils.GetQMMenuTemplate(), APIUtils.GetQMMenuTemplate().transform.parent); 36 | MenuObject.name = MenuName; 37 | MenuObject.SetActive(false); 38 | Object.DestroyImmediate(MenuObject.GetComponent()); 39 | MenuPage = MenuObject.AddComponent(); 40 | MenuPage.field_Public_String_0 = MenuName; 41 | MenuPage.field_Protected_MenuStateController_0 = APIUtils.MenuStateControllerInstance; 42 | MenuPage.field_Private_List_1_UIPage_0 = new List(); 43 | MenuPage.field_Private_List_1_UIPage_0.Add(MenuPage); 44 | APIUtils.MenuStateControllerInstance.field_Private_Dictionary_2_String_UIPage_0.Add(MenuName, MenuPage); 45 | 46 | IsMenuRoot = isRoot; 47 | 48 | if (IsMenuRoot) 49 | { 50 | var list = APIUtils.MenuStateControllerInstance.field_Public_ArrayOf_UIPage_0.ToList(); 51 | list.Add(MenuPage); 52 | APIUtils.MenuStateControllerInstance.field_Public_ArrayOf_UIPage_0 = list.ToArray(); 53 | } 54 | 55 | MenuObject.transform.Find("ScrollRect/Viewport/VerticalLayoutGroup").DestroyChildren(); 56 | MenuTitleText = MenuObject.GetComponentInChildren(true); 57 | SetMenuTitle(menuTitle); 58 | BackButton = MenuObject.transform.GetChild(0).Find("LeftItemContainer/Button_Back").gameObject; 59 | BackButton.SetActive(true); 60 | BackButton.GetComponentInChildren