mirror of
https://github.com/D1GQ/BetterAmongUs.git
synced 2026-10-20 01:46:19 +00:00
Fixes
This commit is contained in:
1 parent
c4d7388f2c
commit
7e54af49d2
4 files changed
+168
-10
No files matched your search
@@ -4,12 +4,35 @@ using UnityEngine;
|
||||
|
||||
namespace BetterAmongUs.Helpers;
|
||||
|
||||
internal class BetterPlayerControl(IntPtr intPtr) : MonoBehaviour(intPtr)
|
||||
internal class ExtendedPlayerControl : MonoBehaviour
|
||||
{
|
||||
internal static readonly HashSet<(PlayerControl player, ExtendedPlayerControl extendedPlayer)> AllExtendedPlayerControl = [];
|
||||
|
||||
internal PlayerControl? _Player { get; set; }
|
||||
internal TextMeshPro? InfoTextInfo { get; set; }
|
||||
internal TextMeshPro? InfoTextTop { get; set; }
|
||||
internal TextMeshPro? InfoTextBottom { get; set; }
|
||||
|
||||
internal void Start()
|
||||
{
|
||||
var player = gameObject.GetComponent<PlayerControl>();
|
||||
if (player != null)
|
||||
{
|
||||
if (!AllExtendedPlayerControl.Any(items => items.extendedPlayer == this))
|
||||
{
|
||||
AllExtendedPlayerControl.Add((player, this));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Destroy(this);
|
||||
}
|
||||
}
|
||||
|
||||
internal void OnDestroy()
|
||||
{
|
||||
AllExtendedPlayerControl.RemoveWhere(items => items.extendedPlayer == this);
|
||||
}
|
||||
}
|
||||
|
||||
internal static class PlayerControlExtension
|
||||
@@ -50,7 +73,7 @@ internal static class PlayerControlExtension
|
||||
{
|
||||
if (pc.BetterPlayerControl() == null)
|
||||
{
|
||||
BetterPlayerControl newExtendedPc = pc.gameObject.AddComponent<BetterPlayerControl>();
|
||||
ExtendedPlayerControl newExtendedPc = pc.gameObject.AddComponent<ExtendedPlayerControl>();
|
||||
newExtendedPc._Player = pc;
|
||||
newExtendedPc.InfoTextInfo = InfoText_Info_TMP;
|
||||
newExtendedPc.InfoTextTop = InfoText_T_TMP;
|
||||
@@ -59,13 +82,13 @@ internal static class PlayerControlExtension
|
||||
}
|
||||
}
|
||||
|
||||
internal static BetterPlayerControl? BetterPlayerControl(this PlayerControl player)
|
||||
internal static ExtendedPlayerControl? BetterPlayerControl(this PlayerControl player)
|
||||
{
|
||||
return player?.GetComponent<BetterPlayerControl>();
|
||||
return ExtendedPlayerControl.AllExtendedPlayerControl.FirstOrDefault(items => items.player == player).extendedPlayer ?? null;
|
||||
}
|
||||
|
||||
internal static BetterPlayerControl? BetterPlayerControl(this PlayerPhysics playerPhysics)
|
||||
internal static ExtendedPlayerControl? BetterPlayerControl(this PlayerPhysics playerPhysics)
|
||||
{
|
||||
return playerPhysics?.GetComponent<BetterPlayerControl>();
|
||||
return ExtendedPlayerControl.AllExtendedPlayerControl.FirstOrDefault(items => items.player == playerPhysics.myPlayer).extendedPlayer ?? null;
|
||||
}
|
||||
}
|
||||
@@ -10,6 +10,8 @@ namespace BetterAmongUs.Helpers;
|
||||
|
||||
internal class ExtendedPlayerInfo : MonoBehaviour
|
||||
{
|
||||
internal static readonly HashSet<(NetworkedPlayerInfo data, ExtendedPlayerInfo extendedData)> AllExtendedPlayerInfo = [];
|
||||
|
||||
private bool hasSet = false;
|
||||
internal void SetInfo(NetworkedPlayerInfo data)
|
||||
{
|
||||
@@ -21,6 +23,28 @@ internal class ExtendedPlayerInfo : MonoBehaviour
|
||||
}
|
||||
|
||||
private float timeAccumulator = 0f;
|
||||
|
||||
internal void Start()
|
||||
{
|
||||
var data = gameObject.GetComponent<NetworkedPlayerInfo>();
|
||||
if (data != null)
|
||||
{
|
||||
if (!AllExtendedPlayerInfo.Any(items => items.extendedData == this))
|
||||
{
|
||||
AllExtendedPlayerInfo.Add((data, this));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Destroy(this);
|
||||
}
|
||||
}
|
||||
|
||||
internal void OnDestroy()
|
||||
{
|
||||
AllExtendedPlayerInfo.RemoveWhere(items => items.extendedData == this);
|
||||
}
|
||||
|
||||
internal void Update()
|
||||
{
|
||||
var time = Time.deltaTime;
|
||||
@@ -137,19 +161,19 @@ internal static class PlayerControlDataExtension
|
||||
// Get BetterData from PlayerControl
|
||||
internal static ExtendedPlayerInfo? BetterData(this PlayerControl player)
|
||||
{
|
||||
return player?.Data?.GetComponent<ExtendedPlayerInfo>();
|
||||
return ExtendedPlayerInfo.AllExtendedPlayerInfo.FirstOrDefault(items => items.data == player.Data).extendedData ?? null;
|
||||
}
|
||||
|
||||
// Get BetterData from NetworkedPlayerInfo
|
||||
internal static ExtendedPlayerInfo? BetterData(this NetworkedPlayerInfo data)
|
||||
{
|
||||
return data?.GetComponent<ExtendedPlayerInfo>();
|
||||
return ExtendedPlayerInfo.AllExtendedPlayerInfo.FirstOrDefault(items => items.data == data).extendedData ?? null;
|
||||
}
|
||||
|
||||
// Get BetterData from ClientData
|
||||
internal static ExtendedPlayerInfo? BetterData(this ClientData data)
|
||||
{
|
||||
var player = Utils.PlayerFromClientId(data.Id);
|
||||
return player?.Data?.GetComponent<ExtendedPlayerInfo>();
|
||||
return ExtendedPlayerInfo.AllExtendedPlayerInfo.FirstOrDefault(items => items.data == player.Data).extendedData ?? null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
using Il2CppInterop.Runtime;
|
||||
using UnityEngine;
|
||||
|
||||
namespace BetterAmongUs.Modules;
|
||||
|
||||
internal abstract class MonoExtension : MonoBehaviour
|
||||
{
|
||||
private static readonly Dictionary<Type, List<ExtensionPair>> _extensionsByBaseType = new();
|
||||
private MonoBehaviour? _baseMono;
|
||||
|
||||
protected MonoBehaviour? BaseMono
|
||||
{
|
||||
get => _baseMono;
|
||||
private set => _baseMono = value;
|
||||
}
|
||||
|
||||
private struct ExtensionPair
|
||||
{
|
||||
public MonoBehaviour? Base;
|
||||
public MonoExtension? Extension;
|
||||
}
|
||||
|
||||
public static T? Get<T>(MonoBehaviour mono) where T : MonoExtension
|
||||
{
|
||||
if (_extensionsByBaseType.TryGetValue(mono.GetType(), out var extensions))
|
||||
{
|
||||
foreach (var pair in extensions)
|
||||
{
|
||||
if (pair.Base == mono && pair.Extension is T result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
protected bool RegisterExtension<T>() where T : MonoBehaviour
|
||||
{
|
||||
var baseComponent = GetComponent(Il2CppType.From(typeof(T))) as T;
|
||||
if (baseComponent == null)
|
||||
{
|
||||
Destroy(this);
|
||||
return false;
|
||||
}
|
||||
|
||||
var existingExtensions = GetComponents(Il2CppType.From(GetType()));
|
||||
if (existingExtensions.Length > 1)
|
||||
{
|
||||
Destroy(this);
|
||||
return false;
|
||||
}
|
||||
|
||||
var baseType = typeof(T);
|
||||
if (!_extensionsByBaseType.TryGetValue(baseType, out var extensions))
|
||||
{
|
||||
extensions = new List<ExtensionPair>();
|
||||
_extensionsByBaseType[baseType] = extensions;
|
||||
}
|
||||
|
||||
extensions.Add(new ExtensionPair { Base = baseComponent, Extension = this });
|
||||
BaseMono = baseComponent;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
protected void UnregisterExtension<T>() where T : MonoBehaviour
|
||||
{
|
||||
if (BaseMono == null) return;
|
||||
|
||||
if (_extensionsByBaseType.TryGetValue(typeof(T), out var extensions))
|
||||
{
|
||||
for (int i = extensions.Count - 1; i >= 0; i--)
|
||||
{
|
||||
if (extensions[i].Extension == this)
|
||||
{
|
||||
extensions.RemoveAt(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (extensions.Count == 0)
|
||||
{
|
||||
_extensionsByBaseType.Remove(typeof(T));
|
||||
}
|
||||
}
|
||||
|
||||
BaseMono = null;
|
||||
}
|
||||
|
||||
public static void CleanAll()
|
||||
{
|
||||
foreach (var kvp in _extensionsByBaseType.ToArray())
|
||||
{
|
||||
var extensions = kvp.Value;
|
||||
for (int i = extensions.Count - 1; i >= 0; i--)
|
||||
{
|
||||
if (extensions[i].Base == null || extensions[i].Extension == null)
|
||||
{
|
||||
extensions.RemoveAt(i);
|
||||
}
|
||||
}
|
||||
|
||||
if (extensions.Count == 0)
|
||||
{
|
||||
_extensionsByBaseType.Remove(kvp.Key);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -28,7 +28,7 @@ internal enum ReleaseTypes : int
|
||||
internal class Main : BasePlugin
|
||||
{
|
||||
internal static readonly ReleaseTypes ReleaseBuildType = ReleaseTypes.Beta;
|
||||
internal const string BetaNum = "1";
|
||||
internal const string BetaNum = "2";
|
||||
internal const string HotfixNum = "0";
|
||||
internal const bool IsHotFix = false;
|
||||
internal const string PluginGuid = "com.ten.betteramongus";
|
||||
|
||||
Reference in new issue
Block a user