mirror of
https://github.com/D1GQ/BetterAmongUs.git
synced 2026-10-20 01:46:19 +00:00
169 lines
5.4 KiB
C#
169 lines
5.4 KiB
C#
using BetterAmongUs.Data;
|
|
using BetterAmongUs.Data.Json;
|
|
using BetterAmongUs.Helpers;
|
|
using BetterAmongUs.Patches.Client;
|
|
using HarmonyLib;
|
|
using TMPro;
|
|
using UnityEngine;
|
|
|
|
namespace BetterAmongUs.Patches.Gameplay.UI;
|
|
|
|
[HarmonyPatch(typeof(PlayerTab))]
|
|
internal static class PlayerTabPatch
|
|
{
|
|
private static List<PassiveButton> presetButtons = [];
|
|
private static float cooldown = 0f;
|
|
|
|
[HarmonyPatch(nameof(PlayerTab.OnEnable))]
|
|
[HarmonyPrefix]
|
|
private static void OnEnable_Prefix(PlayerTab __instance)
|
|
{
|
|
foreach (var button in presetButtons.ToArray())
|
|
{
|
|
if (button == null) continue;
|
|
UnityEngine.Object.Destroy(button.gameObject);
|
|
}
|
|
presetButtons.Clear();
|
|
|
|
for (int i = 0; i <= 5; i++)
|
|
{
|
|
int currentI = i;
|
|
var name = currentI == 0 ? "Among Us Preset" : $"Preset {i}";
|
|
var button = __instance.CreateButton(name, new Vector3(2.5f, 1.55f - currentI * 0.45f, 0f), () =>
|
|
{
|
|
if (cooldown > 0f || BetterDataManager.BetterDataFile.SelectedOutfitPreset == currentI) return;
|
|
cooldown = 0.5f;
|
|
|
|
BetterDataManager.BetterDataFile.SelectedOutfitPreset = currentI;
|
|
|
|
foreach (var button in presetButtons)
|
|
{
|
|
if (button == null) continue;
|
|
button.SetPassiveButtonHoverStateInactive();
|
|
}
|
|
|
|
var data = OutfitData.GetOutfitData(currentI);
|
|
data.Load(() =>
|
|
{
|
|
if (LoadPlayerOutfit(data))
|
|
{
|
|
__instance.PlayerPreview.UpdateFromLocalPlayer(PlayerMaterial.MaskType.None);
|
|
}
|
|
else
|
|
{
|
|
__instance.PlayerPreview.UpdateFromDataManager(PlayerMaterial.MaskType.None);
|
|
}
|
|
});
|
|
});
|
|
presetButtons.Add(button);
|
|
}
|
|
}
|
|
|
|
private static readonly List<SpriteRenderer> _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<SpriteRenderer>();
|
|
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;
|
|
if (player != null)
|
|
{
|
|
player.RpcSetHat(data.HatId);
|
|
player.RpcSetPet(data.PetId);
|
|
player.RpcSetSkin(data.SkinId);
|
|
player.RpcSetVisor(data.VisorId);
|
|
player.RpcSetNamePlate(data.NamePlateId);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
private static PassiveButton CreateButton(this PlayerTab __instance, string name, Vector3 pos, Action callback)
|
|
{
|
|
var button = UnityEngine.Object.Instantiate(MainMenuPatch.ButtonPrefab, __instance.transform);
|
|
button.gameObject.SetActive(true);
|
|
button.gameObject.SetLayers("UI");
|
|
button.transform.localPosition = pos;
|
|
button.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
|
|
button.OnClick = new();
|
|
button.OnClick.AddListener(callback);
|
|
button.DestroyTextTranslators();
|
|
var text = button.GetComponentInChildren<TextMeshPro>();
|
|
text?.SetText(name);
|
|
return button;
|
|
}
|
|
|
|
[HarmonyPatch(nameof(PlayerTab.Update))]
|
|
[HarmonyPrefix]
|
|
private static void Updatee_Postfix(PlayerTab __instance)
|
|
{
|
|
if (cooldown > 0f)
|
|
{
|
|
cooldown -= Time.deltaTime;
|
|
}
|
|
else
|
|
{
|
|
cooldown = 0f;
|
|
}
|
|
|
|
for (int i = 0; i < presetButtons.Count; i++)
|
|
{
|
|
PassiveButton? button = presetButtons[i];
|
|
if (button == null) continue;
|
|
if (i == BetterDataManager.BetterDataFile.SelectedOutfitPreset)
|
|
{
|
|
button.SetPassiveButtonHoverStateActive();
|
|
}
|
|
}
|
|
}
|
|
}
|