Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions src/BAUPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -181,8 +181,11 @@ internal void UnloadBAU()
ConsoleManager.DetachConsole();
BetterNotificationManager.Detach();
ClientPatch.Unpatch();
Harmony.UnpatchAll();
ModManager.Instance.ModStamp.gameObject.SetActive(false);
Harmony.UnpatchSelf();
BetterAmongUs.Interfaces.IMonoExtension.ClearExtensions();
OptionsMenuBehaviourPatch.RestoreFrameRate();
if (ModManager.Instance != null && ModManager.Instance.ModStamp != null)
ModManager.Instance.ModStamp.gameObject.SetActive(false);
SceneChanger.ChangeScene("MainMenu");
}

Expand Down
9 changes: 8 additions & 1 deletion src/BetterAmongUs.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<OutputType>Library</OutputType>
<LangVersion>preview</LangVersion>
<Version Condition="'$(Version)' == ''">1.3.3</Version>
<AssemblyVersion>1.3.3.0</AssemblyVersion>
<FileVersion>1.3.3.0</FileVersion>
<InformationalVersion>1.3.3</InformationalVersion>
<UseGitMetadata Condition="'$(UseGitMetadata)' == '' and (Exists('$(MSBuildProjectDirectory)/../.git') or Exists('$(MSBuildProjectDirectory)/.git'))">true</UseGitMetadata>
<UseGitMetadata Condition="'$(UseGitMetadata)' == ''">false</UseGitMetadata>
<DefineConstants Condition="'$(UseGitMetadata)' == 'true'">$(DefineConstants);BAU_GIT_METADATA</DefineConstants>
</PropertyGroup>

<!-- Apply Null Notation Restrictions -->
Expand Down Expand Up @@ -89,7 +96,7 @@

<!-- NuGet Info Packages -->
<ItemGroup>
<PackageReference Include="GitInfo" Version="3.3.3">
<PackageReference Include="GitInfo" Version="3.3.3" Condition="'$(UseGitMetadata)' == 'true'">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
Expand Down
49 changes: 16 additions & 33 deletions src/Interfaces/IMonoExtension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,11 +68,6 @@ private static void CleanupLookups()

if (baseIsDead || extensionIsDead)
{
if (pair.Extension != null && !extensionIsDead)
{
pair.Extension.OnDestroy();
}

extensions.RemoveAt(i);
}
}
Expand Down Expand Up @@ -182,14 +177,6 @@ internal static bool HasExtension<T>(MonoBehaviour monoBehaviour) where T : IMon
return existingComponent;
}

var existingExtensions = monoBehaviour.GetComponentsInChildren(Il2CppType.From(typeof(T)), true);
if (existingExtensions.Length > 0)
{
var found = existingExtensions.FirstOrDefault() as T;
if (found != null)
return found;
}

T? monoExtension = monoBehaviour.gameObject.AddComponent<T>();
if (monoExtension != null)
{
Expand Down Expand Up @@ -224,28 +211,24 @@ internal static void TryRemoveExtension(IMonoExtension monoExtension)
if (monoExtension == null)
return;

CleanupLookups();

if (monoExtension.BaseMono != null)
foreach (var entry in _extensionsByBaseType.ToArray())
{
var baseType = monoExtension.BaseMono.GetType();

if (_extensionsByBaseType.TryGetValue(baseType, out var extensions))
{
for (int i = extensions.Count - 1; i >= 0; i--)
{
if (extensions[i].Extension == monoExtension)
{
extensions.RemoveAt(i);
break;
}
}
entry.Value.RemoveAll(pair => ReferenceEquals(pair.Extension, monoExtension));
if (entry.Value.Count == 0)
_extensionsByBaseType.Remove(entry.Key);
}
}

if (extensions.Count == 0)
{
_extensionsByBaseType.Remove(baseType);
}
}
internal static void ClearExtensions()
{
var extensions = _extensionsByBaseType.Values.SelectMany(items => items)
.Select(pair => pair.Extension).OfType<MonoBehaviour>().ToArray();
_extensionsByBaseType.Clear();
foreach (var extension in extensions)
{
if (extension == null) continue;
extension.enabled = false;
UnityEngine.Object.Destroy(extension);
}
}

