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";