From 00e2a384c90e47cb07ba30ff016eec6f736f5c09 Mon Sep 17 00:00:00 2001 From: Ape <155788660+ApeMV@users.noreply.github.com> Date: Fri, 11 Sep 2026 23:00:09 +0200 Subject: [PATCH] Not even gonna try summing this up --- AmongUsRevamped.cs | 4 +- Modules/CommandHelper.cs | 1 - Modules/CustomOptionsHolder.cs | 103 ++++++- Modules/EACR.cs | 165 ++++++----- Modules/Utils.cs | 137 +++++++-- Patches/ChatPatches.cs | 182 ++++++++---- Patches/ClientOptionsPatch.cs | 4 + Patches/CredentialsPatch.cs | 21 +- Patches/EndGamePatches.cs | 2 +- Patches/IntroPatch.cs | 8 +- Patches/JoinAndLeavePatches.cs | 9 +- Patches/NumberOptionsPatch.cs | 4 +- Patches/PlayerControlPatches.cs | 10 +- Patches/SabotagePatches.cs | 29 +- README.md | 10 +- Resources/Language/English.json | 42 ++- Resources/Language/Italian.json | 343 ++++++++++------------ Resources/Language/Japanese.json | 28 +- Resources/Language/Russian.json | 28 +- Resources/Language/SimplifiedChinese.json | 28 +- 20 files changed, 700 insertions(+), 458 deletions(-) diff --git a/AmongUsRevamped.cs b/AmongUsRevamped.cs index 68ab2ff..eaa280b 100644 --- a/AmongUsRevamped.cs +++ b/AmongUsRevamped.cs @@ -37,6 +37,7 @@ public partial class Main : BasePlugin public static ConfigEntry DisableInfoWhenDead { get; private set; } public static ConfigEntry DisableCommandHelper { get; private set; } public static ConfigEntry DisableCompatibilityWarning { get; private set; } + public static ConfigEntry DisableChatModifier { get; private set; } public static NormalGameOptionsV11 NormalOptions => GameOptionsManager.Instance != null ? GameOptionsManager.Instance.currentNormalGameOptions : null; public static HideNSeekGameOptionsV11 HideNSeekOptions => GameOptionsManager.Instance != null ? GameOptionsManager.Instance.currentHideNSeekGameOptions : null; @@ -44,7 +45,7 @@ public partial class Main : BasePlugin public static bool HasArgumentException; public static string CredentialsText; - public const string ModVersion = "v2.0.4"; + public const string ModVersion = "v2.1.0"; public static float GameTimer; public static float AfkTimer; @@ -96,6 +97,7 @@ public partial class Main : BasePlugin DisableInfoWhenDead = Config.Bind("Client Options", "Disable Task/Kill View", false); DisableCommandHelper = Config.Bind("Client Options", "Disable Command Helper", false); DisableCompatibilityWarning = Config.Bind("Client Options", "Disable Compatibility Warning", false); + DisableChatModifier = Config.Bind("Client Options", "Disable Chat Modifications", false); Translator.Init(); Translator.Reload(); diff --git a/Modules/CommandHelper.cs b/Modules/CommandHelper.cs index b504dbe..6a20463 100644 --- a/Modules/CommandHelper.cs +++ b/Modules/CommandHelper.cs @@ -83,7 +83,6 @@ internal static class CommandHelper new Cmd { Name = new[] { "/clearseeker" }, Prompt = "/clearseeker", Description = Translator.Get("clearSeekerDesc"), HasVariable = false }, new Cmd { Name = new[] { "/mapvote" }, Prompt = "/mapvote", Description = Translator.Get("mapVoteDesc"), HasVariable = false }, - new Cmd { Name = new[] { "/allmapvote" }, Prompt = "/allmapvote", Description = Translator.Get("allMapVoteDesc"), HasVariable = false }, new Cmd { Name = new[] { "/gmvote" }, Prompt = "/gmvote", Description = Translator.Get("modeVoteDesc"), HasVariable = false }, new Cmd { Name = new[] { "/private" }, Prompt = "/private", Description = Translator.Get("privateDesc"), HasVariable = false }, diff --git a/Modules/CustomOptionsHolder.cs b/Modules/CustomOptionsHolder.cs index 6635aa5..7508c0f 100644 --- a/Modules/CustomOptionsHolder.cs +++ b/Modules/CustomOptionsHolder.cs @@ -61,6 +61,11 @@ namespace AmongUsRevamped Translator.Get("kick"), Translator.Get("ban"), Translator.Get("notifyMe") }; + public static readonly string[] cheatingPenalties = + { + Translator.Get("ban"), Translator.Get("kick"), Translator.Get("notifyMe") + }; + //System @@ -102,8 +107,6 @@ namespace AmongUsRevamped public static OptionItem MessagePerPlayerNum; public static OptionItem AutomaticMapPoll; public static OptionItem TimeBeforeMapPoll; - public static OptionItem AutomaticAllMapPoll; - public static OptionItem TimeBeforeAllMapPoll; public static OptionItem AutomaticModePoll; public static OptionItem TimeBeforeModePoll; @@ -123,12 +126,37 @@ namespace AmongUsRevamped public static OptionItem TabGroupMisc; public static OptionItem MapVoteDuration; + public static OptionItem CustomizeMapVote; + public static OptionItem IncludeSkeld; + public static OptionItem IncludeMira; + public static OptionItem IncludePolus; + public static OptionItem IncludeAirship; + public static OptionItem IncludeFungle; + public static OptionItem IncludeDleks; + public static OptionItem ModeVoteDuration; + public static OptionItem CustomizeModeVote; + public static OptionItem IncludeStandard; + public static OptionItem IncludeNoKillCooldown; + public static OptionItem IncludeShiftAndSeek; + public static OptionItem IncludePoofAndSeek; + public static OptionItem IncludeSpeedrun; + public static OptionItem StartCountdown; public static OptionItem ColorCommandLevel; public static OptionItem AllowFortegreen; public static OptionItem NoGameEnd; + public static OptionItem TabGroupAnticheat; + public static OptionItem HackingPunishment; + public static OptionItem DetectBadRPC; + public static OptionItem DetectBadSabotage; + public static OptionItem DetectBadVent; + public static OptionItem DetectBadTask; + public static OptionItem DetectBadKill; + public static OptionItem DetectBadAnimation; + public static OptionItem DetectBadMeeting; + public static OptionItem TabGroupAccess; public static OptionItem SlashColorCmd; public static OptionItem SlashRolesAndGamemodeCmd; @@ -167,6 +195,8 @@ namespace AmongUsRevamped public static OptionItem ShieldFirstDeath; public static OptionItem ShieldFirstDeathDuration; public static OptionItem DisableAnnoyingMeetingCalls; + + public static OptionItem TabGroupGameplayMapModifications; public static OptionItem ChangeDecontaminationTime; public static OptionItem DecontaminationTimeOnMiraHQ; public static OptionItem DecontaminationDoorOpenTimeOnMiraHQ; @@ -424,18 +454,14 @@ namespace AmongUsRevamped TimeBeforeMapPoll = IntegerOptionItem.Create(60155, Translator.Get("timeBeforeMapPoll"), new(10, 300, 5), 10, TabGroup.SystemSettings, false) .SetValueFormat(OptionFormat.Seconds) .SetParent(AutomaticMapPoll); - AutomaticAllMapPoll = BooleanOptionItem.Create(60156, Translator.Get("automaticAllMapPoll"), false, TabGroup.SystemSettings, false); - TimeBeforeAllMapPoll = IntegerOptionItem.Create(60157, Translator.Get("timeBeforeMapPoll"), new(10, 300, 5), 10, TabGroup.SystemSettings, false) - .SetValueFormat(OptionFormat.Seconds) - .SetParent(AutomaticAllMapPoll); - AutomaticModePoll = BooleanOptionItem.Create(60158, Translator.Get("automaticModePoll"), false, TabGroup.SystemSettings, false); - TimeBeforeModePoll = IntegerOptionItem.Create(60159, Translator.Get("timeBeforeMapPoll"), new(10, 300, 5), 20, TabGroup.SystemSettings, false) + AutomaticModePoll = BooleanOptionItem.Create(60156, Translator.Get("automaticModePoll"), false, TabGroup.SystemSettings, false); + TimeBeforeModePoll = IntegerOptionItem.Create(60157, Translator.Get("timeBeforeMapPoll"), new(10, 300, 5), 20, TabGroup.SystemSettings, false) .SetValueFormat(OptionFormat.Seconds) .SetParent(AutomaticModePoll); TabGroupAutostart = TextOptionItem.Create(64425, Translator.Get("tabGroupAutostart"), TabGroup.SystemSettings) .SetColor(Color.yellow); - AutoStartTimer = IntegerOptionItem.Create(64426, Translator.Get("autoStartTimer"), new(1, 5, 1), 5, TabGroup.SystemSettings, false) + AutoStartTimer = IntegerOptionItem.Create(64426, Translator.Get("autoStartTimer"), new(2, 5, 1), 5, TabGroup.SystemSettings, false) .SetValueFormat(OptionFormat.Seconds); WaitAutoStart = IntegerOptionItem.Create(64427, Translator.Get("waitAutoStart"), new(10, 600, 10), 300, TabGroup.SystemSettings, false) .SetValueFormat(OptionFormat.Seconds); @@ -457,19 +483,64 @@ namespace AmongUsRevamped TabGroupMisc = TextOptionItem.Create(60378, Translator.Get("tabGroupMisc"), TabGroup.SystemSettings) .SetColor(Color.yellow); + MapVoteDuration = IntegerOptionItem.Create(60379, Translator.Get("mapVoteDuration"), new(5, 60, 5), 20, TabGroup.SystemSettings, false) + .SetValueFormat(OptionFormat.Seconds); + CustomizeMapVote = BooleanOptionItem.Create(60380, Translator.Get("customizeMapVote"), false, TabGroup.SystemSettings, false); + IncludeSkeld = BooleanOptionItem.Create(60381, Translator.Get("includeSkeld"), true, TabGroup.SystemSettings, false) + .SetParent(CustomizeMapVote); + IncludeMira = BooleanOptionItem.Create(60382, Translator.Get("includeMira"), true, TabGroup.SystemSettings, false) + .SetParent(CustomizeMapVote); + IncludePolus = BooleanOptionItem.Create(60383, Translator.Get("includePolus"), true, TabGroup.SystemSettings, false) + .SetParent(CustomizeMapVote); + IncludeAirship = BooleanOptionItem.Create(60384, Translator.Get("includeAirship"), true, TabGroup.SystemSettings, false) + .SetParent(CustomizeMapVote); + IncludeFungle = BooleanOptionItem.Create(60385, Translator.Get("includeFungle"), true, TabGroup.SystemSettings, false) + .SetParent(CustomizeMapVote); + IncludeDleks = BooleanOptionItem.Create(60386, Translator.Get("includeDleks"), true, TabGroup.SystemSettings, false) + .SetParent(CustomizeMapVote); + + ModeVoteDuration = IntegerOptionItem.Create(60389, Translator.Get("modeVoteDuration"), new(5, 60, 5), 20, TabGroup.SystemSettings, false) + .SetValueFormat(OptionFormat.Seconds); + CustomizeModeVote = BooleanOptionItem.Create(60390, Translator.Get("customizeModeVote"), false, TabGroup.SystemSettings, false); + IncludeStandard = BooleanOptionItem.Create(60391, Translator.Get("includeStandard"), true, TabGroup.SystemSettings, false) + .SetParent(CustomizeModeVote); + IncludeNoKillCooldown = BooleanOptionItem.Create(60392, Translator.Get("includeNoKillCooldown"), true, TabGroup.SystemSettings, false) + .SetParent(CustomizeModeVote); + IncludeShiftAndSeek = BooleanOptionItem.Create(60393, Translator.Get("includeShiftAndSeek"), true, TabGroup.SystemSettings, false) + .SetParent(CustomizeModeVote); + IncludePoofAndSeek = BooleanOptionItem.Create(60394, Translator.Get("includePoofAndSeek"), true, TabGroup.SystemSettings, false) + .SetParent(CustomizeModeVote); + IncludeSpeedrun = BooleanOptionItem.Create(60395, Translator.Get("includeSpeedrun"), true, TabGroup.SystemSettings, false) + .SetParent(CustomizeModeVote); + StartCountdown = IntegerOptionItem.Create(60396, Translator.Get("startCountdown"), new(2, 5, 1), 5, TabGroup.SystemSettings, false) .SetValueFormat(OptionFormat.Seconds) .SetColor(Color.red); - ModeVoteDuration = IntegerOptionItem.Create(60380, Translator.Get("modeVoteDuration"), new(5, 60, 5), 20, TabGroup.SystemSettings, false) - .SetValueFormat(OptionFormat.Seconds) + AllowFortegreen = BooleanOptionItem.Create(60397, Translator.Get("allowFortegreen"), false, TabGroup.SystemSettings, false) .SetColor(Color.red); - StartCountdown = IntegerOptionItem.Create(60381, Translator.Get("startCountdown"), new(1, 5, 1), 5, TabGroup.SystemSettings, false) - .SetValueFormat(OptionFormat.Seconds) + NoGameEnd = BooleanOptionItem.Create(60398, Translator.Get("noGameEnd"), false, TabGroup.SystemSettings, false) .SetColor(Color.red); - AllowFortegreen = BooleanOptionItem.Create(60382, Translator.Get("allowFortegreen"), false, TabGroup.SystemSettings, false) + + TabGroupAnticheat = TextOptionItem.Create(60400, Translator.Get("tabGroupAnticheat"), TabGroup.SystemSettings) + .SetColor(Color.yellow); + HackingPunishment = StringOptionItem.Create(60401, Translator.Get("hackingPunishment"), cheatingPenalties, 0, TabGroup.SystemSettings, false) .SetColor(Color.red); - NoGameEnd = BooleanOptionItem.Create(60383, Translator.Get("noGameEnd"), false, TabGroup.SystemSettings, false) + DetectBadRPC = BooleanOptionItem.Create(60402, Translator.Get("detectBadRPC"), true, TabGroup.SystemSettings, false) .SetColor(Color.red); + DetectBadSabotage = BooleanOptionItem.Create(60403, Translator.Get("detectBadSabotage"), true, TabGroup.SystemSettings, false) + .SetColor(Color.red); + DetectBadVent = BooleanOptionItem.Create(60404, Translator.Get("detectBadVent"), true, TabGroup.SystemSettings, false) + .SetColor(Color.red); + DetectBadTask = BooleanOptionItem.Create(60405, Translator.Get("detectBadTask"), true, TabGroup.SystemSettings, false) + .SetColor(Color.red); + DetectBadKill = BooleanOptionItem.Create(60406, Translator.Get("detectBadKill"), true, TabGroup.SystemSettings, false) + .SetColor(Color.red); + DetectBadAnimation = BooleanOptionItem.Create(60407, Translator.Get("detectBadAnimation"), true, TabGroup.SystemSettings, false) + .SetColor(Color.red); + DetectBadMeeting = BooleanOptionItem.Create(60408, Translator.Get("detectBadMeeting"), true, TabGroup.SystemSettings, false) + .SetColor(Color.red); + + // Gamemode Settings @@ -628,6 +699,8 @@ namespace AmongUsRevamped .SetValueFormat(OptionFormat.Seconds); DisableAnnoyingMeetingCalls = BooleanOptionItem.Create(60567, Translator.Get("disableAnnoyingMeetingCalls"), false, TabGroup.ModSettings, false); + TabGroupGameplayMapModifications = TextOptionItem.Create(60549, Translator.Get("tabGroupGameplayMapModifications"), TabGroup.ModSettings) + .SetColor(Color.blue); ChangeDecontaminationTime = BooleanOptionItem.Create(60550, Translator.Get("changeDecontaminationTime"), false, TabGroup.ModSettings, false); DecontaminationTimeOnMiraHQ = FloatOptionItem.Create(60551, Translator.Get("decontaminationTimeOnMiraHQ"), new(0.5f, 10f, 0.25f), 3f, TabGroup.ModSettings, false) .SetParent(ChangeDecontaminationTime) diff --git a/Modules/EACR.cs b/Modules/EACR.cs index 46ba101..4ae492c 100644 --- a/Modules/EACR.cs +++ b/Modules/EACR.cs @@ -8,23 +8,22 @@ internal class EACR { public static bool PlayerControlReceiveRpc(PlayerControl pc, byte callId, MessageReader reader) { - if (!AmongUsClient.Instance.AmHost) return false; - if (pc == null || reader == null) return false; + if (!AmongUsClient.Instance.AmHost || pc == null || reader == null) return false; try { MessageReader sr = MessageReader.Get(reader); var rpc = (RpcCalls)callId; + switch (rpc) { case RpcCalls.StartMeeting: { - AmongUsClient.Instance.KickPlayer(pc.Data.ClientId, true); - Logger.SendInGame($"{pc.Data.PlayerName} was banned for being calling an invalid meeting (cheating)"); - Logger.Info($" {pc.Data.PlayerName} was banned for being calling an invalid meeting (cheating)", "EACR"); + MeetingCheat(pc); return true; } } + switch (callId) { case 101: // Aum Chat @@ -38,9 +37,7 @@ internal class EACR if (!flag) { - AmongUsClient.Instance.KickPlayer(pc.Data.ClientId, true); - Logger.SendInGame($"{pc.Data.PlayerName} was banned for AUM chat CallId (cheating)"); - Logger.Info($" {pc.Data.PlayerName} was banned for AUM chat CallId (cheating)", "EACR"); + RPCCheat(pc, "Among Us Menu Chat"); return true; } } @@ -56,9 +53,7 @@ internal class EACR if (aumid == pc.PlayerId) { - AmongUsClient.Instance.KickPlayer(pc.Data.ClientId, true); - Logger.SendInGame($"{pc.Data.PlayerName} was banned for AUM CallId (cheating)"); - Logger.Info($" {pc.Data.PlayerName} was banned for AUM CallId (cheating)", "EACR"); + RPCCheat(pc, "Among Us Menu"); return true; } } @@ -78,9 +73,7 @@ internal class EACR if (!flag) { - AmongUsClient.Instance.KickPlayer(pc.Data.ClientId, true); - Logger.SendInGame($"{pc.Data.PlayerName} was banned for KN chat CallId (cheating)"); - Logger.Info($" {pc.Data.PlayerName} was banned for KN chat CallId (cheating)", "EACR"); + RPCCheat(pc, "KillNetwork Chat"); return true; } } @@ -92,27 +85,14 @@ internal class EACR case 250: // KN if (sr.BytesRemaining == 0) { - AmongUsClient.Instance.KickPlayer(pc.Data.ClientId, true); - Logger.SendInGame($"{pc.Data.PlayerName} was banned for KN CallId (cheating)"); - Logger.Info($" {pc.Data.PlayerName} was banned for KN CallId (cheating)", "EACR"); + RPCCheat(pc, "KillNetwork"); return true; } break; case unchecked((byte)420): // 164 Sicko - if (sr.BytesRemaining == 0) - { - AmongUsClient.Instance.KickPlayer(pc.Data.ClientId, true); - Logger.SendInGame($"{pc.Data.PlayerName} was banned for Sickomenu RPC (cheating)"); - Logger.Info($" {pc.Data.PlayerName} was banned for Sickomenu RPC (cheating)", "EACR"); - return true; - } - break; - case 202: // SMC try { - AmongUsClient.Instance.KickPlayer(pc.Data.ClientId, true); - Logger.SendInGame($"{pc.Data.PlayerName} was banned for MMC CallId (cheating)"); - Logger.Info($" {pc.Data.PlayerName} was banned for MMC CallId (cheating)", "EACR"); + RPCCheat(pc, "SickoMenu"); return true; } catch @@ -120,7 +100,18 @@ internal class EACR } break; - case 201: + case 202: // SMC + try + { + RPCCheat(pc, "SlopMenuCrew"); + return true; + } + catch + { + + } + break; + case 201: // SMC Chat try { var firstString = sr.ReadString(); @@ -131,9 +122,7 @@ internal class EACR if (!flag) { - AmongUsClient.Instance.KickPlayer(pc.Data.ClientId, true); - Logger.SendInGame($"{pc.Data.PlayerName} was banned for MMC chat CallId (cheating)"); - Logger.Info($" {pc.Data.PlayerName} was banned for MMC chat CallId (cheating)", "EACR"); + RPCCheat(pc, "SlopMenuCrew Chat"); return true; } } @@ -150,6 +139,7 @@ internal class EACR } return false; } + public static bool RpcUpdateSystemCheck(PlayerControl player, SystemTypes systemType, byte amount) { var Mapid = Utils.GetActiveMapId(); @@ -167,108 +157,131 @@ internal class EACR if (systemType == SystemTypes.Sabotage) { - if (!player.Data.Role.IsImpostor && !player.isNew) + if (!player.Data.Role.IsImpostor) { - AmongUsClient.Instance.KickPlayer(player.Data.ClientId, true); - Logger.SendInGame($"{player.Data.PlayerName} was banned for invalid sabotage (cheating)"); - Logger.Info($" {player.Data.PlayerName} was banned for invalid sabotage", "EACR"); + SabotageCheat(player); } } else if (systemType == SystemTypes.LifeSupp) { - if (Mapid != 0 && Mapid != 1 && Mapid != 3) goto YesCheat; - else if (amount != 64 && amount != 65) goto YesCheat; + if (Mapid != 0 && Mapid != 1 && Mapid != 3) SabotageCheat(player); + else if (amount != 64 && amount != 65) SabotageCheat(player); } else if (systemType == SystemTypes.Comms) { if (amount == 0) { - if (Mapid == 1 || Mapid == 5) goto YesCheat; + if (Mapid == 1 || Mapid == 5) SabotageCheat(player); } else if (amount == 64 || amount == 65 || amount == 32 || amount == 33 || amount == 16 || amount == 17) { - if (!(Mapid == 1 || Mapid == 5)) goto YesCheat; + if (!(Mapid == 1 || Mapid == 5)) SabotageCheat(player); } - else goto YesCheat; + else SabotageCheat(player); } else if (systemType == SystemTypes.Electrical) { - if (Mapid == 5) goto YesCheat; - if (amount >= 5) - { - goto YesCheat; - } + if (Mapid == 5 || amount >= 5) SabotageCheat(player); } else if (systemType == SystemTypes.Laboratory) { - if (Mapid != 2) goto YesCheat; - else if (!(amount == 64 || amount == 65 || amount == 32 || amount == 33)) goto YesCheat; + if (Mapid != 2) SabotageCheat(player); + else if (!(amount == 64 || amount == 65 || amount == 32 || amount == 33)) SabotageCheat(player); } else if (systemType == SystemTypes.Reactor) { - if (Mapid == 2 || Mapid == 4) goto YesCheat; - else if (!(amount == 64 || amount == 65 || amount == 32 || amount == 33)) goto YesCheat; + if (Mapid == 2 || Mapid == 4) SabotageCheat(player); + else if (!(amount == 64 || amount == 65 || amount == 32 || amount == 33)) SabotageCheat(player); } else if (systemType == SystemTypes.HeliSabotage) { - if (Mapid != 4) goto YesCheat; - else if (!(amount == 64 || amount == 65 || amount == 16 || amount == 17 || amount == 32 || amount == 33)) goto YesCheat; + if (Mapid != 4) SabotageCheat(player); + else if (!(amount == 64 || amount == 65 || amount == 16 || amount == 17 || amount == 32 || amount == 33)) SabotageCheat(player); } else if (systemType == SystemTypes.MushroomMixupSabotage) { - goto YesCheat; + SabotageCheat(player); } if (Utils.IsMeeting && MeetingHud.Instance.state != MeetingHud.MeetingStates.Animating) { - Logger.SendInGame($"{player.Data.PlayerName} might have called an invalid sabotage (cheating)"); - Logger.Info($" {player.Data.PlayerName} might have called an invalid sabotage (cheating)", "EACR"); + SabotageCheat(player); return true; } return false; - YesCheat: + } + + public static void RPCCheat(PlayerControl player, string input) + { + if (Options.DetectBadRPC.GetBool()) { - AmongUsClient.Instance.KickPlayer(player.Data.ClientId, true); - Logger.SendInGame($"{player.Data.PlayerName} was banned for an invalid sabotage (cheating)"); - Logger.Info($" {player.Data.PlayerName} was banned for an invalid sabotage", "EACR"); - return true; + HackingPunishment(player, $"{player.Data.PlayerName} Sent invalid RPC: {input} (hacking)"); + } + } + + public static void SabotageCheat(PlayerControl player) + { + if (Options.DetectBadSabotage.GetBool()) + { + HackingPunishment(player, $"{player.Data.PlayerName} invalidly sabotaged (hacking)"); } } public static void VentCheat(PlayerControl player, Vent __instance) { - AmongUsClient.Instance.KickPlayer(player.Data.ClientId, true); - Logger.SendInGame($"{player.Data.PlayerName} was banned for invalid venting (cheating)"); - Logger.Info($" {player.Data.PlayerName} was banned for invalid venting", "EACR"); + if (Options.DetectBadVent.GetBool()) + { + HackingPunishment(player, $"{player.Data.PlayerName} invalidly vented (hacking)"); + } } public static void PlayAnimationCheat(PlayerControl player) { - AmongUsClient.Instance.KickPlayer(player.Data.ClientId, true); - Logger.SendInGame($"{player.Data.PlayerName} was banned for an invalid animation (cheating)"); - Logger.Info($" {player.Data.PlayerName} was banned for an invalid animation", "EACR"); + if (Options.DetectBadAnimation.GetBool()) + { + HackingPunishment(player, $"{player.Data.PlayerName} sent an invalid animation (hacking)"); + } } public static void TaskCheat(PlayerControl player) { - AmongUsClient.Instance.KickPlayer(player.Data.ClientId, true); - Logger.SendInGame($"{player.Data.PlayerName} was banned for invalidly completing a task (cheating)"); - Logger.Info($" {player.Data.PlayerName} was banned for invalidly completing a task", "EACR"); + if (Options.DetectBadTask.GetBool()) + { + HackingPunishment(player, $"{player.Data.PlayerName} invalidly completed a task (hacking)"); + } } public static void MurderCheat(PlayerControl player) { - AmongUsClient.Instance.KickPlayer(player.Data.ClientId, true); - Logger.SendInGame($"{player.Data.PlayerName} was banned for invalidly murdering a player (cheating)"); - Logger.Info($" {player.Data.PlayerName} was banned for invalidly murdering a player", "EACR"); + if (Options.DetectBadKill.GetBool()) + { + HackingPunishment(player, $"{player.Data.PlayerName} invalidly murdered a player (hacking)"); + } } public static void MeetingCheat(PlayerControl player) { - AmongUsClient.Instance.KickPlayer(player.Data.ClientId, true); - Logger.SendInGame($"{player.Data.PlayerName} was banned for invalidly calling a meeting (cheating)"); - Logger.Info($" {player.Data.PlayerName} was banned for invalidly calling a meeting", "EACR"); + if (Options.DetectBadMeeting.GetBool()) + { + HackingPunishment(player, $"{player.Data.PlayerName} invalidly called a meeting (hacking)"); + } + } + + public static void HackingPunishment(PlayerControl player, string input) + { + if (Options.HackingPunishment.GetValue() == 0) + { + AmongUsClient.Instance.KickPlayer(player.Data.ClientId, true); + } + + if (Options.HackingPunishment.GetValue() == 1) + { + AmongUsClient.Instance.KickPlayer(player.Data.ClientId, false); + } + + Logger.SendInGame($"{input}"); + Logger.Info($" {input}", "EACR"); } } \ No newline at end of file diff --git a/Modules/Utils.cs b/Modules/Utils.cs index 2a4e257..a6386d2 100644 --- a/Modules/Utils.cs +++ b/Modules/Utils.cs @@ -605,25 +605,30 @@ public static class Utils public static int fungleVotes; public static int dleksVotes; public static bool MapVoteActive; - public static bool DleksEnabled; public static readonly List HasVoted = []; - public static void MapVote(bool dleks, bool moderator) + public static void MapVote(bool moderator) { if (MapVoteActive || ModeVoteActive) return; - DleksEnabled = dleks; MapVoteActive = true; - if (dleks && moderator) Utils.ModeratorChatCommand("A map vote is active!\n\nA: Skeld\nB: Mira\nC: Polus\nD: Airship\nE: Fungle\nF: Eht Dleks\n\nType /vote 'letter' to vote.", "", false); - else if (moderator) Utils.ModeratorChatCommand("A map vote is active!\n\nA: The Skeld\nB: Mira HQ\nC: Polus\nD: The Airship\nE: The Fungle\n\nType /vote 'letter' to vote.", "", false); + string voteMessage = "A map vote is active!\n\n"; + if (!Options.CustomizeMapVote.GetBool()) voteMessage += "A: Skeld\nB: Mira\nC: Polus\nD: Airship\nE: Fungle\nF: Dleks\n"; + if (Options.IncludeSkeld.GetBool()) voteMessage += "A: Skeld\n"; + if (Options.IncludeMira.GetBool()) voteMessage += "B: Mira\n"; + if (Options.IncludePolus.GetBool()) voteMessage += "C: Polus\n"; + if (Options.IncludeAirship.GetBool()) voteMessage += "D: Airship\n"; + if (Options.IncludeFungle.GetBool()) voteMessage += "E: Fungle\n"; + if (Options.IncludeDleks.GetBool()) voteMessage += "F: Dleks\n"; + voteMessage += "\nType /vote 'letter' to vote."; - if (dleks && !moderator) Utils.ChatCommand(DestroyableSingleton.Instance.Chat, "A map vote is active!\n\nA: Skeld\nB: Mira\nC: Polus\nD: Airship\nE: Fungle\nF: Eht Dleks\n\nType /vote 'letter' to vote.", "", false); - else if (!moderator) Utils.ChatCommand(DestroyableSingleton.Instance.Chat, "A map vote is active!\n\nA: The Skeld\nB: Mira HQ\nC: Polus\nD: The Airship\nE: The Fungle\n\nType /vote 'letter' to vote.", "", false); + if (moderator) Utils.ModeratorChatCommand(voteMessage, "", false); + else Utils.ChatCommand(DestroyableSingleton.Instance.Chat, voteMessage, "", false); new LateTask(() => { - int highest = skeldVotes; - string winner = "Skeld"; + int highest = -1; + string winner = ""; byte mapId = 0; bool tie = false; @@ -642,16 +647,47 @@ public static class Utils } } - Check(miraVotes, "Mira HQ", 1); - Check(polusVotes, "Polus", 2); - Check(airshipVotes, "Airship", 4); - Check(fungleVotes, "The Fungle", 5); - if (DleksEnabled) Check(dleksVotes, "Eht Dleks", 3); + if (!Options.CustomizeMapVote.GetBool()) + { + Check(skeldVotes, "Skeld", 0); + Check(miraVotes, "Mira", 1); + Check(polusVotes, "Polus", 2); + Check(airshipVotes, "Airship", 4); + Check(fungleVotes, "Fungle", 5); + Check(dleksVotes, "Dleks", 3); + } + else + { + if (Options.IncludeSkeld.GetBool()) Check(skeldVotes, "Skeld", 0); + if (Options.IncludeMira.GetBool()) Check(miraVotes, "Mira", 1); + if (Options.IncludePolus.GetBool()) Check(polusVotes, "Polus", 2); + if (Options.IncludeAirship.GetBool()) Check(airshipVotes, "Airship", 4); + if (Options.IncludeFungle.GetBool()) Check(fungleVotes, "Fungle", 5); + if (Options.IncludeDleks.GetBool()) Check(dleksVotes, "Dleks", 3); + } - string voteResults = $"Skeld: {skeldVotes}\n" + $"Mira: {miraVotes}\n" + $"Polus: {polusVotes}\n" + $"Airship: {airshipVotes}\n" + $"Fungle: {fungleVotes}"; - if (DleksEnabled) voteResults += $"\nEht Dleks: {dleksVotes}"; + string voteResults = ""; + if (!Options.CustomizeMapVote.GetBool()) + { + voteResults += $"Skeld: {skeldVotes}\n"; + voteResults += $"Mira: {miraVotes}\n"; + voteResults += $"Polus: {polusVotes}\n"; + voteResults += $"Airship: {airshipVotes}\n"; + voteResults += $"Fungle: {fungleVotes}\n"; + voteResults += $"Dleks: {dleksVotes}\n"; + } + else + { + if (Options.IncludeSkeld.GetBool()) voteResults += $"Skeld: {skeldVotes}\n"; + if (Options.IncludeMira.GetBool()) voteResults += $"Mira: {miraVotes}\n"; + if (Options.IncludePolus.GetBool()) voteResults += $"Polus: {polusVotes}\n"; + if (Options.IncludeAirship.GetBool()) voteResults += $"Airship: {airshipVotes}\n"; + if (Options.IncludeFungle.GetBool()) voteResults += $"Fungle: {fungleVotes}\n"; + if (Options.IncludeDleks.GetBool()) voteResults += $"Dleks: {dleksVotes}\n"; + } + voteResults = voteResults.TrimEnd(); - if (highest == 0) + if (highest <= 0) { ModeratorChatCommand("Lol, no one voted. Hooray for democracy?", "", false); } @@ -663,7 +699,7 @@ public static class Utils { ModeratorChatCommand(SendChatPatch.ConvertNum($"Winner: {winner} ({highest})\n\n{voteResults}"), "", false); - if (winner == "Eht Dleks") + if (winner == "Dleks") { CreateOptionsPickerPatch.ApplyDleks(Utils.isHideNSeek); } @@ -701,13 +737,22 @@ public static class Utils ModeVoteActive = true; - if (moderator) Utils.ModeratorChatCommand("A Gamemode vote is active!\n\nA: None\nB: No Kill Cooldown\nC: Speedrun\nD: SnS\nE: PnS\n\nType /vote 'letter' to vote.", "", false); - else Utils.ChatCommand(DestroyableSingleton.Instance.Chat, "A Gamemode vote is active!\n\nA: None\nB: No Kill Cooldown\nC: Speedrun\nD: SnS\nE: PnS\n\nType /vote 'letter' to vote.", "", false); + string voteMessage = "A Gamemode vote is active!\n\n"; + if (!Options.CustomizeModeVote.GetBool()) voteMessage += "A: None\nB: No Kill Cooldown\nC: Speedrun\nD: SnS\nE: PnS\n"; + if (Options.IncludeStandard.GetBool()) voteMessage += "A: None\n"; + if (Options.IncludeNoKillCooldown.GetBool()) voteMessage += "B: No Kill Cooldown\n"; + if (Options.IncludeSpeedrun.GetBool()) voteMessage += "C: Speedrun\n"; + if (Options.IncludeShiftAndSeek.GetBool()) voteMessage += "D: SnS\n"; + if (Options.IncludePoofAndSeek.GetBool()) voteMessage += "E: PnS\n"; + voteMessage += "\nType /vote 'letter' to vote."; + + if (moderator) Utils.ModeratorChatCommand(voteMessage, "", false); + else Utils.ChatCommand(DestroyableSingleton.Instance.Chat, voteMessage, "", false); new LateTask(() => { - int highest = standardVotes; - string winner = "None"; + int highest = -1; + string winner = ""; byte modeId = 0; bool tie = false; @@ -726,13 +771,43 @@ public static class Utils } } - Check(noKillCooldownVotes, "0 Kill Cooldown", 0); - Check(speedrunVotes, "Speedrun", 2); - Check(shiftAndSeekVotes, "Shift and Seek", 1); - Check(poofAndSeekVotes, "Poof and Seek", 3); + if (!Options.CustomizeModeVote.GetBool()) + { + Check(standardVotes, "None", 0); + Check(noKillCooldownVotes, "0 Kill Cooldown", 0); + Check(speedrunVotes, "Speedrun", 2); + Check(shiftAndSeekVotes, "Shift and Seek", 1); + Check(poofAndSeekVotes, "Poof and Seek", 3); + } + else + { + if (Options.IncludeStandard.GetBool()) Check(standardVotes, "None", 0); + if (Options.IncludeNoKillCooldown.GetBool()) Check(noKillCooldownVotes, "0 Kill Cooldown", 0); + if (Options.IncludeSpeedrun.GetBool()) Check(speedrunVotes, "Speedrun", 2); + if (Options.IncludeShiftAndSeek.GetBool()) Check(shiftAndSeekVotes, "Shift and Seek", 1); + if (Options.IncludePoofAndSeek.GetBool()) Check(poofAndSeekVotes, "Poof and Seek", 3); + } - string voteResults = $"Standard: {standardVotes}\n" + $"No Kill Cooldown: {noKillCooldownVotes}\n" + $"Speedrun: {speedrunVotes}\n" + $"Shift and Seek: {shiftAndSeekVotes}\n" + $"Poof and Seek: {poofAndSeekVotes}"; - if (highest == 0) + string voteResults = ""; + if (!Options.CustomizeModeVote.GetBool()) + { + voteResults += $"Standard: {standardVotes}\n"; + voteResults += $"No Kill Cooldown: {noKillCooldownVotes}\n"; + voteResults += $"Speedrun: {speedrunVotes}\n"; + voteResults += $"Shift and Seek: {shiftAndSeekVotes}\n"; + voteResults += $"Poof and Seek: {poofAndSeekVotes}\n"; + } + else + { + if (Options.IncludeStandard.GetBool()) voteResults += $"Standard: {standardVotes}\n"; + if (Options.IncludeNoKillCooldown.GetBool()) voteResults += $"No Kill Cooldown: {noKillCooldownVotes}\n"; + if (Options.IncludeSpeedrun.GetBool()) voteResults += $"Speedrun: {speedrunVotes}\n"; + if (Options.IncludeShiftAndSeek.GetBool()) voteResults += $"Shift and Seek: {shiftAndSeekVotes}\n"; + if (Options.IncludePoofAndSeek.GetBool()) voteResults += $"Poof and Seek: {poofAndSeekVotes}\n"; + } + voteResults = voteResults.TrimEnd(); + + if (highest <= 0) { ModeratorChatCommand("We have a winner! Just kidding. No one voted.", "", false); } @@ -744,10 +819,10 @@ public static class Utils { ModeratorChatCommand(SendChatPatch.ConvertNum($"Winner: {winner} ({highest})\n\n{voteResults}"), "", false); Options.Gamemode.SetValue(modeId); - + if (winner == "0 Kill Cooldown") { - Main.NormalOptions.KillCooldown = 0.01f; + Main.NormalOptions.KillCooldown = 0.001f; } } @@ -756,7 +831,7 @@ public static class Utils speedrunVotes = 0; shiftAndSeekVotes = 0; poofAndSeekVotes = 0; - HasVoted.Clear(); + HasModeVoted.Clear(); ModeVoteActive = false; }, Options.ModeVoteDuration.GetInt(), "ModePoll"); diff --git a/Patches/ChatPatches.cs b/Patches/ChatPatches.cs index 3da1a51..a14d798 100644 --- a/Patches/ChatPatches.cs +++ b/Patches/ChatPatches.cs @@ -36,6 +36,24 @@ internal static class ChatControllerUpdatePatch __instance.quickChatField.background.color = Color.white; __instance.quickChatField.text.color = Color.black; } + + if (Main.DisableChatModifier.Value && !__instance.freeChatField.textArea.allowAllCharacters) + { + __instance.freeChatField.textArea.AllowSymbols = false; + __instance.freeChatField.textArea.AllowEmail = false; + __instance.freeChatField.textArea.characterLimit = 100; + } + if (!Main.DisableChatModifier.Value) + { + if (__instance.timeSinceLastMessage < 0.9f) + { + __instance.timeSinceLastMessage = 0.9f; + } + + __instance.freeChatField.textArea.AllowSymbols = true; + __instance.freeChatField.textArea.AllowEmail = true; + __instance.freeChatField.textArea.characterLimit = 120; + } } } @@ -418,19 +436,7 @@ internal static class SendChatPatch { if (Utils.IsLobby) { - Utils.MapVote(false, false); - - __instance.freeChatField.textArea.Clear(); - __instance.freeChatField.textArea.SetText(string.Empty); - return false; - } - } - - if (text == "/allmapvote") - { - if (Utils.IsLobby) - { - Utils.MapVote(true, false); + Utils.MapVote(false); __instance.freeChatField.textArea.Clear(); __instance.freeChatField.textArea.SetText(string.Empty); @@ -452,77 +458,87 @@ internal static class SendChatPatch if (text == "/vote a") { - if (Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) return true; - if (Utils.MapVoteActive && !Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) + if (Utils.MapVoteActive) { + if (Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) return true; Utils.skeldVotes++; + Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId); } - if (Utils.ModeVoteActive) + else if (Utils.ModeVoteActive) { + if (Utils.HasModeVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) return true; Utils.standardVotes++; + Utils.HasModeVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId); } - Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId); } if (text == "/vote b") { - if (Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) return true; if (Utils.MapVoteActive) { + if (Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) return true; Utils.miraVotes++; + Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId); } - if (Utils.ModeVoteActive) + else if (Utils.ModeVoteActive) { + if (Utils.HasModeVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) return true; Utils.noKillCooldownVotes++; + Utils.HasModeVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId); } - Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId); } if (text == "/vote c") { - if (Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) return true; if (Utils.MapVoteActive) { + if (Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) return true; Utils.polusVotes++; + Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId); } - if (Utils.ModeVoteActive) + else if (Utils.ModeVoteActive) { + if (Utils.HasModeVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) return true; Utils.speedrunVotes++; + Utils.HasModeVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId); } - Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId); } if (text == "/vote d") { - if (Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) return true; if (Utils.MapVoteActive) { + if (Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) return true; Utils.airshipVotes++; + Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId); } - if (Utils.ModeVoteActive) + else if (Utils.ModeVoteActive) { + if (Utils.HasModeVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) return true; Utils.shiftAndSeekVotes++; + Utils.HasModeVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId); } - Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId); } if (text == "/vote e") { - if (Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) return true; if (Utils.MapVoteActive) { + if (Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) return true; Utils.fungleVotes++; + Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId); } - if (Utils.ModeVoteActive) + else if (Utils.ModeVoteActive) { + if (Utils.HasModeVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) return true; Utils.poofAndSeekVotes++; + Utils.HasModeVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId); } - Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId); } if (text == "/vote f") { - if (Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) return true; - if (Utils.MapVoteActive && Utils.DleksEnabled) + if (Utils.MapVoteActive) { + if (Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) return true; Utils.dleksVotes++; + Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId); } - Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId); } if (text == "/l" || text == "/lastgame") @@ -575,7 +591,7 @@ internal static class SendChatPatch switch (Options.Gamemode.GetValue()) { case 0: - if (GameOptionsManager.Instance.CurrentGameOptions.GetFloat(FloatOptionNames.KillCooldown) == 0.01f) + if (GameOptionsManager.Instance.CurrentGameOptions.GetFloat(FloatOptionNames.KillCooldown) == 0.001f) { Utils.ChatCommand(__instance, "0 Kill Cooldown:\n\nImpostors have no kill cooldown, and can't kill after a game starts for 5 seconds", "", false); } @@ -874,16 +890,7 @@ public static class RPCHandlerPatch if (Utils.IsLobby) { if (Utils.CheckAccessLevel(__instance.Data.FriendCode) < Options.SlashMapAndSeekerCmd.GetValue()) return; - Utils.MapVote(false, true); - } - } - - if (text == "/allmapvote") - { - if (Utils.IsLobby) - { - if (Utils.CheckAccessLevel(__instance.Data.FriendCode) < Options.SlashMapAndSeekerCmd.GetValue()) return; - Utils.MapVote(true, true); + Utils.MapVote(true); } } @@ -895,80 +902,90 @@ public static class RPCHandlerPatch Utils.ModeVote(true); } } - + if (text == "/vote a") { - if (Utils.HasVoted.Contains(__instance.Data.PlayerId)) return; if (Utils.MapVoteActive) { + if (Utils.HasVoted.Contains(__instance.Data.PlayerId)) return; Utils.skeldVotes++; + Utils.HasVoted.Add(__instance.Data.PlayerId); } - if (Utils.ModeVoteActive) + else if (Utils.ModeVoteActive) { + if (Utils.HasModeVoted.Contains(__instance.Data.PlayerId)) return; Utils.standardVotes++; + Utils.HasModeVoted.Add(__instance.Data.PlayerId); } - Utils.HasVoted.Add(__instance.Data.PlayerId); } if (text == "/vote b") { - if (Utils.HasVoted.Contains(__instance.Data.PlayerId)) return; if (Utils.MapVoteActive) { + if (Utils.HasVoted.Contains(__instance.Data.PlayerId)) return; Utils.miraVotes++; + Utils.HasVoted.Add(__instance.Data.PlayerId); } - if (Utils.ModeVoteActive) + else if (Utils.ModeVoteActive) { + if (Utils.HasModeVoted.Contains(__instance.Data.PlayerId)) return; Utils.noKillCooldownVotes++; + Utils.HasModeVoted.Add(__instance.Data.PlayerId); } - Utils.HasVoted.Add(__instance.Data.PlayerId); } if (text == "/vote c") { - if (Utils.HasVoted.Contains(__instance.Data.PlayerId)) return; if (Utils.MapVoteActive) { + if (Utils.HasVoted.Contains(__instance.Data.PlayerId)) return; Utils.polusVotes++; + Utils.HasVoted.Add(__instance.Data.PlayerId); } - if (Utils.ModeVoteActive) + else if (Utils.ModeVoteActive) { + if (Utils.HasModeVoted.Contains(__instance.Data.PlayerId)) return; Utils.speedrunVotes++; + Utils.HasModeVoted.Add(__instance.Data.PlayerId); } - Utils.HasVoted.Add(__instance.Data.PlayerId); } if (text == "/vote d") { - if (Utils.HasVoted.Contains(__instance.Data.PlayerId)) return; if (Utils.MapVoteActive) { + if (Utils.HasVoted.Contains(__instance.Data.PlayerId)) return; Utils.airshipVotes++; + Utils.HasVoted.Add(__instance.Data.PlayerId); } - if (Utils.ModeVoteActive) + else if (Utils.ModeVoteActive) { + if (Utils.HasModeVoted.Contains(__instance.Data.PlayerId)) return; Utils.shiftAndSeekVotes++; + Utils.HasModeVoted.Add(__instance.Data.PlayerId); } - Utils.HasVoted.Add(__instance.Data.PlayerId); } if (text == "/vote e") { - if (Utils.HasVoted.Contains(__instance.Data.PlayerId)) return; if (Utils.MapVoteActive) { + if (Utils.HasVoted.Contains(__instance.Data.PlayerId)) return; Utils.fungleVotes++; + Utils.HasVoted.Add(__instance.Data.PlayerId); } - if (Utils.ModeVoteActive) + else if (Utils.ModeVoteActive) { + if (Utils.HasModeVoted.Contains(__instance.Data.PlayerId)) return; Utils.poofAndSeekVotes++; + Utils.HasModeVoted.Add(__instance.Data.PlayerId); } - Utils.HasVoted.Add(__instance.Data.PlayerId); } if (text == "/vote f") { - if (Utils.HasVoted.Contains(__instance.Data.PlayerId)) return; - if (Utils.MapVoteActive && Utils.DleksEnabled) + if (Utils.MapVoteActive) { + if (Utils.HasVoted.Contains(__instance.Data.PlayerId)) return; Utils.dleksVotes++; + Utils.HasVoted.Add(__instance.Data.PlayerId); } - Utils.HasVoted.Add(__instance.Data.PlayerId); } if (text == "/l" || text == "/lastgame") @@ -1018,7 +1035,7 @@ public static class RPCHandlerPatch switch (Options.Gamemode.GetValue()) { case 0: - if (GameOptionsManager.Instance.CurrentGameOptions.GetFloat(FloatOptionNames.KillCooldown) == 0.01f) + if (GameOptionsManager.Instance.CurrentGameOptions.GetFloat(FloatOptionNames.KillCooldown) == 0.001f) { Utils.ModeratorChatCommand("0 Kill Cooldown:\n\nImpostors have no kill cooldown, and can't kill after a game starts for 5 seconds", "", false); } @@ -1063,4 +1080,43 @@ public static class RPCHandlerPatch } } } +} + +[HarmonyPatch(typeof(FreeChatInputField), nameof(FreeChatInputField.UpdateCharCount))] +public static class FreeChatInputFieldUpdateCharCountPatch +{ + public static void Postfix(FreeChatInputField __instance) + { + if (!Main.DisableChatModifier.Value) + { + __instance.charCountText.SetText($"{__instance.textArea.text.Length}/120"); + } + } +} + +// https://github.com/astra1dev/AUnlocker/blob/main/src/Patches/ChatPatches.cs +[HarmonyPatch(typeof(TextBoxTMP), nameof(TextBoxTMP.Update))] +public static class TextBoxTMPUpdatePatch +{ + public static void Postfix(TextBoxTMP __instance) + { + if (!Main.DisableChatModifier.Value && __instance.hasFocus) + { + if (!Input.GetKey(KeyCode.LeftControl) && !Input.GetKey(KeyCode.RightControl)) return; + + if (Input.GetKeyDown(KeyCode.C)) + { + GUIUtility.systemCopyBuffer = __instance.text; + } + if (Input.GetKeyDown(KeyCode.V)) + { + __instance.SetText(__instance.text + GUIUtility.systemCopyBuffer); + } + if (Input.GetKeyDown(KeyCode.X)) + { + GUIUtility.systemCopyBuffer = __instance.text; + __instance.SetText(""); + } + } + } } \ No newline at end of file diff --git a/Patches/ClientOptionsPatch.cs b/Patches/ClientOptionsPatch.cs index 88a7d1f..0de4680 100644 --- a/Patches/ClientOptionsPatch.cs +++ b/Patches/ClientOptionsPatch.cs @@ -17,6 +17,7 @@ namespace AmongUsRevamped private static ClientOptionItem DisableInfoWhenDead; private static ClientOptionItem DisableCommandHelper; private static ClientOptionItem DisableCompatibilityWarning; + private static ClientOptionItem DisableChatModifier; public static void Postfix(OptionsMenuBehaviour __instance) { @@ -64,6 +65,9 @@ namespace AmongUsRevamped if (DisableCompatibilityWarning == null || DisableCompatibilityWarning.ToggleButton == null) DisableCompatibilityWarning = ClientOptionItem.Create(Translator.Get("disableCompatibilityWarning"), Main.DisableCompatibilityWarning, __instance); + + if (DisableChatModifier == null || DisableChatModifier.ToggleButton == null) + DisableChatModifier = ClientOptionItem.Create(Translator.Get("disableChatModifier"), Main.DisableChatModifier, __instance); } } diff --git a/Patches/CredentialsPatch.cs b/Patches/CredentialsPatch.cs index d657770..da3e1fd 100644 --- a/Patches/CredentialsPatch.cs +++ b/Patches/CredentialsPatch.cs @@ -62,7 +62,7 @@ namespace AmongUsRevamped var credentials = UnityEngine.Object.Instantiate(__instance.text); credentials.text = Main.CredentialsText; credentials.alignment = TextAlignmentOptions.Right; - credentials.transform.position = new Vector3(1f, 2.67f, -2f); + credentials.transform.position = new Vector3(-4.1f, -2.68f, -2f); credentials.fontSize = credentials.fontSizeMax = credentials.fontSizeMin = 2f; ErrorText.Create(__instance.text); @@ -181,6 +181,7 @@ namespace AmongUsRevamped private static PassiveButton template; private static PassiveButton discordButton; private static PassiveButton gitHubButton; + private static PassiveButton latestButton; private static PassiveButton animationSceneButton; private static Transform buttonParent; public static void Postfix(MainMenuManager __instance) @@ -195,7 +196,7 @@ namespace AmongUsRevamped discordButton = CreateButton( __instance, "DiscordButton", - new(2.1f, 4.05f, 1f), + new(2.3f, 4.05f, 1f), new(88, 101, 242, byte.MaxValue), new(148, 161, byte.MaxValue, byte.MaxValue), () => Application.OpenURL("https://discord.gg/83Zhzhyhya"), @@ -207,13 +208,25 @@ namespace AmongUsRevamped gitHubButton = CreateButton( __instance, "GitHubButton", - new(3.8f, 4.05f, 1f), + new(4.0f, 4.05f, 1f), new(153, 153, 153, byte.MaxValue), new(209, 209, 209, byte.MaxValue), () => Application.OpenURL("https://github.com/ApeMV/AmongUsRevamped"), "GitHub"); } + if (latestButton == null) + { + latestButton = CreateButton( + __instance, + "LatestButton", + new(5.7f, 4.05f, 1f), + new(255, 215, 0, byte.MaxValue), + new(255, 255, 30, byte.MaxValue), + () => Application.OpenURL("https://github.com/ApeMV/AmongUsRevamped/releases/latest"), + "Latest"); + } + if (animationSceneButton == null) { animationSceneButton = CreateButton( @@ -322,7 +335,7 @@ namespace AmongUsRevamped button.name = name; button.transform.localPosition = localPosition; - if (name == "GitHubButton" || name == "DiscordButton") + if (name == "GitHubButton" || name == "DiscordButton" || name == "LatestButton") { button.transform.localScale = new Vector3(0.8f, 1f, 1f); } diff --git a/Patches/EndGamePatches.cs b/Patches/EndGamePatches.cs index 0f0f554..44c616d 100644 --- a/Patches/EndGamePatches.cs +++ b/Patches/EndGamePatches.cs @@ -51,7 +51,7 @@ class NormalGameEndChecker public static void CheckWinnerText(string Winner) { string impostorList = string.Join(", ", imps.Select(p => p.Data.PlayerName)); - string impostorString = impostorList != "" ? $"\n\n Impostors: {impostorList}" : ""; + string impostorString = impostorList != "" ? $"\n\nImpostors: {impostorList}" : ""; if (!canUpdateWinnerText) return; diff --git a/Patches/IntroPatch.cs b/Patches/IntroPatch.cs index b772b7c..6897261 100644 --- a/Patches/IntroPatch.cs +++ b/Patches/IntroPatch.cs @@ -90,14 +90,14 @@ internal static class CoShowIntroPatch } } - if ((GameOptionsManager.Instance.CurrentGameOptions.GetFloat(FloatOptionNames.KillCooldown) == 0.01f)) + if ((GameOptionsManager.Instance.CurrentGameOptions.GetFloat(FloatOptionNames.KillCooldown) == 0.001f)) { Main.NormalOptions.KillCooldown = 5f; OptionManager.SyncGameOptions(); _ = new LateTask(() => { - Main.NormalOptions.KillCooldown = 0.01f; + Main.NormalOptions.KillCooldown = 0.001f; OptionManager.SyncGameOptions(); }, 13f, "NoKcdEnabled"); } @@ -111,7 +111,7 @@ internal static class CoShowIntroPatch _ = new LateTask(() => { - Main.NormalOptions.KillCooldown = 0.01f; + Main.NormalOptions.KillCooldown = 0.001f; OptionManager.SyncGameOptions(); }, 18f, "NoKcdEnabled"); } @@ -122,7 +122,7 @@ internal static class CoShowIntroPatch _ = new LateTask(() => { - Main.NormalOptions.KillCooldown = 0.01f; + Main.NormalOptions.KillCooldown = 0.001f; OptionManager.SyncGameOptions(); }, 13f, "NoKcdEnabled"); } diff --git a/Patches/JoinAndLeavePatches.cs b/Patches/JoinAndLeavePatches.cs index 8930ffb..65ded80 100644 --- a/Patches/JoinAndLeavePatches.cs +++ b/Patches/JoinAndLeavePatches.cs @@ -50,16 +50,9 @@ internal static class OnGameJoinedPatch { new LateTask(() => { - Utils.MapVote(false, true); + Utils.MapVote(true); }, Options.TimeBeforeMapPoll.GetInt(), "AutoMapPoll"); } - if (Options.AutomaticAllMapPoll.GetBool()) - { - new LateTask(() => - { - Utils.MapVote(true, true); - }, Options.TimeBeforeAllMapPoll.GetInt(), "AutoMapPoll"); - } if (Options.AutomaticModePoll.GetBool()) { new LateTask(() => diff --git a/Patches/NumberOptionsPatch.cs b/Patches/NumberOptionsPatch.cs index c573d61..d100849 100644 --- a/Patches/NumberOptionsPatch.cs +++ b/Patches/NumberOptionsPatch.cs @@ -19,7 +19,7 @@ public static class NumberOption_Increase { if (__instance.Title == StringNames.GameKillCooldown) { - if (__instance.Value == 0.01f) + if (__instance.Value == 0.001f) { __instance.Value = 0.5f; __instance.UpdateValue(); @@ -114,7 +114,7 @@ public static class NumberOption_Initialize case StringNames.GameKillCooldown: __instance.Increment = 0.5f; - __instance.ValidRange = new FloatRange(0.01f, 900f); + __instance.ValidRange = new FloatRange(0.001f, 900f); break; case StringNames.GamePlayerSpeed: diff --git a/Patches/PlayerControlPatches.cs b/Patches/PlayerControlPatches.cs index 4bdc413..4d3aa49 100644 --- a/Patches/PlayerControlPatches.cs +++ b/Patches/PlayerControlPatches.cs @@ -182,14 +182,20 @@ class PlayerControlCompleteTaskPatch __instance.Data.RoleType == RoleTypes.Phantom || __instance.Data.RoleType == RoleTypes.Viper) { - EACR.TaskCheat(__instance); + if (__instance != PlayerControl.LocalPlayer) + { + EACR.TaskCheat(__instance); + } } playerTasksCompleted[__instance.PlayerId]++; if (playerTasksCompleted[__instance.PlayerId] > __instance.Data.Tasks.Count) { - EACR.TaskCheat(__instance); + if (__instance != PlayerControl.LocalPlayer) + { + EACR.TaskCheat(__instance); + } } Logger.Info($" {__instance.Data.PlayerName} completed {idx}", "TaskPatch"); diff --git a/Patches/SabotagePatches.cs b/Patches/SabotagePatches.cs index 8450a16..722ce23 100644 --- a/Patches/SabotagePatches.cs +++ b/Patches/SabotagePatches.cs @@ -104,8 +104,7 @@ public static class MessageReaderUpdateSystemPatch public static bool Prefix(ShipStatus __instance, [HarmonyArgument(0)] SystemTypes systemType, [HarmonyArgument(1)] PlayerControl player, [HarmonyArgument(2)] MessageReader reader) { if (systemType is - SystemTypes.Ventilation - or SystemTypes.Security + SystemTypes.Security or SystemTypes.Decontamination or SystemTypes.Decontamination2 or SystemTypes.Decontamination3 @@ -113,13 +112,29 @@ public static class MessageReaderUpdateSystemPatch if (player.Data.ClientId == AmongUsClient.Instance.HostId) return true; - var amount = MessageReader.Get(reader).ReadByte(); - if (EACR.RpcUpdateSystemCheck(player, systemType, amount)) + // Thanks to D1GQ for finding. + if (systemType == SystemTypes.Ventilation) { - Logger.Info("EACR patched Sabotage RPC", "MessageReaderUpdateSystemPatch"); - return false; + _ = reader.ReadUInt16(); + var operation = (VentilationSystem.Operation)reader.ReadByte(); + if (operation == VentilationSystem.Operation.BootImpostors) + { + return false; + } + + return true; + + } + else + { + var amount = MessageReader.Get(reader).ReadByte(); + if (EACR.RpcUpdateSystemCheck(player, systemType, amount)) + { + Logger.Info("EACR patched Sabotage RPC", "MessageReaderUpdateSystemPatch"); + return false; + } + else return true; } - else return true; } } diff --git a/README.md b/README.md index 0f88cd1..98ecd6d 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ **** ‎ -# 🎮 Features (v2.0.4): +# 🎮 Features (v2.1.0): ## ♠️ Client Side settings: - Toggle Game Master (Spectator) @@ -45,6 +45,7 @@ - Toggle Lobby Music - Toggle Info When Dead - Toggle Command Helper +- Toggle Chat Modifications ## ⚙️ Technical settings: - Advanced AFK Detection system - Kick/Ban players under/above a certain level @@ -77,7 +78,7 @@ - Shield player who died first - Hide and Seek: Custom Seeker count ## 🏆 Custom Gamemodes: -- 0 Kill Cooldown -> Set Kill Cooldown to 0.01 +- 0Kcd -> Set Kill Cooldown to 0.0 - Shift and Seek - Poof and Seek - Speedrun @@ -90,7 +91,6 @@ - Detect invalid kills - Detect immortality cheats - Block attempted votekicks -- These are all enabled by default ## ❓ Other Improvements: - Lanuage support: English, Italian, Japanese, Russian, Simplified Chinese, Spanish - Select a language in Language/YourLanguage.txt @@ -104,6 +104,8 @@ - Higher and more accurate Option ranges - Always visible lobby timer - Access experimental animation test scene +- Faster chat cooldown (2.2s) +- 120 character chat limit, copy pasting - 🎉 And this all works in public lobbies! ### Hotkeys @@ -151,10 +153,10 @@ ### :star: [AUnlocker](https://github.com/astra1dev/AUnlocker) > - Original NumberOptionsPatch > - Always Show Lobby Timer +> - Copy Pasting & Character Increase ### :star: [EHR (Formerly TOHE+)](https://github.com/Gurge44/EndlessHostRoles) > - Task Patching ### :star: [TOH](https://github.com/tukasa0001/TownOfHost) : -> - Ban Manager > - OptionHolder & ClientOptionItem ### :star: [Super New Roles](https://github.com/ykundesu/SuperNewRoles) (SNR): > - Credentials menu diff --git a/Resources/Language/English.json b/Resources/Language/English.json index b0add20..1687c6b 100644 --- a/Resources/Language/English.json +++ b/Resources/Language/English.json @@ -39,7 +39,7 @@ "tabGroupAutomation": "Automation", "autoSendGameInfo": "Automatically send winner info", - "autoRejoinLobby": "Auto Rejoin Lobby", + "autoRejoinLobby": "Automatically Rejoin Lobby", "tabGroupAutostart": "Autohost", "autoStartTimer": "Countdown For Auto Start", @@ -159,7 +159,7 @@ "disableFungleVital": "Disable Fungle Vitals", "tabGroupTasks": "Tasks", - "allPlayersSameTasks": "Everyone has same tasks", + "allPlayersSameTasks": "Everyone Has Same Tasks", "overrideTaskSettings": "Disable Tasks", "taskPercentNeededToWin": "% Tasks completed for crewmates to win", @@ -252,7 +252,7 @@ "disableSubmitScan": "Disable Submit Scan", "disableUploadData": "Disable Upload Data", - "allCommandsFull": "ALL COMMANDS:\n\n/help\nShow this message.\n/aur, /socials\nSend Among Us Revamped social links.\n\n/r, /gm\nSend current mode description.\n/l, /lastgame\nSend last winner info.\n\n/0kc, /0killcooldown\nSend 0 Kill Cooldown mode description.\n/sns, /shiftandseek\nSend Shift and Seek mode description.\n/sns2\nSend extended Shift and Seek mode description\n/pns, /poofandseek\nSend Poof and Seek mode description.\n/sp, /speedrun\nSend Speedrun mode description.\n\n/kick, /ban\nKick or ban a player by name.\n/ckick, /cban\nKick or ban a player by color.\n\n/vip /moderator /admin\nAdd a player as VIP, Moderator, or Admin.\n/removevip, /removemoderator, /removeadmin\nRemove VIP, Moderator, or Admin from a player.\n\n/eg, /endgame\nEnd the current game.\n/em, /endmeeting\nEnd the current meeting.\n/s, /start\nBegin the game starting countdown.\n\n/t {template}\nSend a template from AUR-DATA/templates.txt.\n\n/col, /color, /colour\nSet your color, can be used to bypass limits.\n\n/seeker {name}\nForce someone as Seeker in HnS.\n/seekers\nShow forced seeker list.\n/clearseeker\nClear forced seeker list.\n\n/mapvote\nStarts a map vote containing default maps.\n/allmapvote\nStarts a map vote that includes Eht Dleks.\n/gmvote\nStarts a gamemode vote.", + "allCommandsFull": "ALL COMMANDS:\n\n/help\nShow this message.\n/aur, /socials\nSend Among Us Revamped social links.\n\n/r\nSend current mode description.\n/l, /lastgame\nSend last winner info.\n\n/0kc, /0killcooldown\nSend 0 Kill Cooldown mode description.\n/sns, /shiftandseek\nSend Shift and Seek mode description.\n/sns2\nSend extended Shift and Seek mode description\n/pns, /poofandseek\nSend Poof and Seek mode description.\n/sp, /speedrun\nSend Speedrun mode description.\n\n/kick, /ban\nKick or ban a player by name.\n/ckick, /cban\nKick or ban a player by color.\n\n/vip /moderator /admin\nAdd a player as VIP, Moderator, or Admin.\n/removevip /removemoderator /removeadmin\nRemove VIP, Moderator, or Admin from a player.\n\n/eg, /endgame\nEnd the current game.\n/em, /endmeeting\nEnd the current meeting.\n/s, /start\nBegin the game starting countdown.\n\n/t {template}\nSend a template from AUR-DATA/templates.txt.\n\n/col, /color, /colour\nSet your color, can be used to bypass limits.\n\n/seeker {name}\nForce someone as Seeker in HnS.\n/seekers\nShow forced Seeker list.\n/clearseeker\nClear forced Seeker list.\n\n/mapvote\nStarts a customizable map vote maps.\n/gmvote\nStarts a customizable gamemode vote.\n\n/private\nSets lobby to private.\n/public\nSets lobby to public.", "translationReloaded": "Your file has successfully been reset.\nTo apply all changes, restart your game.", @@ -308,9 +308,9 @@ "seekerDesc": "Adds player as Seeker in HnS.", "seekersDesc": "Shows all manually selected Seekers.", "clearSeekerDesc": "Clears the manual Seeker list.", - "mapVoteDesc": "Starts a vote between the 5 core maps.", + "mapVoteDesc": "Starts a vote between selected maps.", "allMapVoteDesc": "Starts a vote between all 6 maps, including Eht Dleks.", - "modeVoteDesc": "Starts a vote between all gamemodes.", + "modeVoteDesc": "Starts a vote between selected gamemodes.", "privateDesc": "Changes lobby visibility to private.", "publicDesc": "Changes lobby visibility to public.", @@ -365,5 +365,35 @@ "pnsDisableCloseDoor": "Disable PnS Door Sabotages", "tabGroupPNS": "Poof and Seek", "badMoveTimeToSuicide": "Phantom Suicides After Visibly Moving For", - "snsImpostorCanVent": "Impostors Can Vent" + "snsImpostorCanVent": "Impostors Can Vent", + + "tabGroupAnticheat": "Anticheat", + "hackingPunishment": "Hacking Punishment", + "detectBadRPC": "Detect Invalid RPC's", + "detectBadSabotage": "Detect Invalid Sabotages", + "detectBadVent": "Detect Invalid Venting", + "detectBadTask": "Detect Invalid Task Completions", + "detectBadKill": "Detect Invalid Kills", + "detectBadAnimation": "Detect Invalid Animations", + "detectBadMeeting": "Detect Invalid Meetings", + + "customizeMapVote": "Customize Map Votes", + "includeSkeld": "Include Skeld", + "includeMira": "Include Mira", + "includePolus": "Include Polus", + "includeAirship": "Include Airship", + "includeFungle": "Include Fungle", + "includeDleks": "Include Dleks", + + "customizeModeVote": "Customize Gamemode Votes", + "includeStandard": "Include Standard", + "includeNoKillCooldown": "Include 0 Kill Cooldown", + "includeShiftAndSeek": "Include Shift And Seek", + "includePoofAndSeek": "Include Poof And Seek", + "includeSpeedrun": "Include Speedrun", + + "tabGroupGameplayMapModifications": "Map Modifications", + + "disableChatModifier": "Disable Chat Modifications" + } diff --git a/Resources/Language/Italian.json b/Resources/Language/Italian.json index f15c925..36b7145 100644 --- a/Resources/Language/Italian.json +++ b/Resources/Language/Italian.json @@ -1,46 +1,42 @@ { "LanguageID": "1", - "gameMaster": "Spettatore", "showFPS": "Mostra FPS", "autoStart": "Avvio Automatico", "enableDarkTheme": "Abilita Tema Scuro", "enableLobbyMusic": "Musica della Lobby", "disableInfoWhenDead": "Nascondi Informazioni Dopo la Morte", - "disableCommandHelper": "Disabilita Aiutante Comandi", + "disableCommandHelper": "Disabilita Aiutante dei Comandi", "disableCompatibilityWarning": "Disabilita Avviso di Compatibilità", - - "cancelStartCountdown": "Conto alla rovescia annullato", - - "invalidFriendCodeKick": "{0} è stato kickato per un Codice Amico non valido", - "invalidFriendCodeBan": "{0} è stato bannato per un Codice Amico non valido", + "cancelStartCountdown": "Conto alla rovescia per l'avvio annullato", + "invalidFriendCodeKick": "{0} è stato espulso a causa di un Codice Amico non valido", + "invalidFriendCodeBan": "{0} è stato bannato a causa di un Codice Amico non valido", "language": "Lingua (Richiede Riavvio)", "gamemode": "Modalità", "tabGroupMain": "Moderazione", - "kickLowLevelPlayer": "Kicka Giocatori Sotto il Livello", - "tempBanLowLevelPlayer": "Banna invece di kickare", - "dontKickLevelOnes": "Non kickare Giocatori Liv.1 Nelle Lobby Glitchate", - "kickInvalidFriendCodes": "Kicka Codici Amico Non Validi (Vuoti)", - "tempBanInvalidFriendCodes": "Banna invece di kickare", - "deniedWordsToKick": "Parole Vietate Inviate Per Kickare il Giocatore", + "kickLowLevelPlayer": "Espelli Giocatori Sotto il Livello", + "tempBanLowLevelPlayer": "Banna invece di espellere", + "dontKickLevelOnes": "Non espellere i Giocatori di Liv. 1 Nelle Lobby Glitchate", + "kickInvalidFriendCodes": "Espelli Codici Amico Non Validi (Vuoti)", + "tempBanInvalidFriendCodes": "Banna invece di espellere", + "deniedWordsToKick": "Parole Vietate Inviate Per Espellere il Giocatore", "moderatorCanUseCommand": "I Moderatori Possono Usare i Comandi", - "autoKickStart": "Kicka Giocatori Che Dicono Start", - "autoKickStartAsBan": "Banna invece di kickare", + "autoKickStart": "Espelli i Giocatori Che Dicono Start", + "autoKickStartAsBan": "Banna invece di espellere", "autoKickStartStrength": "Modalità di rilevamento rigorosa", "tabGroupAutomation": "Automazione", "autoSendGameInfo": "Invia automaticamente informazioni sui vincitori", "autoRejoinLobby": "Rientra automaticamente nella lobby", - "autoStartTimer": "Conto alla rovescia Avvio Automatico", + "autoStartTimer": "Conto alla rovescia Per l'Avvio Automatico", "waitAutoStart": "Avvio Automatico Dopo", - "playerAutoStart": "Giocatori Necessari Per Avvio Automatico", - "enableJoinMessages": "Abilita Messaggio di Benvenuto", + "playerAutoStart": "Giocatori Necessari Per l'Avvio Automatico", + "enableJoinMessages": "Abilita Messaggi di Benvenuto", "messagePerPlayerNum": "Messaggio Ogni # Ingressi", "tabGroupMisc": "Sperimentale", - "startCountdown": "Conto alla rovescia Predefinito", - "colorCommandLevel": "Chi Può Usare i Comandi Colore", + "startCountdown": "Conto alla Rovescia Per l'Avvio Predefinito", + "colorCommandLevel": "Chi Può usare i Comandi Colore", "allowFortegreen": "Consenti Colore Fortegreen", "noGameEnd": "Nessuna Fine Partita", - "tabGroupAccess": "Livelli di Accesso", "slashColorCmd": "Chi Può Usare /color", "slashRolesAndGamemodeCmd": "Chi Può Usare /r & Templates", @@ -48,22 +44,19 @@ "slashKickCmd": "Chi Può Usare /kick & /ckick", "slashBanCmd": "Chi Può Usare /ban & /cban", "slashStartAndEndGameCmd": "Chi Può Usare /startgame & /endgame", - "tabGroupCrewmate": "Ruoli Astronauti", "tabGroupNeutral": "Ruoli Neutrali", "tabGroupImpostor": "Ruoli Impostori", - "tabGroupStandard": "Standard", - "tabGroupHNS": "Nascondino", "numSeekers": "# Cercatori", - "tabGroup0Kcd": "0 Cooldown Uccisione", - "noKcdSettingsOverride": "Aggiorna Automaticamente Impostazioni", + "tabGroup0Kcd": "0 Ricarica Uccisioni", + "noKcdSettingsOverride": "Aggiorna Automaticamente le Impostazioni", "tabGroupSNS": "Clone", - "snsChatInGame": "Chat in gioco (sperimentale)", - "snsSettingsOverride": "Aggiorna Automaticamente Impostazioni", - "cantKillTime": "Dopo un Mancato Bersaglio Non Puoi Uccidere Per", - "misfiresToSuicide": "Suicidio Dopo Numero di Mancati Bersagli", + "snsChatInGame": "Chat durante il gioco (sperimentale)", + "snsSettingsOverride": "Aggiorna Automaticamente le Impostazioni", + "cantKillTime": "Dopo una Cilecca Non Puoi Uccidere Per", + "misfiresToSuicide": "Suicidio Dopo Numero di Cilecche", "crewAutoWinsGameAfter": "Gli Astronauti Vincono Automaticamente Dopo", "snsDisableSabotage": "Disabilita Sabotaggi Critici in Modalità Clone", "snsDisableReactor": "Disabilita Sabotaggio Reattore", @@ -71,26 +64,12 @@ "snsDisableLights": "Disabilita Sabotaggio Luci", "snsDisableComms": "Disabilita Sabotaggio Comunicazioni", "snsDisableHeli": "Disabilita Sabotaggio Collisione", - "snsDisableMushroomMixup": "Disabilita Sabotaggio Caos dei Funghi", + "snsDisableMushroomMixup": "Disabilita Sabotaggio Mixup Fungo", "snsDisableCloseDoor": "Disabilita Sabotaggio Porte in Modalità Clone", - - "tabGroupCustomizeSabotages": "Customize Sabotages", - "customizeSabotages": "Enable Sabotage Customizations", - "sabotageCooldown": "Critical Sabotage Cooldown", - "skeldReactorDuration": "Skeld Reactor Duration", - "skeldO2Duration": "Skeld O2 Duration", - "miraReactorDuration": "Mira Reactor Duration", - "miraO2Duration": "Mira O2 Duration", - "polusReactorDuration": "Polus Reactor Duration", - "airshipReactorDuration": "Airship Reactor Duration", - "fungleReactorDuration": "Fungle Reactor Duration", - "fungleMushroomMixupDuration": "Fungle Mixup Duration", - "tabGroupSpeedrun": "Speedrun", - "speedrunSettingsOverride": "Aggiorna Automaticamente Impostazioni", + "speedrunSettingsOverride": "Aggiorna Automaticamente le Impostazioni", "gameAutoEndsAfter": "La partita finisce automaticamente dopo", "engineerMode": "Tutti Ingegneri", - "tabGroupSabotages": "Sabotaggi", "deadImpostorsCanSabotage": "Gli Impostori Morti Possono Sabotare", "disableSabotage": "Disabilita Sabotaggi Critici", @@ -99,11 +78,10 @@ "disableLights": "Disabilita Sabotaggio Luci", "disableComms": "Disabilita Sabotaggio Comunicazioni", "disableHeli": "Disabilita Sabotaggio Collisione", - "disableMushroomMixup": "Disabilita Sabotaggio Caos dei Funghi", + "disableMushroomMixup": "Disabilita Sabotaggio Mixup Fungo", "disableCloseDoor": "Disabilita Sabotaggio Porte", - "tabGroupGameplayGeneral": "Generale", - "disableAnnoyingMeetingCalls": "Nei primi 30 secondi non si possono chiamare riunioni", + "disableAnnoyingMeetingCalls": "Nei primi 30 secondi non è possibile convocare riunioni", "disableReport": "Disabilita Report dei Cadaveri", "changeDecontaminationTime": "Cambia Tempo di Decontaminazione (Solo Modalità Standard)", "decontaminationTimeOnMiraHQ": "Tempo di decontaminazione su Mira HQ", @@ -111,38 +89,34 @@ "decontaminationTimeOnPolus": "Tempo di decontaminazione su Polus", "decontaminationDoorOpenTimeOnPolus": "Tempo di apertura porte su Polus", "disableSporeTrigger": "Disabilita spore su Fungle", - "disableDevices": "Disabilita Dispositivi", "disableSkeldDevices": "Disabilita Dispositivi su Skeld", - "disableSkeldAdmin": "Disabilita Admin su Skeld", + "disableSkeldAdmin": "Disabilita Amministrazione su Skeld", "disableSkeldCamera": "Disabilita Telecamere su Skeld", "disableMiraHQDevices": "Disabilita Dispositivi su Mira HQ", - "disableMiraHQAdmin": "Disabilita Admin su Mira HQ", - "disableMiraHQDoorLog": "Disabilita Registri Porte su Mira HQ", + "disableMiraHQAdmin": "Disabilita Amministrazione su Mira HQ", + "disableMiraHQDoorLog": "Disabilita Log Porte su Mira HQ", "disablePolusDevices": "Disabilita Dispositivi su Polus", - "disablePolusAdmin": "Disabilita Admin su Polus", + "disablePolusAdmin": "Disabilita Amministrazione su Polus", "disablePolusCamera": "Disabilita Telecamere su Polus", "disablePolusVital": "Disabilita Segni Vitali su Polus", "disableAirshipDevices": "Disabilita Dispositivi su Airship", - "disableAirshipCockpitAdmin": "Disabilita Admin nella Cabina su Airship", - "disableAirshipRecordsAdmin": "Disabilita Admin nell'Archivio su Airship", + "disableAirshipCockpitAdmin": "Disabilita Amministrazione Cabina su Airship", + "disableAirshipRecordsAdmin": "Disabilita Amministrazione Archivi su Airship", "disableAirshipCamera": "Disabilita Telecamere su Airship", "disableAirshipVital": "Disabilita Segni Vitali su Airship", "disableFungleDevices": "Disabilita Dispositivi su Fungle", "disableFungleVital": "Disabilita Segni Vitali su Fungle", - "tabGroupTasks": "Incarichi", "allPlayersSameTasks": "Stessi incarichi per tutti", "overrideTaskSettings": "Disabilita incarichi", "taskPercentNeededToWin": "% di Incarichi completati per la vittoria degli astronauti", - "disableMiraTasks": "Disabilita Incarichi su Mira HQ", "disableBuyBeverage": "Disabilita Compra Bevanda", "disableMeasureWeather": "Disabilita Misura Condizioni Meteo", "disableProcessData": "Disabilita Elabora Dati", "disableRunDiagnostics": "Disabilita Esegui Diagnostica", "disableSortSamples": "Disabilita Smista Campioni", - "disablePolusTasks": "Disabilita Incarichi su Polus", "disableActivateWeatherNodes": "Disabilita Ripara Nodo Atmosferico", "disableAlignTelescope": "Disabilita Allinea Telescopio", @@ -152,207 +126,200 @@ "disableRebootWifi": "Disabilita Riavvia Wi-Fi", "disableRepairDrill": "Disabilita Ripara Trivella", "disableScanBoardingPass": "Disabilita Scansiona Carta d'Imbarco", - "disableAirshipTasks": "Disabilita Incarichi su Airship", "disableCleanToilet": "Disabilita Pulisci Bagno", "disableDecontaminate": "Disabilita Decontamina", "disableDevelopPhotos": "Disabilita Sviluppa Foto", "disableDressMannequin": "Disabilita Vesti Manichino", "disableFixShower": "Disabilita Ripara Doccia", - "disableMakeBurger": "Disabilita Prepara Burger", + "disableMakeBurger": "Disabilita Prepara Hamburger", "disablePickUpTowels": "Disabilita Raccogli Asciugamani", "disablePolishRuby": "Disabilita Lucida Rubino", - "disablePutAwayPistols": "Disabilita Metti a Posto Pistole", - "disablePutAwayRifles": "Disabilita Metti a Posto Fucili", + "disablePutAwayPistols": "Disabilita Metti a Posto le Pistole", + "disablePutAwayRifles": "Disabilita Metti a Posto i Fucili", "disableRewindTapes": "Disabilita Riavvolgi Nastri", - "disableResetBreaker": "Disabilita Resetta Interruttore", - "disableSortRecords": "Disabilita Smista Documenti", + "disableResetBreaker": "Disabilita Ripristina Interruttori", + "disableSortRecords": "Disabilita Smista Registri", "disableStartFans": "Disabilita Avvia Ventilatori", "disableUnlockSafe": "Disabilita Apri Cassaforte", - "disableFungleTasks": "Disabilita Incarichi su Fungle", "disableBuildSandcastle": "Disabilita Costruisci Castello di Sabbia", "disableCatchFish": "Disabilita Pesca", "disableCollectSamples": "Disabilita Raccogli Campioni", "disableCollectShells": "Disabilita Raccogli Conchiglie", "disableCollectVegetables": "Disabilita Raccogli Verdure", - "disableCrankGenerator": "Disabilita Avvia Generatore a Manovella", + "disableCrankGenerator": "Disabilita Gira Generatore", "disableExtractFuel": "Disabilita Estrai Carburante", "disableFixAntenna": "Disabilita Ripara Antenna", - "disableHelpCritter": "Disabilita Aiuta la Creatura", + "disableHelpCritter": "Disabilita Aiuta l'Animale", "disableHoistSupplies": "Disabilita Solleva Provviste", "disableLiftWeights": "Disabilita Solleva Pesi", "disableMineOres": "Disabilita Estrai Minerali", - "disablePlayVideoGame": "Disabilita Gioca ai Videogiochi", + "disablePlayVideoGame": "Disabilita Gioca al Videogioco", "disablePolishGem": "Disabilita Lucida Gemma", "disableReplaceParts": "Disabilita Sostituisci Parti", "disableRoastMarshmallow": "Disabilita Arrostisci Marshmallow", "disableThrowFisbee": "Disabilita Lancia Frisbee", "disableFindSignal": "Disabilita Trova Segnale", - "disableMiscCommonTasks": "Disabilita Incarichi Comuni", "disableEnterIdCode": "Disabilita Inserisci Codice ID", "disableFixWiring": "Disabilita Ripara Cavi", - "disableSwipeCard": "Disabilita Passa la Carta", - + "disableSwipeCard": "Disabilita Striscia Carta", "disableMiscShortTasks": "Disabilita Incarichi Corti", "disableAssembleArtifact": "Disabilita Assembla Manufatto", - "disableChartCourse": "Disabilita Traccia la Rotta", + "disableChartCourse": "Disabilita Traccia Rotta", "disableCleanO2Filter": "Disabilita Pulisci Filtro O2", "disableCleanVent": "Disabilita Pulisci Condotto", "disableMonitorMushroom": "Disabilita Monitora Fungo", "disableMonitorTree": "Disabilita Controlla Albero", - "disablePrimeShields": "Disabilita Innesca Scudi", + "disablePrimeShields": "Disabilita Avvia Scudi", "disableRecordTemperature": "Disabilita Registra Temperatura", - "disableStabilizeSteering": "Disabilita Stabilizza Rotta", + "disableStabilizeSteering": "Disabilita Stabilizza Timone", "disableStoreArtifacts": "Disabilita Conserva Manufatti", "disableUnlockManifolds": "Disabilita Sblocca Collettori", - "disableMiscLongTasks": "Disabilita Incarichi Lunghi", - "disableAlignEngineOutput": "Disabilita Allinea Uscita Motore", + "disableAlignEngineOutput": "Disabilita Allinea Potenza Motori", "disableClearAsteroids": "Disabilita Distruggi Asteroidi", "disableEmptyChute": "Disabilita Svuota Scivolo", "disableInspectSample": "Disabilita Ispeziona Campione", "disableReplaceWaterJug": "Disabilita Sostituisci Boccione d'Acqua", "disableStartReactor": "Disabilita Avvia Reattore", "disableWaterPlants": "Disabilita Innaffia Piante", - "disableMiscMixedTasks": "Disabilita Incarichi Misti", "disableCalibrateDistributor": "Disabilita Calibra Distributore", "disableDivertPower": "Disabilita Devia Energia", "disableEmptyGarbage": "Disabilita Svuota Spazzatura", - "disableFuelEngines": "Disabilita Fai Rifornimento Motori", - "disableSubmitScan": "Disabilita Esegui Scansione", + "disableFuelEngines": "Disabilita Rifornisci Motori", + "disableSubmitScan": "Disabilita Invia Scansione", "disableUploadData": "Disabilita Carica Dati", - - "allCommandsFull": "TUTTI I COMANDI:\n\n/help\nMostra questo messaggio.\n/aur, /socials\nInvia i link di Among Us Revamped.\n\n/r, /gm\nInvia la descrizione della modalità attuale o la lista delle abilità.\n/l, /lastgame\nInvia le informazioni sull'ultimo vincitore.\n\n/0kc, /0killcooldown\nInvia la descrizione della modalità 0 Cooldown Uccisione.\n/sns, /shiftandseek\nInvia la descrizione della modalità Clone.\n/sp, /speedrun\nInvia la descrizione della modalità Speedrun.\n\n/kick, /ban\nKicka o banna un giocatore tramite nome.\n/ckick, /cban\nKicka o banna un giocatore tramite colore.\n\n/vip /moderator /admin\nAggiunge un giocatore come VIP, Moderatore o Admin.\n/removevip, /removemoderator, /removeadmin\nRimuove lo stato di VIP, Moderatore o Admin a un giocatore.\n\n/eg, /endgame\nTermina la partita attuale.\n/em, /endmeeting\nTermina la riunione attuale.\n/s, /start\nInizia il conto alla rovescia per l'avvio.\n\n/t {template}\nInvia un template da AUR-DATA/templates.txt.\n\n/col, /color, /colour\nCambia il tuo colore, può essere usato per aggirare le restrizioni sui colori.", - - "translationReloaded": "Il tuo file di lingua è stato ricaricato con successo.\nPer applicare tutte le modifiche, riavvia il gioco.", - - "templateWelcome": "# In questo file puoi creare dei template che fungono da semplice alternativa al copia-incolla.\n# Per creare un template, scrivi una nuova riga con la stessa formattazione del template di prova qui sotto.\n# I template non possono essere più lunghi di 120 caratteri e non possono contenere caratteri speciali. In caso contrario verrai kickato.\n\ntest: questo è un esempio di template. Scrivi '/t test' per vederlo.\n\nwelcome: Benvenuti! Questa Lobby Utilizza Among Us Revamped {ModVersion} di MV. Buon divertimento!", - "moderatorWelcome": "# In questo file puoi aggiungere Moderatori tramite il Codice Amico.\n# Se aggiungi qualcuno, riceverà un nome viola in gioco.\n# Vai nelle 'Impostazioni di Sistema' nel gioco per modificare i permessi dei Moderatori. Di seguito è riportato un esempio di Codice Amico.\n\nfriendcode#0000", - "vipWelcome": "# In questo file puoi aggiungere VIP tramite il Codice Amico.\n# Se aggiungi qualcuno, riceverà un nome giallo in gioco.\n# Vai nelle 'Impostazioni di Sistema' nel gioco per modificare i permessi dei VIP. Di seguito è riportato un esempio di Codice Amico.\n\nfriendcode#0000\n", - "adminWelcome": "# In questo file puoi aggiungere Admin tramite il Codice Amico.\n# Se aggiungi qualcuno, riceverà un nome rosso in gioco.\n# Vai nelle 'Impostazioni di Sistema' nel gioco per modificare i permessi degli Admin. Di seguito è riportato un esempio di Codice Amico.\n\nfriendcode#0000\n", - "banlistWelcome": "# In questo file puoi bannare i giocatori dalle tue lobby tramite il Codice Amico.\n# Se banni qualcuno in gioco, verrà aggiunto automaticamente a questo file. Di seguito è riportato un esempio di Codice Amico.\n\nfriendcode#0000\n", - "banwordWelcome": "# In questo file puoi impostare le parole vietate, kickando automaticamente chi pronuncia le parole scritte qui.\n# Nota bene: per separare le parole devi usare nuove righe.", - "bannameWelcome": "# In questo file puoi impostare i nomi vietati, kickando automaticamente chi utilizza i nomi scritti qui.\n# Nota bene: per separare i nomi devi usare nuove righe.", - "languageWelcome": "# In questo file puoi impostare la tua lingua per Among Us Revamped.\n# Per impostare la lingua, scrivi una delle lingue supportate in una nuova riga. Quella predefinita è English.\n# Lingue supportate: English, Spanish, SimplifiedChinese, Italian\n\nItalian", - - "noGameEndWarning": "ATTENZIONE: L'impostazione 'Nessuna Fine Partita' è Abilitata", - - "tooLongTemplate": "Il tuo template supera i 120 caratteri e verrai kickato se viene inviato. Per favore, riducine la lunghezza.", - - "vipAdd": "{0} aggiunto con successo come VIP.", - "moderatorAdd": "{0} aggiunto con successo come Moderatore.", - "adminAdd": "{0} aggiunto con successo come Admin.", - "vipRemove": "VIP rimosso con successo a {0}.", - "moderatorRemove": "Moderatore rimosso con successo a {0}.", - "adminRemove": "Admin rimosso con successo a {0}.", - "permFail": "Impossibile trovare il giocatore '{0}'. Assicurati di aver scritto il nome correttamente", - - "helpDesc": "Mostra tutti i Comandi e cosa fanno.", - "snsDesc": "Invia la descrizione della modalità Clone.", - "0kcDesc": "Invia la descrizione della modalità 0 Cooldown Uccisione.", - "SrDesc": "Invia la descrizione della modalità Speedrun.", - "egDesc": "Termina la partita attuale.", - "emDesc": "Termina la riunione attuale.", - "aurDesc": "Invia i Link di Among Us Revamped.", - "sDesc": "Inizia il Conto alla rovescia per l'avvio.", - "rDesc": "/r Invia le abilità abilitate o la modalità attuale.", - "rolesDesc": "Invia una panoramica di tutte le abilità/modalità.", - "kickDesc": "Kicka un giocatore tramite nome.", - "ckickDesc": "Kicka un giocatore tramite colore.", - "banDesc": "Banna un giocatore tramite nome.", - "cbanDesc": "Banna un giocatore tramite colore.", - "dumpDesc": "Copia il LogOutput in un file separato.", - "colDesc": "Cambia il tuo colore.", - "reloadDesc": "Ricarica il file di lingua.", - "vipDesc": "Aggiunge un giocatore come VIP.", - "moderatorDesc": "Aggiunge un giocatore come Moderatore.", - "adminDesc": "Aggiunge un giocatore come Admin.", - "cremoveVipDesc": "Rimuove lo stato VIP a un giocatore.", - "removeModeratorDesc": "Rimuove lo stato di Moderatore a un giocatore.", - "removeAdminDesc": "Rimuove lo stato di Admin a un giocatore.", - "lastgameDesc": "Invia le informazioni sull'ultima partita.", - "templateDesc": "Invia un template specifico da AUR-DATA/templates.txt.", - - "banWordKick": "{0} è stato kickato per aver inviato una parola vietata {1} volta/e", - - "pluginWarning": "ATTENZIONE:\nHai 2 o più plugin attivi rilevati.\nAmong Us Revamped non è compatibile con la maggior parte delle mod.\nSe riscontri dei bug, molto probabilmente sono dovuti a incompatibilità.", - + "allCommandsFull": "TUTTI I COMANDI:\n\n/help\nMostra questo messaggio. \n/aur, /socials\nInvia i link di Among Us Revamped. \n\n/r, /gm\nInvia la descrizione della modalità corrente o l'elenco delle abilità. \n/l, /lastgame\nInvia informazioni sull'ultimo vincitore. \n\n/0kc, /0killcooldown\nInvia la descrizione della modalità 0 Ricarica Uccisioni. \n/sns, /shiftandseek\nInvia la descrizione della modalità Clone. \n/sp, /speedrun\nInvia la descrizione della modalità Speedrun. \n\n/kick, /ban\nEspelle o banna un giocatore dal nome. \n/ckick, /cban\nEspelle o banna un giocatore dal colore. \n\n/vip /moderator /admin\nAggiunge un giocatore come VIP, Moderatore o Amministratore. \n/removevip, /removemoderator, /removeadmin\nRimuove VIP, Moderatore o Amministratore da un giocatore. \n\n/eg, /endgame\nTermina la partita in corso. \n/em, /endmeeting\nTermina la riunione in corso. \n/s, /start\nInizia il conto alla rovescia per l'avvio. \n\n/t {template}\nInvia un template da AUR-DATA/templates.txt. \n\n/col, /color, /colour\nCambia il tuo colore, può essere usato per aggirare le restrizioni di colore. ", + "translationReloaded": "Il tuo file della lingua è stato ripristinato con successo. \nPer applicare tutte le modifiche, riavvia il gioco. ", + "templateWelcome": "# In questo file puoi creare template, che possono servire come semplice alternativa al copia-incolla. \n# Per creare un template, scrivi una nuova riga con la stessa formattazione del template di test qui sotto. \n# I template non possono essere più lunghi di 120 caratteri e non possono contenere caratteri speciali. In caso contrario, verrai espulso. \n\ntest: questo è un esempio di template. Scrivi '/t test', per vederlo. \n\nwelcome: Benvenuti! Questa Lobby Utilizza Among Us Revamped {ModVersion} di MV. Divertitevi! ", + "moderatorWelcome": "# In questo file puoi aggiungere Moderatori tramite Codice Amico. \n# Se aggiungi qualcuno, riceverà un nome viola nel gioco. \n# Vai su 'Impostazioni di Sistema' nel gioco per modificare i permessi dei Moderatori. Di seguito è riportato un esempio di Codice Amico. \n\nfriendcode#0000", + "vipWelcome": "# In questo file puoi aggiungere VIP tramite Codice Amico. \n# Se aggiungi qualcuno, riceverà un nome giallo nel gioco. \n# Vai su 'Impostazioni di Sistema' nel gioco per modificare i permessi dei VIP. Di seguito è riportato un esempio di Codice Amico. \n\nfriendcode#0000\n", + "adminWelcome": "# In questo file puoi aggiungere Amministratori tramite Codice Amico. \n# Se aggiungi qualcuno, riceverà un nome rosso nel gioco. \n# Vai su 'Impostazioni di Sistema' nel gioco per modificare i permessi degli Amministratori. Di seguito è riportato un esempio di Codice Amico. \n\nfriendcode#0000\n", + "banlistWelcome": "# In questo file puoi bannare i giocatori dalle tue lobby tramite Codice Amico. \n# Se banni qualcuno in gioco, verrà automaticamente aggiunto a questo file. Di seguito è riportato un esempio di Codice Amico. \n\nfriendcode#0000\n", + "banwordWelcome": "# In questo file puoi creare parole vietate, espellendo automaticamente chi dice queste parole scritte qui. \n# Nota bene, per separare le parole devi usare delle nuove righe. ", + "bannameWelcome": "# In questo file puoi creare nomi vietati, espellendo automaticamente chi utilizza i nomi scritti qui. \n# Nota bene, per separare i nomi devi usare delle nuove righe. ", + "languageWelcome": "# In questo file puoi impostare la lingua del tuo Among Us Revamped. \n# Per impostare la lingua, scrivi una delle lingue supportate in una nuova riga. L'impostazione predefinita è l'inglese. \n# Lingue supportate: English, Spanish, SimplifiedChinese, Italian\n\nItalian", + "noGameEndWarning": "ATTENZIONE: Impostazione 'Nessuna Fine Partita' Attivata", + "tooLongTemplate": "Il tuo template è più lungo di 120 caratteri e verrai espulso se viene inviato. Per favore, riducine la lunghezza. ", + "vipAdd": "Aggiunto con successo {0} come VIP. ", + "moderatorAdd": "Aggiunto con successo {0} come Moderatore. ", + "adminAdd": "Aggiunto con successo {0} come Amministratore. ", + "vipRemove": "VIP rimosso con successo da {0}. ", + "moderatorRemove": "Moderatore rimosso con successo da {0}. ", + "adminRemove": "Amministratore rimosso con successo da {0}. ", + "permFail": "Impossibile trovare il giocatore '{0}'. Assicurati di aver scritto il nome correttamente. ", + "helpDesc": "Mostra tutti i Comandi e cosa fanno. ", + "snsDesc": "Invia la descrizione della modalità Clone. ", + "0kcDesc": "Invia la descrizione della modalità 0 Ricarica Uccisioni. ", + "SrDesc": "Invia la descrizione della modalità Speedrun. ", + "egDesc": "Termina la partita in corso. ", + "emDesc": "Termina la riunione in corso. ", + "aurDesc": "Invia i Link di Among Us Revamped. ", + "sDesc": "Inizia il conto alla rovescia per l'avvio. ", + "rDesc": "/r Invia le abilità attivate o la modalità corrente. ", + "rolesDesc": "Invia una panoramica di tutte le abilità/modalità. ", + "kickDesc": "Espelle il giocatore dal nome. ", + "ckickDesc": "Espelle il giocatore dal colore. ", + "banDesc": "Banna il giocatore dal nome. ", + "cbanDesc": "Banna il giocatore dal colore. ", + "dumpDesc": "Copia LogOutput in un file separato. ", + "colDesc": "Cambia il tuo colore. ", + "reloadDesc": "Ricarica il file della lingua. ", + "vipDesc": "Aggiunge il giocatore come VIP. ", + "moderatorDesc": "Aggiunge il giocatore come Moderatore. ", + "adminDesc": "Aggiunge il giocatore come Amministratore. ", + "cremoveVipDesc": "Rimuove il VIP dal giocatore. ", + "removeModeratorDesc": "Rimuove il Moderatore dal giocatore. ", + "removeAdminDesc": "Rimuove l'Amministratore dal giocatore. ", + "lastgameDesc": "Invia informazioni sull'ultima partita. ", + "templateDesc": "Invia un template specifico da AUR-DATA/templates.txt. ", + "banWordKick": "{0} è stato espulso perché ha inviato una parola vietata {1} volta/e. ", + "pluginWarning": "ATTENZIONE:\nHai 2 o più plugin attivi rilevati. \nAmong Us Revamped non è compatibile con la maggior parte delle mod. \nSe riscontri dei bug, quasi certamente sono dovuti a incompatibilità. ", "systemSettings": "Impostazioni di Sistema", "gameplaySettings": "Impostazioni di Gioco", "gamemodeSettings": "Impostazioni Modalità", - - "systemSettingsDesc": "Impostazioni di Sistema Per Migliorare il Comfort e Semplificare i Test.", - "gameplaySettingsDesc": "Impostazioni di Gioco Per Migliorare l'Esperienza di Gioco.", - "gamemodeSettingsDesc": "Impostazioni Aggiuntive Per Specifiche Modalità di Gioco.", - + "systemSettingsDesc": "Impostazioni di Sistema per Migliorare il Comfort e Semplificare i Test. ", + "gameplaySettingsDesc": "Impostazioni di Gioco per Migliorare l'Esperienza di Gioco. ", + "gamemodeSettingsDesc": "Impostazioni Aggiuntive per Determinate Modalità di Gioco. ", "everyone": "Tutti", "vipAndAbove": "VIP E Superiori", "moderatorAndAbove": "Moderatore E Superiori", - "admin": "Admin", + "admin": "Amministratore", "onlyYou": "Solo Tu", - - "seekerDesc": "Aggiunge un giocatore come cercatore a nascondino", - "seekersDesc": "Mostra tutti i cercatori scelti manualmente.", - "clearSeekerDesc": "Pulisce la lista di tutti i cercatori scelti manualmente", - + "seekerDesc": "Aggiunge il giocatore come cercatore in nascondino. ", + "seekersDesc": "Mostra tutti i cercatori selezionati manualmente. ", + "clearSeekerDesc": "Pulisce l'elenco di tutti i cercatori selezionati manualmente. ", "slashEndMeetingCmd": "Chi Può Usare /endmeeting & /seeker", - - "gameMasterWarning":"Osserverai le partite finché la modalità spettatore è attiva. ATTENZIONE: L'assegnazione dei ruoli potrebbe essere errata se questa impostazione è abilitata.", - - "startWordsWelcome": "# In questo file puoi impostare le parole per 'Kicka Giocatori Che Dicono Start'.\n# 'Modalità di rilevamento rigorosa' OFF = I messaggi devono coincidere perfettamente con le parole impostate. 'Modalità di rilevamento rigorosa' ON = I messaggi necessitano solo di contenere le parole impostate.\n# Puoi anche aggiungere parole non correlate, che verranno rilevate solo nella lobby..\n\nstart\nbegin\ncommence\ninizia\nstartate\n", - - "gameMasterWarningTwo": "ATTENZIONE: Modalità Spettatore Attivata", - - "startWordKick": "{0} è stato kickato per aver inviato una parola presente in StartWords.txt {1} volta/e", - + "gameMasterWarning": "Osserverai le partite mentre la modalità spettatore è attiva. ATTENZIONE: L'assegnazione dei ruoli potrebbe essere errata se questa impostazione è attivata. ", + "startWordsWelcome": "# In questo file puoi creare parole che serviranno a 'Espellere i Giocatori Che Dicono Start'. \n# 'Modalità di rilevamento rigorosa' OFF = I messaggi devono corrispondere perfettamente alle parole specificate. 'Modalità di rilevamento rigorosa' ON = I messaggi richiedono solo determinate parole. \n# Puoi anche aggiungere parole non correlate, che verranno rilevate solo nella lobby. \n\nstart\nbegin\ncommence\nstart\ninizia\n", + "gameMasterWarningTwo": "ATTENZIONE: Modalità Game Master Attivata", + "startWordKick": "{0} è stato espulso perché ha inviato una parola presente in StartWords.txt {1} volta/e. ", "seekers": "Cercatori: ", - "clearedSeekers": "Lista dei cercatori scelti manualmente pulita con successo.", - "tabGroupLevelKick": "Moderazione Livelli", - "enableKickLowLevelPlayer": "Kicka Giocatori di Basso Livello", + "clearedSeekers": "Elenco dei cercatori selezionati manualmente pulito con successo. ", + "tabGroupLevelKick": "Moderazione per Livello", + "enableKickLowLevelPlayer": "Espelli Giocatori di Basso Livello", "tabGroupKickInvalidFriendCodes": "Codici Amico Non Validi", - "tabGroupAutoKickStart": "Parole di Start", - "autoKickStartTimes": "Messaggi di Start inviati necessari per il kick", + "tabGroupAutoKickStart": "Parola Start", + "autoKickStartTimes": "Messaggi Start inviati necessari per l'espulsione", "tabGroupAutostart": "AutoHost", - "rehost": "Ricrea Automaticamente Lobby In Caso di Crash", - "public": "Rendi Automaticamente la Nuova Lobby Pubblica", - "mapVoteDuration": "Durata della Votazione per le Mappe", + "rehost": "Ricrea Automaticamente la Lobby al Crash", + "public": "Rendi Automaticamente Pubblica la Nuova Lobby", + "mapVoteDuration": "Durata Votazione Mappe", "tabGroupDeniedWords": "Parole Vietate", - "enableDeniedWords": "Kicka Giocatori Che Pronunciano Parole Vietate", + "enableDeniedWords": "Espelli i Giocatori Che Dicono Parole Vietate", "slashMapAndSeekerCmd": "Chi Può Usare /seeker & /mapvote", "snsChatInGameExtend": "Invia informazioni sulla modalità dopo l'inizio del gioco", - "mapVoteDesc": "Inizia una votazione tra le 5 mappe principali.", - "allMapVoteDesc": "Inizia una votazione tra tutte e 6 le mappe, inclusa Eht Dleks.", - "banWordBan": "{0} è stato bannato per aver inviato una parola di DeniedWords.txt {1} volta/e", - "startWordBan": "{0} è stato bannato per aver inviato una parola di StartWords.txt {1} volta/e", + "mapVoteDesc": "Inizia una votazione tra le 5 mappe principali. ", + "allMapVoteDesc": "Inizia una votazione tra tutte e 6 le mappe, inclusa Eht Dleks. ", + "banWordBan": "{0} è stato bannato perché ha inviato una parola da DeniedWords.txt {1} volta/e. ", + "startWordBan": "{0} è stato bannato perché ha inviato una parola da StartWords.txt {1} volta/e. ", "moderationSettings": "Impostazioni di Moderazione", - "moderationSettingsDesc": "Impostazioni di Moderazione per combattere tossicità e cattivo comportamento.", - "rehostSuccess": "La Lobby è Stata Ricreata Con Successo", - "enableKickHighLevelPlayer": "Kicka Giocatori di Alto Livello", - "kickHighLevelPlayer": "Kicka Giocatori Sopra il Livello", - "kick": "Kick", - "ban": "Ban", + "moderationSettingsDesc": "Impostazioni di Moderazione per combattere tossicità e cattivi comportamenti. ", + "rehostSuccess": "La Lobby È Stata Ricreata Con Successo", + "enableKickHighLevelPlayer": "Espelli Giocatori di Alto Livello", + "kickHighLevelPlayer": "Espelli Giocatori Sopra il Livello", + "kick": "Espelli", + "ban": "Banna", "notifyMe": "Notificami", - "tabGroupAfk": "Rilevamento AFK", "enableAfkDetection": "Abilita Rilevamento AFK", "afkTimer": "Soglia di Rilevamento", "afkPenalty": "Penalità Per AFK", "onlyDetectSpawn": "Rileva Solo i Giocatori allo Spawn", - - "afkNotify": "{0} è stato AFK {1}sec", - "afkKick": "{0} è stato AFK {1}sec, kickiamo il giocatore", - "afkBan": "{0} è stato AFK {1}sec, banniamo il giocatore", - + "afkNotify": "{0} È Stato AFK per {1}sec", + "afkKick": "{0} È Stato AFK per {1}sec, espulsione giocatore", + "afkBan": "{0} È Stato AFK per {1}sec, ban giocatore", "automaticMapPoll": "/mapvote Automatico Dopo il Rientro", "automaticAllMapPoll": "/allmapvote Automatico Dopo il Rientro", - "timeBeforeMapPoll": "Tempo Prima Inizio Votazione Mappe", - - "pnsDisableSabotage": "Disable PnS Critical Sabotages", - "pnsDisableCloseDoor": "Disable PnS Door Sabotages", - "tabGroupPNS": "Poof and Seek", - "badMoveTimeToSuicide": "Phantom Suicides After Visibly Moving For", - "snsImpostorCanVent": "Impostors can vent" + "timeBeforeMapPoll": "Tempo Prima dell'Inizio Votazione Mappe", + "pnsDisableSabotage": "Disabilita Sabotaggi Critici in Modalità Nascondino Fantasma", + "pnsDisableCloseDoor": "Disabilita Sabotaggio Porte in Modalità Nascondino Fantasma", + "tabGroupPNS": "Nascondino Fantasma", + "badMoveTimeToSuicide": "I Fantasmi Si Suicidano Dopo Movimento Visibile Dopo", + "snsImpostorCanVent": "Gli Impostori Possono Entrare nelle Botole", + "pnsDesc": "Invia Informazioni sulla Modalità Nascondino Fantasma. ", + "modeVoteDuration": "Tempo di Votazione per la Modalità", + "snsChatInGameExtendTwo": "Invia info ampliate dopo l'inizio del gioco", + "snsChatInGameFast": "Riunioni Veloci (sperimentale+)", + "shieldFirstDeath": "Proteggi il Giocatore Morto Per Primo", + "shieldFirstDeathDuration": "Durata dello Scudo", + "snsTwoDesc": "Invia Descrizione Ampliata di Clone. ", + "modeVoteDesc": "Inizia la Votazione tra tutte le modalità. ", + "automaticModePoll": "/gmvote Automatico Dopo il Rientro", + "tabGroupCustomizeSabotages": "Personalizza Sabotaggi", + "customizeSabotages": "Abilita Personalizzazione Sabotaggi", + "sabotageCooldown": "Ricarica Sabotaggi Critici", + "skeldReactorDuration": "Durata Sabotaggio Reattore su Skeld", + "skeldO2Duration": "Durata Sabotaggio O2 su Skeld", + "miraReactorDuration": "Durata Sabotaggio Reattore su Mira", + "miraO2Duration": "Durata Sabotaggio O2 su Mira", + "polusReactorDuration": "Durata Sabotaggio Reattore su Polus", + "airshipReactorDuration": "Durata Sabotaggio Reattore su Airship", + "fungleReactorDuration": "Durata Sabotaggio Reattore su Fungle", + "fungleMushroomMixupDuration": "Durata Sabotaggio Mixup Fungo", + "privateDesc": "Cambia la Visibilità della Lobby in Privata. ", + "publicDesc": "Cambia la Visibilità della Lobby in Pubblica. " } \ No newline at end of file diff --git a/Resources/Language/Japanese.json b/Resources/Language/Japanese.json index 5a15bef..29ecee6 100644 --- a/Resources/Language/Japanese.json +++ b/Resources/Language/Japanese.json @@ -76,19 +76,6 @@ "snsDisableHeli": "墜落危険サボタージュを無効化", "snsDisableMushroomMixup": "キノコシャッフルサボタージュを無効化", "snsDisableCloseDoor": "SnSドア閉鎖を無効化", - - "tabGroupCustomizeSabotages": "Customize Sabotages", - "customizeSabotages": "Enable Sabotage Customizations", - "sabotageCooldown": "Critical Sabotage Cooldown", - "skeldReactorDuration": "Skeld Reactor Duration", - "skeldO2Duration": "Skeld O2 Duration", - "miraReactorDuration": "Mira Reactor Duration", - "miraO2Duration": "Mira O2 Duration", - "polusReactorDuration": "Polus Reactor Duration", - "airshipReactorDuration": "Airship Reactor Duration", - "fungleReactorDuration": "Fungle Reactor Duration", - "fungleMushroomMixupDuration": "Fungle Mixup Duration", - "tabGroupSpeedrun": "スピードラン", "speedrunSettingsOverride": "設定を自動更新", "gameAutoEndsAfter": "ゲームの自動終了時間", @@ -363,7 +350,18 @@ "snsTwoDesc": "Shift and Seekの拡張説明を送信。", "modeVoteDesc": "すべてのゲームモードから投票を開始します。", "automaticModePoll": "再参加後に自動で /gmvote を実行", +"tabGroupCustomizeSabotages": "サボタージュのカスタマイズ", +"customizeSabotages": "サボタージュのカスタマイズを有効にする", +"sabotageCooldown": "緊急サボタージュのクールダウン", +"skeldReactorDuration": "Skeld 原子炉サボタージュの持続時間", +"skeldO2Duration": "Skeld 酸素サボタージュの持続時間", +"miraReactorDuration": "Mira 原子炉サボタージュの持続時間", +"miraO2Duration": "Mira 酸素サボタージュの持続時間", +"polusReactorDuration": "Polus 原子炉サボタージュの持続時間", +"airshipReactorDuration": "Airship 原子炉サボタージュの持続時間", +"fungleReactorDuration": "Fungle 原子炉サボタージュの持続時間", +"fungleMushroomMixupDuration": "Fungle キノコ幻覚の持続時間", - "privateDesc": "Changes lobby visibility to private.", - "publicDesc": "Changes lobby visibility to public." +"privateDesc": "ロビーを非公開に設定します。", +"publicDesc": "ロビーを公開に設定します。" } diff --git a/Resources/Language/Russian.json b/Resources/Language/Russian.json index 41f7967..9484d9e 100644 --- a/Resources/Language/Russian.json +++ b/Resources/Language/Russian.json @@ -73,19 +73,6 @@ "snsDisableHeli": "Выключить Сабботаж Столкновения", "snsDisableMushroomMixup": "Выключить Сабботаж Грибного Переполоха", "snsDisableCloseDoor": "Выключить Сабботаж Дверей в Режиме Клона", - - "tabGroupCustomizeSabotages": "Customize Sabotages", - "customizeSabotages": "Enable Sabotage Customizations", - "sabotageCooldown": "Critical Sabotage Cooldown", - "skeldReactorDuration": "Skeld Reactor Duration", - "skeldO2Duration": "Skeld O2 Duration", - "miraReactorDuration": "Mira Reactor Duration", - "miraO2Duration": "Mira O2 Duration", - "polusReactorDuration": "Polus Reactor Duration", - "airshipReactorDuration": "Airship Reactor Duration", - "fungleReactorDuration": "Fungle Reactor Duration", - "fungleMushroomMixupDuration": "Fungle Mixup Duration", - "tabGroupSpeedrun": "Спидран", "speedrunSettingsOverride": "Автоматически Обновлять Настройки", "gameAutoEndsAfter": "Игра автоматически заканчивается после", @@ -364,7 +351,18 @@ "snsTwoDesc": "Отправить Увеличенное Описание Клона.", "modeVoteDesc": "Начать Голосование между всеми режимами.", "automaticModePoll": "Автоматический /gmvote После Перезахода", + "tabGroupCustomizeSabotages": "Кастомизировать Саботажи", + "customizeSabotages": "Включить Кастомизацию Сабботажей", + "sabotageCooldown": "Перезарядка Критических Сабботажей", + "skeldReactorDuration": "Длительность Сабботажа Реактора на Skeld", + "skeldO2Duration": "Длительность Сабботажа O2 на Skeld", + "miraReactorDuration": "Длительность Сабботажа Реактора на Mira", + "miraO2Duration": "Длительность Сабботажа O2 на Mira", + "polusReactorDuration": "Длительность Сабботажа Реактора на Polus", + "airshipReactorDuration": "Длительность Сабботажа Реактора на Airship", + "fungleReactorDuration": "Длительность Сабботажа Реактора на Fungle", + "fungleMushroomMixupDuration": "Длительность Сабботажа Грибного Переполоха", - "privateDesc": "Changes lobby visibility to private.", - "publicDesc": "Changes lobby visibility to public." + "privateDesc": "Изменяет Публичность Лобби на Приватный.", + "publicDesc": "Изменяет Публичность Лобби на Публичный." } diff --git a/Resources/Language/SimplifiedChinese.json b/Resources/Language/SimplifiedChinese.json index ec2c337..4840183 100644 --- a/Resources/Language/SimplifiedChinese.json +++ b/Resources/Language/SimplifiedChinese.json @@ -76,19 +76,6 @@ "snsDisableHeli": "禁用坠机危机破坏", "snsDisableMushroomMixup": "禁用迷幻蘑菇破坏", "snsDisableCloseDoor": "禁用 SnS 关门破坏", - - "tabGroupCustomizeSabotages": "Customize Sabotages", - "customizeSabotages": "Enable Sabotage Customizations", - "sabotageCooldown": "Critical Sabotage Cooldown", - "skeldReactorDuration": "Skeld Reactor Duration", - "skeldO2Duration": "Skeld O2 Duration", - "miraReactorDuration": "Mira Reactor Duration", - "miraO2Duration": "Mira O2 Duration", - "polusReactorDuration": "Polus Reactor Duration", - "airshipReactorDuration": "Airship Reactor Duration", - "fungleReactorDuration": "Fungle Reactor Duration", - "fungleMushroomMixupDuration": "Fungle Mixup Duration", - "tabGroupSpeedrun": "速通模式 (Speedrun)", "speedrunSettingsOverride": "自动更新设置", "gameAutoEndsAfter": "游戏在此时间后自动结束", @@ -350,7 +337,18 @@ "snsTwoDesc": "发送 Shift and Seek 扩展说明。", "modeVoteDesc": "在所有游戏模式之间发起投票。", "automaticModePoll": "重新加入后自动执行 /gmvote", +"tabGroupCustomizeSabotages": "自定义破坏", +"customizeSabotages": "启用自定义破坏", +"sabotageCooldown": "紧急破坏冷却时间", +"skeldReactorDuration": "Skeld 反应堆破坏持续时间", +"skeldO2Duration": "Skeld 氧气破坏持续时间", +"miraReactorDuration": "Mira 反应堆破坏持续时间", +"miraO2Duration": "Mira 氧气破坏持续时间", +"polusReactorDuration": "Polus 反应堆破坏持续时间", +"airshipReactorDuration": "Airship 反应堆破坏持续时间", +"fungleReactorDuration": "Fungle 反应堆破坏持续时间", +"fungleMushroomMixupDuration": "Fungle 蘑菇幻觉持续时间", - "privateDesc": "Changes lobby visibility to private.", - "publicDesc": "Changes lobby visibility to public." +"privateDesc": "将房间改为私人。", +"publicDesc": "将房间改为公开。" }