Expand Down
37 changes: 26 additions & 11 deletions src/Managers/NetworkManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,15 +74,18 @@ internal static void StreamlineMessage(MessageWriter writer, SendOption sendOpti

MessageReader[] allReaders = writer.MessagesToReaders();

foreach (MessageReader reader in allReaders)
try
{
if (reader.Tag == 5 || reader.Tag == 6)
foreach (MessageReader reader in allReaders)
{
ReadData(reader, sendOption);
reader.Recycle();
continue;
if (reader.Tag == 5 || reader.Tag == 6)
ReadData(reader, sendOption);
}
}
finally
{
foreach (var reader in allReaders) reader.Recycle();
}
}

/// <summary>
Expand All @@ -103,15 +106,27 @@ internal static void ReadData(MessageReader reader, SendOption sendOption)

MessageReader[] allDataReaders = reader.MessagesToReadersNewBuffer();

foreach (MessageReader dataReader in allDataReaders)
try
{
if (dataReader.Tag == 2)
foreach (MessageReader dataReader in allDataReaders)
{
var data = ReadRpc(MessageReader.Get(dataReader), typeFlag, ClientId);
HandleInnerNetObject(data.Sender, (byte)data.CalledRpc, data.Reader);
continue;
if (dataReader.Tag != 2) continue;
var rpcReader = MessageReader.Get(dataReader);
try
{
var data = ReadRpc(rpcReader, typeFlag, ClientId);
HandleInnerNetObject(data.Sender, (byte)data.CalledRpc, data.Reader);
}
finally
{
rpcReader.Recycle();
}
}
}
finally
{
foreach (var dataReader in allDataReaders) dataReader.Recycle();
}
}

/// <summary>
Expand Down Expand Up @@ -143,7 +158,7 @@ public static void HandleGameData(MessageReader parentReader)
int currentMessageNumber = InnerNetClient.msgNum++;
var oldReader = MessageReader.Get(messageReader);
InnerNetClient.StartCoroutine(HandleGameDataInner(messageReader, currentMessageNumber));
RPCHandler.HandleRPC(parentReader.Tag, null, oldReader, HandlerFlag.HandleGameDataTag);
RPCHandler.HandleRPC(oldReader.Tag, null, oldReader, HandlerFlag.HandleGameDataTag);
oldReader.Recycle();
}
}
Expand Down
8 changes: 8 additions & 0 deletions src/ModInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,11 @@ internal static class ModInfo
/// <summary>
/// Gets the Git commit hash from assembly metadata.
/// </summary>
#if BAU_GIT_METADATA
public static string CommitHash = ThisAssembly.Git.Commit;
#else
public static string CommitHash = "source-archive";
#endif

/// <summary>
/// Gets the build date from assembly metadata.
Expand Down Expand Up @@ -64,7 +68,11 @@ internal static class ModInfo
/// <summary>
/// The GitHub repository URL for BAU.
/// </summary>
#if BAU_GIT_METADATA
internal const string GITHUB = ThisAssembly.Git.RepositoryUrl;
#else
internal const string GITHUB = "https://github.com/D1GQ/BetterAmongUs";
#endif

/// <summary>
/// The Discord invite URL for BAU.
Expand Down
18 changes: 11 additions & 7 deletions src/Modules/AntiCheat/RPCHandlers/ReportDeadBodyHandler.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using BetterAmongUs.Attributes;
using BetterAmongUs.Attributes;
using BetterAmongUs.Generated;
using BetterAmongUs.Managers;
using BetterAmongUs.Patches.Gameplay.UI;
Expand All @@ -14,13 +14,12 @@ internal sealed class ReportDeadBodyHandler : RPCHandler

