using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using HarmonyLib; using Il2CppInterop.Runtime.Injection; using Innersloth.IO; using System.Security.Cryptography; using System.Text; using UnityEngine; namespace BetterAmongUs; public enum ReleaseTypes : int { Release, Beta, Dev, } [BepInPlugin(PluginGuid, "BetterAmongUs", PluginVersion)] [BepInProcess("Among Us.exe")] public class Main : BasePlugin { public const ReleaseTypes ReleaseBuildType = ReleaseTypes.Release; public const string BetaNum = "0"; public const string HotfixNum = "0"; public const bool IsHotFix = false; public const string PluginGuid = "com.ten.betteramongus"; public const string PluginVersion = "1.1.3"; public const string ReleaseDate = "09.16.2024"; // mm/dd/yyyy public const string Github = "https://github.com/EnhancedNetwork/BetterAmongUs-Public"; public const string Discord = "https://discord.gg/ten"; public static string modSignature { get { string GetHash(string puid) { using SHA256 sha256 = SHA256.Create(); byte[] sha256Bytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(puid)); string sha256Hash = BitConverter.ToString(sha256Bytes).Replace("-", "").ToLower(); return sha256Hash.Substring(0, 16) + sha256Hash.Substring(sha256Hash.Length - 8); } var versionData = new StringBuilder() .Append(Enum.GetName(typeof(ReleaseTypes), ReleaseBuildType)) .Append(BetaNum) .Append(HotfixNum) .Append(PluginGuid) .Append(GetVersionText().Replace(" ", ".")) .Append(ReleaseDate) .Append(Github) .Append(Discord) .Append(string.Join(".", Enum.GetNames(typeof(CustomRPC)))) .Append(string.Join(".", GetRoleName.Values)) .Append(string.Join(".", GetRoleColor.Values)) .ToString(); return GetHash(versionData); } } public static string GetVersionText(bool newLine = false) { string text = string.Empty; string newLineText = newLine ? "\n" : " "; if (ReleaseBuildType == ReleaseTypes.Release) text = $"v{BetterAmongUsVersion}"; else if (ReleaseBuildType == ReleaseTypes.Beta) text = $"v{BetterAmongUsVersion}{newLineText}Beta {Main.BetaNum}"; else if (Main.ReleaseBuildType == ReleaseTypes.Dev) text = $"v{BetterAmongUsVersion}{newLineText}Dev {Main.ReleaseDate}"; if (IsHotFix) text += $" Hotfix {HotfixNum}"; return text; } public Harmony Harmony { get; } = new Harmony(PluginGuid); public static string BetterAmongUsVersion => PluginVersion; public static string AmongUsVersion => Application.version; public static PlatformSpecificData PlatformData => Constants.GetPlatformData(); public static List SupportedAmongUsVersions = [ "2024.9.4", "2024.8.13", "2024.6.18", ]; public static string[] DevUser = [ "J4sxGDREO5bjLvzvMkv059g+7wpNg7PbyWa9vLVWQkw=", ]; public static PlayerControl[] AllPlayerControls => PlayerControl.AllPlayerControls.ToArray().Where(pc => pc != null).ToArray(); public static PlayerControl[] AllAlivePlayerControls => AllPlayerControls.ToArray().Where(pc => pc.IsAlive()).ToArray(); public static Dictionary GetRoleName => new Dictionary { { 0, "Crewmate" }, { 1, "Impostor" }, { 2, "Scientist" }, { 3, "Engineer" }, { 4, "Guardian Angel" }, { 5, "Shapeshifter" }, { 6, "Crewmate" }, { 7, "Impostor" }, { 8, "Noisemaker" }, { 9, "Phantom" }, { 10, "Tracker" } }; public static Dictionary GetRoleColor => new Dictionary { { 0, "#8cffff" }, { 1, "#f00202" }, { 2, "#00d9d9" }, { 3, "#8f8f8f" }, { 4, "#8cffff" }, { 5, "#f06102" }, { 6, "#8cffff" }, { 7, "#f00202" }, { 8, "#fc7c7c" }, { 9, "#d100b9" }, { 10, "#59f002" } }; public static ManualLogSource Logger; public static DebugMenu debugmenu { get; set; } = null; public override void Load() { try { Logger = BepInEx.Logging.Logger.CreateLogSource(PluginGuid); Harmony.PatchAll(); BetterDataManager.SetUp(); BetterDataManager.LoadData(); LoadOptions(); if (PlatformData.Platform == Platforms.StandaloneSteamPC) File.WriteAllText(Path.Combine(Environment.CurrentDirectory, "steam_appid.txt"), "945360"); if (File.Exists(Path.Combine(BetterDataManager.filePathFolder, "better-log.txt"))) File.WriteAllText(Path.Combine(BetterDataManager.filePathFolder, "better-previous-log.txt"), File.ReadAllText(Path.Combine(BetterDataManager.filePathFolder, "better-log.txt"))); File.WriteAllText(Path.Combine(BetterDataManager.filePathFolder, "better-log.txt"), ""); BetterAmongUs.Logger.Log("Better Among Us successfully loaded!"); // Set up debug menu for (int i = 0; i < DevUser.Length; i++) DevUser[i] = Encryptor.Decrypt(DevUser[i]); #if DEBUG ClassInjector.RegisterTypeInIl2Cpp(); ClassInjector.RegisterTypeInIl2Cpp(); debugmenu = AddComponent(); AddComponent(); #endif string SupportedVersions = string.Empty; foreach (string text in SupportedAmongUsVersions.ToArray()) SupportedVersions += $"{text} "; BetterAmongUs.Logger.Log($"BetterAmongUs {BetterAmongUsVersion}-{ReleaseDate} - [{AmongUsVersion} --> {SupportedVersions.Substring(0, SupportedVersions.Length - 1)}] {Utils.GetPlatformName(PlatformData.Platform)}"); } catch (Exception ex) { BetterAmongUs.Logger.Error(ex); } } public static ConfigEntry AntiCheat { get; private set; } public static ConfigEntry BetterHost { get; private set; } public static ConfigEntry BetterNotifications { get; private set; } public static ConfigEntry ChatInGameplay { get; private set; } public static ConfigEntry LobbyPlayerInfo { get; private set; } public static ConfigEntry DisableLobbyTheme { get; private set; } public static ConfigEntry UnlockFPS { get; private set; } public static ConfigEntry ShowFPS { get; private set; } public static ConfigEntry CommandPrefix { get; set; } private void LoadOptions() { AntiCheat = Config.Bind("Better Options", "AntiCheat", true); BetterHost = Config.Bind("Better Options", "BetterHost", false); BetterNotifications = Config.Bind("Better Options", "BetterNotifications", true); ChatInGameplay = Config.Bind("Better Options", "ChatInGameplay", true); LobbyPlayerInfo = Config.Bind("Better Options", "LobbyPlayerInfo", true); DisableLobbyTheme = Config.Bind("Better Options", "DisableLobbyTheme", true); UnlockFPS = Config.Bind("Better Options", "UnlockFPS", false); ShowFPS = Config.Bind("Better Options", "ShowFPS", false); CommandPrefix = Config.Bind("Client Options", "CommandPrefix", "/"); } public static string GetDataPathToAmongUs() => FileIO.GetRootDataPath(); public static string GetGamePathToAmongUs() => Environment.CurrentDirectory; }