From 9c1d8a2943474394c0d4eb4e711860e04d5b9f64 Mon Sep 17 00:00:00 2001 From: Ape <155788660+ApeMV@users.noreply.github.com> Date: Mon, 3 Aug 2026 20:02:59 +0200 Subject: [PATCH] v1.9.2 BE --- AmongUsRevamped.cs | 2 +- Modules/BanManager.cs | 34 +- Modules/CommandHelper.cs | 5 +- Modules/CustomOptionsHolder.cs | 210 ++++---- Modules/EACR.cs | 21 + Modules/FixedUpdate.cs | 2 +- Modules/OptionItem/OptionItem.cs | 1 + Modules/Rehost.cs | 27 ++ Modules/Utils.cs | 96 +++- Patches/ChatPatches.cs | 70 ++- Patches/ClientOptionsPatch.cs | 3 +- Patches/DleksPatch.cs | 17 +- Patches/EndGamePatches.cs | 4 +- Patches/GameSettingMenuPatch.cs | 3 + Patches/IntroPatch.cs | 16 +- Patches/JoinAndLeavePatches.cs | 8 +- Patches/OnGameStartedPatch.cs | 7 +- Patches/PlayerControlPatches.cs | 75 ++- Patches/VentPatches.cs | 23 +- README.md | 22 +- Resources/Language/English.json | 32 +- Resources/Language/Japanese.json | 554 +++++++++++----------- Resources/Language/Russian.json | 68 +-- Resources/Language/SimplifiedChinese.json | 23 +- 24 files changed, 868 insertions(+), 455 deletions(-) create mode 100644 Modules/Rehost.cs diff --git a/AmongUsRevamped.cs b/AmongUsRevamped.cs index df90403..d043c3f 100644 --- a/AmongUsRevamped.cs +++ b/AmongUsRevamped.cs @@ -44,7 +44,7 @@ public partial class Main : BasePlugin public static bool HasArgumentException; public static string CredentialsText; - public const string ModVersion = "v1.9.1"; + public const string ModVersion = "v1.9.2"; public static float GameTimer; diff --git a/Modules/BanManager.cs b/Modules/BanManager.cs index 76d326c..cb04baf 100644 --- a/Modules/BanManager.cs +++ b/Modules/BanManager.cs @@ -170,12 +170,12 @@ public static class BanManager public static bool IsWordBanned(PlayerControl player, string input) { - if (input == "" || !AmongUsClient.Instance.AmHost || Utils.CheckAccessLevel(player.Data.FriendCode) > 0) return false; + if (input == "" || !AmongUsClient.Instance.AmHost || Utils.CheckAccessLevel(player.Data.FriendCode) > 0 || !Options.EnableDeniedWords.GetBool()) return false; int clientId = player.Data.ClientId; var bannedWords = File.ReadAllLines(BanWordPath).Where(x => !x.StartsWith("#")); - if (bannedWords.Where(code => !string.IsNullOrWhiteSpace(code)).Any(code => input.Contains(code, StringComparison.OrdinalIgnoreCase))) + if ((Options.DeniedWordsStrength.GetBool() && bannedWords.Where(code => !string.IsNullOrWhiteSpace(code)).Any(code => input.Contains(code, StringComparison.OrdinalIgnoreCase))) || (!Options.DeniedWordsStrength.GetBool() && bannedWords.Where(code => !string.IsNullOrWhiteSpace(code)).Any(code => input.Equals(code, StringComparison.OrdinalIgnoreCase)))) { if (!Main.SayDeniedWordTimes.ContainsKey(clientId)) @@ -187,9 +187,17 @@ public static class BanManager if (Main.SayDeniedWordTimes[clientId] >= Options.DeniedWordsToKick.GetInt()) { - AmongUsClient.Instance.KickPlayer(clientId, false); - Logger.Info(Translator.Get("banWordKick", player.Data.PlayerName, Options.DeniedWordsToKick.GetInt()), "DeniedWordKick"); - Logger.SendInGame(Translator.Get("banWordKick", player.Data.PlayerName, Options.DeniedWordsToKick.GetInt())); + if (Options.DeniedWordsAsBan.GetBool()) + { + AmongUsClient.Instance.KickPlayer(clientId, true); + Logger.SendInGame(Translator.Get("banWordBan", player.Data.PlayerName, Options.DeniedWordsToKick.GetInt())); + } + else + { + AmongUsClient.Instance.KickPlayer(clientId, false); + Logger.SendInGame(Translator.Get("banWordKick", player.Data.PlayerName, Options.DeniedWordsToKick.GetInt())); + } + Logger.Info(Translator.Get("banWordKick", player.Data.PlayerName, Options.DeniedWordsToKick.GetInt()), "DeniedWordKick"); } return true; } @@ -198,10 +206,10 @@ public static class BanManager public static bool IsStartWord(PlayerControl player, string input) { - if (input == "" || !AmongUsClient.Instance.AmHost || Utils.CheckAccessLevel(player.Data.FriendCode) > 0) return false; + if (input == "" || !AmongUsClient.Instance.AmHost || Utils.CheckAccessLevel(player.Data.FriendCode) > 0 || !Options.AutoKickStart.GetBool()) return false; int clientId = player.Data.ClientId; - var startWords = File.ReadAllLines(BanWordPath).Where(x => !x.StartsWith("#")); + var startWords = File.ReadAllLines(StartWordsPath).Where(x => !x.StartsWith("#")); if ((Options.AutoKickStartStrength.GetBool() && startWords.Where(code => !string.IsNullOrWhiteSpace(code)).Any(code => input.Contains(code, StringComparison.OrdinalIgnoreCase))) || (!Options.AutoKickStartStrength.GetBool() && startWords.Where(code => !string.IsNullOrWhiteSpace(code)).Any(code => input.Equals(code, StringComparison.OrdinalIgnoreCase)))) { @@ -214,9 +222,17 @@ public static class BanManager if (Main.SayStartTimes[clientId] >= Options.AutoKickStartTimes.GetInt()) { - AmongUsClient.Instance.KickPlayer(clientId, false); + if (Options.AutoKickStartAsBan.GetBool()) + { + AmongUsClient.Instance.KickPlayer(clientId, true); + Logger.SendInGame(Translator.Get("startWordKick", player.Data.PlayerName, Options.AutoKickStartTimes.GetInt())); + } + else + { + AmongUsClient.Instance.KickPlayer(clientId, false); + Logger.SendInGame(Translator.Get("startWordBan", player.Data.PlayerName, Options.AutoKickStartTimes.GetInt())); + } Logger.Info(Translator.Get("startWordKick", player.Data.PlayerName, Options.AutoKickStartTimes.GetInt()), "StartWordKick"); - Logger.SendInGame(Translator.Get("startWordKick", player.Data.PlayerName, Options.AutoKickStartTimes.GetInt())); } return true; } diff --git a/Modules/CommandHelper.cs b/Modules/CommandHelper.cs index 70267f1..80fd550 100644 --- a/Modules/CommandHelper.cs +++ b/Modules/CommandHelper.cs @@ -76,7 +76,10 @@ internal static class CommandHelper new Cmd { Name = new[] { "/seeker" }, Prompt = "/seeker {name}", Description = Translator.Get("seekerDesc"), HasVariable = true }, new Cmd { Name = new[] { "/seekers" }, Prompt = "/seekers", Description = Translator.Get("seekersDesc"), HasVariable = false }, - new Cmd { Name = new[] { "/clearseeker" }, Prompt = "/clearseeker", Description = Translator.Get("clearSeekerDesc"), HasVariable = false } + 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 } }; [HarmonyPostfix] diff --git a/Modules/CustomOptionsHolder.cs b/Modules/CustomOptionsHolder.cs index 42a86e7..59444b0 100644 --- a/Modules/CustomOptionsHolder.cs +++ b/Modules/CustomOptionsHolder.cs @@ -72,32 +72,43 @@ namespace AmongUsRevamped public static OptionItem TabGroupMain; + public static OptionItem TabGroupLevelKick; + public static OptionItem EnableKickLowLevelPlayer; public static OptionItem KickLowLevelPlayer; public static OptionItem DontKickLevelOnes; public static OptionItem TempBanLowLevelPlayer; + public static OptionItem TabGroupKickInvalidFriendCodes; public static OptionItem KickInvalidFriendCodes; public static OptionItem TempBanInvalidFriendCodes; + public static OptionItem TabGroupDeniedWords; + public static OptionItem EnableDeniedWords; public static OptionItem DeniedWordsToKick; + public static OptionItem DeniedWordsAsBan; + public static OptionItem DeniedWordsStrength; + public static OptionItem TabGroupAutoKickStart; public static OptionItem AutoKickStart; public static OptionItem AutoKickStartAsBan; public static OptionItem AutoKickStartTimes; public static OptionItem AutoKickStartStrength; public static OptionItem TabGroupAutomation; - public static OptionItem AutoSendGameInfo; public static OptionItem AutoRejoinLobby; - public static OptionItem AutoStartTimer; - public static OptionItem WaitAutoStart; - public static OptionItem PlayerAutoStart; public static OptionItem EnableJoinMessages; public static OptionItem MessagePerPlayerNum; - public static OptionItem TabGroupMisc; + public static OptionItem TabGroupAutostart; + public static OptionItem AutoStartTimer; + public static OptionItem WaitAutoStart; + public static OptionItem PlayerAutoStart; + public static OptionItem Rehost; + public static OptionItem Public; + public static OptionItem TabGroupMisc; + public static OptionItem MapVoteDuration; public static OptionItem StartCountdown; public static OptionItem ColorCommandLevel; public static OptionItem AllowFortegreen; @@ -107,6 +118,7 @@ namespace AmongUsRevamped public static OptionItem SlashColorCmd; public static OptionItem SlashRolesAndGamemodeCmd; public static OptionItem SlashLastGameCmd; + public static OptionItem SlashMapAndSeekerCmd; public static OptionItem SlashKickCmd; public static OptionItem SlashBanCmd; public static OptionItem SlashEndMeetingCmd; @@ -270,6 +282,7 @@ namespace AmongUsRevamped public static OptionItem TabGroupSNS; public static OptionItem SNSSettingsOverride; public static OptionItem SNSChatInGame; + public static OptionItem SNSChatInGameExtend; public static OptionItem CrewAutoWinsGameAfter; public static OptionItem CantKillTime; public static OptionItem MisfiresToSuicide; @@ -294,72 +307,96 @@ namespace AmongUsRevamped if (IsLoaded) return; _ = PresetOptionItem.Create(0, TabGroup.SystemSettings) - .SetColor(new Color32(204, 204, 0, 255)) + .SetColor(Color.yellow) .SetHeader(true); Gamemode = StringOptionItem.Create(1, Translator.Get("gamemode"), gameModes, 0, TabGroup.SystemSettings, false) - .SetColor(Color.green) + .SetColor(Color.yellow) .SetHeader(true); - TabGroupMain = TextOptionItem.Create(60000, Translator.Get("tabGroupMain"), TabGroup.SystemSettings) - .SetColor(Color.blue); - - DeniedWordsToKick = IntegerOptionItem.Create(60049, Translator.Get("deniedWordsToKick"), new(1, 5, 1), 1, TabGroup.SystemSettings, false) + TabGroupLevelKick = TextOptionItem.Create(60048, Translator.Get("tabGroupLevelKick"), TabGroup.ModerationSettings) + .SetColor(Color.red); + EnableKickLowLevelPlayer = BooleanOptionItem.Create(60049, Translator.Get("enableKickLowLevelPlayer"), false, TabGroup.ModerationSettings, false); + KickLowLevelPlayer = IntegerOptionItem.Create(60050, Translator.Get("kickLowLevelPlayer"), new(0, 100, 1), 0, TabGroup.ModerationSettings, false) + .SetParent(EnableKickLowLevelPlayer) .SetValueFormat(OptionFormat.Level); + TempBanLowLevelPlayer = BooleanOptionItem.Create(60051, Translator.Get("tempBanLowLevelPlayer"), false, TabGroup.ModerationSettings, false) + .SetParent(EnableKickLowLevelPlayer); + DontKickLevelOnes = BooleanOptionItem.Create(60052, Translator.Get("dontKickLevelOnes"), false, TabGroup.ModerationSettings, false) + .SetParent(EnableKickLowLevelPlayer); - KickLowLevelPlayer = IntegerOptionItem.Create(60050, Translator.Get("kickLowLevelPlayer"), new(0, 100, 1), 0, TabGroup.SystemSettings, false) - .SetValueFormat(OptionFormat.Level); - TempBanLowLevelPlayer = BooleanOptionItem.Create(60051, Translator.Get("tempBanLowLevelPlayer"), false, TabGroup.SystemSettings, false) - .SetParent(KickLowLevelPlayer); - DontKickLevelOnes = BooleanOptionItem.Create(60052, Translator.Get("dontKickLevelOnes"), false, TabGroup.SystemSettings, false) - .SetParent(KickLowLevelPlayer); - - KickInvalidFriendCodes = BooleanOptionItem.Create(60080, Translator.Get("kickInvalidFriendCodes"), true, TabGroup.SystemSettings, false); - TempBanInvalidFriendCodes = BooleanOptionItem.Create(60081, Translator.Get("tempBanInvalidFriendCodes"), false, TabGroup.SystemSettings, false) + TabGroupKickInvalidFriendCodes = TextOptionItem.Create(60079, Translator.Get("tabGroupKickInvalidFriendCodes"), TabGroup.ModerationSettings) + .SetColor(Color.red); + KickInvalidFriendCodes = BooleanOptionItem.Create(60080, Translator.Get("kickInvalidFriendCodes"), true, TabGroup.ModerationSettings, false); + TempBanInvalidFriendCodes = BooleanOptionItem.Create(60081, Translator.Get("tempBanInvalidFriendCodes"), false, TabGroup.ModerationSettings, false) .SetParent(KickInvalidFriendCodes); - AutoKickStart = BooleanOptionItem.Create(60123, Translator.Get("autoKickStart"), false, TabGroup.SystemSettings, false); - AutoKickStartAsBan = BooleanOptionItem.Create(60124, Translator.Get("autoKickStartAsBan"), false, TabGroup.SystemSettings, false) + TabGroupDeniedWords = TextOptionItem.Create(60082, Translator.Get("tabGroupDeniedWords"), TabGroup.ModerationSettings) + .SetColor(Color.red); + EnableDeniedWords = BooleanOptionItem.Create(60083, Translator.Get("enableDeniedWords"), false, TabGroup.ModerationSettings, false); + DeniedWordsAsBan = BooleanOptionItem.Create(60084, Translator.Get("autoKickStartAsBan"), false, TabGroup.ModerationSettings, false) + .SetParent(EnableDeniedWords); + DeniedWordsToKick = IntegerOptionItem.Create(60085, Translator.Get("deniedWordsToKick"), new(1, 5, 1), 1, TabGroup.ModerationSettings, false) + .SetParent(EnableDeniedWords) + .SetValueFormat(OptionFormat.Level); + DeniedWordsStrength = BooleanOptionItem.Create(60086, Translator.Get("autoKickStartStrength"), false, TabGroup.ModerationSettings, false) + .SetParent(EnableDeniedWords); + + TabGroupAutoKickStart = TextOptionItem.Create(600122, Translator.Get("tabGroupAutoKickStart"), TabGroup.ModerationSettings) + .SetColor(Color.red); + AutoKickStart = BooleanOptionItem.Create(60123, Translator.Get("autoKickStart"), false, TabGroup.ModerationSettings, false); + AutoKickStartAsBan = BooleanOptionItem.Create(60124, Translator.Get("autoKickStartAsBan"), false, TabGroup.ModerationSettings, false) .SetParent(AutoKickStart); - AutoKickStartTimes = IntegerOptionItem.Create(60125, Translator.Get("autoKickStartTimes"), new(1, 10, 1), 1, TabGroup.SystemSettings, false) + AutoKickStartTimes = IntegerOptionItem.Create(60125, Translator.Get("autoKickStartTimes"), new(1, 10, 1), 1, TabGroup.ModerationSettings, false) .SetParent(AutoKickStart) .SetValueFormat(OptionFormat.Times); - AutoKickStartStrength = BooleanOptionItem.Create(60126, Translator.Get("autoKickStartStrength"), false, TabGroup.SystemSettings, false) + AutoKickStartStrength = BooleanOptionItem.Create(60126, Translator.Get("autoKickStartStrength"), false, TabGroup.ModerationSettings, false) .SetParent(AutoKickStart); + TabGroupAccess = TextOptionItem.Create(60127, Translator.Get("tabGroupAccess"), TabGroup.ModerationSettings) + .SetColor(Color.red); + SlashColorCmd = StringOptionItem.Create(60128, Translator.Get("slashColorCmd"), accessLevels, 1, TabGroup.ModerationSettings, false); + SlashRolesAndGamemodeCmd = StringOptionItem.Create(60129, Translator.Get("slashRolesAndGamemodeCmd"), accessLevels, 1, TabGroup.ModerationSettings, false); + SlashLastGameCmd = StringOptionItem.Create(60130, Translator.Get("slashLastGameCmd"), accessLevels, 1, TabGroup.ModerationSettings, false); + SlashMapAndSeekerCmd = StringOptionItem.Create(60131, Translator.Get("slashMapAndSeekerCmd"), accessLevels, 1, TabGroup.ModerationSettings, false); + SlashKickCmd = StringOptionItem.Create(60132, Translator.Get("slashKickCmd"), accessLevels, 2, TabGroup.ModerationSettings, false); + SlashBanCmd = StringOptionItem.Create(60133, Translator.Get("slashBanCmd"), accessLevels, 2, TabGroup.ModerationSettings, false); + SlashEndMeetingCmd = StringOptionItem.Create(60134, Translator.Get("slashEndMeetingCmd"), accessLevels, 3, TabGroup.ModerationSettings, false); + SlashStartAndEndGameCmd = StringOptionItem.Create(60135, Translator.Get("slashStartAndEndGameCmd"), accessLevels, 3, TabGroup.ModerationSettings, false); + TabGroupAutomation = TextOptionItem.Create(60149, Translator.Get("tabGroupAutomation"), TabGroup.SystemSettings) .SetColor(Color.yellow); - AutoSendGameInfo = BooleanOptionItem.Create(60150, Translator.Get("autoSendGameInfo"), true, TabGroup.SystemSettings, false); - AutoRejoinLobby = BooleanOptionItem.Create(60210, Translator.Get("autoRejoinLobby"), false, TabGroup.SystemSettings, false); - AutoStartTimer = IntegerOptionItem.Create(64420, Translator.Get("autoStartTimer"), new(1, 5, 1), 5, TabGroup.SystemSettings, false) - .SetValueFormat(OptionFormat.Seconds); - WaitAutoStart = IntegerOptionItem.Create(64421, Translator.Get("waitAutoStart"), new(10, 600, 10), 300, TabGroup.SystemSettings, false) - .SetValueFormat(OptionFormat.Seconds); - PlayerAutoStart = IntegerOptionItem.Create(64422, Translator.Get("playerAutoStart"), new(1, 15, 1), 1, TabGroup.SystemSettings, false); - EnableJoinMessages = BooleanOptionItem.Create(64423, Translator.Get("enableJoinMessages"), true, TabGroup.SystemSettings, false); - MessagePerPlayerNum = IntegerOptionItem.Create(64424, Translator.Get("messagePerPlayerNum"), new(1, 15, 1), 5, TabGroup.SystemSettings, false) + AutoRejoinLobby = BooleanOptionItem.Create(60151, Translator.Get("autoRejoinLobby"), false, TabGroup.SystemSettings, false); + EnableJoinMessages = BooleanOptionItem.Create(60152, Translator.Get("enableJoinMessages"), true, TabGroup.SystemSettings, false); + MessagePerPlayerNum = IntegerOptionItem.Create(60153, Translator.Get("messagePerPlayerNum"), new(1, 15, 1), 5, TabGroup.SystemSettings, false) .SetParent(EnableJoinMessages); - TabGroupMisc = TextOptionItem.Create(60379, Translator.Get("tabGroupMisc"), TabGroup.SystemSettings) - .SetColor(Color.green); - - StartCountdown = IntegerOptionItem.Create(60380, Translator.Get("startCountdown"), new(1, 5, 1), 5, TabGroup.SystemSettings, false) + 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) .SetValueFormat(OptionFormat.Seconds); - AllowFortegreen = BooleanOptionItem.Create(60382, Translator.Get("allowFortegreen"), false, TabGroup.SystemSettings, false); + WaitAutoStart = IntegerOptionItem.Create(64427, Translator.Get("waitAutoStart"), new(10, 600, 10), 300, TabGroup.SystemSettings, false) + .SetValueFormat(OptionFormat.Seconds); + PlayerAutoStart = IntegerOptionItem.Create(64428, Translator.Get("playerAutoStart"), new(1, 15, 1), 1, TabGroup.SystemSettings, false); + Rehost = BooleanOptionItem.Create(64429, Translator.Get("rehost"), false, TabGroup.SystemSettings, false); + Public = BooleanOptionItem.Create(64430, Translator.Get("public"), false, TabGroup.SystemSettings, false) + .SetParent(Rehost); + + 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) + .SetColor(Color.red); + StartCountdown = IntegerOptionItem.Create(60380, Translator.Get("startCountdown"), new(1, 5, 1), 5, TabGroup.SystemSettings, false) + .SetValueFormat(OptionFormat.Seconds) + .SetColor(Color.red); + AllowFortegreen = BooleanOptionItem.Create(60382, Translator.Get("allowFortegreen"), false, TabGroup.SystemSettings, false) + .SetColor(Color.red); NoGameEnd = BooleanOptionItem.Create(60383, Translator.Get("noGameEnd"), false, TabGroup.SystemSettings, false) .SetColor(Color.red); - TabGroupAccess = TextOptionItem.Create(60400, Translator.Get("tabGroupAccess"), TabGroup.SystemSettings) - .SetColor(Color.red); - SlashColorCmd = StringOptionItem.Create(60401, Translator.Get("slashColorCmd"), accessLevels, 1, TabGroup.SystemSettings, false); - SlashRolesAndGamemodeCmd = StringOptionItem.Create(60402, Translator.Get("slashRolesAndGamemodeCmd"), accessLevels, 1, TabGroup.SystemSettings, false); - SlashLastGameCmd = StringOptionItem.Create(60403, Translator.Get("slashLastGameCmd"), accessLevels, 1, TabGroup.SystemSettings, false); - SlashKickCmd = StringOptionItem.Create(60405, Translator.Get("slashKickCmd"), accessLevels, 2, TabGroup.SystemSettings, false); - SlashBanCmd = StringOptionItem.Create(60406, Translator.Get("slashBanCmd"), accessLevels, 2, TabGroup.SystemSettings, false); - SlashEndMeetingCmd = StringOptionItem.Create(60407, Translator.Get("slashEndMeetingCmd"), accessLevels, 3, TabGroup.SystemSettings, false); - SlashStartAndEndGameCmd = StringOptionItem.Create(60408, Translator.Get("slashStartAndEndGameCmd"), accessLevels, 3, TabGroup.SystemSettings, false); - // Gamemode Settings TabGroupHNS = TextOptionItem.Create(70000, Translator.Get("tabGroupHNS"), TabGroup.GamemodeSettings) @@ -368,9 +405,11 @@ namespace AmongUsRevamped .SetValueFormat(OptionFormat.Level); TabGroupSNS = TextOptionItem.Create(70050, Translator.Get("tabGroupSNS"), TabGroup.GamemodeSettings) - .SetColor(Color.yellow); + .SetColor(Color.green); SNSSettingsOverride = BooleanOptionItem.Create(70051, Translator.Get("snsSettingsOverride"), true, TabGroup.GamemodeSettings, false); SNSChatInGame = BooleanOptionItem.Create(70063, Translator.Get("snsChatInGame"), false, TabGroup.GamemodeSettings, false); + SNSChatInGameExtend = BooleanOptionItem.Create(70064, Translator.Get("snsChatInGameExtend"), false, TabGroup.GamemodeSettings, false) + .SetParent(SNSChatInGame); CantKillTime = IntegerOptionItem.Create(70053, Translator.Get("cantKillTime"), new(0, 60, 5), 20, TabGroup.GamemodeSettings, false) .SetValueFormat(OptionFormat.Seconds); MisfiresToSuicide = IntegerOptionItem.Create(70052, Translator.Get("misfiresToSuicide"), new(1, 10, 1), 2, TabGroup.GamemodeSettings, false); @@ -400,7 +439,7 @@ namespace AmongUsRevamped .SetColor(Color.red); TabGroupSpeedrun = TextOptionItem.Create(70075, Translator.Get("tabGroupSpeedrun"), TabGroup.GamemodeSettings) - .SetColor(Color.blue); + .SetColor(Color.green); SpeedrunSettingsOverride = BooleanOptionItem.Create(70076, Translator.Get("speedrunSettingsOverride"), true, TabGroup.GamemodeSettings, false); GameAutoEndsAfter = IntegerOptionItem.Create(70077, Translator.Get("gameAutoEndsAfter"), new(0, 600, 10), 300, TabGroup.GamemodeSettings, false) .SetValueFormat(OptionFormat.Seconds); @@ -408,7 +447,7 @@ namespace AmongUsRevamped // Gameplay Settings TabGroupSabotages = TextOptionItem.Create(60450, Translator.Get("tabGroupSabotages"), TabGroup.ModSettings) - .SetColor(Color.red); + .SetColor(Color.blue); DeadImpostorsCanSabotage = BooleanOptionItem.Create(60455, Translator.Get("deadImpostorsCanSabotage"), true, TabGroup.ModSettings, false) .SetColor(Color.red); DisableSabotage = BooleanOptionItem.Create(60456, Translator.Get("disableSabotage"), false, TabGroup.ModSettings, false) @@ -436,100 +475,77 @@ namespace AmongUsRevamped TabGroupGameplayGeneral = TextOptionItem.Create(60564, Translator.Get("tabGroupGameplayGeneral"), TabGroup.ModSettings) .SetColor(Color.blue); - DisableAnnoyingMeetingCalls = BooleanOptionItem.Create(60565, Translator.Get("disableAnnoyingMeetingCalls"), false, TabGroup.ModSettings, false) - .SetColor(new Color32(19, 188, 233, byte.MaxValue)); + DisableAnnoyingMeetingCalls = BooleanOptionItem.Create(60565, Translator.Get("disableAnnoyingMeetingCalls"), false, TabGroup.ModSettings, false); - ChangeDecontaminationTime = BooleanOptionItem.Create(60550, Translator.Get("changeDecontaminationTime"), false, TabGroup.ModSettings, false) - .SetColor(new Color32(19, 188, 233, byte.MaxValue)); + 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) - .SetValueFormat(OptionFormat.Seconds) - .SetColor(new Color32(19, 188, 233, byte.MaxValue)); + .SetValueFormat(OptionFormat.Seconds); DecontaminationDoorOpenTimeOnMiraHQ = FloatOptionItem.Create(60552, Translator.Get("decontaminationDoorOpenTimeOnMiraHQ"), new(0.5f, 10f, 0.25f), 3f, TabGroup.ModSettings, false) .SetParent(ChangeDecontaminationTime) - .SetValueFormat(OptionFormat.Seconds) - .SetColor(new Color32(19, 188, 233, byte.MaxValue)); + .SetValueFormat(OptionFormat.Seconds); DecontaminationTimeOnPolus = FloatOptionItem.Create(60553, Translator.Get("decontaminationTimeOnPolus"), new(0.5f, 10f, 0.25f), 3f, TabGroup.ModSettings, false) .SetParent(ChangeDecontaminationTime) - .SetValueFormat(OptionFormat.Seconds) - .SetColor(new Color32(19, 188, 233, byte.MaxValue)); + .SetValueFormat(OptionFormat.Seconds); DecontaminationDoorOpenTimeOnPolus = FloatOptionItem.Create(60554, Translator.Get("decontaminationDoorOpenTimeOnPolus"), new(0.5f, 10f, 0.25f), 3f, TabGroup.ModSettings, false) .SetParent(ChangeDecontaminationTime) - .SetValueFormat(OptionFormat.Seconds) - .SetColor(new Color32(19, 188, 233, byte.MaxValue)); + .SetValueFormat(OptionFormat.Seconds); - DisableSporeTrigger = BooleanOptionItem.Create(60558, Translator.Get("disableSporeTrigger"), false, TabGroup.ModSettings, false) - .SetColor(new Color32(19, 188, 233, byte.MaxValue)); + DisableSporeTrigger = BooleanOptionItem.Create(60558, Translator.Get("disableSporeTrigger"), false, TabGroup.ModSettings, false); - DisableDevices = BooleanOptionItem.Create(22900, Translator.Get("disableDevices"), false, TabGroup.ModSettings, false) - .SetColor(Color.red); + DisableDevices = BooleanOptionItem.Create(22900, Translator.Get("disableDevices"), false, TabGroup.ModSettings, false); DisableSkeldDevices = BooleanOptionItem.Create(22905, Translator.Get("disableSkeldDevices"), false, TabGroup.ModSettings, false) .SetParent(DisableDevices) .SetColor(new Color32(255, 153, 153, byte.MaxValue)); DisableSkeldAdmin = BooleanOptionItem.Create(22906, Translator.Get("disableSkeldAdmin"), false, TabGroup.ModSettings, false) - .SetParent(DisableSkeldDevices) - .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + .SetParent(DisableSkeldDevices); DisableSkeldCamera = BooleanOptionItem.Create(22907, Translator.Get("disableSkeldCamera"), false, TabGroup.ModSettings, false) - .SetParent(DisableSkeldDevices) - .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + .SetParent(DisableSkeldDevices); DisableMiraHQDevices = BooleanOptionItem.Create(22908, Translator.Get("disableMiraHQDevices"), false, TabGroup.ModSettings, false) .SetParent(DisableDevices) .SetColor(new Color32(255, 153, 153, byte.MaxValue)); DisableMiraHQAdmin = BooleanOptionItem.Create(22909, Translator.Get("disableMiraHQAdmin"), false, TabGroup.ModSettings, false) - .SetParent(DisableMiraHQDevices) - .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + .SetParent(DisableMiraHQDevices); DisableMiraHQDoorLog = BooleanOptionItem.Create(22910, Translator.Get("disableMiraHQDoorLog"), false, TabGroup.ModSettings, false) - .SetParent(DisableMiraHQDevices) - .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + .SetParent(DisableMiraHQDevices); DisablePolusDevices = BooleanOptionItem.Create(22911, Translator.Get("disablePolusDevices"), false, TabGroup.ModSettings, false) .SetParent(DisableDevices) .SetColor(new Color32(255, 153, 153, byte.MaxValue)); DisablePolusAdmin = BooleanOptionItem.Create(22912, Translator.Get("disablePolusAdmin"), false, TabGroup.ModSettings, false) - .SetParent(DisablePolusDevices) - .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + .SetParent(DisablePolusDevices); DisablePolusCamera = BooleanOptionItem.Create(22913, Translator.Get("disablePolusCamera"), false, TabGroup.ModSettings, false) - .SetParent(DisablePolusDevices) - .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + .SetParent(DisablePolusDevices); DisablePolusVital = BooleanOptionItem.Create(22914, Translator.Get("disablePolusVital"), false, TabGroup.ModSettings, false) - .SetParent(DisablePolusDevices) - .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + .SetParent(DisablePolusDevices); DisableAirshipDevices = BooleanOptionItem.Create(22915, Translator.Get("disableAirshipDevices"), false, TabGroup.ModSettings, false) .SetParent(DisableDevices) .SetColor(new Color32(255, 153, 153, byte.MaxValue)); DisableAirshipCockpitAdmin = BooleanOptionItem.Create(22916, Translator.Get("disableAirshipCockpitAdmin"), false, TabGroup.ModSettings, false) - .SetParent(DisableAirshipDevices) - .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + .SetParent(DisableAirshipDevices); DisableAirshipRecordsAdmin = BooleanOptionItem.Create(22917, Translator.Get("disableAirshipRecordsAdmin"), false, TabGroup.ModSettings, false) - .SetParent(DisableAirshipDevices) - .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + .SetParent(DisableAirshipDevices); DisableAirshipCamera = BooleanOptionItem.Create(22918, Translator.Get("disableAirshipCamera"), false, TabGroup.ModSettings, false) - .SetParent(DisableAirshipDevices) - .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + .SetParent(DisableAirshipDevices); DisableAirshipVital = BooleanOptionItem.Create(22919, Translator.Get("disableAirshipVital"), false, TabGroup.ModSettings, false) - .SetParent(DisableAirshipDevices) - .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + .SetParent(DisableAirshipDevices); DisableFungleDevices = BooleanOptionItem.Create(22925, Translator.Get("disableFungleDevices"), false, TabGroup.ModSettings, false) .SetParent(DisableDevices) .SetColor(new Color32(255, 153, 153, byte.MaxValue)); DisableFungleVital = BooleanOptionItem.Create(22927, Translator.Get("disableFungleVital"), false, TabGroup.ModSettings, false) - .SetParent(DisableFungleDevices) - .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + .SetParent(DisableFungleDevices); TabGroupTasks = TextOptionItem.Create(22995, Translator.Get("tabGroupTasks"), TabGroup.ModSettings) - .SetColor(Color.yellow); + .SetColor(Color.blue); TaskPercentNeededToWin = IntegerOptionItem.Create(22996, Translator.Get("taskPercentNeededToWin"), new(30, 100, 5), 100, TabGroup.ModSettings, false) - .SetColor(new Color32(255, 255, 153, byte.MaxValue)) .SetValueFormat(OptionFormat.Percent); - AllPlayersSameTasks = BooleanOptionItem.Create(22998, Translator.Get("allPlayersSameTasks"), false, TabGroup.ModSettings, false) - .SetColor(new Color32(255, 255, 153, byte.MaxValue)); - OverrideTaskSettings = BooleanOptionItem.Create(22999, Translator.Get("overrideTaskSettings"), false, TabGroup.ModSettings, false) - .SetColor(new Color32(255, 255, 153, byte.MaxValue)); + AllPlayersSameTasks = BooleanOptionItem.Create(22998, Translator.Get("allPlayersSameTasks"), false, TabGroup.ModSettings, false); + OverrideTaskSettings = BooleanOptionItem.Create(22999, Translator.Get("overrideTaskSettings"), false, TabGroup.ModSettings, false); DisableMiraTasks = BooleanOptionItem.Create(23000, Translator.Get("disableMiraTasks"), false, TabGroup.ModSettings, false) .SetColor(new Color32(173, 216, 230, byte.MaxValue)) diff --git a/Modules/EACR.cs b/Modules/EACR.cs index a840b27..6bcebfd 100644 --- a/Modules/EACR.cs +++ b/Modules/EACR.cs @@ -201,4 +201,25 @@ internal class EACR return true; } } + + 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"); + } + + 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"); + } + + 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"); + } } \ No newline at end of file diff --git a/Modules/FixedUpdate.cs b/Modules/FixedUpdate.cs index 88b5e5f..7f56b89 100644 --- a/Modules/FixedUpdate.cs +++ b/Modules/FixedUpdate.cs @@ -110,7 +110,7 @@ class FixedUpdateInGamePatch Utils.CustomWinnerEndGame(PlayerControl.LocalPlayer, 0); Logger.Info($" No one won because the game took longer than {Options.GameAutoEndsAfter.GetInt()}s", "SpeedrunManager"); - NormalGameEndChecker.CheckWinnerText("NoOneWin"); + NormalGameEndChecker.CheckWinnerText("NoOneWinsSpeedrun"); } } } diff --git a/Modules/OptionItem/OptionItem.cs b/Modules/OptionItem/OptionItem.cs index fdf5172..1dcb035 100644 --- a/Modules/OptionItem/OptionItem.cs +++ b/Modules/OptionItem/OptionItem.cs @@ -214,6 +214,7 @@ namespace AmongUsRevamped public enum TabGroup { SystemSettings, + ModerationSettings, //CustomRoleSettings, ModSettings, GamemodeSettings, diff --git a/Modules/Rehost.cs b/Modules/Rehost.cs new file mode 100644 index 0000000..4a2337c --- /dev/null +++ b/Modules/Rehost.cs @@ -0,0 +1,27 @@ +using InnerNet; +using UnityEngine; +using System; +using AmongUs.GameOptions; + +namespace AmongUsRevamped +{ + [HarmonyPatch(typeof(InnerNetClient), nameof(InnerNetClient.DisconnectInternal))] + public static class DisconnectManager + { + public static bool Rehosting; + public static void Prefix(InnerNetClient __instance, DisconnectReasons reason, string stringReason) + { + Logger.Info($" Disconnected due to {reason}/{stringReason}, ping:{__instance.Ping})", "DisconnectManager"); + + if (!Options.Rehost.GetBool() || reason == DisconnectReasons.NewConnection || reason == DisconnectReasons.ConnectionLimit || reason == DisconnectReasons.ExitGame) return; + + _ = new LateTask(() => + { + Rehosting = true; + PSManager.Instance.CreateGame(GameModes.Normal); + Logger.Info(Translator.Get("rehostSuccess"), "DisconnectManager"); + + }, 5f, "RehostManager"); + } + } +} diff --git a/Modules/Utils.cs b/Modules/Utils.cs index a7f5107..af719d2 100644 --- a/Modules/Utils.cs +++ b/Modules/Utils.cs @@ -73,6 +73,8 @@ public static class Utils { case TabGroup.SystemSettings: return Translator.Get("systemSettings"); + case TabGroup.ModerationSettings: + return Translator.Get("moderationSettings"); case TabGroup.ModSettings: return Translator.Get("gameplaySettings"); case TabGroup.GamemodeSettings: @@ -206,7 +208,7 @@ public static class Utils MurderPlayerPatch.misfireCount.Clear(); MurderPlayerPatch.killCount.Clear(); - LateTask.Tasks.Clear(); + LateTask.Tasks.RemoveAll(x => x.name != "RehostManager"); NormalGameEndChecker.ImpCheckComplete = false; CreateOptionsPickerPatch.SetDleks2 = false; CanCallMeetings = true; @@ -224,7 +226,7 @@ public static class Utils PlayerControlSetRolePatch.FirstAssign = true; PlayerControlSetRolePatch.manualSeekers.Clear(); - CoShowIntroPatch.IntroInitiated = false; + OnGameStartPatch.PastStartScreen = false; } public static PlayerControl[] AllAlivePlayerControls @@ -571,4 +573,94 @@ public static class Utils } else return $"{p.Data.RoleType}"; } + + public static int skeldVotes; + public static int miraVotes; + public static int polusVotes; + public static int airshipVotes; + 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) + { + if (MapVoteActive) 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); + + 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); + + new LateTask(() => + { + int highest = skeldVotes; + string winner = "Skeld"; + byte mapId = 0; + bool tie = false; + + void Check(int votes, string name, byte id) + { + if (votes > highest) + { + highest = votes; + winner = name; + mapId = id; + tie = false; + } + else if (votes == highest) + { + tie = true; + } + } + + 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); + + string voteResults = $"Skeld: {skeldVotes}\n" + $"Mira: {miraVotes}\n" + $"Polus: {polusVotes}\n" + $"Airship: {airshipVotes}\n" + $"Fungle: {fungleVotes}"; + if (DleksEnabled) voteResults += $"\nEht Dleks: {dleksVotes}"; + + if (highest == 0) + { + ModeratorChatCommand("Lol, no one voted. Hooray for democracy?", "", false); + } + else if (tie) + { + ModeratorChatCommand($"Map vote tied. No new map selected.\n\n{voteResults}", "", false); + } + else + { + ModeratorChatCommand(SendChatPatch.ConvertNum($"Winner: {winner} ({highest})\n\n{voteResults}"), "", false); + + if (winner == "Eht Dleks") + { + CreateOptionsPickerPatch.ApplyDleks(Utils.isHideNSeek); + } + else + { + CreateOptionsPickerPatch.ClearDleks(); + + if (!Utils.isHideNSeek) Main.NormalOptions.MapId = mapId; + else Main.HideNSeekOptions.MapId = mapId; + } + } + + skeldVotes = 0; + miraVotes = 0; + polusVotes = 0; + airshipVotes = 0; + fungleVotes = 0; + dleksVotes = 0; + HasVoted.Clear(); + + MapVoteActive = false; + }, Options.MapVoteDuration.GetInt(), "MapPoll"); + } } \ No newline at end of file diff --git a/Patches/ChatPatches.cs b/Patches/ChatPatches.cs index facfa88..8f3c23c 100644 --- a/Patches/ChatPatches.cs +++ b/Patches/ChatPatches.cs @@ -396,10 +396,44 @@ internal static class SendChatPatch if (__instance.timeSinceLastMessage < 3f || OnGameJoinedPatch.WaitingForChat) return false; + if (text == "/mapvote") + { + 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); + + __instance.freeChatField.textArea.Clear(); + __instance.freeChatField.textArea.SetText(string.Empty); + return false; + } + } + + if (text == "/vote a" && Utils.MapVoteActive && !Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) {Utils.skeldVotes++; Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId);} + if (text == "/vote b" && Utils.MapVoteActive && !Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) {Utils.miraVotes++; Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId);} + if (text == "/vote c" && Utils.MapVoteActive && !Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) {Utils.polusVotes++; Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId);} + if (text == "/vote d" && Utils.MapVoteActive && !Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) {Utils.airshipVotes++; Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId);} + if (text == "/vote e" && Utils.MapVoteActive && !Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) {Utils.fungleVotes++; Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId);} + if (text == "/vote f" && Utils.MapVoteActive && !Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId) && Utils.DleksEnabled) {Utils.dleksVotes++; Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId);} + if (text == "/l" || text == "/lastgame") { if (string.IsNullOrEmpty(NormalGameEndChecker.LastWinReason) || Utils.InGame) return false; Utils.ChatCommand(__instance, $"{NormalGameEndChecker.LastWinReason}", "", false); + + __instance.freeChatField.textArea.Clear(); + __instance.freeChatField.textArea.SetText(string.Empty); return false; } @@ -588,7 +622,7 @@ public static class RPCHandlerPatch BanManager.IsStartWord(__instance, text); BanManager.IsWordBanned(__instance, text); - if (text.StartsWith("/seeker ") && Utils.CheckAccessLevel(__instance.Data.FriendCode) >= Options.SlashEndMeetingCmd.GetValue()) + if (text.StartsWith("/seeker ") && Utils.CheckAccessLevel(__instance.Data.FriendCode) >= Options.SlashMapAndSeekerCmd.GetValue()) { if (!Utils.IsLobby || !Utils.isHideNSeek) { @@ -627,8 +661,9 @@ public static class RPCHandlerPatch } } - if (text == "/clearseeker" && Utils.CheckAccessLevel(__instance.Data.FriendCode) >= Options.SlashEndMeetingCmd.GetValue()) + if (text == "/clearseeker") { + if (Utils.CheckAccessLevel(__instance.Data.FriendCode) < Options.SlashMapAndSeekerCmd.GetValue()) return; PlayerControlSetRolePatch.manualSeekers.Clear(); HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, Translator.Get("clearedSeekers")); } @@ -697,8 +732,6 @@ public static class RPCHandlerPatch } } - if (OnGameJoinedPatch.WaitingForChat || GameStartManagerUpdatePatch.CountingDown) return; - if (text == "/eg" || text == "/endgame") { if (Utils.CheckAccessLevel(__instance.Data.FriendCode) < Options.SlashStartAndEndGameCmd.GetValue()) return; @@ -722,6 +755,33 @@ public static class RPCHandlerPatch GameStartManager.Instance.BeginGame(); } + if (OnGameJoinedPatch.WaitingForChat || GameStartManagerUpdatePatch.CountingDown) return; + + if (text == "/mapvote") + { + 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); + } + } + + if (text == "/vote a" && Utils.MapVoteActive && !Utils.HasVoted.Contains(__instance.Data.PlayerId)) {Utils.skeldVotes++; Utils.HasVoted.Add(__instance.Data.PlayerId);} + if (text == "/vote b" && Utils.MapVoteActive && !Utils.HasVoted.Contains(__instance.Data.PlayerId)) {Utils.miraVotes++; Utils.HasVoted.Add(__instance.Data.PlayerId);} + if (text == "/vote c" && Utils.MapVoteActive && !Utils.HasVoted.Contains(__instance.Data.PlayerId)) {Utils.polusVotes++; Utils.HasVoted.Add(__instance.Data.PlayerId);} + if (text == "/vote d" && Utils.MapVoteActive && !Utils.HasVoted.Contains(__instance.Data.PlayerId)) {Utils.airshipVotes++; Utils.HasVoted.Add(__instance.Data.PlayerId);} + if (text == "/vote e" && Utils.MapVoteActive && !Utils.HasVoted.Contains(__instance.Data.PlayerId)) {Utils.fungleVotes++; Utils.HasVoted.Add(__instance.Data.PlayerId);} + if (text == "/vote f" && Utils.MapVoteActive && !Utils.HasVoted.Contains(__instance.Data.PlayerId) && Utils.DleksEnabled) {Utils.dleksVotes++; Utils.HasVoted.Add(__instance.Data.PlayerId);} + if (text == "/l" || text == "/lastgame") { if (Utils.CheckAccessLevel(__instance.Data.FriendCode) < Options.SlashLastGameCmd.GetValue()) return; @@ -732,7 +792,7 @@ public static class RPCHandlerPatch if (text == "/aur" || text == "/socials") { if (Utils.CheckAccessLevel(__instance.Data.FriendCode) < Options.SlashLastGameCmd.GetValue()) return; - Utils.ModeratorChatCommand("AUR socials:\n\ng i t h u b . c o m /\nApeMV/AmongUsRevamped\n\nd i s c o r d . g g /\n83Zhzhyhya", "", false); + Utils.ModeratorChatCommand("AUR socials:\n\ng i t h u b . c o m /\nApeMV/AmongUsRevamped\n\nd i s c о r d . g g /\n83Zhzhyhya", "", false); } if (text == "/0kc" || text == "/0killcooldown") diff --git a/Patches/ClientOptionsPatch.cs b/Patches/ClientOptionsPatch.cs index 3c9c0b4..88a7d1f 100644 --- a/Patches/ClientOptionsPatch.cs +++ b/Patches/ClientOptionsPatch.cs @@ -28,8 +28,7 @@ namespace AmongUsRevamped static void GMButtonToggle() { - if (Main.GM.Value) - HudManager.Instance.ShowPopUp(Translator.Get("gameMasterWarning")); + if (Main.GM.Value && Utils.IsLobby) HudManager.Instance.ShowPopUp(Translator.Get("gameMasterWarning")); } } diff --git a/Patches/DleksPatch.cs b/Patches/DleksPatch.cs index 953c8f6..eb9120a 100644 --- a/Patches/DleksPatch.cs +++ b/Patches/DleksPatch.cs @@ -25,7 +25,22 @@ class CreateOptionsPickerPatch isSkeldFlipped = value; } } - + + public static void ApplyDleks(bool hideNSeek) + { + SetDleks = true; + FlippedSkeld = true; + + if (!Utils.isHideNSeek) Main.NormalOptions.MapId = 0; + else Main.HideNSeekOptions.MapId = 0; + } + + public static void ClearDleks() + { + SetDleks = false; + FlippedSkeld = false; + } + private static MapSelectButton DleksButton; [HarmonyPatch] public static class GameOptionsMapPickerPatch diff --git a/Patches/EndGamePatches.cs b/Patches/EndGamePatches.cs index b64f15f..faf6886 100644 --- a/Patches/EndGamePatches.cs +++ b/Patches/EndGamePatches.cs @@ -65,12 +65,12 @@ class NormalGameEndChecker return; } - if (Utils.AliveImpostors == 0 || Winner == "Crewmate") + if ((Options.Gamemode.GetValue() != 2 && Utils.AliveImpostors == 0) || Winner == "Crewmate") { LastWinReason = "Crewmates Win!\n\nImpostors: " + impostorList; canUpdateWinnerText = false; } - else if (Utils.AliveImpostors >= Utils.AliveCrewmates || Winner == "Impostor") + else if ((Options.Gamemode.GetValue() != 2 && Utils.AliveImpostors >= Utils.AliveCrewmates) || Winner == "Impostor") { LastWinReason = "Impostors Win!\n\nImpostors: " + impostorList; canUpdateWinnerText = false; diff --git a/Patches/GameSettingMenuPatch.cs b/Patches/GameSettingMenuPatch.cs index abe9db4..bf7081a 100644 --- a/Patches/GameSettingMenuPatch.cs +++ b/Patches/GameSettingMenuPatch.cs @@ -115,6 +115,9 @@ namespace AmongUsRevamped case TabGroup.SystemSettings: __instance.MenuDescriptionText.text = Translator.Get("systemSettingsDesc"); break; + case TabGroup.ModerationSettings: + __instance.MenuDescriptionText.text = Translator.Get("moderationSettingsDesc"); + break; case TabGroup.ModSettings: __instance.MenuDescriptionText.text = Translator.Get("gameplaySettingsDesc"); break; diff --git a/Patches/IntroPatch.cs b/Patches/IntroPatch.cs index 84de296..4e0a56e 100644 --- a/Patches/IntroPatch.cs +++ b/Patches/IntroPatch.cs @@ -9,14 +9,11 @@ namespace AmongUsRevamped; [HarmonyPatch(typeof(HudManager), nameof(HudManager.CoShowIntro))] internal static class CoShowIntroPatch { - public static bool IntroInitiated; public static void Postfix(IntroCutscene __instance) { Logger.Info(" Intro initiated", "CoShowIntro"); if (!AmongUsClient.Instance.AmHost) return; - - IntroInitiated = true; foreach (var p in PlayerControl.AllPlayerControls) { @@ -38,6 +35,19 @@ internal static class CoShowIntroPatch Utils.CanCallMeetings = true; }, 33f, "MeetingEnabled"); } + + if (Options.Gamemode.GetValue() == 1 && Options.SNSChatInGameExtend.GetBool()) + { + if (Options.MisfiresToSuicide.GetInt() == 1 || Options.CantKillTime.GetInt() == 0) + { + Utils.ModeratorChatCommand("Shift and Seek:\n\nImpostors can only kill someone while shapeshifted as them\nEmergency Meetings = Off", $"Crewmates win by doing tasks or surviving {Options.CrewAutoWinsGameAfter.GetInt()}s\nImpostors win by killing everyone\n{Options.MisfiresToSuicide.GetInt()} wrong kill(s) = suicide", true); + } + else + { + + Utils.ModeratorChatCommand("Shift and Seek:\n\nImpostors can only kill someone while shapeshifted as them\nEmergency Meetings = Off", SendChatPatch.ConvertNum($"Crew wins by tasks/surviving {Options.CrewAutoWinsGameAfter.GetInt()}s\nImp wins by killing\nOne wrong kill = Can't kill for {Options.CantKillTime.GetInt()}s\n{Options.MisfiresToSuicide.GetInt()} wrong kills = suicide"), true); + } + } } } diff --git a/Patches/JoinAndLeavePatches.cs b/Patches/JoinAndLeavePatches.cs index cb870ba..00d982f 100644 --- a/Patches/JoinAndLeavePatches.cs +++ b/Patches/JoinAndLeavePatches.cs @@ -45,6 +45,12 @@ internal static class OnGameJoinedPatch WaitingForChat = false; }, 5.2f, "AutoSendGameInfo2"); } + + if (Options.Public.GetBool() && DisconnectManager.Rehosting) + { + AmongUsClient.Instance.ChangeGamePublic(true); + DisconnectManager.Rehosting = false; + } } } @@ -134,7 +140,7 @@ public static class SetLevelPatch public static List HandledLevelKicks = []; public static void Prefix(PlayerControl __instance, uint level) { - if (AmongUsClient.Instance.AmHost && level < Options.KickLowLevelPlayer.GetInt() - 1 && __instance.Data.ClientId != AmongUsClient.Instance.HostId) + if (AmongUsClient.Instance.AmHost && level < Options.KickLowLevelPlayer.GetInt() - 1 && __instance.Data.ClientId != AmongUsClient.Instance.HostId && Options.EnableKickLowLevelPlayer.GetBool()) { if (level == 0 && Options.DontKickLevelOnes.GetBool()) return; if (HandledLevelKicks.Contains(__instance)) return; diff --git a/Patches/OnGameStartedPatch.cs b/Patches/OnGameStartedPatch.cs index 0350f4b..8b912b0 100644 --- a/Patches/OnGameStartedPatch.cs +++ b/Patches/OnGameStartedPatch.cs @@ -43,7 +43,7 @@ class PlayerControlSetRolePatch if (!ProcessedPlayers.Add(__instance.PlayerId)) return true; - canOverrideRole = false; + // canOverrideRole = false; if (Utils.isHideNSeek && Seekers.Count() == 0 && Options.NumSeekers.GetInt() > 0) { @@ -110,7 +110,7 @@ class PlayerControlSetRolePatch Seekers.Clear(); ProcessedPlayers.Clear(); - Logger.Info("PCSRP successful", "RoleManaging"); + Logger.Info(" PCSRP successful", "RoleManaging"); } return true; @@ -120,6 +120,7 @@ class PlayerControlSetRolePatch [HarmonyPatch(typeof(HudManager), nameof(HudManager.OnGameStart))] internal static class OnGameStartPatch { + public static bool PastStartScreen; public static void Postfix() { if (AmongUsClient.Instance.AmHost && Options.Gamemode.GetValue() == 1 && Options.SNSChatInGame.GetBool()) @@ -139,5 +140,7 @@ internal static class OnGameStartPatch { Utils.StoredRoleText[p.PlayerId] = Utils.GetRoleText(p); } + + PastStartScreen = true; } } \ No newline at end of file diff --git a/Patches/PlayerControlPatches.cs b/Patches/PlayerControlPatches.cs index e739406..08a3b3a 100644 --- a/Patches/PlayerControlPatches.cs +++ b/Patches/PlayerControlPatches.cs @@ -167,8 +167,21 @@ class PlayerControlCompleteTaskPatch tasksPerPlayer[p.PlayerId] = p.Data.Tasks.Count; } + if (__instance.Data.RoleType == RoleTypes.Impostor || + __instance.Data.RoleType == RoleTypes.Shapeshifter || + __instance.Data.RoleType == RoleTypes.Phantom || + __instance.Data.RoleType == RoleTypes.Viper) + { + EACR.TaskCheat(__instance); + } + playerTasksCompleted[__instance.PlayerId]++; + if (playerTasksCompleted[__instance.PlayerId] > __instance.Data.Tasks.Count) + { + EACR.TaskCheat(__instance); + } + Logger.Info($" {__instance.Data.PlayerName} completed {idx}", "TaskPatch"); if (Options.Gamemode.GetValue() != 2) CalculateTaskWin(); @@ -192,7 +205,7 @@ class PlayerControlCompleteTaskPatch public static void CalculateTaskWin() { - if (!Utils.GamePastRoleSelection || Utils.isHideNSeek || Options.NoGameEnd.GetBool() || !CoShowIntroPatch.IntroInitiated) return; + if (!Utils.GamePastRoleSelection || Utils.isHideNSeek || Options.NoGameEnd.GetBool() || !OnGameStartPatch.PastStartScreen) return; //Logger.Info($" Checking if {GameData.Instance.CompletedTasks} - {ignoredCompletedTasks} >= ({GameData.Instance.TotalTasks} - {ignoredTasks}) * 0.01 * {Options.TaskPercentNeededToWin.GetInt()}", "TaskPatch"); @@ -215,3 +228,63 @@ public static class PlayerControlCheckSporeTriggerPatch else return true; } } + +[HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.PlayAnimation))] +public static class PlayAnimationPatch +{ + public static void Prefix(PlayerControl __instance, byte animType) + { + if (!AmongUsClient.Instance.AmHost || __instance == PlayerControl.LocalPlayer) return; + + var task = (TaskTypes)animType; + + switch (task) + { + case TaskTypes.PrimeShields: + case TaskTypes.ClearAsteroids: + case TaskTypes.EmptyGarbage: + if (__instance.Data.RoleType == RoleTypes.Impostor || + __instance.Data.RoleType == RoleTypes.Shapeshifter || + __instance.Data.RoleType == RoleTypes.Phantom || + __instance.Data.RoleType == RoleTypes.Viper) + { + EACR.PlayAnimationCheat(__instance); + return; + } + if (!GameManager.Instance.LogicOptions.GetVisualTasks()) + { + { + EACR.PlayAnimationCheat(__instance); + return; + } + } + break; + } + } +} + +[HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.SetScanner))] +public static class SetScannerPatch +{ + public static void Prefix(PlayerControl __instance) + { + if (!AmongUsClient.Instance.AmHost || __instance == PlayerControl.LocalPlayer) return; + + if (__instance.Data.RoleType == RoleTypes.Impostor || + __instance.Data.RoleType == RoleTypes.Shapeshifter || + __instance.Data.RoleType == RoleTypes.Phantom || + __instance.Data.RoleType == RoleTypes.Viper) + { + EACR.PlayAnimationCheat(__instance); + return; + } + + if (!GameManager.Instance.LogicOptions.GetVisualTasks() && __instance != PlayerControl.LocalPlayer) + { + { + EACR.PlayAnimationCheat(__instance); + return; + } + } + } +} diff --git a/Patches/VentPatches.cs b/Patches/VentPatches.cs index 2a3a5e3..a7b3e8a 100644 --- a/Patches/VentPatches.cs +++ b/Patches/VentPatches.cs @@ -1,8 +1,7 @@ -namespace AmongUsRevamped; +using AmongUs.GameOptions; -//Old Patch for Mayor +namespace AmongUsRevamped; -/* [HarmonyPatch(typeof(Vent), nameof(Vent.EnterVent))] class EnterVentPatch { @@ -10,11 +9,19 @@ class EnterVentPatch { if (!AmongUsClient.Instance.AmHost) return; - if (CustomRoleManagement.PlayerRoles.TryGetValue(pc.PlayerId, out var role) && role == "Mayor") + if (pc.Data.RoleType != RoleTypes.Impostor && + pc.Data.RoleType != RoleTypes.Shapeshifter && + pc.Data.RoleType != RoleTypes.Phantom && + pc.Data.RoleType != RoleTypes.Viper && + pc.Data.RoleType != RoleTypes.Engineer && + !pc.Data.IsDead) { - pc.CmdReportDeadBody(null); - Logger.Info($" The Mayor, {pc.Data.PlayerName}, called a meeting by venting", "EnterVent"); + EACR.VentCheat(pc, __instance); + } + + if (__instance.Id > 15) + { + EACR.VentCheat(pc, __instance); } } -} -*/ \ No newline at end of file +} \ No newline at end of file diff --git a/README.md b/README.md index 31dff89..5abb41b 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ **** ‎ -# 🎮 Features (v1.9.1): +# 🎮 Features (v1.9.2): ## ♠️ Client Side settings: - Game Master (Spectator) @@ -44,16 +44,15 @@ - Denyword system - Banlist system - Denyname system -- Multi layer moderator system +- Advanced Moderator system - To add Admins, Moderators and VIP's, type the user's Friendcode in the designated files located in AUR-DATA - Enable No Game End - Custom starting countdown ## ♻️ Automation settings: -- Automatically start game +- Full Autohost and Rehost support - Automatically rejoin lobby - Automatically send winner info -- Enable (configurable) Welcome Messages -- The Welcome Template is in Templates.txt +- Enable (configurable) Welcome Messages from Templates.txt ## 🔧 Gameplay Settings: - Dead impostors can sabotage - Disable critical sabotages (invividual) @@ -70,8 +69,16 @@ - 0 Kill Cooldown -> Set Kill Cooldown to 0.01 - Shift and Seek - Speedrun +## 👾 Custom Anticheat: +- Detect invalid sabotages +- Detect malformed RPC's +- Detect invalid venting +- Detect Invalid animations +- Detect Invalid task completions +- Detect immortality cheats +- These are all enabled by default ## ❓ Other Improvements: -- Among Us Revamped supports other languages +- Lanuage support: English, Italian, Japanese, Russian, Simplified Chinese, Spanish - Select a language in Language/YourLanguage.txt - Preset system for mod settings - Command Helper @@ -80,7 +87,6 @@ - Ability to cancel starting countdown - Improved main menu - Faster startup time -- Custom anticheat system - Zoom out in lobby or when dead - See player kill/task count and Role when dead - Higher and more accurate Option ranges @@ -123,6 +129,8 @@ | /seeker {name} | Manually adds someone as Seeker in HnS | | /seekers | Shows manual Seeker list in HnS | | /clearseekers | Clears manual Seeker list in HnS | +| /mapvote | Starts a vote for the map. Default maps only | +| /allmapvote | Starts a vote for the map. Includes Eht Dleks | ‎ **Credit to these mods and their developers for their code:** diff --git a/Resources/Language/English.json b/Resources/Language/English.json index 3f80334..19d1e5f 100644 --- a/Resources/Language/English.json +++ b/Resources/Language/English.json @@ -19,38 +19,53 @@ "language": "Language (Requires Restart)", "gamemode": "Gamemode", "tabGroupMain": "Moderation", + "tabGroupLevelKick": "Level Moderation", + "enableKickLowLevelPlayer": "Kick Low Level Players", "kickLowLevelPlayer": "Kick Players Under Level", "tempBanLowLevelPlayer": "Ban Instead Of Kick", "dontKickLevelOnes": "Don't Kick Lv.1 Players For Glitched Lobbies", + "tabGroupKickInvalidFriendCodes": "Invalid Friendcodes", "kickInvalidFriendCodes": "Kick Invalid (Empty) Friendcodes", "tempBanInvalidFriendCodes": "Ban Instead Of Kick", "deniedWordsToKick": "Sent Denied Words To Kick Player", "moderatorCanUseCommand": "Moderators can use commands", + "tabGroupAutoKickStart": "Start Words", "autoKickStart": "Kick Players Who Say Start", "autoKickStartAsBan": "Ban Instead Of Kick", - "autoKickStartTimes": "Start messages needed to kick", + "autoKickStartTimes": "Sent Start Words To Kick Player", "autoKickStartStrength": "Strict detection mode", + "tabGroupAutomation": "Automation", "autoSendGameInfo": "Automatically send winner info", "autoRejoinLobby": "Auto Rejoin Lobby", + + "tabGroupAutostart": "Autohost", "autoStartTimer": "Countdown For Auto Start", "waitAutoStart": "Auto Start After", "playerAutoStart": "Players Needed To Auto Start", + "rehost": "Automatically Recreate Lobby On Disconnect", + "public": "Automatically Publicize New Lobby", "enableJoinMessages": "Enable Welcome Messages", "messagePerPlayerNum": "Message Per Amount Of Joins", - "tabGroupMisc": "Miscelleneous", + + "tabGroupMisc": "Experimental", "startCountdown": "Default Starting Countdown", "colorCommandLevel": "Who Can use Color Commands", "allowFortegreen": "Allow Fortegreen Color", "noGameEnd": "No Game End", + "mapVoteDuration": "Map Vote Duration", + + "tabGroupDeniedWords": "Denied Words", + "enableDeniedWords": "Kick Players Who Say Denied Words", "tabGroupAccess": "Access Levels", "slashColorCmd": "Who Can Use /color", "slashRolesAndGamemodeCmd": "Who Can Use /r & Templates", "slashLastGameCmd": "Who Can Use /l & /aur", + "slashMapAndSeekerCmd": "Who Can Use /seeker & /mapvote", "slashKickCmd": "Who Can Use /kick & /ckick", "slashBanCmd": "Who Can Use /ban & /cban", - "slashEndMeetingCmd": "Who Can Use /endmeeting & /seeker", + "slashEndMeetingCmd": "Who Can Use /endmeeting", "slashStartAndEndGameCmd": "Who Can Use /startgame & /endgame", "tabGroupCrewmate": "Crewmate Roles", @@ -65,6 +80,7 @@ "noKcdSettingsOverride": "Auto Update Settings", "tabGroupSNS": "Shift and Seek", "snsChatInGame": "Chat during gameplay (experimental)", + "snsChatInGameExtend": "Send gamemode info after game start", "snsSettingsOverride": "Auto Update Settings", "cantKillTime": "After Misfiring, Can't kill for", "misfiresToSuicide": "Suicide After Amount Of Misfires", @@ -270,17 +286,23 @@ "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.", + "allMapVoteDesc": "Starts a vote between all 6 maps, including Eht Dleks.", "banWordKick": "{0} was kicked because they sent a word in DeniedWords.txt {1} time(s)", "startWordKick": "{0} was kicked because they sent a word in StartWords.txt {1} time(s)", + "banWordBan": "{0} was banned because they sent a word in DeniedWords.txt {1} time(s)", + "startWordBan": "{0} was banned because they sent a word in StartWords.txt {1} time(s)", "pluginWarning": "WARNING:\nYou have 2 or more detected Plugins.\nAmong Us Revamped is not compatible with most mods.\nIf you find bugs, they are most likely due to incompatibility.", "systemSettings": "System Settings", + "moderationSettings": "Moderation Settings", "gameplaySettings": "Gameplay Settings", "gamemodeSettings": "Gamemode Settings", "systemSettingsDesc": "Quality settings to improve comfort and testing.", + "moderationSettingsDesc": "Moderation settings to combat toxicity and misconduct.", "gameplaySettingsDesc": "Gameplay settings to improve the in-game experience.", "gamemodeSettingsDesc": "Situational settings to apply for specific gamemodes.", @@ -291,5 +313,7 @@ "onlyYou": "Only You", "seekers": "Seekers: ", - "clearedSeekers": "Successfully cleared the manual Seeker list." + "clearedSeekers": "Successfully cleared the manual Seeker list.", + + "rehostSuccess": "Successfully rehosted a lobby" } diff --git a/Resources/Language/Japanese.json b/Resources/Language/Japanese.json index 3b81c38..87ace66 100644 --- a/Resources/Language/Japanese.json +++ b/Resources/Language/Japanese.json @@ -1,287 +1,295 @@ { "LanguageID": "4", + "gameMaster": "ゲームマスター", + "showFPS": "FPSを表示", + "autoStart": "自動スタート", + "enableDarkTheme": "ダークテーマを有効化", + "enableLobbyMusic": "ロビーBGM", + "disableInfoWhenDead": "死亡時に情報を非表示", + "disableCommandHelper": "コマンドヘルパーを無効化", "disableCompatibilityWarning": "互換性警告を無効化", + "gameMasterWarning": "ゲームマスターをオフにするまで観戦モードになります。警告: この設定が有効な場合、役職の割り当てが正確に行われない可能性があります。", + + "cancelStartCountdown": "カウントダウンがキャンセルされました", + + "invalidFriendCodeKick": "{0} は無効なフレンドコードのためキックされました", + "invalidFriendCodeBan": "{0} は無効なフレンドコードのためBANされました", + "language": "言語 (再起動が必要)", + "gamemode": "ゲームモード", + "tabGroupMain": "モデレーション", + "kickLowLevelPlayer": "指定レベル未満のプレイヤーをキック", + "tempBanLowLevelPlayer": "キックの代わりにBAN", + "dontKickLevelOnes": "Lv.1プレイヤーをキックしない (バグロビー対策)", + "kickInvalidFriendCodes": "無効(空欄)なフレンドコードをキック", + "tempBanInvalidFriendCodes": "キックの代わりにBAN", + "deniedWordsToKick": "NGワード送信者をキック", + "moderatorCanUseCommand": "モデレーターのコマンド使用を許可", + "autoKickStart": "「Start/開始」と発言したプレイヤーをキック", + "autoKickStartAsBan": "キックの代わりにBAN", + "autoKickStartTimes": "キックに必要な催促メッセージ回数", + "autoKickStartStrength": "厳格検出モード", + "tabGroupAutomation": "自動化", + "autoSendGameInfo": "勝者情報を自動送信", + "autoRejoinLobby": "ロビーへ自動再参加", + "autoStartTimer": "自動スタートのカウントダウン", + "waitAutoStart": "自動スタートまでの待機時間", + "playerAutoStart": "自動スタートに必要な人数", + "enableJoinMessages": "参加歓迎メッセージを有効化", + "messagePerPlayerNum": "指定参加人数ごとの通知", + "tabGroupMisc": "その他", + "startCountdown": "デフォルトのカウントダウン", + "colorCommandLevel": "カラーコマンドの使用権限", + "allowFortegreen": "フォルテグリーン色を許可", + "noGameEnd": "ゲーム終了なし", + + "tabGroupAccess": "アクセス権限", + "slashColorCmd": "/color の使用権限", + "slashRolesAndGamemodeCmd": "/r & テンプレート の使用権限", + "slashLastGameCmd": "/l & /aur の使用権限", + "slashKickCmd": "/kick & /ckick の使用権限", + "slashBanCmd": "/ban & /cban の使用権限", + "slashEndMeetingCmd": "/endmeeting & /seeker の使用権限", + "slashStartAndEndGameCmd": "/startgame & /endgame の使用権限", + + "tabGroupCrewmate": "クルー役職", + "tabGroupNeutral": "第三陣営役職", + "tabGroupImpostor": "インポスター役職", + + "tabGroupStandard": "ノーマル", + + "tabGroupHNS": "かくれんぼ (Hide and Seek)", + "numSeekers": "鬼の人数", + "tabGroup0Kcd": "キルクールダウン0秒", + "noKcdSettingsOverride": "設定を自動更新", + "tabGroupSNS": "シェイプ&シーク (Shift and Seek)", + "snsChatInGame": "ゲーム中のチャットを許可 (ベータ機能)", + "snsSettingsOverride": "設定を自動更新", + "cantKillTime": "お手付き後のキル不可時間", + "misfiresToSuicide": "指定回数のお手付きで自滅", + "crewAutoWinsGameAfter": "クルーの自動勝利カウントダウン", + "snsDisableSabotage": "SnS緊急サボタージュを無効化", + "snsDisableReactor": "リアクターサボタージュを無効化", + "snsDisableOxygen": "O2サボタージュを無効化", + "snsDisableLights": "停電サボタージュを無効化", + "snsDisableComms": "通信妨害サボタージュを無効化", + "snsDisableHeli": "墜落危険サボタージュを無効化", + "snsDisableMushroomMixup": "キノコシャッフルサボタージュを無効化", + "snsDisableCloseDoor": "SnSドア閉鎖を無効化", + "tabGroupSpeedrun": "スピードラン", + "speedrunSettingsOverride": "設定を自動更新", + "gameAutoEndsAfter": "ゲームの自動終了時間", + "engineerMode": "全員エンジニア", + + "tabGroupSabotages": "サボタージュ設定", + "deadImpostorsCanSabotage": "幽霊インポスターのサボタージュを許可", + "disableSabotage": "緊急サボタージュを無効化", + "disableReactor": "リアクターサボタージュを無効化", + "disableOxygen": "O2サボタージュを無効化", + "disableLights": "停電サボタージュを無効化", + "disableComms": "通信妨害サボタージュを無効化", + "disableHeli": "墜落危険サボタージュを無効化", + "disableMushroomMixup": "キノコシャッフルサボタージュを無効化", + "disableCloseDoor": "ドア閉鎖を無効化", + + "tabGroupGameplayGeneral": "一般ゲーム設定", + "disableAnnoyingMeetingCalls": "開始30秒間の緊急会議召集を禁止", + "disableReport": "通報を無効化", + "changeDecontaminationTime": "除染時間を変更 (ノーマル限定)", + "decontaminationTimeOnMiraHQ": "MIRA HQ 除染所要時間", + "decontaminationDoorOpenTimeOnMiraHQ": "MIRA HQ 除染ドア開放時間", + "decontaminationTimeOnPolus": "Polus 除染所要時間", + "decontaminationDoorOpenTimeOnPolus": "Polus 除染ドア開放時間", + "disableSporeTrigger": "Fungleの胞子発生を無効化", + + "disableDevices": "端末・設備を無効化", + "disableSkeldDevices": "The Skeld の設備を無効化", + "disableSkeldAdmin": "The Skeld アドミンを無効化", + "disableSkeldCamera": "The Skeld 防犯カメラを無効化", + "disableMiraHQDevices": "MIRA HQ の設備を無効化", + "disableMiraHQAdmin": "MIRA HQ アドミンを無効化", + "disableMiraHQDoorLog": "MIRA HQ ドアログを無効化", + "disablePolusDevices": "Polus の設備を無効化", + "disablePolusAdmin": "Polus アドミンを無効化", + "disablePolusCamera": "Polus 防犯カメラを無効化", + "disablePolusVital": "Polus バイタルを無効化", + "disableAirshipDevices": "The Airship の設備を無効化", + "disableAirshipCockpitAdmin": "The Airship 操縦室アドミンを無効化", + "disableAirshipRecordsAdmin": "The Airship 記録室アドミンを無効化", + "disableAirshipCamera": "The Airship 防犯カメラを無効化", + "disableAirshipVital": "The Airship バイタルを無効化", + "disableFungleDevices": "The Fungle の設備を無効化", + "disableFungleVital": "The Fungle バイタルを無効化", + + "tabGroupTasks": "タスク設定", + "allPlayersSameTasks": "全員同じタスクを割り当て", + "overrideTaskSettings": "すべてのタスクを無効化", + "taskPercentNeededToWin": "クルー勝利に必要なタスク完了率(%)", + + "disableMiraTasks": "MIRA HQ タスクを無効化", + "disableBuyBeverage": "「飲料の購入」を無効化", + "disableMeasureWeather": "「天気の測定」を無効化", + "disableProcessData": "「データの処理」を無効化", + "disableRunDiagnostics": "「診断の実行」を無効化", + "disableSortSamples": "「標本の仕分け」を無効化", + + "disablePolusTasks": "Polus タスクを無効化", + "disableActivateWeatherNodes": "「気象ノードの有効化」を無効化", + "disableAlignTelescope": "「望遠鏡の整列」を無効化", + "disableFillCanisters": "「キャニスターへの充填」を無効化", + "disableInsertKeys": "「鍵の挿入」を無効化", + "disableOpenWaterways": "「水路を開く」を無効化", + "disableRebootWifi": "「Wi-Fiの再起動」を無効化", + "disableRepairDrill": "「ドリルの修理」を無効化", + "disableScanBoardingPass": "「搭乗券のスキヤン」を無効化", + + "disableAirshipTasks": "The Airship タスクを無効化", + "disableCleanToilet": "「トイレの掃除」を無効化", + "disableDecontaminate": "「除染」を無効化", + "disableDevelopPhotos": "「写真の現像」を無効化", + "disableDressMannequin": "「マネキンの着せ替え」を無効化", + "disableFixShower": "「シャワーの修理」を無効化", + "disableMakeBurger": "「バーガーの作成」を無効化", + "disablePickUpTowels": "「タオルを拾う」を無効化", + "disablePolishRuby": "「ルビーを磨く」を無効化", + "disablePutAwayPistols": "「拳銃の片付け」を無効化", + "disablePutAwayRifles": "「ライフルを片付ける」を無効化", + "disableRewindTapes": "「テープの巻き戻し」を無効化", + "disableResetBreakers": "「ブレーカーのリセット」を無効化", + "disableSortRecords": "「記録の整理」を無効化", + "disableStartFans": "「ファンを始動」を無効化", + "disableUnlockSafe": "「金庫の解錠」を無効化", + + "disableFungleTasks": "The Fungle タスクを無効化", + "disableBuildSandcastle": "「砂の城を作る」を無効化", + "disableCatchFish": "「魚を捕まえる」を無効化", + "disableCollectSamples": "「標本の採取」を無効化", + "disableCollectShells": "「貝殻の採取」を無効化", + "disableCollectVegetables": "「野菜の収穫」を無効化", + "disableCrankGenerator": "「発電機を回す」を無効化", + "disableExtractFuel": "「燃料の抽出」を無効化", + "disableFixAntenna": "「アンテナの修理」を無効化", + "disableHelpCritter": "「生き物の救出」を無効化", + "disableHoistSupplies": "「物資の引き上げ」を無効化", + "disableLiftWeights": "「ウエイトリフティング」を無効化", + "disableMineOres": "「鉱石の採掘」を無効化", + "disablePlayVideoGame": "「ゲームを遊ぶ」を無効化", + "disablePolishGem": "「宝石を磨く」を無効化", + "disableReplaceParts": "「部品の交換」を無効化", + "disableRoastMarshmallow": "「マシュマロを焼く」を無効化", + "disableThrowFisbee": "「フリスビーを投げる」を無効化", + "disableFindSignal": "「信号を探す」を無効化", + + "disableMiscCommonTasks": "共通タスクを無効化", + "disableEnterIdCode": "「IDコードの入力」を無効化", + "disableFixWiring": "「配線の修理」を無効化", + "disableSwipeCard": "「カードを通す」を無効化", + + "disableMiscShortTasks": "ショートタスクを無効化", + "disableAssembleArtifact": "「アーティファクトの組み立て」を無効化", + "disableChartCourse": "「航路の確認」を無効化", + "disableCleanO2Filter": "「O2フィルターの清掃」を無効化", + "disableCleanVent": "「ベントの清掃」を無効化", + "disableMonitorMushroom": "「キノコの監視」を無効化", + "disableMonitorTree": "「木の監視」を無効化", + "disablePrimeShields": "「シールドの準備」を無効化", + "disableRecordTemperature": "「温度の記録」を無効化", + "disableStabilizeSteering": "「操舵の安定化」を無効化", + "disableStoreArtifacts": "「アーティファクトの保管」を無効化", + "disableUnlockManifolds": "「マニホールドの開錠」を無効化", + + "disableMiscLongTasks": "ロングタスクを無効化", + "disableAlignEngineOutput": "「エンジン出力の調整」を無効化", + "disableClearAsteroids": "「小惑星の破壊」を無効化", + "disableEmptyChute": "「ダストシュートを空にする」を無効化", + "disableInspectSample": "「検体の検査」を無効化", + "disableReplaceWaterJug": "「給水ボトルの交換」を無効化", + "disableStartReactor": "「リアクターの起動」を無効化", + "disableWaterPlants": "「植物の水やり」を無効化", + + "disableMiscMixedTasks": "ミックス(多段階)タスクを無効化", + "disableCalibrateDistributor": "「ディストリビューターの調整」を無効化", + "disableDivertPower": "「電力のバイパス」を無効化", + "disableEmptyGarbage": "「ゴミ捨て」を無効化", + "disableFuelEngines": "「エンジンへの給油」を無効化", + "disableSubmitScan": "「スキャンの送信」を無効化", + "disableUploadData": "「データのアップロード」を無効化", + + "allCommandsFull": "全コマンド一覧:\n\n/help\nこのヘルプメッセージを表示します。\n/aur, /socials\nAmong Us Revamped のSNSリンクを送信します。\n\n/r, /gm\n現在のゲームモードの説明を送信します。\n/l, /lastgame\n前回の勝者情報を送信します。\n\n/0kc, /0killcooldown\nキルクール0秒モードの説明を送信します。\n/sns, /shiftandseek\nシェイプ&シークモードの説明を送信します。\n/sp, /speedrun\nスピードランモードの説明を送信します。\n\n/kick, /ban\n名前指定でプレイヤーをキック/BANします。\n/ckick, /cban\n色指定でプレイヤーをキック/BANします。\n\n/vip /moderator /admin\nプレイヤーをVIP、モデレーター、管理人に設定します。\n/removevip, /removemoderator, /removeadmin\nプレイヤーの権限を削除します。\n\n/eg, /endgame\n現在のゲームを強制終了します。\n/em, /endmeeting\n現在の会議を強制終了します。\n/s, /start\nゲーム開始のカウントダウンを開始します。\n\n/t {template}\nAUR-DATA/templates.txt から定型文を送信します。\n\n/col, /color, /colour\n自分の色を設定します(制限解除に使用可能)。", + + "translationReloaded": "翻訳ファイルが正常にリセットされました。\n変更を適用するにはゲームを再起動してください。", + + "templateWelcome": "# このファイルには定型文(テンプレート)を追加できます。\n# テンプレートを作成するには、下の例と同じフォーマットで新しい行を追加してください。\n# 注意: テンプレートは120文字を超えてはいけず、特殊文字も使用できません(送信時にキックされます)。\n\ntest: これはテンプレートの例です。'/t test' と入力して送信します。\n\nwelcome: ようこそ! このロビーは MV 作成の Among Us Revamped {ModVersion} を使用しています。お楽しみください!", + "moderatorWelcome": "# このファイルにはフレンドコードでモデレーターを追加できます。\n# 追加されたプレイヤーはゲーム内で名前が紫色で表示されます。\n# 権限のカスタマイズはゲーム内の「システム設定」で行えます。以下は記述例です。\n\nfriendcode#0000", + "vipWelcome": "# このファイルにはフレンドコードでVIPを追加できます。\n# 追加されたプレイヤーはゲーム内で名前が黄色で表示されます。\n# 権限のカスタマイズはゲーム内の「システム設定」で行えます。以下は記述例です。\n\nfriendcode#0000\n", + "adminWelcome": "# このファイルにはフレンドコードで管理人(Admin)を追加できます。\n# 追加されたプレイヤーはゲーム内で名前が赤色で表示されます。\n# 権限のカスタマイズはゲーム内の「システム設定」で行えます。以下は記述例です。\n\nfriendcode#0000\n", + "banlistWelcome": "# このファイルにフレンドコードを記述することでプレイヤーをBANリストに追加できます。\n# ゲーム内でBANしたプレイヤーも自動的にここへ追加されます。以下は記述例です。\n\nfriendcode#0000\n", + "banwordWelcome": "# このファイルではNGワードを設定できます。リスト内の単語を発言したプレイヤーは自動的にキックされます。\n# 単語ごとに改行して区切ってください。", + "bannameWelcome": "# このファイルではNGネームを設定できます。リスト内の名前を使用しているプレイヤーは自動的にキックされます。\n# 名前ごとに改行して区切ってください。", + "startWordsWelcome": "# このファイルでは「『Start』と発言したプレイヤーをキック」に使用する判定単語を設定できます。\n# 「厳格検出モード」OFF = 完全一致で判定。「厳格検出モード」ON = 部分一致で判定。\n# ロビー内でのみ検知したい無関係な単語を入れることも可能です。\n\nstart\nbegin\ncommence", + + "noGameEndWarning": "警告: 「ゲーム終了なし」が有効になっています", + "gameMasterWarningTwo": "警告: 「ゲームマスター」が有効になっています", + + "tooLongTemplate": "テンプレートが120文字を超えているため、送信するとキックされます。文字数を減らしてください。", + + "vipAdd": "{0} をVIPに追加しました。", + "moderatorAdd": "{0} をモデレーターに追加しました。", + "adminAdd": "{0} を管理人に追加しました。", + "vipRemove": "{0} のVIP権限を削除しました。", + "moderatorRemove": "{0} のモデレーター権限を削除しました。", + "adminRemove": "{0} の管理人権限を削除しました。", + "permFail": "ユーザー '{0}' が見つかりませんでした。綴りが正しいか確認してください。", + + "helpDesc": "すべてのコマンドと機能を表示します。", + "snsDesc": "シェイプ&シークモードの説明を送信します。", + "0kcDesc": "キルクール0秒モードの説明を送信します。", + "SrDesc": "スピードランモードの説明を送信します。", + "egDesc": "現在のゲームを強制終了します。", + "emDesc": "現在の会議を強制終了します。", + "aurDesc": "Among Us Revamped のSNSリンクを送信します。", + "sDesc": "ゲーム開始カウントダウンを開始します。", + "rDesc": "現在のゲームモードの説明を送信します。", + "rolesDesc": "すべての能力・モードの概要を送信します。", + "kickDesc": "名前指定でプレイヤーをキックします。", + "ckickDesc": "色指定でプレイヤーをキックします。", + "banDesc": "名前指定でプレイヤーをBANします。", + "cbanDesc": "色指定でプレイヤーをBANします。", + "dumpDesc": "LogOutputを別のファイルにコピーします。", + "colDesc": "自分の色を変更します。", + "reloadDesc": "言語ファイルを再読み込みします。", + "vipDesc": "ユーザーをVIPに追加します。", + "moderatorDesc": "ユーザーをモデレーターに追加します。", + "adminDesc": "ユーザーを管理人に追加します。", + "cremoveVipDesc": "ユーザーからVIP権限を削除します。", + "removeModeratorDesc": "ユーザーからモデレーター権限を削除します。", + "removeAdminDesc": "ユーザーから管理人権限を削除します。", + "lastgameDesc": "前回のゲーム情報を送信します。", + "templateDesc": "AUR-DATA/templates.txt から指定のテンプレートを送信します。", + "seekerDesc": "かくれんぼでプレイヤーを鬼(Seeker)に指定します。", + "seekersDesc": "手動選択された鬼のリストを表示します。", + "clearSeekerDesc": "手動選択された鬼のリストをクリアします。", + + "banWordKick": "{0} は DeniedWords.txt に登録されたNGワードを {1} 回送信したためキックされました", + "startWordKick": "{0} は StartWords.txt に登録された単語を {1} 回送信したためキックされました", + + "pluginWarning": "警告:\n複数のプラグイン(Mod)が検出されました。\nAmong Us Revamped は他の多くのMODと互換性がありません。\nバグが発生する場合、そのほとんどはMod間の競合によるものです。", + "systemSettings": "システム設定", "gameplaySettings": "ゲームプレイ設定", - "gamemodeSettings": "モード設定", + "gamemodeSettings": "ゲームモード設定", - "systemSettingsDesc": "快適性の向上やテスト目的の画質・システム設定。", - "gameplaySettingsDesc": "ゲーム内体験を改善するための設定。", - "gamemodeSettingsDesc": "特定のゲームモードに適したシチュエーション設定。", + "systemSettingsDesc": "快適性やテスト作業を向上させる各種設定。", + "gameplaySettingsDesc": "局内の体験を向上させるゲームプレイ設定。", + "gamemodeSettingsDesc": "特定モード用に適用する状況別の設定。", "everyone": "全員", "vipAndAbove": "VIP 以上", "moderatorAndAbove": "モデレーター 以上", - "admin": "管理者", - "onlyYou": "自分のみ", + "admin": "管理人", + "onlyYou": "あなたのみ", - "gameMaster": "管理者", - "showFPS": "FPSを表示", - "autoStart": "自動開始", - "enableDarkTheme": "ダークテーマを有効化", - "enableLobbyMusic": "ロビーBGM", - "disableInfoWhenDead": "死亡後に情報を非表示", - "disableCommandHelper": "コマンドヘルパーを無効化", - - "gameMasterWarning": "ゲーム管理者をオフにするまで、観戦モードに入ります。警告:この設定を有効にすると、スキルのメッセージが送信されなくなったり、配役の割り当てが不正確になったりする可能性があります。", - - "cancelStartCountdown": "開始カウントダウンがキャンセルされました", - - "invalidFriendCodeKick": "{0} はフレンドコードが無効なためキックされました", - "invalidFriendCodeBan": "{0} はフレンドコードが無効なためBANされました", - "language": "言語 (再起動が必要)", - "gamemode": "ゲームモード", - "tabGroupMain": "管理設定", - "kickLowLevelPlayer": "このレベル未満のプレイヤーをキック", - "tempBanLowLevelPlayer": "キックではなくBANにする", - "dontKickLevelOnes": "部屋のエラーによるレベル1プレイヤーのキックを防止", - "kickInvalidFriendCodes": "無効(空)のフレンドコードをキック", - "tempBanInvalidFriendCodes": "キックではなくBANにする", - "deniedWordsToKick": "NGワード送信時にプレイヤーをキック", - "moderatorCanUseCommand": "モデレーターはコマンドを使用可能", - "autoKickStart": "「Start」と送信したプレイヤーを自動キック", - "autoKickStartAsBan": "キックではなくBANにする", - "autoKickStartTimes": "キックに必要な「Start」の送信回数", - "autoKickStartStrength": "厳格な検出モード", - "tabGroupAutomation": "自動化", - "autoSendGameInfo": "勝者情報を自動送信", - "autoRejoinLobby": "ロビーに自動で再参加", - "autoStartTimer": "自動開始カウントダウン", - "waitAutoStart": "自動開始の待機時間", - "playerAutoStart": "自動開始に必要な人数", - "enableJoinMessages": "入室歓迎メッセージを有効化", - "messagePerPlayerNum": "指定した入室人数に達するごとにメッセージを送信", - "tabGroupMisc": "その他設定", - "startCountdown": "デフォルトの開始カウントダウン", - "colorCommandLevel": "カラーコマンドを使用できる権限", - "allowFortegreen": "フォートグリーンを許可", - "noGameEnd": "ゲームが絶対に終了しない", - - "tabGroupAccess": "権限レベル", - "slashColorCmd": "/color を使用できる権限", - "slashRolesAndGamemodeCmd": "/r とテンプレートを使用できる権限", - "slashLastGameCmd": "/l と /aur を使用できる権限", - "slashKickCmd": "/kick と /ckick を使用できる権限", - "slashBanCmd": "/ban と /cban を使用できる権限", - "slashEndMeetingCmd": "/endmeeting を使用できる権限", - "slashStartAndEndGameCmd": "/startgame と /endgame を使用できる権限", - - "tabGroupCrewmate": "クルーメイトの役職", - "tabGroupNeutral": "ニュートラルの役職", - "tabGroupImpostor": "インポスターの役職", - - "tabGroupStandard": "スタンダードモード", - - "tabGroupHNS": "かくれんぼモード (Hide and Seek)", - "numSeekers": "オニの数", - "tabGroup0Kcd": "キルクールダウン0秒モード (0 Kill Cooldown)", - "noKcdSettingsOverride": "設定の自動更新", - "tabGroupSNS": "シフト&シーク (Shift and Seek)", - "snsChatInGame": "ゲーム進行中のチャットを許可 (実験的)", - "snsSettingsOverride": "設定の自動更新", - "cantKillTime": "ミス/空振り後のキル不能時間", - "misfiresToSuicide": "ミスが指定回数に達した時に自害", - "crewAutoWinsGameAfter": "クルーがこの時間経過後に自動勝利", - "snsDisableSabotage": "SnSの緊急サボタージュを無効化", - "snsDisableReactor": "リアクター妨害を無効化", - "snsDisableOxygen": "酸素妨害を無効化", - "snsDisableLights": "停電妨害を無効化", - "snsDisableComms": "通信妨害を無効化", - "snsDisableHeli": "墜落危機妨害を無効化", - "snsDisableMushroomMixup": "キノコまぜまぜ妨害を無効化", - "snsDisableCloseDoor": "SnSのドア閉め妨害を無効化", - "tabGroupSpeedrun": "タイムアタックモード (Speedrun)", - "speedrunSettingsOverride": "設定の自動更新", - "gameAutoEndsAfter": "ゲームがこの時間経過後に自動終了", - "engineerMode": "全員がエンジニア", - - "tabGroupSabotages": "サボタージュ設定", - "deadImpostorsCanSabotage": "死亡したインポスターもサボタージュ可能", - "disableSabotage": "緊急サボタージュを無効化", - "disableReactor": "リアクター妨害を無効化", - "disableOxygen": "酸素妨害を無効化", - "disableLights": "停電妨害を無効化", - "disableComms": "通信妨害を無効化", - "disableHeli": "墜落危機妨害を無効化", - "disableMushroomMixup": "キノコまぜまぜ妨害を無効化", - "disableCloseDoor": "ドア閉め妨害を無効化", - - "tabGroupGameplayGeneral": "全般的なゲームプレイ", - "disableAnnoyingMeetingCalls": "ゲーム開始後30秒間は緊急会議の招集を禁止", - "disableReport": "死体通報を無効化", - "changeDecontaminationTime": "除染室の時間を上書き (スタンダードモードのみ)", - "decontaminationTimeOnMiraHQ": "Mira HQの除染持続時間", - "decontaminationDoorOpenTimeOnMiraHQ": "Mira HQのドア開放持続時間", - "decontaminationTimeOnPolus": "Polusの除染持続時間", - "decontaminationDoorOpenTimeOnPolus": "Polusのドア開放持続時間", - "disableSporeTrigger": "The Fungleの胞子トリガーを無効化", - - "disableDevices": "端末を無効化", - "disableSkeldDevices": "Skeldの端末を無効化", - "disableSkeldAdmin": "Skeldの管理室マップを無効化", - "disableSkeldCamera": "Skeldの監視カメラを無効化", - "disableMiraHQDevices": "Mira HQの端末を無効化", - "disableMiraHQAdmin": "Mira HQの管理室マップを無効化", - "disableMiraHQDoorLog": "Mira HQのセンサーログを無効化", - "disablePolusDevices": "Polusの端末を無効化", - "disablePolusAdmin": "Polusの管理室マップを無効化", - "disablePolusCamera": "Polusの監視カメラを無効化", - "disablePolusVital": "Polusのバイタルを無効化", - "disableAirshipDevices": "Airshipの端末を無効化", - "disableAirshipCockpitAdmin": "Airshipのコックピット管理室マップを無効化", - "disableAirshipRecordsAdmin": "Airshipの記録室管理室マップを無効化", - "disableAirshipCamera": "Airshipの監視カメラを無効化", - "disableAirshipVital": "Airshipのバイタルを無効化", - "disableFungleDevices": "The Fungleの端末を無効化", - "disableFungleVital": "The Fungleのバイタルを無効化", - - "tabGroupTasks": "タスク設定", - "allPlayersSameTasks": "全員が同じタスクを所持", - "overrideTaskSettings": "タスクを無効化", - "taskPercentNeededToWin": "クルーの勝利に必要なタスク達成割合", - - "disableMiraTasks": "Mira HQのタスクを無効化", - "disableBuyBeverage": "「飲料を買う」を無効化", - "disableMeasureWeather": "「天気を計測する」を無効化", - "disableProcessData": "「データを処理する」を無効化", - "disableRunDiagnostics": "「診断を実行する」を無効化", - "disableSortSamples": "「サンプルを整理する」を無効化", - - "disablePolusTasks": "Polusのタスクを無効化", - "disableActivateWeatherNodes": "「気象ノードを起動する」を無効化", - "disableAlignTelescope": "「望遠鏡を調整する」を無効化", - "disableFillCanisters": "「キャニスターを満たす」を無効化", - "disableInsertKeys": "「鍵を差し込む」を無効化", - "disableOpenWaterways": "「水路を開く」を無効化", - "disableRebootWifi": "「Wi-Fiを再起動する」を無効化", - "disableRepairDrill": "「ドリルを修理する」を無効化", - "disableScanBoardingPass": "「搭乗券をスキャンする」を無効化", - - "disableAirshipTasks": "Airshipのタスクを無効化", - "disableCleanToilet": "「トイレを掃除する」を無効化", - "disableDecontaminate": "「除染する」を無効化", - "disableDevelopPhotos": "「写真を現像する」を無効化", - "disableDressMannequin": "「マネキンに着せ替える」を無効化", - "disableFixShower": "「シャワーヘッドを修理する」を無効化", - "disableMakeBurger": "「ハンバーガーを作る」を無効化", - "disablePickUpTowels": "「タオルを拾う」を無効化", - "disablePolishRuby": "「ルビーを磨く」を無効化", - "disablePutAwayPistols": "「ピストルを片付ける」を無効化", - "disablePutAwayRifles": "「ライフルを片付ける」を無効化", - "disableRewindTapes": "「テープを巻き戻す」を無効化", - "disableResetBreaker": "「ブレーカーをリセットする」を無効化", - "disableSortRecords": "「記録を整理する」を無効化", - "disableStartFans": "「ファンを始動する」を無効化", - "disableUnlockSafe": "「金庫を開ける」を無効化", - - "disableFungleTasks": "The Fungleのタスクを無効化", - "disableBuildSandcastle": "「砂のお城を作る」を無効化", - "disableCatchFish": "「魚釣りをする」を無効化", - "disableCollectSamples": "「サンプルを採集する」を無効化", - "disableCollectShells": "「貝殻を集める」を無効化", - "disableCollectVegetables": "「野菜を収穫する」を無効化", - "disableCrankGenerator": "「発電機を回す」を無効化", - "disableExtractFuel": "「燃料を抽出する」を無効化", - "disableFixAntenna": "「アンテナを修理する」を無効化", - "disableHelpCritter": "「小動物を助ける」を無効化", - "disableHoistSupplies": "「物資を巻き上げる」を無効化", - "disableLiftWeights": "「ウエイトリフティング」を無効化", - "disableMineOres": "「鉱石を採掘する」を無効化", - "disablePlayVideoGame": "「ゲームを遊ぶ」を無効化", - "disablePolishGem": "「宝石を磨く」を無効化", - "disableReplaceParts": "「部品を交換する」を無効化", - "disableRoastMarshmallow": "「マシュマロを焼く」を無効化", - "disableThrowFisbee": "「フリスビーを投げる」を無効化", - "disableFindSignal": "「電波を探す」を無効化", - - "disableMiscCommonTasks": "共通タスクをグローバル無効化", - "disableEnterIdCode": "「IDコードを入力する」を無効化", - "disableFixWiring": "「配線を修理する」を無効化", - "disableSwipeCard": "「カードをスワイプする」を無効化", - - "disableMiscShortTasks": "ショートタスクをグローバル無効化", - "disableAssembleArtifact": "「遺物を組み立てる」を無効化", - "disableChartCourse": "「航路を設定する」を無効化", - "disableCleanO2Filter": "「酸素フィルターを清掃する」を無効化", - "disableCleanVent": "「ベントを清掃する」を無効化", - "disableMonitorMushroom": "「キノコを監視する」を無効化", - "disableMonitorTree": "「木を監視する」を無効化", - "disablePrimeShields": "「シールドを充填する」を無効化", - "disableRecordTemperature": "「温度を記録する」を無効化", - "disableStabilizeSteering": "「操縦を安定させる」を無効化", - "disableStoreArtifacts": "「遺物を保管する」を無効化", - "disableUnlockManifolds": "「マニホールドを開ける」を無効化", - - "disableMiscLongTasks": "ロングタスクをグローバル無効化", - "disableAlignEngineOutput": "「エンジン出力を調整する」を無効化", - "disableClearAsteroids": "「小惑星をクリアする」を無効化", - "disableEmptyChute": "「ゴミ捨て場のシュートを空にする」を無効化", - "disableInspectSample": "「サンプルを検査する」を無効化", - "disableReplaceWaterJug": "「給水ボトルの交換」を無効化", - "disableStartReactor": "「リアクターを起動する」を無効化", - "disableWaterPlants": "「植物に水をやる」を無効化", - - "disableMiscMixedTasks": "複合タスクをグローバル無効化", - "disableCalibrateDistributor": "「配電盤を調整する」を無効化", - "disableDivertPower": "「電力を転送する」を無効化", - "disableEmptyGarbage": "「ゴミを捨てる」を無効化", - "disableFuelEngines": "「エンジンに燃料を補給する」を無効化", - "disableSubmitScan": "「スキャンを送信する」を無効化", - "disableUploadData": "「データをアップロードする」を無効化", - - "allCommandsFull": "すべてのコマンド:\n\n/help\nこのヘルプメッセージを表示します。\n/aur, /socials\nAmong Us RevampedのSNSリンクを送信します。\n\n/r, /gm\n現在のモード紹介またはスキルリストを送信します。\n/l, /lastgame\n前回のゲームの勝者情報を送信します。\n\n/0kc, /0killcooldown\nキルクールダウン0秒モードの紹介を送信します。\n/sns, /shiftandseek\nシフト&シークモードの紹介を送信します。\n/sp, /speedrun\nタイムアタックモードの紹介を送信します。\n\n/kick, /ban\n名前を指定してプレイヤーをキックまたはBANします。\n/ckick, /cban\n色を指定してプレイヤーをキックまたはBANします。\n\n/vip /moderator /admin\nプレイヤーをVIP、モデレーター、または管理者に設定します。\n/removevip, /removemoderator, /removeadmin\nプレイヤーのVIP、モデレーター、または管理者権限を剥奪します。\n\n/eg, /endgame\n現在のゲームを終了します。\n/em, /endmeeting\n現在の会議を終了します。\n/s, /start\nゲーム開始のカウントダウンを始めます。\n\n/t {template}\nAUR-DATA/templates.txt内の指定されたテンプレートを送信します。\n\n/col, /color, /colour\nあなたのカラーを設定します(制限のバイパスに使用可能)。", - - "translationReloaded": "ファイルが正常にリセットされました。\nすべての変更を適用するには、ゲームを再起動してください。", - - "templateWelcome": "# このファイルでは、簡単にコピー&ペーストできるテンプレートを追加できます。\n# 新しいテンプレートを作成するには、改行して下のテスト用テンプレートと同じ形式を使用してください。\n# テンプレートの長さは120文字を超えることはできず、特殊文字も含められません。超えた場合は部屋からキックされます。\n\ntest: これはテンプレートの例です。「/t test」と入力すると表示されます。\n\nwelcome: ようこそ!このロビーはMV制作の Among Us Revamped {ModVersion} を使用しています。お楽しみください!", - "moderatorWelcome": "# このファイルでは、フレンドコードを使ってモデレーターを追加できます。\n# 追加されると、ゲーム内での名前が紫色になります。\n# ゲーム内の「システム設定」からモデレーター権限をカスタマイズしてください。以下はフレンドコードの例です。\n\nfriendcode#0000", - "vipWelcome": "# このファイルでは、フレンドコードを使ってVIPを追加できます。\n# 追加されると、ゲーム内での名前が黄色になります。\n# ゲーム内の「システム設定」からVIP権限をカスタマイズしてください。以下はフレンドコードの例です。\n\nfriendcode#0000\n", - "adminWelcome": "# このファイルでは、フレンドコードを使って管理職(Admin)を追加できます。\n# 追加されると、ゲーム内での名前が赤色になります。\n# ゲーム内の「システム設定」から管理者権限をカスタマイズしてください。以下はフレンドコードの例です。\n\nfriendcode#0000\n", - "banlistWelcome": "# このファイルでは、フレンドコードを使ってロビーからプレイヤーをBANできます。\n# ゲーム内で誰かをBANすると、自動的にここにも同期されます。以下はフレンドコードの例です。\n\nfriendcode#0000\n", - "banwordWelcome": "# このファイルでは、NGワードを設定できます。ここでリストされた単語をゲーム内で送信したプレイヤーは自動的にキックされます。\n# 単語ごとに必ず改行して区切ってください。", - "bannameWelcome": "# このファイルでは、NG名前を設定できます。ここでリストされた名前をゲーム内で使用しているプレイヤーは自動的にキックされます。\n# 名前ごとに必ず改行して区切ってください。", - - "noGameEndWarning": "警告:「ゲームが絶対に終了しない」が有効になっています", - - "tooLongTemplate": "テンプレートが120文字を超えているため、送信するとキックされます。長さを短くしてください。", - - "vipAdd": "{0} を VIP として登録しました。", - "moderatorAdd": "{0} を モデレーター として登録しました。", - "adminAdd": "{0} を 管理者 として登録しました。", - "vipRemove": "{0} の VIP 権限を削除しました。", - "moderatorRemove": "{0} の モデレーター 権限を削除しました。", - "adminRemove": "{0} の 管理者 権限を削除しました。", - "permFail": "ユーザー '{0}' が見つかりません。スペルが正しいか確認してください。", - - "helpDesc": "すべてのコマンドとその機能を表示します。", - "snsDesc": "シフト&シーク (Shift and Seek) ゲームモードの紹介を送信します。", - "0kcDesc": "キルクールダウン0秒 (0 Kill Cooldown) ゲームモードの紹介を送信します。", - "SrDesc": "タイムアタック (Speedrun) ゲームモード의 紹介を送信します。", - "egDesc": "現在のゲームを終了します。", - "emDesc": "現在の会議を終了します。", - "aurDesc": "Among Us RevampedのSNSリンクを送信します。", - "sDesc": "ゲーム開始のカウントダウンを始めます。", - "rDesc": "/r はアクティブなスキルまたは現在のモードを送信します。", - "rolesDesc": "すべてのスキル・ゲームモードの概要を送信します。", - "kickDesc": "名前を指定してプレイヤーをキックします。", - "ckickDesc": "色を指定してプレイヤーをキックします。", - "banDesc": "名前を指定してプレイヤーをBANします。", - "cbanDesc": "色を指定してプレイヤーをBANします。", - "dumpDesc": "LogOutput(ログ出力)を独立したファイルにコピーします。", - "colDesc": "あなたのカラーを設定します。", - "reloadDesc": "言語ファイルを再読み込みします。", - "vipDesc": "ユーザーを VIP に追加します。", - "moderatorDesc": "ユーザーを モデレーター に追加します。", - "adminDesc": "ユーザーを 管理者 に追加します。", - "cremoveVipDesc": "ユーザーの VIP 権限を削除します。", - "removeModeratorDesc": "ユーザーの モデレーター 権限を削除します。", - "removeAdminDesc": "ユーザーの 管理者 権限を削除します。", - "lastgameDesc": "前回のゲーム情報を送信します。", - "templateDesc": "AUR-DATA/templates.txtで指定されたテンプレートを送信します。", - - "banWordKick": "{0} はNGワードを送信したためキックされました(累計回数:{1} 回)", - - "pluginWarning": "警告:\n2つ以上のプラグインが有効化されていることを検出しました。\nAmong Us RevampedはほとんどのModと互換性がありません。\n不具合が発生した場合、競合が原因である可能性が非常に高いです。" + "seekers": "鬼(Seeker): ", + "clearedSeekers": "手動選択された鬼のリストを正常にクリアしました。" } diff --git a/Resources/Language/Russian.json b/Resources/Language/Russian.json index 2db6565..ff39032 100644 --- a/Resources/Language/Russian.json +++ b/Resources/Language/Russian.json @@ -10,9 +10,7 @@ "disableCommandHelper": "Выключить Командного Помощника", "disableCompatibilityWarning": "Выключить Предупреждение Совместимости", - "gameMasterWarning":"Вы будете наблюдать игры пока включён режим спектатора. ВНИМАНИЕ: Сообщения со способностями не будут отправлены и назначение ролей может быть неправильным если эта настройка включена.", - - "cancelStartCountdown": "Отсчет до старта отменён", + "cancelStartCountdown": "Отсчёт до старта отменён", "invalidFriendCodeKick": "{0} был кикнут из-за неправильного Кода друга", "invalidFriendCodeBan": "{0} был забанен из-за неправильного Кода друга", @@ -29,17 +27,17 @@ "autoKickStart": "Кикать Игроков Которые Говорят Start", "autoKickStartAsBan": "Банить вместо кика", "autoKickStartTimes": "Start сообщений нужно для кика", - "autoKickStartStrength": "Режим строго обнаружения", + "autoKickStartStrength": "Режим строгого обнаружения", "tabGroupAutomation": "Автоматизация", - "autoSendGameInfo": "Автоматически отправлять информацию о победителе", + "autoSendGameInfo": "Автоматически отправлять информацию о победителях", "autoRejoinLobby": "Автоматически перезаходить в лобби", - "autoStartTimer": "Отсчет Для Авто Старта", + "autoStartTimer": "Отсчёт Для Авто Старта", "waitAutoStart": "Авто Старт После", "playerAutoStart": "Игроков Нужно Для Авто Старта", "enableJoinMessages": "Включить Сообщение С Приветствиями", - "messagePerPlayerNum": "Сообщение Каждое Количество Заходов", + "messagePerPlayerNum": "Сообщение Каждые # Заходов", "tabGroupMisc": "Разное", - "startCountdown": "Отсчет Для Старта По Умолчанию", + "startCountdown": "Отсчёт Для Старта По Умолчанию", "colorCommandLevel": "Кто Может использовать Команды Цветов", "allowFortegreen": "Разрешить Фортезелёный Цвет", "noGameEnd": "Без Конца Игры", @@ -50,7 +48,6 @@ "slashLastGameCmd": "Кто Может Использовать /l & /aur", "slashKickCmd": "Кто Может Использовать /kick & /ckick", "slashBanCmd": "Кто Может Использовать /ban & /cban", - "slashEndMeetingCmd": "Кто Может Использовать /endmeeting", "slashStartAndEndGameCmd": "Кто Может Использовать /startgame & /endgame", "tabGroupCrewmate": "Роли Экипажа", @@ -69,7 +66,7 @@ "cantKillTime": "После Осечки Нельзя Убивать В Течение", "misfiresToSuicide": "Самоубийство После Количества Осечек", "crewAutoWinsGameAfter": "Экипаж Автоматически Побеждает После", - "snsDisableSabotage": "Выключить Критические Сабботажи в Режиме Клона", + "snsDisableSabotage": "Выключить Критические Саботажи в Режиме Клона", "snsDisableReactor": "Выключить Сабботаж Реактора", "snsDisableOxygen": "Выключить Сабботаж O2", "snsDisableLights": "Выключить Сабботаж Света", @@ -82,9 +79,9 @@ "gameAutoEndsAfter": "Игра автоматически заканчивается после", "engineerMode": "Все Инженеры", - "tabGroupSabotages": "Сабботажи", - "deadImpostorsCanSabotage": "Умершие Предатели Могут Сабботировать", - "disableSabotage": "Выключить Критические Сабботажи", + "tabGroupSabotages": "Саботажи", + "deadImpostorsCanSabotage": "Умершие Предатели Могут Саботировать", + "disableSabotage": "Выключить Критические Саботажи", "disableReactor": "Выключить Сабботаж Реактора", "disableOxygen": "Выключить Сабботаж O2", "disableLights": "Выключить Сабботаж Света", @@ -216,30 +213,30 @@ "disableSubmitScan": "Выключить Пройти Скан", "disableUploadData": "Выключить Загрузить Данные", - "allCommandsFull": "ВСЕ КОМАНДЫ:\n\n/help\nПоказать это сообщение.\n/aur, /socials\nОтправляет ссылки Among Us Revamped.\n\n/r, /gm\nОтправляет описание текущего режима или списка способностей.\n/l, /lastgame\nОтправляет информацию о последнем победителе.\n\n/0kc, /0killcooldown\nОтправляет описание режима 0 Перезарядки Убийств.\n/sns, /shiftandseek\nОтправляет описание режима Клона.\n/sp, /speedrun\nОтправляет описание режима Спидрана.\n\n/kick, /ban\nКикает или банит игрока по нику.\n/ckick, /cban\nКикает или банит игрока по цвету.\n\n/vip /moderator /admin\nДобавляет игрока как VIP, Модератора или Админа.\n/removevip, /removemoderator, /removeadmin\nУбирает VIP, Модератора или Админа у игрока.\n\n/eg, /endgame\nЗаканчивает текущую игру.\n/em, /endmeeting\nЗаканчивает текущее собрание.\n/s, /start\nНачинает отсчет для старта.\n\n/t {template}\nОтправляет шаблон из AUR-DATA/templates.txt.\n\n/col, /color, /colour\nМеняет ваш цвет, может быть использована чтобы обойти ограничения по цветам.", + "allCommandsFull": "ВСЕ КОМАНДЫ:\n\n/help\nПоказать это сообщение.\n/aur, /socials\nОтправляет ссылки Among Us Revamped.\n\n/r, /gm\nОтправляет описание текущего режима или списка способностей.\n/l, /lastgame\nОтправляет информацию о последнем победителе.\n\n/0kc, /0killcooldown\nОтправляет описание режима 0 Перезарядки Убийств.\n/sns, /shiftandseek\nОтправляет описание режима Клона.\n/sp, /speedrun\nОтправляет описание режима Спидрана.\n\n/kick, /ban\nКикает или банит игрока по нику.\n/ckick, /cban\nКикает или банит игрока по цвету.\n\n/vip /moderator /admin\nДобавляет игрока как VIP, Модератора или Админа.\n/removevip, /removemoderator, /removeadmin\nУбирает VIP, Модератора или Админа у игрока.\n\n/eg, /endgame\nЗаканчивает текущую игру.\n/em, /endmeeting\nЗаканчивает текущее собрание.\n/s, /start\nНачинает Отсчёт для старта.\n\n/t {template}\nОтправляет шаблон из AUR-DATA/templates.txt.\n\n/col, /color, /colour\nМеняет ваш цвет, может быть использована чтобы обойти ограничения по цветам.", "translationReloaded": "Ваш языковой файл был успешно сброшен.\nЧтобы применить все изменения, перезапустите вашу игру.", - "templateWelcome": "# В этом файле вы можете создавать шаблоны, которые могут служить как простая альтернатива копировать-вставить.\n# Чтобы создать шаблон, напишите новую линию с таким же форматированием как и у тестового шаблона снизу.\n# Шаблоны не могут быть длиннее чем 120 символов и не могут содержать специальные символы. В противном вас будет кикать.\n\ntest: это пример шаблона. Напишите '/t test' чтобы увидеть его.\n\nwelcome: Добро Пожаловать! Это Лобби Использует Among Us Revamped {ModVersion} от MV. Наслаждайтесь!", - "moderatorWelcome": "# В этом файле вы можете добавлять Модераторов по Коду друга.\n# Если вы добавите кого то, они получат фиолетовый ник в игре.\n# Перейдите в 'Системные Настройки' в игре чтобы изменить полномочия Модераторов. Снизу приведен пример Кода друга.\n\nfriendcode#0000", - "vipWelcome": "# В этом файле вы можете добавлять VIP по Коду друга.\n# Если вы добавите кого то, они получат желтый ник в игре.\n# Перейдите в 'Системные Настройки' в игре чтобы изменить полномочия VIP. Снизу приведен пример Кода друга.\n\nfriendcode#0000\n", - "adminWelcome": "# В этом файле вы можете добавлять Админов по Коду друга.\n# Если вы добавите кого то, они получат красный ник в игре.\n# Перейдите в 'Системные Настройки' в игре чтобы изменить полномочия Админов. Снизу приведен пример Кода друга.\n\nfriendcode#0000\n", + "templateWelcome": "# В этом файле вы можете создавать шаблоны, которые могут служить как простая альтернатива копировать-вставить.\n# Чтобы создать шаблон, напишите новую линию с таким же форматированием как и у тестового шаблона снизу.\n# Шаблоны не могут быть длиннее, чем 120 символов и не могут содержать специальные символы. В противном вас будет кикать.\n\ntest: это пример шаблона. Напишите '/t test', чтобы увидеть его.\n\nwelcome: Добро Пожаловать! Это Лобби Использует Among Us Revamped {ModVersion} от MV. Наслаждайтесь!", + "moderatorWelcome": "# В этом файле вы можете добавлять Модераторов по Коду друга.\n# Если вы добавите кого-то, они получат фиолетовый ник в игре.\n# Перейдите в 'Системные Настройки' в игре чтобы изменить полномочия Модераторов. Снизу приведен пример Кода друга.\n\nfriendcode#0000", + "vipWelcome": "# В этом файле вы можете добавлять VIP по Коду друга.\n# Если вы добавите кого-то, они получат желтый ник в игре.\n# Перейдите в 'Системные Настройки' в игре чтобы изменить полномочия VIP. Снизу приведен пример Кода друга.\n\nfriendcode#0000\n", + "adminWelcome": "# В этом файле вы можете добавлять Админов по Коду друга.\n# Если вы добавите кого-то, они получат красный ник в игре.\n# Перейдите в 'Системные Настройки' в игре чтобы изменить полномочия Админов. Снизу приведен пример Кода друга.\n\nfriendcode#0000\n", "banlistWelcome": "# В этом файле вы можете банить игроков из ваших лобби по Коду друга.\n# Если вы забаните кого-то в игре они автоматически добавятся в этот файл. Снизу приведен пример Кода друга.\n\nfriendcode#0000\n", - "banwordWelcome": "# В этом файле вы можете создавать запрещенные слова, автоматически кикает тех кто сказали эти слова которые написаны здесь.\n# Обратите внимание чтобы разделять слова надо при помощи новых строк.", - "bannameWelcome": "# В этом файле вы можете создавать запрещенные имена, автоматически кикает тех кто использует имена которые написаны здесь.\n# Обратите внимание чтобы разделять имена надо при помощи новых строк.", + "banwordWelcome": "# В этом файле вы можете создавать запрещенные слова, автоматически кикает тех кто сказали эти слова которые написаны здесь.\n# Обратите внимание, чтобы разделять слова надо при помощи новых строк.", + "bannameWelcome": "# В этом файле вы можете создавать запрещенные имена, автоматически кикает тех кто использует имена которые написаны здесь.\n# Обратите внимание, чтобы разделять имена надо при помощи новых строк.", "languageWelcome": "# In this file you can set your Among Us Revamped language.\n# To set the language, type one of the supported languages in a new line. The default is English.\n# Supported languages: English, Spanish, SimplifiedChinese, Italian\n\nEnglish", "noGameEndWarning": "ВНИМАНИЕ: Настройка 'Без Конца Игры' Включена", - "tooLongTemplate": "Ваш шаблон длиннее чем 120 символов и будет вас кик если он будет отправлен. Пожалуйста уменьшите длину.", + "tooLongTemplate": "Ваш шаблон длиннее, чем 120 символов и вас кикнет если он будет отправлен. Пожалуйста, уменьшите длину.", "vipAdd": "Успешно добавлен {0} как VIP.", "moderatorAdd": "Успешно добавлен {0} как Модератор.", - "adminAdd": "Успешно добавлен {0} as Админ.", + "adminAdd": "Успешно добавлен {0} как Админ.", "vipRemove": "Успешно убран VIP у {0}.", "moderatorRemove": "Успешно убран Модератор у {0}.", "adminRemove": "Успешно убран Админ у {0}.", - "permFail": "Не удалось найти игрока '{0}'. Убедитесь что вы написали ник корректно", + "permFail": "Не удалось найти игрока '{0}'. Убедитесь, что вы написали ник корректно", "helpDesc": "Показывает все Команды и что они делают.", "snsDesc": "Отправляет описание режима Клона.", @@ -248,7 +245,7 @@ "egDesc": "Заканчивает текущую игру.", "emDesc": "Заканчивает текущее собрание.", "aurDesc": "Отправляет Ссылки Us Revamped.", - "sDesc": "Начинает отсчет для старта.", + "sDesc": "Начинает Отсчёт для старта.", "rDesc": "/r Отправляет включеные способности или текущий режим.", "rolesDesc": "Отправляет обзор всех способностей/режимов.", "kickDesc": "Кикает игрока по нику.", @@ -259,8 +256,8 @@ "colDesc": "Меняет ваш цвет.", "reloadDesc": "Перезагружает языковой файл.", "vipDesc": "Добавляет игрока как VIP.", - "moderatorDesc": "Добавляет игрока как Модератор.", - "adminDesc": "Добавляет игрока как Админ.", + "moderatorDesc": "Добавляет игрока как Модератора.", + "adminDesc": "Добавляет игрока как Админа.", "cremoveVipDesc": "Убирает VIP у игрока.", "removeModeratorDesc": "Убирает Модератора у игрока.", "removeAdminDesc": "Убирает Админа у игрока.", @@ -283,5 +280,22 @@ "vipAndAbove": "VIP И Выше", "moderatorAndAbove": "Модератор И Выше", "admin": "Админ", - "onlyYou": "Только Вы" + "onlyYou": "Только Вы", + + "seekerDesc": "Добавляет игрока как искателя в прятках", + "seekersDesc": "Показывает всех вручную выбранных искателей.", + "clearSeekerDesc": "Очищает список всех вручную выбранных искателей", + + "slashEndMeetingCmd": "Кто Может Использовать /endmeeting & /seeker", + + "gameMasterWarning":"Вы будете наблюдать игры пока включён режим наблюдателя. ВНИМАНИЕ: Назначение ролей может быть неправильным, если эта настройка включена.", + + "startWordsWelcome": "# В этом файле вы можете создавать слова которые будут 'Кикать Игроков Которые Говорят Старт'.\n# 'Режим строгого обнаружения' ВЫКЛ = Сообщения должны идеально совпадать с определенными словами. 'Режим строгого обнаружения' ВКЛ = Сообщения нуждаются только в определённых словах.\n# Вы также можете добавлять несвязанные слова, которые будут обнаруживаться только в лобби..\n\nstart\nbegin\ncommence\nстарт\nначинайте\n", + + "gameMasterWarningTwo": "ВНИМАНИЕ: Режим Наблюдателя Включен", + + "startWordKick": "{0} Был кикнут так как они отправили слово которое было в StartWords.txt {1} раз(а)", + + "seekers": "Искателей: ", + "clearedSeekers": "Успешно очищен список вручную выбранных искателей." } diff --git a/Resources/Language/SimplifiedChinese.json b/Resources/Language/SimplifiedChinese.json index 877aa56..c28e449 100644 --- a/Resources/Language/SimplifiedChinese.json +++ b/Resources/Language/SimplifiedChinese.json @@ -1,7 +1,7 @@ { "LanguageID": "2", - "gameMaster": "游戏大师(Game Master)", + "gameMaster": "游戏主管(Game Master)", "showFPS": "显示帧率 (FPS)", "autoStart": "自动开始", "enableDarkTheme": "启用深色主题", @@ -45,13 +45,13 @@ "noGameEnd": "游戏永不结束", "tabGroupAccess": "权限等级", - "slashColorCmd": "谁可以使用 /color", + "slashColorCmd": "谁可以使用 /color 指令", "slashRolesAndGamemodeCmd": "谁可以使用 /r 和模板", - "slashLastGameCmd": "谁可以使用 /l 和 /aur", - "slashKickCmd": "谁可以使用 /kick 和 /ckick", - "slashBanCmd": "谁可以使用 /ban 和 /cban", - "slashEndMeetingCmd": "谁可以使用 /endmeeting", - "slashStartAndEndGameCmd": "谁可以使用 /startgame 和 /endgame", + "slashLastGameCmd": "谁可以使用 /l 和 /aur 指令", + "slashKickCmd": "谁可以使用 /kick 和 /ckick 指令", + "slashBanCmd": "谁可以使用 /ban 和 /cban 指令", + "slashEndMeetingCmd": "谁可以使用 /endmeeting 和 /seeker 指令", + "slashStartAndEndGameCmd": "谁可以使用 /startgame 和 /endgame 指令", "tabGroupCrewmate": "船员职业", "tabGroupNeutral": "中立职业", @@ -282,5 +282,12 @@ "vipAndAbove": "VIP 及以上", "moderatorAndAbove": "管理员 及以上", "admin": "管理员", - "onlyYou": "仅自己" + "onlyYou": "仅自己", + "seekersDesc": "显示所有手动选择的搜寻者。", + "clearSeekerDesc": "清除手动搜寻者列表。", + "startWordsWelcome": "# 在此文件中,您可以设置检查发送 “Start” 并踢出该玩家的功能。\n# 严格检测关闭 = 消息必须完全匹配关键词。\n# 严格检测开启 = 消息只需包含关键词即可。\n# 也可以添加无关词语,仅用于大厅检测。\n\nstart\nbegin\ncommence", + "gameMasterWarningTwo": "警告:游戏主管已启用", + "startWordKick": "{0} 因发送 StartWords.txt 中的关键词被踢出,累计次数:{1} 次", + "seekers": "搜寻者:", + "clearedSeekers": "已成功清除手动搜寻者列表。" }