internal override bool HandleAntiCheatCancel(PlayerControl? sender, MessageReader reader)
{
if (sender == null || sender.Data == null || sender.MyPhysics == null)
return CancelAsHost;

if (!GameState.IsInGamePlay || !BAUPlugin.AllPlayerControls.All(pc => pc.roleAssigned))
{
if (BetterNotificationManager.NotifyCheat(sender, TranslationStrings.AntiCheat_InvalidActionRPC.Format(Enum.GetName((RpcCalls)CallId)), forceBan: true))
{
LogRpcInfo($"Report dead body blocked: Game not in play or roles not assigned");
}

// Late packets during loading or teardown are not evidence of cheating.
return CancelAsHost;
}

Expand All @@ -41,7 +40,12 @@ internal override bool HandleAntiCheatCancel(PlayerControl? sender, MessageReade

if (isBodyReport)
{
if (!deadPlayerInfo.IsDead || deadPlayerInfo == sender.Data)
if (!deadPlayerInfo.IsDead && deadPlayerInfo != sender.Data)
{
return true;
}

if (deadPlayerInfo == sender.Data)
{
if (BetterNotificationManager.NotifyCheat(sender, TranslationStrings.AntiCheat_InvalidActionRPC.Format(Enum.GetName((RpcCalls)CallId))))
{
Expand Down
8 changes: 5 additions & 3 deletions src/Modules/AntiCheat/RPCHandlers/SendChatHandler.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using AmongUs.Data;
using AmongUs.Data;
using BetterAmongUs.Attributes;
using BetterAmongUs.Data;
using BetterAmongUs.Utilities;
Expand All @@ -17,9 +17,11 @@ internal override void Handle(PlayerControl? sender, MessageReader reader)
{
var text = reader.ReadString();

if (sender == null || !GameState.IsHost || sender.IsLocalPlayer()) return;

if (BetterGameSettings.UseBanWordList.GetBool() && (!BetterGameSettings.UseBanWordListOnlyLobby.GetBool() || GameState.IsLobby))
{
if (TextFileHandler.CompareStringFilters(BetterDataManager.Files.banWordListFilePath, text.Split(' ')))
if (TextFileHandler.CompareChatFilters(BetterDataManager.Files.banWordListFilePath, text))
{
sender.Kick(false, $"has been kicked due to\nchat message containing a banned word!");
}
Expand All @@ -28,7 +30,7 @@ internal override void Handle(PlayerControl? sender, MessageReader reader)

internal override void HandleAntiCheat(PlayerControl? sender, MessageReader reader)
{
if (sender.IsAlive() && GameState.IsInGamePlay && !GameState.IsMeeting && !GameState.IsExilling || DataManager.Settings.Multiplayer.ChatMode == InnerNet.QuickChatModes.QuickChatOnly)
if (sender.IsAlive() && GameState.IsInGamePlay && !GameState.IsMeeting && !GameState.IsExilling)
{
if (BetterNotificationManager.NotifyCheat(sender, GetFormatActionText()))
{
Expand Down
7 changes: 5 additions & 2 deletions src/Modules/ClientOptionItem.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using BepInEx.Configuration;
using BetterAmongUs.Generated;
using BetterAmongUs.Patches.Client;
using BetterAmongUs.Utilities;
using BetterAmongUs.Utilities.Extension;
using UnityEngine;

Expand Down Expand Up @@ -84,7 +85,9 @@ private static ToggleButtonBehaviour CreateToggleButton(TranslationStrings.Trans
var mouseMoveToggle = optionsMenuBehaviour.DisableMouseMovement;
var toggleButton = UnityEngine.Object.Instantiate(mouseMoveToggle, parent);
toggleButton.name = translationStringName.LocalizedString;
toggleButton.DestroyTextTranslators();
toggleButton.Text.text = translationStringName.LocalizedString;
toggleButton.gameObject.SetActive(true);

return toggleButton;
}
Expand Down Expand Up @@ -165,7 +168,7 @@ internal void SetupButton(Action onClick, Func<bool>? clickCheck)

// Style for button (not toggle)
ToggleButton.Text.text = ToggleButton.name;
ToggleButton.Rollover?.ChangeOutColor(new Color32(0, 150, 0, 255));
if (ToggleButton.Rollover != null) ToggleButton.Rollover.ChangeOutColor(new Color32(0, 150, 0, 255));
ToggleButton.Text.color = new Color(1f, 1f, 1f, 1f);

passiveButton.OnClick.AddListener(() =>
Expand Down Expand Up @@ -202,7 +205,7 @@ private void UpdateToggleVisuals(bool isEnabled)
new Color(1f, 1f, 1f, 0.5f);

ToggleButton.Background.color = color;
ToggleButton.Rollover?.ChangeOutColor(color);
if (ToggleButton.Rollover != null) ToggleButton.Rollover.ChangeOutColor(color);
ToggleButton.Text.color = textColor;
ToggleButton.Text.text = $"{ToggleButton.name}: {(isEnabled ? "On" : "Off")}";
}
Expand Down
2 changes: 2 additions & 0 deletions src/Modules/OptionItems/OptionCheckboxItem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,8 @@ protected sealed override void SetupOptionBehavior()
/// <param name="updateTabVisuals">Whether to update the parent tab visuals as well.</param>
internal sealed override void UpdateVisuals(bool updateTabVisuals = true)
{
if (Option == null || Tab == null || Tab.AUTab == null) return;

if (Option is ToggleOption toggleOption)
{
toggleOption.CheckMark.enabled = Value;
Expand Down
2 changes: 2 additions & 0 deletions src/Modules/OptionItems/OptionFloatItem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,8 @@ public override void SetValue(float newValue)
/// <param name="updateTabVisuals">Whether to update the parent tab visuals as well.</param>
internal override void UpdateVisuals(bool updateTabVisuals = true)
{
if (Option == null || Tab == null || Tab.AUTab == null) return;

if (Option is NumberOption numberOption)
{
numberOption.PlusBtn.SetInteractable(false);
Expand Down
2 changes: 2 additions & 0 deletions src/Modules/OptionItems/OptionIntItem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,8 @@ public sealed override void SetValue(int newValue)
/// <param name="updateTabVisuals">Whether to update the parent tab visuals as well.</param>
internal sealed override void UpdateVisuals(bool updateTabVisuals = true)
{
if (Option == null || Tab == null || Tab.AUTab == null) return;

if (Option is NumberOption numberOption)
{
numberOption.PlusBtn.SetInteractable(false);
Expand Down
4 changes: 3 additions & 1 deletion src/Modules/OptionItems/OptionPlayerItem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public sealed class OptionPlayerItem : OptionItem<int>
/// <summary>
/// Gets the maximum player index based on the number of players in the game.
/// </summary>
private int Max => BAUPlugin.AllPlayerControls.Count - 1;
private int Max => Math.Max(Min, BAUPlugin.AllPlayerControls.Count - 1);

/// <summary>
/// Gets the minimum player index (-1 for random selection, 0 for first player).
Expand Down Expand Up @@ -204,6 +204,8 @@ internal void ResetValue()
/// <param name="updateTabVisuals">Whether to update the parent tab visuals as well.</param>
internal sealed override void UpdateVisuals(bool updateTabVisuals = true)
{
if (Option == null || Tab == null || Tab.AUTab == null) return;

if (!GameSettingMenu.Instance)
return;

Expand Down
2 changes: 2 additions & 0 deletions src/Modules/OptionItems/OptionStringItem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,8 @@ public sealed override void SetValue(int newValue)
/// <param name="updateTabVisuals">Whether to update the parent tab visuals as well.</param>
internal sealed override void UpdateVisuals(bool updateTabVisuals = true)
{
if (Option == null || Tab == null || Tab.AUTab == null) return;

if (Option is NumberOption numberOption)
{
numberOption.PlusBtn.SetInteractable(false);
Expand Down
10 changes: 7 additions & 3 deletions src/Modules/OptionItems/OptionTab.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ internal sealed class OptionTab
/// <summary>
/// Gets the translated description of this tab.
/// </summary>
internal string Description => TranslationName.LocalizedString;
internal string Description => TranslationDescription.LocalizedString;

/// <summary>
/// Gets or sets the translation key for the tab description.
Expand Down Expand Up @@ -131,6 +131,7 @@ private void CreateBehavior(bool doNotDestroyMapPicker)

var SettingsTab = UnityEngine.Object.Instantiate(GameSettingMenu.Instance.GameSettingsTab, GameSettingMenu.Instance.GameSettingsTab.transform.parent);
AUTab = SettingsTab;
SettingsTab.enabled = false;
SettingsTab.name = Name;
if (!doNotDestroyMapPicker) SettingsTab.scrollBar.Inner.DestroyChildren();

Expand Down Expand Up @@ -197,8 +198,11 @@ private void ShowOptions()
opt.UpdateVisuals(false);
}

AUTab?.scrollBar?.SetYBoundsMax(spacingNum - 2.5f);
AUTab?.scrollBar?.ScrollRelative(new(0f, 0f));
if (AUTab.scrollBar != null)
{
AUTab.scrollBar.SetYBoundsMax(Mathf.Max(0f, spacingNum - 2.5f));
AUTab.scrollBar.ScrollRelative(new(0f, 0f));
}
}

/// <summary>
Expand Down
Loading