From 1bbab59e3eb07e699a2c146e01e2028c04809ca3 Mon Sep 17 00:00:00 2001 From: D1GQ Date: Fri, 16 Aug 2024 14:54:05 -0500 Subject: [PATCH] Task update! --- Modules/AntiCheat.cs | 30 +++++++++++++++++++++++++++++- Modules/BetterHostManager.cs | 4 ++++ Modules/ExtendedPlayerControl.cs | 2 +- Modules/ExtendedPlayerInfo.cs | 2 ++ Patches/MeetingHudPatch.cs | 4 ++++ Patches/PlayerControlPatch.cs | 25 +++++++++++++++++++------ main.cs | 2 +- 7 files changed, 60 insertions(+), 9 deletions(-) diff --git a/Modules/AntiCheat.cs b/Modules/AntiCheat.cs index 734f8d1..874691e 100644 --- a/Modules/AntiCheat.cs +++ b/Modules/AntiCheat.cs @@ -2,6 +2,7 @@ using HarmonyLib; using Hazel; using InnerNet; +using UnityEngine.Purchasing; namespace BetterAmongUs; @@ -297,6 +298,27 @@ class AntiCheat } } + if (callId is (byte)RpcCalls.CompleteTask) + { + var taskId = reader.ReadPackedUInt32(); + + if (!player.myTasks.ToArray().Any(task => task.Id == taskId) + || GameStates.IsMeeting || player.BetterData().LastTaskId != taskId && player.BetterData().TimeSinceLastTask < 3f) + { + BetterNotificationManager.NotifyCheat(player, $"Invalid Action RPC: {Enum.GetName((RpcCalls)callId)}"); + Logger.LogCheat($"{player.Data.PlayerName} {Enum.GetName((RpcCalls)callId)}: {!player.myTasks.ToArray().Any(task => task.Id == taskId)} - {GameStates.IsMeeting}" + + $" - {player.BetterData().LastTaskId != taskId} && {player.BetterData().TimeSinceLastTask < 3f}"); + + player.BetterData().TimeSinceLastTask = 0f; + player.BetterData().LastTaskId = taskId; + + return; + } + + player.BetterData().TimeSinceLastTask = 0f; + player.BetterData().LastTaskId = taskId; + } + if (callId is (byte)RpcCalls.Pet or (byte)RpcCalls.CancelPet) { if (player?.CurrentOutfit?.PetId == "pet_EmptyPet") @@ -465,10 +487,16 @@ class AntiCheat if (player.DataIsCollected() == true && !GameStates.IsLocalGame && GameStates.IsVanillaServer) { - if (callId is (byte)RpcCalls.SetName or (byte)RpcCalls.CheckName or (byte)RpcCalls.SetLevel) + if (callId is (byte)RpcCalls.CheckName or (byte)RpcCalls.SetLevel) { BetterNotificationManager.NotifyCheat(player, $"Invalid Set RPC: {Enum.GetName((RpcCalls)callId)}"); Logger.LogCheat($"{player.Data.PlayerName} {Enum.GetName((RpcCalls)callId)}: {player.DataIsCollected() == true}"); + + if (callId is (byte)RpcCalls.CheckName) + { + var name = reader.ReadString(); + Logger.LogCheat($"{player.Data.PlayerName} Has tried to change their name to '{name}' but has been undone!"); + } return false; } } diff --git a/Modules/BetterHostManager.cs b/Modules/BetterHostManager.cs index dd26901..086ad9b 100644 --- a/Modules/BetterHostManager.cs +++ b/Modules/BetterHostManager.cs @@ -220,6 +220,10 @@ class BetterHostManager else if (GameStates.IsInGamePlay) { string Role = $"{player.GetRoleName()}"; + if (!player.IsImpostorTeam() && player.myTasks.Count > 0) + { + Role += $" ({player.myTasks.ToArray().Where(task => task.IsComplete).Count()}/{player.myTasks.Count})"; + } if (player.IsImpostorTeam() is false || target.IsImpostorTeam() is false) { if (target.IsAlive() && player != target) diff --git a/Modules/ExtendedPlayerControl.cs b/Modules/ExtendedPlayerControl.cs index 2f28a90..abcb672 100644 --- a/Modules/ExtendedPlayerControl.cs +++ b/Modules/ExtendedPlayerControl.cs @@ -102,7 +102,7 @@ static class ExtendedPlayerControl // Kick player public static void Kick(this PlayerControl player, bool ban = false, string setReasonInfo = "") { - if (!GameStates.IsHost || !player.DataIsCollected() || player.IsHost() || player.BetterData().BannedByAntiCheat) + if (!GameStates.IsHost || !player.DataIsCollected() || player.IsHost() || player.BetterData().BannedByAntiCheat || player.isDummy) { return; } diff --git a/Modules/ExtendedPlayerInfo.cs b/Modules/ExtendedPlayerInfo.cs index 425bdfe..8ee0c2a 100644 --- a/Modules/ExtendedPlayerInfo.cs +++ b/Modules/ExtendedPlayerInfo.cs @@ -11,6 +11,8 @@ public class ExtendedPlayerInfo public bool IsTOHEHost { get; set; } = false; public bool BannedByAntiCheat { get; set; } = false; public bool HasNoisemakerNotify { get; set; } = false; + public float TimeSinceLastTask { get; set; } = 5f; + public uint LastTaskId { get; set; } = 0; public int TimesCalledMeeting { get; set; } = 0; public RoleTypes DeadDisplayRole { get; set; } } diff --git a/Patches/MeetingHudPatch.cs b/Patches/MeetingHudPatch.cs index 285fe80..e923938 100644 --- a/Patches/MeetingHudPatch.cs +++ b/Patches/MeetingHudPatch.cs @@ -119,6 +119,10 @@ class MeetingHudUpdatePatch string RoleHexColor = target.IsImpostorTeam() ? "#ff1919" : "#8cffff"; string Role = $"{target.GetRoleName()}"; + if (!target.IsImpostorTeam() && target.myTasks.Count > 0) + { + Role += $" ({target.myTasks.ToArray().Where(task => task.IsComplete).Count()}/{target.myTasks.Count})"; + } if (!target.IsImpostorTeammate()) { if (PlayerControl.LocalPlayer.IsAlive() && target != PlayerControl.LocalPlayer) diff --git a/Patches/PlayerControlPatch.cs b/Patches/PlayerControlPatch.cs index 89fa4c3..99486e5 100644 --- a/Patches/PlayerControlPatch.cs +++ b/Patches/PlayerControlPatch.cs @@ -72,6 +72,12 @@ class PlayerControlPatch { __instance.BetterData().TimesCalledMeeting = 0; __instance.BetterData().HasNoisemakerNotify = false; + __instance.BetterData().TimeSinceLastTask = 5f; + __instance.BetterData().LastTaskId = 999; + } + else + { + __instance.BetterData().TimeSinceLastTask += Time.deltaTime; } } @@ -131,12 +137,15 @@ class PlayerControlPatch var sbInfoBottom = new StringBuilder(); // Put +++ at the end of each tag - if (!string.IsNullOrEmpty(hashPuid) && AntiCheat.SickoData.ContainsKey(hashPuid) || !string.IsNullOrEmpty(friendCode) && AntiCheat.SickoData.ContainsValue(friendCode)) - sbTag.Append("Sicko User+++"); - else if (!string.IsNullOrEmpty(hashPuid) && AntiCheat.AUMData.ContainsKey(hashPuid) || !string.IsNullOrEmpty(friendCode) && AntiCheat.AUMData.ContainsValue(friendCode)) - sbTag.Append("AUM User+++"); - else if (!string.IsNullOrEmpty(hashPuid) && AntiCheat.PlayerData.ContainsKey(hashPuid) || !string.IsNullOrEmpty(friendCode) && AntiCheat.PlayerData.ContainsValue(friendCode)) - sbTag.Append("Known Cheater+++"); + if (!player.isDummy) + { + if (!string.IsNullOrEmpty(hashPuid) && AntiCheat.SickoData.ContainsKey(hashPuid) || !string.IsNullOrEmpty(friendCode) && AntiCheat.SickoData.ContainsValue(friendCode)) + sbTag.Append("Sicko User+++"); + else if (!string.IsNullOrEmpty(hashPuid) && AntiCheat.AUMData.ContainsKey(hashPuid) || !string.IsNullOrEmpty(friendCode) && AntiCheat.AUMData.ContainsValue(friendCode)) + sbTag.Append("AUM User+++"); + else if (!string.IsNullOrEmpty(hashPuid) && AntiCheat.PlayerData.ContainsKey(hashPuid) || !string.IsNullOrEmpty(friendCode) && AntiCheat.PlayerData.ContainsValue(friendCode)) + sbTag.Append("Known Cheater+++"); + } if (GameStates.IsInGame && GameStates.IsLobby && !GameStates.IsFreePlay) { @@ -167,6 +176,10 @@ class PlayerControlPatch if (player.IsImpostorTeammate() || player == PlayerControl.LocalPlayer || !PlayerControl.LocalPlayer.IsAlive() || DebugMenu.RevealRoles) { string Role = $"{player.GetRoleName()}"; + if (!player.IsImpostorTeam() && player.myTasks.Count > 0) + { + Role += $" ({player.myTasks.ToArray().Where(task => task.IsComplete).Count()}/{player.myTasks.Count})"; + } sbTagTop.Append($"{Role}+++"); } } diff --git a/main.cs b/main.cs index dd878a2..559573c 100644 --- a/main.cs +++ b/main.cs @@ -28,7 +28,7 @@ public class Main : BasePlugin public const bool IsHotFix = false; public const string PluginGuid = "com.d1gq.betteramongus"; public const string PluginVersion = "1.0.2"; - public const string ReleaseDate = "08.15.2024"; // mm/dd/yyyy + public const string ReleaseDate = "08.16.2024"; // mm/dd/yyyy public const string Github = "https://github.com/D1GQ/BetterAmongUs-Public"; public const string Discord = "https://discord.gg/vjYrXpzNAn";