Merge pull request #41 from EnhancedNetwork/dev

Add Support to 2025.3.25
This commit is contained in:
D1GQ authored and GitHub committed 2025-03-25 21:15:04 -05:00
commit 2974e0f4d2
17 files changed
+171 -94

No files matched your search

+6 -3
View File
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
@@ -6,11 +6,13 @@
<OutputType>Library</OutputType>
<langVersion>preview</langVersion>
</PropertyGroup>
<ItemGroup>
<None Include="..\.editorconfig" Link=".editorconfig" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="AmongUs.GameLibs.Steam" Version="2024.10.29" />
<PackageReference Include="AmongUs.GameLibs.Steam" Version="2025.3.25" />
<PackageReference Include="BepInEx.IL2CPP.MSBuild" Version="2.0.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
@@ -21,9 +23,10 @@
</PackageReference>
<PackageReference Include="BepInEx.Unity.IL2CPP" Version="6.0.0-be.674" Private="false" ExcludeAssets="runtime;native" />
</ItemGroup>
<ItemGroup>
<!-- Embed all files in the Resources folder -->
<EmbeddedResource Include="Resources\**\*" />
<EmbeddedResource Include="token.env" />
<EmbeddedResource Include="token.env" />
</ItemGroup>
</Project>
+5 -5
View File
@@ -185,11 +185,11 @@ class BAUAntiCheat
if (GameState.IsInGamePlay)
{
if (callId is (byte)RpcCalls.SetColor
or (byte)RpcCalls.SetHat
or (byte)RpcCalls.SetSkin
or (byte)RpcCalls.SetVisor
or (byte)RpcCalls.SetPet
or (byte)RpcCalls.SetNamePlate)
or (byte)RpcCalls.SetHat_Deprecated
or (byte)RpcCalls.SetSkin_Deprecated
or (byte)RpcCalls.SetVisor_Deprecated
or (byte)RpcCalls.SetPet_Deprecated
or (byte)RpcCalls.SetNamePlate_Deprecated)
{
BetterNotificationManager.NotifyCheat(player, string.Format(Translator.GetString("AntiCheat.InvalidSetRPC"), Enum.GetName((RpcCalls)callId)));
Logger.LogCheat($"{player.BetterData().RealName} {Enum.GetName((RpcCalls)callId)}: {GameState.IsInGamePlay}");
@@ -5,5 +5,5 @@ namespace BetterAmongUs.Modules.AntiCheat;
[RegisterRPCHandler]
internal sealed class SetHatHandler : RPCHandler
{
internal override byte CallId => (byte)RpcCalls.SetHat;
internal override byte CallId => (byte)RpcCalls.SetHat_Deprecated;
}
@@ -5,5 +5,5 @@ namespace BetterAmongUs.Modules.AntiCheat;
[RegisterRPCHandler]
internal sealed class SetNamePlateHandler : RPCHandler
{
internal override byte CallId => (byte)RpcCalls.SetNamePlate;
internal override byte CallId => (byte)RpcCalls.SetNamePlate_Deprecated;
}
@@ -5,5 +5,5 @@ namespace BetterAmongUs.Modules.AntiCheat;
[RegisterRPCHandler]
internal sealed class SetPetHandler : RPCHandler
{
internal override byte CallId => (byte)RpcCalls.SetPet;
internal override byte CallId => (byte)RpcCalls.SetPet_Deprecated;
}
@@ -5,5 +5,5 @@ namespace BetterAmongUs.Modules.AntiCheat;
[RegisterRPCHandler]
internal sealed class SetSkinHandler : RPCHandler
{
internal override byte CallId => (byte)RpcCalls.SetSkin;
internal override byte CallId => (byte)RpcCalls.SetSkin_Deprecated;
}
@@ -5,5 +5,5 @@ namespace BetterAmongUs.Modules.AntiCheat;
[RegisterRPCHandler]
internal sealed class SetVisorHandler : RPCHandler
{
internal override byte CallId => (byte)RpcCalls.SetVisor;
internal override byte CallId => (byte)RpcCalls.SetVisor_Deprecated;
}
+1 -1
View File
@@ -17,7 +17,7 @@ class FileChecker
"System", "Unity", "Harmony", "BepInEx", "Microsoft", "Il2Cpp", "Hazel",
"MonoMod", "netstandard", "mscorlib", "AssetRipper", "Cpp2IL", "AsmResolver", "Iced",
"SemanticVersioning", "Mono.Cecil", "Assembly-CSharp", "StableNameDotNet",
"Disarm", "Gee.External.Capstone", "Rewired_Core", "AddressablesPlayAssetDelivery",
"Disarm", "Gee.External.Capstone", "Rewired_Core", "AddressablesPlayAssetDelivery", "Newtonsoft.Json",
"Assembly-CSharp-firstpass", "Sentry", "BetterAmongUs", "MCI", "CrowdedMod", "Mini.RegionInstall", "Unlock", "Skin"
});
+1 -1
View File
@@ -11,7 +11,7 @@ internal static class GameState
internal static bool IsNormalGame => GameOptionsManager.Instance.CurrentGameOptions.GameMode is GameModes.Normal or GameModes.NormalFools;
internal static bool IsHideNSeek => GameOptionsManager.Instance != null && GameOptionsManager.Instance.CurrentGameOptions.GameMode is GameModes.HideNSeek or GameModes.SeekFools;
internal static bool SkeldIsActive => (MapNames)GameOptionsManager.Instance.CurrentGameOptions.MapId == MapNames.Skeld;
internal static bool MiraHQIsActive => (MapNames)GameOptionsManager.Instance.CurrentGameOptions.MapId == MapNames.Mira;
internal static bool MiraHQIsActive => (MapNames)GameOptionsManager.Instance.CurrentGameOptions.MapId == MapNames.MiraHQ;
internal static bool PolusIsActive => (MapNames)GameOptionsManager.Instance.CurrentGameOptions.MapId == MapNames.Polus;
internal static bool DleksIsActive => (MapNames)GameOptionsManager.Instance.CurrentGameOptions.MapId == MapNames.Dleks;
internal static bool AirshipIsActive => (MapNames)GameOptionsManager.Instance.CurrentGameOptions.MapId == MapNames.Airship;
+4 -3
View File
@@ -1,11 +1,12 @@
using HarmonyLib;
using AmongUs.Data.Player;
using HarmonyLib;
namespace BetterAmongUs.Patches;
[HarmonyPatch(typeof(StatsManager), nameof(StatsManager.BanMinutesLeft), MethodType.Getter)]
[HarmonyPatch(typeof(PlayerBanData), nameof(PlayerBanData.BanMinutesLeft), MethodType.Getter)]
internal static class DisconnectPenaltyPatch
{
internal static bool Prefix(StatsManager __instance, ref int __result)
internal static bool Prefix(PlayerBanData __instance, ref int __result)
{
if (__instance.BanPoints != 0f)
{
+79
View File
@@ -0,0 +1,79 @@
using HarmonyLib;
using UnityEngine;
namespace BetterAmongUs.Patches;
[HarmonyPatch(typeof(FindAGameManager))]
internal class FindAGameManagerPatch
{
public static Scroller? Scroller;
[HarmonyPatch(nameof(FindAGameManager.Start))]
[HarmonyPrefix]
internal static void Start_Prefix(FindAGameManager __instance)
{
var prefab = __instance.gameContainers[4];
var list = new GameObject("GameListScroller");
list.transform.SetParent(prefab.transform.parent);
Scroller = list.AddComponent<Scroller>();
Scroller.Inner = list.transform;
Scroller.MouseMustBeOverToScroll = true;
var box = prefab.transform.parent.gameObject.AddComponent<BoxCollider2D>();
box.size = new Vector2(100f, 100f);
Scroller.ClickMask = box;
Scroller.ScrollWheelSpeed = 0.3f;
Scroller.SetYBoundsMin(0f);
Scroller.SetYBoundsMax(3.5f);
Scroller.allowY = true;
foreach (var con in __instance.gameContainers)
{
con.transform.SetParent(list.transform);
var oldPos = con.transform.position;
con.transform.position = new Vector3(oldPos.x, oldPos.y, 25);
}
var oldGameContainers = __instance.gameContainers.ToList();
for (int i = 0; i < 5; i++)
{
var GameContainer = UnityEngine.Object.Instantiate(prefab, list.transform);
var oldPos = GameContainer.transform.position;
GameContainer.transform.position = new Vector3(oldPos.x, oldPos.y - 0.75f * (i + 1), 25);
oldGameContainers.Add(GameContainer);
}
__instance.gameContainers = oldGameContainers.ToArray();
var cutOffTop = CreateBlackSquareSprite();
cutOffTop.transform.SetParent(list.transform.parent);
cutOffTop.transform.localPosition = new Vector3(0, 3, 1);
cutOffTop.transform.localScale = new Vector3(1500, 200, 100);
}
[HarmonyPatch(nameof(FindAGameManager.RefreshList))]
[HarmonyPostfix]
internal static void RefreshList_Postfix()
{
Scroller?.ScrollRelative(new(0f, -100f));
}
private static SpriteRenderer CreateBlackSquareSprite()
{
var square = new GameObject("CutOffTop");
var renderer = square.AddComponent<SpriteRenderer>();
Texture2D texture = new(100, 100);
Color[] pixels = texture.GetPixels();
for (int i = 0; i < pixels.Length; i++)
{
pixels[i] = Color.black;
}
texture.SetPixels(pixels);
texture.Apply();
Sprite sprite = Sprite.Create(texture, new Rect(0, 0, 1, 1), Vector2.one * 0.5f);
renderer.sprite = sprite;
square.transform.localScale = new Vector3(100, 100, 1);
return renderer;
}
}
+8 -8
View File
@@ -205,12 +205,12 @@ class GamePlayManager
switch (EndGameResult.CachedGameOverReason)
{
case GameOverReason.HumansByTask:
case GameOverReason.CrewmatesByTask:
winTeam = Translator.GetString(StringNames.Crewmates);
winTag = Translator.GetString("Game.Summary.Result.TasksCompletion");
winColor = "#8cffff";
break;
case GameOverReason.HumansByVote:
case GameOverReason.CrewmatesByVote:
winTeam = Translator.GetString(StringNames.Crewmates);
winTag = Translator.GetString("Game.Summary.Result.ImpostersVotedOut");
winColor = "#8cffff";
@@ -220,33 +220,33 @@ class GamePlayManager
winTag = Translator.GetString("Game.Summary.Result.ImpostorsDisconnected");
winColor = "#8cffff";
break;
case GameOverReason.ImpostorByKill:
case GameOverReason.ImpostorsByKill:
winTeam = Translator.GetString(StringNames.ImpostorsCategory);
winTag = Translator.GetString("Game.Summary.Result.CrewOutnumbered");
winColor = "#f00202";
break;
case GameOverReason.ImpostorBySabotage:
case GameOverReason.ImpostorsBySabotage:
winTeam = Translator.GetString(StringNames.ImpostorsCategory);
winTag = Translator.GetString("Game.Summary.Result.Sabotage");
winColor = "#f00202";
break;
case GameOverReason.ImpostorByVote:
case GameOverReason.ImpostorsByVote:
winTeam = Translator.GetString(StringNames.ImpostorsCategory);
winTag = Translator.GetString("Game.Summary.Result.CrewOutnumbered");
winColor = "#f00202";
break;
case GameOverReason.HumansDisconnect:
case GameOverReason.CrewmateDisconnect:
winTeam = Translator.GetString(StringNames.ImpostorsCategory);
winTag = Translator.GetString("Game.Summary.Result.CrematesDisconnected");
winColor = "#f00202";
break;
case GameOverReason.HideAndSeek_ByTimer:
case GameOverReason.HideAndSeek_CrewmatesByTimer:
winTeam = Translator.GetString("Game.Summary.Hiders");
winTag = Translator.GetString("Game.Summary.Result.TimeOut");
winColor = "#8cffff";
break;
case GameOverReason.HideAndSeek_ByKills:
case GameOverReason.HideAndSeek_ImpostorsByKills:
winTeam = Translator.GetString("Game.Summary.Seekers");
winTag = Translator.GetString("Game.Summary.Result.NoSurvivors");
winColor = "#f00202";
+1 -2
View File
@@ -13,8 +13,7 @@ internal class HudManagerPatch
{
internal static string WelcomeMessage = $"<b><color=#00b530><size=125%><align=\"center\">{string.Format(Translator.GetString("WelcomeMsg.WelcomeToBAU"), Translator.GetString("BetterAmongUs"))}\n{Main.GetVersionText()}</size>\n" +
$"{Translator.GetString("WelcomeMsg.ThanksForDownloading")}</align></color></b>\n<size=120%> </size>\n" +
string.Format(Translator.GetString("WelcomeMsg.BAUDescription1"), Translator.GetString("bau"), Translator.GetString("BetterOption.AntiCheat")) + "\n\n" +
string.Format(Translator.GetString("WelcomeMsg.BAUDescription2"), Translator.GetString("bau"), Translator.GetString("BetterOption"), Translator.GetString("BetterOption.BetterHost"));
string.Format(Translator.GetString("WelcomeMsg.BAUDescription1"), Translator.GetString("bau"), Translator.GetString("BetterOption.AntiCheat"));
private static bool HasBeenWelcomed = false;
[HarmonyPatch(nameof(HudManager.Start))]
+30 -44
View File
@@ -9,7 +9,8 @@ namespace BetterAmongUs.Patches;
[HarmonyPatch]
internal class PrivateLobbyPatch
{
private static AprilFoolsModeToggleButton? toggle;
private static GameObject? toggle;
private static List<PassiveButton>? buttons = [];
private static TextMeshPro? toggleText;
[HarmonyPatch(typeof(CreateGameOptions))]
@@ -18,81 +19,66 @@ internal class PrivateLobbyPatch
internal static void CreateGameOptionsShow_Postfix(CreateGameOptions __instance)
{
if (toggle != null) return;
buttons.Clear();
toggle = UnityEngine.Object.Instantiate(__instance.AprilFoolsToggle, __instance.transform);
toggle = UnityEngine.Object.Instantiate(__instance.AprilFoolsToggle, __instance.contentObjects.First().transform.parent);
if (toggle != null)
{
toggle.name = "PrivateOnlyLobby";
buttons.Add(toggle.transform.Find("AprilOn").GetComponent<PassiveButton>());
buttons.Add(toggle.transform.Find("AprilOff").GetComponent<PassiveButton>());
if (buttons.Count < 2) return;
toggle.gameObject.SetActive(true);
var onButton = toggle.onButton.GetComponent<PassiveButton>();
var onButton = buttons[0];
if (onButton != null)
{
onButton.gameObject.SetActive(false);
onButton.OnClick = new();
onButton.OnClick.AddListener((Action)(() => TogglePrivateOnlyLobby(true)));
}
var offButton = toggle.offButton.GetComponent<PassiveButton>();
var offButton = buttons[1];
if (offButton != null)
{
offButton.gameObject.SetActive(false);
offButton.OnClick = new();
offButton.OnClick.AddListener((Action)(() => TogglePrivateOnlyLobby(false)));
}
var aspect = toggle.gameObject.AddComponent<AspectPosition>();
aspect.Alignment = AspectPosition.EdgeAlignments.Top;
aspect.DistanceFromEdge = new UnityEngine.Vector3(0, 1.7f, 0);
aspect.DistanceFromEdge = new UnityEngine.Vector3(0.4f, 1.62f, 0);
aspect.AdjustPosition();
var text = toggle.transform.Find("AprilFoolsModeText")?.GetComponent<TextMeshPro>();
var text = toggle.transform.Find("BlackSquare/ModeText")?.GetComponent<TextMeshPro>();
if (text != null)
{
text.DestroyTextTranslator();
text.text = "Private Only Lobby";
toggleText = text;
}
var banner = toggle.transform.Find("Banner")?.GetComponent<SpriteRenderer>();
if (banner != null)
{
banner.color = new(1, 1, 1, 0.25f);
}
}
TogglePrivateOnlyLobby(Main.PrivateOnlyLobby.Value);
}
private static void TogglePrivateOnlyLobby(bool modeOn)
{
Main.PrivateOnlyLobby.Value = modeOn;
}
if (buttons.Count < 2) return;
[HarmonyPatch(typeof(AprilFoolsModeToggleButton))]
[HarmonyPatch(nameof(AprilFoolsModeToggleButton.Update))]
[HarmonyPrefix]
internal static bool AprilFoolsModeToggleButtonUpdate_Prefix(AprilFoolsModeToggleButton __instance)
{
if (__instance == toggle)
buttons[0].gameObject.SetActive(true);
buttons[1].gameObject.SetActive(true);
buttons[0].SelectButton(false);
buttons[1].SelectButton(false);
if (modeOn)
{
if (Main.PrivateOnlyLobby.Value)
{
__instance.offButton.OutColor = Color.grey;
__instance.offText.color = Color.grey;
__instance.offButtonSprite.color = Color.grey;
__instance.onButton.OutColor = Color.white;
__instance.onText.color = Color.white;
__instance.onButtonSprite.color = Color.green;
if (toggleText != null) toggleText.color = new(1, 1, 1, 1);
}
else
{
__instance.onButton.OutColor = Color.grey;
__instance.onText.color = Color.grey;
__instance.onButtonSprite.color = Color.grey;
__instance.offButton.OutColor = Color.white;
__instance.offText.color = Color.white;
__instance.offButtonSprite.color = Color.green;
if (toggleText != null) toggleText.color = new(1, 1, 1, 0.5f);
}
return false;
buttons[0].SelectButton(true);
}
return true;
else
{
buttons[1].SelectButton(true);
}
Main.PrivateOnlyLobby.Value = modeOn;
}
[HarmonyPatch(typeof(LobbyInfoPane))]
+28 -14
View File
@@ -6,9 +6,10 @@ namespace BetterAmongUs.Patches;
class SplashIntroPatch
{
internal static bool Skip = false;
internal static bool BetterIntro = false;
internal static bool IsReallyDoneLoading = false;
private static GameObject BetterLogo;
private static GameObject? BetterLogo;
[HarmonyPatch(typeof(SplashManager))]
class SplashManagerPatch
@@ -17,6 +18,9 @@ class SplashIntroPatch
[HarmonyPrefix]
internal static void Start_Prefix(SplashManager __instance)
{
Skip = false;
BetterIntro = false;
IsReallyDoneLoading = false;
__instance.logoAnimFinish.transform.Find("BlackOverlay").transform.SetLocalY(100f);
}
@@ -24,6 +28,12 @@ class SplashIntroPatch
[HarmonyPrefix]
internal static bool Update_Prefix(SplashManager __instance)
{
if (Skip)
{
CheckIfDone(__instance);
return false;
}
if (Time.time - __instance.startTime > 2f && BetterIntro)
{
UnityEngine.Object.Destroy(__instance.logoAnimFinish.GetComponent<AudioSource>());
@@ -31,11 +41,10 @@ class SplashIntroPatch
if (Input.GetKeyDown(KeyCode.Mouse0) || Input.GetKeyDown(KeyCode.Mouse1))
{
if (Time.time - __instance.startTime > 2f || BetterIntro)
if (CheckIfDone(__instance, true))
{
IsReallyDoneLoading = true;
__instance.sceneChanger.AllowFinishLoadingScene();
__instance.startedSceneLoad = true;
Skip = true;
return false;
}
}
@@ -52,21 +61,26 @@ class SplashIntroPatch
BetterLogo.name = "BetterLogo";
BetterLogo.GetComponent<SpriteRenderer>().sprite = Utils.LoadSprite("BetterAmongUs.Resources.Images.BetterAmongUs-By-The-Enhanced-Network-Logo.png", 150f);
__instance.logoAnimFinish.transform.Find("BlackOverlay").transform.SetLocalY(0f);
__instance.loadingObject.SetActive(false);
__instance.startedSceneLoad = false;
BetterIntro = true;
return false;
}
__instance.startedSceneLoad = true;
CheckIfDone(__instance);
}
if (__instance.startedSceneLoad && BetterIntro)
{
IsReallyDoneLoading = true;
__instance.sceneChanger.AllowFinishLoadingScene();
__instance.startedSceneLoad = true;
}
return false;
}
internal static bool CheckIfDone(SplashManager __instance, bool isSkip = false)
{
if ((Time.time - __instance.startTime > 2f && BetterIntro) || (isSkip && BetterIntro))
{
IsReallyDoneLoading = true;
__instance.sceneChanger.AllowFinishLoadingScene();
__instance.startedSceneLoad = true;
__instance.loadingObject.SetActive(true);
return true;
}
return false;
-1
View File
@@ -46,7 +46,6 @@
"WelcomeMsg.WelcomeToBAU": "Welcome To {0}",
"WelcomeMsg.ThanksForDownloading": "Thanks for downloading!",
"WelcomeMsg.BAUDescription1": "<color=#0dff00>{0}</color> Is a mod for improving the vanilla Among Us experience with a built-in {1} and other futures, <color=#0dff00>{0}</color> is a client-sided mod so it can be used with other vanilla Among Us players.",
"WelcomeMsg.BAUDescription2": "<color=#0dff00>{0}</color> Also has a option in <color=#2b7500>{1}</color> on the pause menu called {2}, {2} is designed to enhance the vanilla experience for other players without having <color=#0dff00>{0}</color> installed!",
"BetterOption": "Better Options",
"BetterOption.AntiCheat": "<color=#4f92ff>Anti-Cheat</color>",
+3 -7
View File
@@ -27,8 +27,8 @@ internal enum ReleaseTypes : int
[BepInProcess("Among Us.exe")]
internal class Main : BasePlugin
{
internal static readonly ReleaseTypes ReleaseBuildType = ReleaseTypes.Release;
internal const string BetaNum = "0";
internal static readonly ReleaseTypes ReleaseBuildType = ReleaseTypes.Beta;
internal const string BetaNum = "1";
internal const string HotfixNum = "0";
internal const bool IsHotFix = false;
internal const string PluginGuid = "com.ten.betteramongus";
@@ -87,11 +87,7 @@ internal class Main : BasePlugin
internal static List<string> SupportedAmongUsVersions =
[
"2024.11.26",
"2024.10.29",
"2024.9.4",
"2024.8.13",
"2024.6.18",
"2025.3.25",
];
internal static List<PlayerControl> AllPlayerControls = [];