diff --git a/BAUPlugin.cs b/BAUPlugin.cs index 4c7d69d..9c7b316 100644 --- a/BAUPlugin.cs +++ b/BAUPlugin.cs @@ -165,6 +165,7 @@ internal class BAUPlugin : BasePlugin internal static ConfigEntry? UnlockFPS { get; private set; } internal static ConfigEntry? ShowFPS { get; private set; } internal static ConfigEntry? CommandPrefix { get; set; } + internal static ConfigEntry? FavoriteColor { get; set; } private void LoadOptions() { PrivateOnlyLobby = Config.Bind("Mod", "PrivateOnlyLobby", false); @@ -179,6 +180,7 @@ internal class BAUPlugin : BasePlugin UnlockFPS = Config.Bind("Better Options", "UnlockFPS", false); ShowFPS = Config.Bind("Better Options", "ShowFPS", false); CommandPrefix = Config.Bind("Client Options", "CommandPrefix", "/"); + FavoriteColor = Config.Bind("Mod", "FavoriteColor", -1); } internal static string GetDataPathToAmongUs() => Application.persistentDataPath; diff --git a/Managers/UpdateManager.cs b/Managers/UpdateManager.cs index 79021f2..0767351 100644 --- a/Managers/UpdateManager.cs +++ b/Managers/UpdateManager.cs @@ -1,6 +1,7 @@ using BepInEx.Unity.IL2CPP.Utils; using BetterAmongUs.Helpers; using BetterAmongUs.Network.Loaders; +using Il2CppInterop.Runtime.Attributes; using System.Collections; using System.Reflection; using TMPro; @@ -68,6 +69,7 @@ internal class UpdateManager : MonoBehaviour private GameObject? mainMenu; private GameObject? ambience; + [HideFromIl2Cpp] private IEnumerator CoPressDownload(DoNotPressButton button) { AmUpdateing = true; diff --git a/Patches/Gameplay/Player/PlayerControlPatch.cs b/Patches/Gameplay/Player/PlayerControlPatch.cs index 1c7a7e1..c8e1397 100644 --- a/Patches/Gameplay/Player/PlayerControlPatch.cs +++ b/Patches/Gameplay/Player/PlayerControlPatch.cs @@ -1,9 +1,11 @@ -using BetterAmongUs.Helpers; +using BepInEx.Unity.IL2CPP.Utils.Collections; +using BetterAmongUs.Helpers; using BetterAmongUs.Items.Enums; using BetterAmongUs.Items.OptionItems; using BetterAmongUs.Managers; using BetterAmongUs.Mono; using HarmonyLib; +using System.Collections; namespace BetterAmongUs.Patches.Gameplay.Player; @@ -12,10 +14,25 @@ internal static class PlayerControlPatch { [HarmonyPatch(nameof(PlayerControl.Start))] [HarmonyPostfix] - private static void Start_Postfix(PlayerControl __instance) + private static void Start_Postfix(PlayerControl __instance, ref Il2CppSystem.Collections.IEnumerator __result) { BAUPlugin.AllPlayerControls.Add(__instance); OptionPlayerItem.UpdateAllValues(); + + __result = Effects.Sequence(__result, CoSetFavoriteColor(__instance).WrapToIl2Cpp()); + } + + private static IEnumerator CoSetFavoriteColor(PlayerControl player) + { + if (player.AmOwner) + { + if (BAUPlugin.FavoriteColor.Value >= 0 && player.cosmetics.ColorId != (byte)BAUPlugin.FavoriteColor.Value) + { + player.CmdCheckColor((byte)BAUPlugin.FavoriteColor.Value); + } + } + + yield break; } [HarmonyPatch(nameof(PlayerControl.OnDestroy))] diff --git a/Patches/Gameplay/Player/PlayerJoinAndLeftPatch.cs b/Patches/Gameplay/Player/PlayerJoinAndLeftPatch.cs index df7c10d..d06132e 100644 --- a/Patches/Gameplay/Player/PlayerJoinAndLeftPatch.cs +++ b/Patches/Gameplay/Player/PlayerJoinAndLeftPatch.cs @@ -33,29 +33,34 @@ internal static class OnPlayerJoinedPatch { _ = new LateTask(() => { - if (GameState.IsInGame) + if (GameState.IsHost) { - var player = Utils.PlayerFromClientId(client.Id); - - // Auto ban player on ban list - if (BetterGameSettings.UseBanPlayerList.GetBool()) + if (GameState.IsInGame) { - if (player != null) + var player = Utils.PlayerFromClientId(client.Id); + + // Auto ban player on ban list + if (BetterGameSettings.UseBanPlayerList.GetBool()) { - if (TextFileHandler.CompareStringMatch(BetterDataManager.banPlayerListFile, - BAUPlugin.AllPlayerControls.Select(player => player.Data.FriendCode) - .Concat(BAUPlugin.AllPlayerControls.Select(player => player.GetHashPuid())).ToArray())) + if (player != null) { - player.Kick(true, Translator.GetString("AntiCheat.BanPlayerListMessage"), bypassDataCheck: true); + if (TextFileHandler.CompareStringMatch(BetterDataManager.banPlayerListFile, + BAUPlugin.AllPlayerControls.Select(player => player.Data.FriendCode) + .Concat(BAUPlugin.AllPlayerControls.Select(player => player.GetHashPuid())).ToArray())) + { + player.Kick(true, Translator.GetString("AntiCheat.BanPlayerListMessage"), bypassDataCheck: true); + } } } - } - - if (BetterGameSettings.UseBanNameList.GetBool()) - { - if (TextFileHandler.CompareStringFilters(BetterDataManager.banNameListFile, [player.Data.PlayerName])) + if (BetterGameSettings.UseBanNameList.GetBool()) { - player?.Kick(true, Translator.GetString("AntiCheat.BanPlayerListMessage"), bypassDataCheck: true); + if (player != null) + { + if (TextFileHandler.CompareStringFilters(BetterDataManager.banNameListFile, [player.Data.PlayerName])) + { + player?.Kick(true, Translator.GetString("AntiCheat.BanPlayerListMessage"), bypassDataCheck: true); + } + } } } } @@ -68,6 +73,18 @@ internal static class OnPlayerLeftPatch { private static void Postfix(/*AmongUsClient __instance,*/ [HarmonyArgument(0)] ClientData data, [HarmonyArgument(1)] DisconnectReasons reason) { + if (GameState.IsLobby) + { + var favColorId = (byte)BAUPlugin.FavoriteColor.Value; + if (BAUPlugin.FavoriteColor.Value >= 0) + { + if (PlayerControl.LocalPlayer.cosmetics.ColorId != favColorId && data.ColorId == favColorId) + { + PlayerControl.LocalPlayer.CmdCheckColor(favColorId); + } + } + } + MeetingHudPatch.UpdateHostIcon(); } } diff --git a/Patches/Gameplay/UI/PlayerTabPatch.cs b/Patches/Gameplay/UI/PlayerTabPatch.cs index de5af12..3d24df6 100644 --- a/Patches/Gameplay/UI/PlayerTabPatch.cs +++ b/Patches/Gameplay/UI/PlayerTabPatch.cs @@ -16,7 +16,7 @@ internal static class PlayerTabPatch [HarmonyPatch(nameof(PlayerTab.OnEnable))] [HarmonyPrefix] - private static void OnEnable_Postfix(PlayerTab __instance) + private static void OnEnable_Prefix(PlayerTab __instance) { foreach (var button in presetButtons.ToArray()) { @@ -59,6 +59,58 @@ internal static class PlayerTabPatch } } + private static readonly List _favoriteIcons = []; + + [HarmonyPatch(nameof(PlayerTab.OnEnable))] + [HarmonyPostfix] + private static void OnEnable_Postfix(PlayerTab __instance) + { + _favoriteIcons.Clear(); + + for (int i = 0; i < __instance.ColorChips.Count; i++) + { + var index = i; + var colorChip = __instance.ColorChips[i]; + colorChip.Button.OnClick = new(); + colorChip.Button.OnClick.AddListener((Action)(() => + { + if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift)) + { + if (BAUPlugin.FavoriteColor.Value == index) + { + BAUPlugin.FavoriteColor.Value = -1; + } + else + { + BAUPlugin.FavoriteColor.Value = index; + } + + UpdateFavorite(); + return; + } + + __instance.ClickEquip(); + })); + + var checkBox = colorChip.PlayerEquippedForeground.transform.Find("CheckMark").GetComponentInChildren(); + var favoriteIcon = UnityEngine.Object.Instantiate(checkBox, colorChip.transform); + favoriteIcon.color = Color.yellow; + favoriteIcon.transform.localPosition -= new Vector3(0f, 0f, 15f); + _favoriteIcons.Add(favoriteIcon); + } + + UpdateFavorite(); + } + + private static void UpdateFavorite() + { + for (int i = 0; i < _favoriteIcons.Count; i++) + { + SpriteRenderer? fav = _favoriteIcons[i]; + fav.gameObject.SetActive(i == BAUPlugin.FavoriteColor.Value); + } + } + private static bool LoadPlayerOutfit(OutfitData data) { var player = PlayerControl.LocalPlayer;