├── 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