Compare commits

...
20 Commits
Author SHA1 Message Date
Ape 48228cfdb7 1.8.4 2026-06-25 14:22:49 +02:00
Ape 0866aba752 Audio fix 2026-06-24 14:56:22 +02:00
Ape 8ad59ca207 1.8.3 2026-06-24 14:45:13 +02:00
Ape cbc66948c0 1.8.2 2026-06-15 15:51:36 +02:00
Ape f456eb63d5 1.8.1 2026-06-12 11:51:57 +02:00
Ape 8e013830b6 1.8.0 2026-06-07 13:52:31 +02:00
Ape 5e74dd1f84 1.7.7 2026-06-05 12:56:13 +02:00
Ape ca39da4d64 fix (3) 2026-06-04 15:35:43 +02:00
Ape 5558350749 fix (2) 2026-06-04 15:34:20 +02:00
Ape 9a0b38c276 Fix 2026-06-04 15:31:03 +02:00
Ape 0f2516fdf5 Mostly bug fixes, some changes 2026-06-04 15:17:19 +02:00
Ape 3ead1b0a69 Whoops 2026-06-02 21:30:07 +02:00
Ape 4e912082db A few small changes 2026-06-02 17:42:13 +02:00
Ape 3c380c1b51 1.7.4 2026-05-31 00:54:48 +02:00
Ape 71461583b3 That was not a fun surpirse 2026-05-29 16:46:00 +02:00
Ape 81c20d4706 1.7.3 Part Three 2026-05-29 15:41:12 +02:00
Ape 94c0049939 1.7.3 Part Two 2026-05-29 15:28:48 +02:00
Ape 1c3224396c 1.7.3 Part One 2026-05-29 00:01:19 +02:00
Ape de4f057899 1.7.2 2026-05-14 21:59:09 +02:00
Ape 3e4d833b66 1.7.1 2026-04-12 19:07:06 +02:00
32 changed files with 2473 additions and 493 deletions

No files matched your search

+12 -4
View File
@@ -30,11 +30,13 @@ public partial class Main : BasePlugin
public static ConfigEntry<string> Preset5 { get; private set; }
public static ConfigEntry<bool> GM { get; private set; }
public static ConfigEntry<bool> UnlockFps { get; private set; }
public static ConfigEntry<bool> ShowFps { get; private set; }
public static ConfigEntry<bool> AutoStart { get; private set; }
public static ConfigEntry<bool> DarkTheme { get; private set; }
public static ConfigEntry<bool> LobbyMusic { get; private set; }
public static ConfigEntry<bool> DisableInfoWhenDead { get; private set; }
public static ConfigEntry<bool> DisableCommandHelper { get; private set; }
public static ConfigEntry<bool> DisableCompatibilityWarning { get; private set; }
public static NormalGameOptionsV10 NormalOptions => GameOptionsManager.Instance != null ? GameOptionsManager.Instance.currentNormalGameOptions : null;
public static HideNSeekGameOptionsV10 HideNSeekOptions => GameOptionsManager.Instance != null ? GameOptionsManager.Instance.currentHideNSeekGameOptions : null;
@@ -42,11 +44,12 @@ public partial class Main : BasePlugin
public static bool HasArgumentException;
public static string CredentialsText;
public const string ModVersion = "v1.7.0";
public const string ModVersion = "v1.8.4";
public static float GameTimer;
public static readonly Dictionary<int, int> SayStartTimes = [];
public static readonly Dictionary<int, int> SayDeniedWordTimes = [];
public static PlayerControl[] AllPlayerControls
{
@@ -85,16 +88,21 @@ public partial class Main : BasePlugin
AutoStart = Config.Bind("Client Options", "Auto Start", false);
GM = Config.Bind("Client Options", "Game Master", false);
UnlockFps = Config.Bind("Client Options", "Unlock FPS", false);
ShowFps = Config.Bind("Client Options", "Show FPS", false);
AutoStart = Config.Bind("Client Options", "Auto Start", false);
DarkTheme = Config.Bind("Client Options", "Dark Theme", false);
LobbyMusic = Config.Bind("Client Options", "Lobby Music", false);
DisableInfoWhenDead = Config.Bind("Client Options", "Disable Task/Kill View", false);
DisableCommandHelper = Config.Bind("Client Options", "Disable Command Helper", false);
DisableCompatibilityWarning = Config.Bind("Client Options", "Disable Compatibility Warning", false);
Translator.Init();
Translator.Reload();
BanManager.Init();
Harmony.PatchAll();
ConsoleManager.DetachConsole();
}
[HarmonyPatch(typeof(ModManager), nameof(ModManager.LateUpdate))]
+1 -1
View File
@@ -18,7 +18,7 @@
<ItemGroup>
<PackageReference Include="BepInEx.Unity.IL2CPP" Version="6.0.0-be.735" ExcludeAssets="runtime;native" />
<PackageReference Include="AmongUs.GameLibs.Steam" Version="2025.11.18" PrivateAssets="all" Condition="'$(Configuration)' == 'Release'"/>
<PackageReference Include="AmongUs.GameLibs.Steam" Version="2026.6.5" PrivateAssets="all" Condition="'$(Configuration)' == 'Release'"/>
<PackageReference Include="AmongUs.GameLibs.Android" Version="2025.10.14" PrivateAssets="all" Condition="'$(Configuration)' == 'Android'"/>
<PackageReference Include="BepInEx.AutoPlugin" Version="1.1.0" PrivateAssets="all" />
+87 -41
View File
@@ -20,12 +20,14 @@ public static class BanManager
#endif
public static string RemoveHtmlTags(this string str) => Regex.Replace(str, "<[^>]*?>", "");
private static readonly string DenyNameListPath = $"{DataPath}/AUR-DATA/DenyNameList.txt";
private static readonly string DenyNameListPath = $"{DataPath}/AUR-DATA/Deniednames.txt";
private static string BanListPath = $"{DataPath}/AUR-DATA/Banlist.txt";
private static string BanWordPath = $"{DataPath}/AUR-DATA/Bannedwords.txt";
private static string VipListPath = $"{DataPath}/AUR-DATA/VIP.txt";
private static string ModeratorListPath = $"{DataPath}/AUR-DATA/Moderator.txt";
private static string AdminListPath = $"{DataPath}/AUR-DATA/Admin.txt";
private static string BanWordPath = $"{DataPath}/AUR-DATA/Deniedwords.txt";
public static string VipListPath = $"{DataPath}/AUR-DATA/VIP.txt";
public static string ModeratorListPath = $"{DataPath}/AUR-DATA/Moderator.txt";
public static string AdminListPath = $"{DataPath}/AUR-DATA/Admin.txt";
private static string TemplatePath = $"{DataPath}/AUR-DATA/Templates.txt";
public static Dictionary<string, string> Templates = new();
public static List<string> TempBanWhiteList = [];
public static void Init()
{
@@ -33,36 +35,15 @@ public static class BanManager
{
if (!Directory.Exists($"{DataPath}/AUR-DATA")) Directory.CreateDirectory($"{DataPath}/AUR-DATA");
if (!File.Exists(DenyNameListPath))
{
Logger.Warn("Creating a new DenyNameList.txt file", "BanManager");
File.Create(DenyNameListPath).Close();
}
if (!File.Exists(BanListPath))
{
Logger.Warn("Creating a new Banlist.txt file", "BanManager");
File.Create(BanListPath).Close();
}
if (!File.Exists(BanWordPath))
{
Logger.Warn("Creating a new Banlist.txt file", "BanManager");
File.Create(BanWordPath).Close();
}
if (!File.Exists(VipListPath))
{
Logger.Warn("Creating a new VIP.txt file", "BanManager");
File.Create(VipListPath).Close();
}
if (!File.Exists(ModeratorListPath))
{
Logger.Warn("Creating a new Moderator.txt file", "BanManager");
File.Create(ModeratorListPath).Close();
}
if (!File.Exists(AdminListPath))
{
Logger.Warn("Creating a new Admin.txt file", "BanManager");
File.Create(AdminListPath).Close();
}
CheckFile(DenyNameListPath, Translator.Get("bannameWelcome"), "DeniedNames.txt");
CheckFile(BanListPath, Translator.Get("banlistWelcome"), "Banlist.txt");
CheckFile(BanWordPath, Translator.Get("banwordWelcome"), "DeniedWords.txt");
CheckFile(VipListPath, Translator.Get("vipWelcome"), "VIP.txt");
CheckFile(ModeratorListPath, Translator.Get("moderatorWelcome"), "Moderator.txt");
CheckFile(AdminListPath, Translator.Get("adminWelcome"), "Admin.txt");
CheckFile(TemplatePath, Translator.Get("templateWelcome"), "Templates.txt");
LoadTemplates();
}
catch (Exception ex)
@@ -153,6 +134,7 @@ public static class BanManager
string line;
while ((line = sr.ReadLine()) != null)
{
if (line.StartsWith("#")) continue;
if (line == "") continue;
if (!OnlyCheckPuid)
{
@@ -172,7 +154,7 @@ public static class BanManager
{
if (name == "" || !AmongUsClient.Instance.AmHost) return false;
var deniedNames = File.ReadAllLines(DenyNameListPath);
var deniedNames = File.ReadAllLines(DenyNameListPath).Where(x => !x.StartsWith("#"));
if (deniedNames.Where(code => !string.IsNullOrWhiteSpace(code)).Any(code => name.Contains(code, StringComparison.OrdinalIgnoreCase)))
{
@@ -188,17 +170,28 @@ public static class BanManager
{
if (input == "" || !AmongUsClient.Instance.AmHost || Utils.CheckAccessLevel(player.Data.FriendCode) > 0) return false;
var bannedWords = File.ReadAllLines(BanWordPath);
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)))
{
AmongUsClient.Instance.KickPlayer(player.Data.ClientId, false);
Logger.Info($" {player.Data.PlayerName} was kicked because they sent a banned word", "Kick");
Logger.SendInGame($"{player.Data.PlayerName} was kicked because they sent a banned word");
if (!Main.SayDeniedWordTimes.ContainsKey(clientId))
{
Main.SayDeniedWordTimes.Add(clientId, 0);
}
Main.SayDeniedWordTimes[clientId]++;
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()));
}
return true;
}
else return false;
}
[HarmonyPatch(typeof(BanMenu), nameof(BanMenu.Select))]
@@ -213,4 +206,57 @@ public static class BanManager
__instance.BanButton.GetComponent<ButtonRolloverHandler>().SetEnabledColors();
}
}
public static void LoadTemplates()
{
Templates.Clear();
if (!File.Exists(TemplatePath)) return;
foreach (var line in File.ReadAllLines(TemplatePath))
{
if (string.IsNullOrWhiteSpace(line)) continue;
if (line.StartsWith("#")) continue;
int splitIndex = line.IndexOf(':');
if (splitIndex == -1) continue;
string key = line[..splitIndex].Trim().ToLower();
string value = line[(splitIndex + 1)..].Trim();
if (!Templates.ContainsKey(key)) Templates.Add(key, value);
}
}
private static void CheckFile(string path, string defaultContent, string name)
{
try
{
if (!File.Exists(path))
{
Logger.Warn($"Creating a new {name} file", "BanManager");
File.WriteAllText(path, defaultContent);
}
}
catch (Exception ex)
{
Logger.Exception(ex, "BanManager");
}
}
public static string CheckTemplate(string text)
{
Dictionary<string, string> variables = new()
{
{ "ModVersion", Main.ModVersion }
};
foreach (var kvp in variables)
{
text = text.Replace($"{{{kvp.Key}}}", kvp.Value);
}
return text;
}
}
+156
View File
@@ -0,0 +1,156 @@
using InnerNet;
using System;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
namespace AmongUsRevamped;
[HarmonyPatch(typeof(TextBoxTMP), nameof(TextBoxTMP.SetText))]
internal static class CommandHelper
{
private static TextMeshPro HelperText;
public class Cmd
{
public string[] Name;
public string Prompt;
public string Description;
public bool HasVariable;
}
static readonly List<Cmd> Commands = new()
{
new Cmd { Name = new[] { "/help" }, Prompt = "/help", Description = Translator.Get("helpDesc"), HasVariable = false },
new Cmd { Name = new[] { "/sns" }, Prompt = "/sns", Description = Translator.Get("snsDesc"), HasVariable = false },
new Cmd { Name = new[] { "/shiftandseek" }, Prompt = "/shiftandseek", Description = Translator.Get("snsDesc"), HasVariable = false },
new Cmd { Name = new[] { "/0kc" }, Prompt = "/0kc", Description = Translator.Get("0kcDesc"), HasVariable = false },
new Cmd { Name = new[] { "/0killcooldown" }, Prompt = "/0killcooldown", Description = Translator.Get("0kcDesc"), HasVariable = false },
new Cmd { Name = new[] { "/sr" }, Prompt = "/sr", Description = Translator.Get("SrDesc"), HasVariable = false },
new Cmd { Name = new[] { "/speedrun" }, Prompt = "/speedrun", Description = Translator.Get("SrDesc"), HasVariable = false },
new Cmd { Name = new[] { "/eg" }, Prompt = "/eg", Description = Translator.Get("egDesc"), HasVariable = false },
new Cmd { Name = new[] { "/endgame" }, Prompt = "/endgame", Description = Translator.Get("egDesc"), HasVariable = false },
new Cmd { Name = new[] { "/em" }, Prompt = "/em", Description = Translator.Get("emDesc"), HasVariable = false },
new Cmd { Name = new[] { "/endmeeting" }, Prompt = "/endmeeting", Description = Translator.Get("emDesc"), HasVariable = false },
new Cmd { Name = new[] { "/aur" }, Prompt = "/aur", Description = Translator.Get("aurDesc"), HasVariable = false },
new Cmd { Name = new[] { "/socials" }, Prompt = "/socials", Description = Translator.Get("aurDesc"), HasVariable = false },
new Cmd { Name = new[] { "/s" }, Prompt = "/s", Description = Translator.Get("sDesc"), HasVariable = false },
new Cmd { Name = new[] { "/start" }, Prompt = "/start", Description = Translator.Get("sDesc"), HasVariable = false },
new Cmd { Name = new[] { "/r" }, Prompt = "/r {role}", Description = Translator.Get("rDesc"), HasVariable = true },
new Cmd { Name = new[] { "/roles" }, Prompt = "/roles", Description = Translator.Get("rolesDesc"), HasVariable = false },
new Cmd { Name = new[] { "/kick" }, Prompt = "/kick {name}", Description = Translator.Get("kickDesc"), HasVariable = true },
new Cmd { Name = new[] { "/ckick" }, Prompt = "/ckick {color}", Description = Translator.Get("ckickDesc"), HasVariable = true },
new Cmd { Name = new[] { "/ban" }, Prompt = "/ban {name}", Description = Translator.Get("banDesc"), HasVariable = true },
new Cmd { Name = new[] { "/cban" }, Prompt = "/cban {color}", Description = Translator.Get("cbanDesc"), HasVariable = true },
new Cmd { Name = new[] { "/dump" }, Prompt = "/dump", Description = Translator.Get("dumpDesc"), HasVariable = false },
new Cmd { Name = new[] { "/col" }, Prompt = "/col {color}", Description = Translator.Get("colDesc"), HasVariable = true },
new Cmd { Name = new[] { "/color" }, Prompt = "/color {color}", Description = Translator.Get("colDesc"), HasVariable = true },
new Cmd { Name = new[] { "/colour" }, Prompt = "/colour {color}", Description = Translator.Get("colDesc"), HasVariable = true },
new Cmd { Name = new[] { "/reload" }, Prompt = "/reload", Description = Translator.Get("reloadDesc"), HasVariable = false },
new Cmd { Name = new[] { "/vip" }, Prompt = "/vip {name}", Description = Translator.Get("vipDesc"), HasVariable = true },
new Cmd { Name = new[] { "/moderator" }, Prompt = "/moderator {name}", Description = Translator.Get("moderatorDesc"), HasVariable = true },
new Cmd { Name = new[] { "/admin" }, Prompt = "/admin {name}", Description = Translator.Get("adminDesc"), HasVariable = true },
new Cmd { Name = new[] { "/removevip" }, Prompt = "/removevip {name}", Description = Translator.Get("cremoveVipDesc"), HasVariable = true },
new Cmd { Name = new[] { "/removemoderator" }, Prompt = "/removemoderator {name}", Description = Translator.Get("removeModeratorDesc"), HasVariable = true },
new Cmd { Name = new[] { "/removeadmin" }, Prompt = "/removeadmin {name}", Description = Translator.Get("removeAdminDesc"), HasVariable = true },
new Cmd { Name = new[] { "/lastgame" }, Prompt = "/lastgame", Description = Translator.Get("lastgameDesc"), HasVariable = false },
new Cmd { Name = new[] { "/t" }, Prompt = "/t {template}", Description = Translator.Get("templateDesc"), HasVariable = true }
};
[HarmonyPostfix]
public static void Postfix(TextBoxTMP __instance)
{
if (!HudManager.InstanceExists || HudManager.Instance.Chat == null || HudManager.Instance.Chat.freeChatField == null || HudManager.Instance.Chat.freeChatField.textArea == null || __instance != HudManager.Instance.Chat.freeChatField.textArea) return;
if (Main.DisableCommandHelper.Value || !AmongUsClient.Instance.AmHost)
{
if (HelperText != null) HelperText.enabled = false;
return;
}
if (!HelperText)
{
HelperText = Object.Instantiate(__instance.outputText, __instance.outputText.transform.parent);
HelperText.name = "HelperText";
HelperText.color = new Color(0.7f, 0.7f, 0.7f, 0.7f);
HelperText.transform.localPosition = __instance.outputText.transform.localPosition;
HelperText.enabled = false;
}
string t = __instance.text;
if (string.IsNullOrEmpty(t) || !t.StartsWith("/"))
{
HelperText.enabled = false;
return;
}
string textCmd = t.Split(' ')[0];
Cmd u = null;
Cmd v = null;
foreach (var cmd in Commands)
{
foreach (var a in cmd.Name)
{
string aliasCmd = a;
if (aliasCmd.Equals(textCmd))
{
v = cmd;
u = cmd;
break;
}
if (aliasCmd.StartsWith(textCmd))
{
u ??= cmd;
}
}
if (v != null) break;
}
if (v != null && !v.HasVariable && t.Length > textCmd.Length)
{
HelperText.enabled = false;
return;
}
__instance.outputText.enabled = true;
if (v != null && textCmd.Equals(v.Name[0]))
{
HelperText.text = $"\n\n<size=80%><color=#FF0000>{v.Description}</color></size>";
}
else if (u != null)
{
HelperText.text = u.Prompt;
}
else
{
HelperText.enabled = false;
return;
}
HelperText.enabled = true;
}
}
+123 -48
View File
@@ -38,12 +38,6 @@ namespace AmongUsRevamped
taskOptionsLoad = Task.Run(Load);
}
//[HarmonyPatch(typeof(MainMenuManager), nameof(MainMenuManager.Start)), HarmonyPostfix]
//public static void WaitOptionsLoad()
//{
//taskOptionsLoad.Wait();
//}
public const int PresetId = 0;
private static readonly string[] presets =
@@ -59,20 +53,34 @@ namespace AmongUsRevamped
public static readonly string[] accessLevels =
{
"Everyone", "<color=yellow>VIP</color> And Above", "<color=purple>Moderator</color> And Above", "<color=red>Admin</color>", "Only You"
Translator.Get("everyone"), Translator.Get("vipAndAbove"), Translator.Get("moderatorAndAbove"), Translator.Get("admin"), Translator.Get("onlyYou")
};
public static readonly string[] crewmateAbilities =
{
"Mayor", "Workhorse", "Jester", "Tasker", "None"
};
public static readonly string[] impostorAbilities =
{
"Tyrant", "Stealer", "Juggernaut", "None"
};
//System
public static OptionItem Language;
public static OptionItem Gamemode;
public static OptionItem TabGroupMain;
public static OptionItem KickLowLevelPlayer;
public static OptionItem DontKickLevelOnes;
public static OptionItem TempBanLowLevelPlayer;
public static OptionItem KickInvalidFriendCodes;
public static OptionItem TempBanInvalidFriendCodes;
public static OptionItem DeniedWordsToKick;
public static OptionItem AutoKickStart;
public static OptionItem AutoKickStartAsBan;
public static OptionItem AutoKickStartTimes;
@@ -85,6 +93,8 @@ namespace AmongUsRevamped
public static OptionItem AutoStartTimer;
public static OptionItem WaitAutoStart;
public static OptionItem PlayerAutoStart;
public static OptionItem EnableJoinMessages;
public static OptionItem MessagePerPlayerNum;
public static OptionItem TabGroupMisc;
@@ -97,7 +107,6 @@ namespace AmongUsRevamped
public static OptionItem SlashColorCmd;
public static OptionItem SlashRolesAndGamemodeCmd;
public static OptionItem SlashLastGameCmd;
public static OptionItem SlashHelpAndAurCmd;
public static OptionItem SlashKickCmd;
public static OptionItem SlashBanCmd;
public static OptionItem SlashEndMeetingCmd;
@@ -255,10 +264,6 @@ namespace AmongUsRevamped
public static OptionItem DisableSubmitScan;
public static OptionItem DisableUploadData;
// Gamemode
public static OptionItem TabGroupStandard;
public static OptionItem ChatBeforeFirstMeeting;
public static OptionItem TabGroupHNS;
public static OptionItem NumSeekers;
@@ -283,18 +288,53 @@ namespace AmongUsRevamped
public static OptionItem TabGroupSpeedrun;
public static OptionItem SpeedrunSettingsOverride;
public static OptionItem GameAutoEndsAfter;
public static OptionItem EngineerMode;
// Roles
// Abilities
public static OptionItem TabGroupCrewmate;
public static OptionItem MayorPerc;
public static OptionItem MayorExtraVoteCount;
public static OptionItem MayorVentToMeeting;
public static OptionItem TabGroupNeutral;
public static OptionItem JesterPerc;
public static OptionItem JesterCanVent;
public static OptionItem OverrideCrewmate;
public static OptionItem CrewmateAbility;
public static OptionItem OverrideScientist;
public static OptionItem ScientistAbility;
public static OptionItem OverrideEngineer;
public static OptionItem EngineerAbility;
public static OptionItem OverrideNoisemaker;
public static OptionItem NoisemakerAbility;
public static OptionItem OverrideTracker;
public static OptionItem TrackerAbility;
public static OptionItem OverrideDetective;
public static OptionItem DetectiveAbility;
public static OptionItem TabGroupCrewmateAbilities;
public static OptionItem ExtraVotesCrewmate;
public static OptionItem ExtraVotesPerTask;
public static OptionItem SpeedrunnerShortTasks;
public static OptionItem SpeedrunnerLongTasks;
public static OptionItem TabGroupImpostor;
public static OptionItem OverrideImpostor;
public static OptionItem ImpostorAbility;
public static OptionItem OverrideShapeshifter;
public static OptionItem ShapeshifterAbility;
public static OptionItem OverridePhantom;
public static OptionItem PhantomAbility;
public static OptionItem OverrideViper;
public static OptionItem ViperAbility;
public static OptionItem TabGroupImpostorAbilities;
public static OptionItem ExtraVotesImpostor;
public static OptionItem ExtraVotesPerKill;
public static OptionItem KillsNeededForJuggernaut;
public static bool IsLoaded = false;
@@ -313,10 +353,15 @@ namespace AmongUsRevamped
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)
.SetValueFormat(OptionFormat.Level);
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)
@@ -336,16 +381,19 @@ namespace AmongUsRevamped
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, 600, 1), 5, 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)
.SetParent(EnableJoinMessages);
TabGroupMisc = TextOptionItem.Create(60379, Translator.Get("tabGroupMisc"), TabGroup.SystemSettings)
.SetColor(Color.green);
StartCountdown = IntegerOptionItem.Create(60380, Translator.Get("startCountdown"), new(1, 600, 1), 5, TabGroup.SystemSettings, false)
StartCountdown = IntegerOptionItem.Create(60380, Translator.Get("startCountdown"), new(1, 5, 1), 5, TabGroup.SystemSettings, false)
.SetValueFormat(OptionFormat.Seconds);
AllowFortegreen = BooleanOptionItem.Create(60382, Translator.Get("allowFortegreen"), false, TabGroup.SystemSettings, false);
NoGameEnd = BooleanOptionItem.Create(60383, Translator.Get("noGameEnd"), false, TabGroup.SystemSettings, false)
@@ -356,40 +404,70 @@ namespace AmongUsRevamped
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);
SlashHelpAndAurCmd = StringOptionItem.Create(60404, Translator.Get("slashHelpAndAurCmd"), 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);
// Custom role settings
TabGroupCrewmate = TextOptionItem.Create(100000, Translator.Get("tabGroupCrewmate"), TabGroup.CustomRoleSettings)
// Ability settings
TabGroupCrewmate = TextOptionItem.Create(100000, Translator.Get("tabGroupCrewmate"), TabGroup.AbilitySettings)
.SetColor(CL.Hex("#8cffff"));
MayorPerc = IntegerOptionItem.Create(100001, Translator.Get("Mayor"), new(0, 100, 5), 0, TabGroup.CustomRoleSettings, false)
.SetValueFormat(OptionFormat.Percent)
.SetColor(CL.Hex("#204d42"));
MayorExtraVoteCount = IntegerOptionItem.Create(100002, Translator.Get("mayorExtraVoteCount"), new(1, 15, 1), 1, TabGroup.CustomRoleSettings, false)
.SetValueFormat(OptionFormat.Level)
.SetParent(MayorPerc);
MayorVentToMeeting = BooleanOptionItem.Create(100003, Translator.Get("mayorVentToMeeting"), true, TabGroup.CustomRoleSettings, false)
.SetParent(MayorPerc);
TabGroupNeutral = TextOptionItem.Create(101000, Translator.Get("tabGroupNeutral"), TabGroup.CustomRoleSettings)
.SetColor(CL.Hex("#FFFF99"));
JesterPerc = IntegerOptionItem.Create(101001, Translator.Get("Jester"), new(0, 100, 5), 0, TabGroup.CustomRoleSettings, false)
.SetValueFormat(OptionFormat.Percent)
.SetColor(CL.Hex("#ec62a5"));
JesterCanVent = BooleanOptionItem.Create(101002, Translator.Get("jesterCanVent"), false, TabGroup.CustomRoleSettings, false)
.SetParent(JesterPerc);
CrewmateAbility = StringOptionItem.Create(100001, Translator.Get("crewmateAbility"), crewmateAbilities, 4, TabGroup.AbilitySettings, false)
.SetColor(CL.Hex("#8cffff"));
TabGroupImpostor = TextOptionItem.Create(102000, Translator.Get("tabGroupImpostor"), TabGroup.CustomRoleSettings)
ScientistAbility = StringOptionItem.Create(100101, Translator.Get("scientistAbility"), crewmateAbilities, 4, TabGroup.AbilitySettings, false)
.SetColor(CL.Hex("#8cffff"));
EngineerAbility = StringOptionItem.Create(100201, Translator.Get("engineerAbility"), crewmateAbilities, 4, TabGroup.AbilitySettings, false)
.SetColor(CL.Hex("#8cffff"));
NoisemakerAbility = StringOptionItem.Create(100301, Translator.Get("noisemakerAbility"), crewmateAbilities, 4, TabGroup.AbilitySettings, false)
.SetColor(CL.Hex("#8cffff"));
TrackerAbility = StringOptionItem.Create(100401, Translator.Get("trackerAbility"), crewmateAbilities, 4, TabGroup.AbilitySettings, false)
.SetColor(CL.Hex("#8cffff"));
DetectiveAbility = StringOptionItem.Create(100501, Translator.Get("detectiveAbility"), crewmateAbilities, 4, TabGroup.AbilitySettings, false)
.SetColor(CL.Hex("#8cffff"));
TabGroupCrewmateAbilities = TextOptionItem.Create(101000, Translator.Get("tabGroupCrewmateAbilities"), TabGroup.AbilitySettings)
.SetColor(CL.Hex("#8cffff"));
ExtraVotesCrewmate = IntegerOptionItem.Create(101001, Translator.Get("extraVotesCrewmate"), new(1, 15, 1), 1, TabGroup.AbilitySettings, false)
.SetValueFormat(OptionFormat.Level);
ExtraVotesPerTask = FloatOptionItem.Create(101002, Translator.Get("extraVotesPerTask"), new(0.25f, 3f, 0.25f), 0.5f, TabGroup.AbilitySettings, false)
.SetValueFormat(OptionFormat.Level);
SpeedrunnerShortTasks = IntegerOptionItem.Create(101003, Translator.Get("speedrunnerShortTasks"), new(0, 15, 1), 4, TabGroup.AbilitySettings, false)
.SetValueFormat(OptionFormat.Level);
SpeedrunnerLongTasks = IntegerOptionItem.Create(101004, Translator.Get("speedrunnerLongTasks"), new(0, 15, 1), 3, TabGroup.AbilitySettings, false)
.SetValueFormat(OptionFormat.Level);
TabGroupImpostor = TextOptionItem.Create(102000, Translator.Get("tabGroupImpostor"), TabGroup.AbilitySettings)
.SetColor(CL.Hex("#ff1919"));
ImpostorAbility = StringOptionItem.Create(100002, Translator.Get("impostorAbility"), impostorAbilities, 3, TabGroup.AbilitySettings, false)
.SetColor(CL.Hex("#ff1919"));
ShapeshifterAbility = StringOptionItem.Create(102101, Translator.Get("shapeshifterAbility"), impostorAbilities, 3, TabGroup.AbilitySettings, false)
.SetColor(CL.Hex("#ff1919"));
PhantomAbility = StringOptionItem.Create(102201, Translator.Get("phantomAbility"), impostorAbilities, 3, TabGroup.AbilitySettings, false)
.SetColor(CL.Hex("#ff1919"));
ViperAbility = StringOptionItem.Create(102301, Translator.Get("viperAbility"), impostorAbilities, 3, TabGroup.AbilitySettings, false)
.SetColor(CL.Hex("#ff1919"));
TabGroupImpostorAbilities = TextOptionItem.Create(103000, Translator.Get("tabGroupImpostorAbilities"), TabGroup.AbilitySettings)
.SetColor(CL.Hex("#ff1919"));
ExtraVotesImpostor = IntegerOptionItem.Create(103001, Translator.Get("extraVotesImpostor"), new(1, 15, 1), 1, TabGroup.AbilitySettings, false)
.SetValueFormat(OptionFormat.Level);
ExtraVotesPerKill = FloatOptionItem.Create(103002, Translator.Get("extraVotesPerKill"), new(0.25f, 3f, 0.25f), 0.5f, TabGroup.AbilitySettings, false)
.SetValueFormat(OptionFormat.Level);
KillsNeededForJuggernaut = IntegerOptionItem.Create(103003, Translator.Get("killsNeededForJuggernaut"), new(3, 15, 1), 7, TabGroup.AbilitySettings, false)
.SetValueFormat(OptionFormat.Level);
// Gamemode Settings
TabGroupStandard = TextOptionItem.Create(69998, Translator.Get("tabGroupStandard"), TabGroup.GamemodeSettings)
.SetColor(Color.white);
ChatBeforeFirstMeeting = BooleanOptionItem.Create(69999, Translator.Get("chatBeforeFirstMeeting"), false, TabGroup.GamemodeSettings, false);
TabGroupHNS = TextOptionItem.Create(70000, Translator.Get("tabGroupHNS"), TabGroup.GamemodeSettings)
.SetColor(Color.green);
@@ -437,6 +515,7 @@ namespace AmongUsRevamped
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);
EngineerMode = BooleanOptionItem.Create(70078, Translator.Get("engineerMode"), false, TabGroup.GamemodeSettings, false);
// Gameplay Settings
TabGroupSabotages = TextOptionItem.Create(60450, Translator.Get("tabGroupSabotages"), TabGroup.ModSettings)
@@ -549,10 +628,6 @@ namespace AmongUsRevamped
.SetParent(DisableDevices)
.SetColor(new Color32(255, 153, 153, byte.MaxValue));
DisableFungleCamera = BooleanOptionItem.Create(22926, Translator.Get("disableFungleCamera"), false, TabGroup.ModSettings, false)
.SetParent(DisableFungleDevices)
.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));
+182 -2
View File
@@ -5,7 +5,181 @@ using InnerNet;
using UnityEngine;
namespace AmongUsRevamped;
// It was a fun ride, but this won't last.
// Edit: WE ARE SO BACK
public static class AbilityManagement
{
public static bool IsMayor(PlayerControl player)
{
if (player.Data.RoleType == RoleTypes.Crewmate && Options.CrewmateAbility.GetValue() == 0 ||
player.Data.RoleType == RoleTypes.Scientist && Options.ScientistAbility.GetValue() == 0 ||
player.Data.RoleType == RoleTypes.Engineer && Options.EngineerAbility.GetValue() == 0 ||
player.Data.RoleType == RoleTypes.Noisemaker && Options.NoisemakerAbility.GetValue() == 0 ||
player.Data.RoleType == RoleTypes.Tracker && Options.TrackerAbility.GetValue() == 0 ||
player.Data.RoleType == RoleTypes.Detective && Options.DetectiveAbility.GetValue() == 0)
{
return true;
}
else return false;
}
public static bool IsWorkhorse(PlayerControl player)
{
if (player.Data.RoleType == RoleTypes.Crewmate && Options.CrewmateAbility.GetValue() == 1 ||
player.Data.RoleType == RoleTypes.Scientist && Options.ScientistAbility.GetValue() == 1 ||
player.Data.RoleType == RoleTypes.Engineer && Options.EngineerAbility.GetValue() == 1 ||
player.Data.RoleType == RoleTypes.Noisemaker && Options.NoisemakerAbility.GetValue() == 1 ||
player.Data.RoleType == RoleTypes.Tracker && Options.TrackerAbility.GetValue() == 1 ||
player.Data.RoleType == RoleTypes.Detective && Options.DetectiveAbility.GetValue() == 1)
{
return true;
}
else return false;
}
public static bool IsJester(PlayerControl player)
{
if (player.Data.RoleType == RoleTypes.Crewmate && Options.CrewmateAbility.GetValue() == 2 ||
player.Data.RoleType == RoleTypes.Scientist && Options.ScientistAbility.GetValue() == 2 ||
player.Data.RoleType == RoleTypes.Engineer && Options.EngineerAbility.GetValue() == 2 ||
player.Data.RoleType == RoleTypes.Noisemaker && Options.NoisemakerAbility.GetValue() == 2 ||
player.Data.RoleType == RoleTypes.Tracker && Options.TrackerAbility.GetValue() == 2 ||
player.Data.RoleType == RoleTypes.Detective && Options.DetectiveAbility.GetValue() == 2)
{
return true;
}
else return false;
}
public static bool IsSpeedrunner(PlayerControl player)
{
if (player.Data.RoleType == RoleTypes.Crewmate && Options.CrewmateAbility.GetValue() == 3 ||
player.Data.RoleType == RoleTypes.Scientist && Options.ScientistAbility.GetValue() == 3 ||
player.Data.RoleType == RoleTypes.Engineer && Options.EngineerAbility.GetValue() == 3 ||
player.Data.RoleType == RoleTypes.Noisemaker && Options.NoisemakerAbility.GetValue() == 3 ||
player.Data.RoleType == RoleTypes.Tracker && Options.TrackerAbility.GetValue() == 3 ||
player.Data.RoleType == RoleTypes.Detective && Options.DetectiveAbility.GetValue() == 3)
{
return true;
}
else return false;
}
public static bool IsTyrant(PlayerControl player)
{
if (player.Data.RoleType == RoleTypes.Impostor && Options.ImpostorAbility.GetValue() == 0 ||
player.Data.RoleType == RoleTypes.Shapeshifter && Options.ShapeshifterAbility.GetValue() == 0 ||
player.Data.RoleType == RoleTypes.Phantom && Options.PhantomAbility.GetValue() == 0 ||
player.Data.RoleType == RoleTypes.Viper && Options.ViperAbility.GetValue() == 0)
{
return true;
}
else return false;
}
public static bool IsStealer(PlayerControl player)
{
if (player.Data.RoleType == RoleTypes.Impostor && Options.ImpostorAbility.GetValue() == 1 ||
player.Data.RoleType == RoleTypes.Shapeshifter && Options.ShapeshifterAbility.GetValue() == 1 ||
player.Data.RoleType == RoleTypes.Phantom && Options.PhantomAbility.GetValue() == 1 ||
player.Data.RoleType == RoleTypes.Viper && Options.ViperAbility.GetValue() == 1)
{
return true;
}
else return false;
}
public static bool IsJuggernaut(PlayerControl player)
{
if (player.Data.RoleType == RoleTypes.Impostor && Options.ImpostorAbility.GetValue() == 2 ||
player.Data.RoleType == RoleTypes.Shapeshifter && Options.ShapeshifterAbility.GetValue() == 2 ||
player.Data.RoleType == RoleTypes.Phantom && Options.PhantomAbility.GetValue() == 2 ||
player.Data.RoleType == RoleTypes.Viper && Options.ViperAbility.GetValue() == 2)
{
return true;
}
else return false;
}
public static string RoleList()
{
if (!AmongUsClient.Instance.AmHost) return "";
var lines = new List<string>();
if (Options.CrewmateAbility.GetValue() != 4) lines.Add($"Crewmate: {Options.CrewmateAbility.GetString()}");
if (Options.ScientistAbility.GetValue() != 4) lines.Add($"Scientist: {Options.ScientistAbility.GetString()}");
if (Options.EngineerAbility.GetValue() != 4) lines.Add($"Engineer: {Options.EngineerAbility.GetString()}");
if (Options.NoisemakerAbility.GetValue() != 4) lines.Add($"Noisemaker: {Options.NoisemakerAbility.GetString()}");
if (Options.TrackerAbility.GetValue() != 4) lines.Add($"Tracker: {Options.TrackerAbility.GetString()}");
if (Options.DetectiveAbility.GetValue() != 4) lines.Add($"Detective: {Options.DetectiveAbility.GetString()}");
if (Options.ImpostorAbility.GetValue() != 3) lines.Add($"Impostor: {Options.ImpostorAbility.GetString()}");
if (Options.ShapeshifterAbility.GetValue() != 3) lines.Add($"Shapeshifter: {Options.ShapeshifterAbility.GetString()}");
if (Options.PhantomAbility.GetValue() != 3) lines.Add($"Phantom: {Options.PhantomAbility.GetString()}");
if (Options.ViperAbility.GetValue() != 3) lines.Add($"Viper: {Options.ViperAbility.GetString()}");
if (lines.Count == 0) return "";
return "ABILITIES:\n\n" + string.Join("\n", lines);
}
public static void SendRoleList(ChatController c, string text, bool moderator)
{
if (!AmongUsClient.Instance.AmHost) return;
if (string.IsNullOrEmpty(RoleList()) || Utils.isHideNSeek) return;
if (text.Length <= 120)
{
if (moderator) Utils.ModeratorChatCommand(text, "", false);
else Utils.ChatCommand(c, text, "", false);
return;
}
int splitIndex = text.LastIndexOf('\n', 120);
if (splitIndex <= 0) splitIndex = 120;
string first = text[..splitIndex];
string second = text[(splitIndex + 1)..];
if (moderator) Utils.ModeratorChatCommand(first, second, true);
else Utils.ChatCommand(c, first, second, true);
}
public static bool HandlingRoleMessages = false;
public static void SendRoleMessages()
{
if (!AmongUsClient.Instance.AmHost || Options.Gamemode.GetValue() > 1 || Utils.isHideNSeek) return;
if (string.IsNullOrEmpty(RoleList()) || PlayerControl.LocalPlayer.Data.IsDead)
{
HandlingRoleMessages = false;
return;
}
HandlingRoleMessages = true;
SendRoleList(DestroyableSingleton<HudManager>.Instance.Chat, AbilityManagement.RoleList(), true);
new LateTask(() =>
{
if (Utils.InGame)
{
Utils.ChatCommand(DestroyableSingleton<HudManager>.Instance.Chat, "Custom Abilities are on!\n\nIf you have one of the roles above, you also have the Ability next to it.", "", false);
}
else
{
Logger.Info("Role sending was forcefully canceled. This should not happen.", "SendRoleMessages");
}
HandlingRoleMessages = false;
}, 6.6f, "SendRoleMessage");
}
}
/*
public static class CustomRoleManagement
{
public static Dictionary<byte, string> PlayerRoles = new Dictionary<byte, string>();
@@ -116,7 +290,12 @@ public static class CustomRoleManagement
private static int PendingRoleMessages = 0;
public static void SendRoleMessages(Dictionary<string, string> roleMessages)
{
if (PlayerRoles.Count == 0 || PlayerControl.LocalPlayer.Data.IsDead) return;
if (PlayerRoles.Count == 0 || PlayerControl.LocalPlayer.Data.IsDead)
{
HandlingRoleMessages = false;
PendingRoleMessages = 0;
return;
}
HashSet<string> sentRoles = new HashSet<string>();
@@ -201,4 +380,5 @@ public static class CustomRoleManagement
}
return string.Join("\n", lines);
}
}
}
*/
+2 -20
View File
@@ -92,8 +92,6 @@ class FixedUpdateInGamePatch
break;
case 3: // Speedrun
if (settingsLabel == null)
Main.NormalOptions.TaskBarMode = 0;
break;
case 0: // Reset
@@ -102,22 +100,6 @@ class FixedUpdateInGamePatch
break;
}
if (__instance.Data.PlayerLevel != 0 && __instance.Data.PlayerLevel < Options.KickLowLevelPlayer.GetInt() - 1 && __instance.Data.ClientId != AmongUsClient.Instance.HostId)
{
if (!Options.TempBanLowLevelPlayer.GetBool())
{
AmongUsClient.Instance.KickPlayer(__instance.Data.ClientId, false);
Logger.Info($" {__instance.Data.PlayerName} was kicked for being under level {Options.KickLowLevelPlayer.GetInt()}", "KickLowLevelPlayer");
Logger.SendInGame($" {__instance.Data.PlayerName} was kicked for being under level {Options.KickLowLevelPlayer.GetInt()}");
}
else
{
AmongUsClient.Instance.KickPlayer(__instance.Data.ClientId, true);
Logger.Info($" {__instance.Data.PlayerName} was banned for being under level {Options.KickLowLevelPlayer.GetInt()} ", "BanLowLevelPlayer");
Logger.SendInGame($" {__instance.Data.PlayerName} was banned for being under level {Options.KickLowLevelPlayer.GetInt()}");
}
}
if (Utils.InGame && !Utils.IsMeeting && !ExileController.Instance)
{
// 2 = Shift and Seek
@@ -129,7 +111,7 @@ class FixedUpdateInGamePatch
Utils.ContinueEndGame((byte)GameOverReason.CrewmatesByVote);
Logger.Info($" Crewmates won because the game took longer than {Options.CrewAutoWinsGameAfter.GetInt()}s", "SNSManager");
NormalGameEndChecker.LastWinReason = $"Crewmates win! (Timer)\n\nImpostors:\n" + string.Join("\n", NormalGameEndChecker.imps.Select(p => p.Data.PlayerName));
NormalGameEndChecker.CheckWinnerText("SnSTimer");
}
}
// 3 = Speedrun
@@ -141,7 +123,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.LastWinReason = $"No one wins! (Timer)";
NormalGameEndChecker.CheckWinnerText("NoOneWin");
}
}
}
+2 -1
View File
@@ -214,7 +214,8 @@ namespace AmongUsRevamped
public enum TabGroup
{
SystemSettings,
CustomRoleSettings,
//CustomRoleSettings,
AbilitySettings,
ModSettings,
GamemodeSettings,
+33 -2
View File
@@ -10,15 +10,46 @@ public static class Translator
{
public enum SupportedLangs
{
English
English,
Italian,
SimplifiedChinese,
Spanish
}
private static readonly Dictionary<SupportedLangs, Dictionary<string, string>> _languages = new();
private static SupportedLangs _currentLang = SupportedLangs.English;
public static SupportedLangs _currentLang;
private static string LanguageFolder => $"{BanManager.DataPath}/Language";
public static void Init()
{
Logger.Info($" Among Us Revamped {Main.ModVersion}", "Init");
_currentLang = SupportedLangs.English;
if (!Directory.Exists(LanguageFolder)) Directory.CreateDirectory(LanguageFolder);
try
{
string path = $"{BanManager.DataPath}/Language/YourLanguage.txt";
if (!File.Exists(path))
{
Logger.Warn($" Creating a new language file", "Translator");
File.WriteAllText(path, "# In this file you can set your Among Us Revamped language.\n# To set the language, replace the 'English' text below with the language you want to select.\n# Supported languages: English, Spanish, SimplifiedChinese, Italian\n\nEnglish");
}
string l = File.ReadAllLines(path).FirstOrDefault(x => !string.IsNullOrWhiteSpace(x) && !x.StartsWith("#"))?.Trim() ?? "English";
if (Enum.TryParse(l, true, out SupportedLangs lang)) _currentLang = lang;
}
catch (IOException ex)
{
Logger.Exception(ex, "BanManager");
}
catch (UnauthorizedAccessException ex)
{
Logger.Exception(ex, "BanManager");
}
CheckLanguageFile(_currentLang);
LoadLanguage(_currentLang);
}
+54 -19
View File
@@ -72,13 +72,13 @@ public static class Utils
switch (tab)
{
case TabGroup.SystemSettings:
return "System Settings";
case TabGroup.CustomRoleSettings:
return "Custom Roles";
return Translator.Get("systemSettings");
case TabGroup.AbilitySettings:
return Translator.Get("abilitySettings");
case TabGroup.ModSettings:
return "Gameplay Settings";
return Translator.Get("gameplaySettings");
case TabGroup.GamemodeSettings:
return "Gamemode Settings";
return Translator.Get("gamemodeSettings");
default:
return "";
}
@@ -212,14 +212,24 @@ public static class Utils
NormalGameEndChecker.ImpCheckComplete = false;
CreateOptionsPickerPatch.SetDleks2 = false;
CanCallMeetings = true;
CustomRoleManagement.HandlingRoleMessages = false;
AbilityManagement.HandlingRoleMessages = false;
PlayerControlSetRolePatch.FirstAssign = true;
PlayerControlSetRolePatch.Jesters.Clear();
PlayerControlCompleteTaskPatch.playerTasksCompleted.Clear();
PlayerControlCompleteTaskPatch.tasksPerPlayer.Clear();
PlayerControlCompleteTaskPatch.tasksInitiated = false;
PlayerControlCompleteTaskPatch.ignoredCompletedTasks = 0;
PlayerControlCompleteTaskPatch.ignoredTasks = 0;
OnPlayerJoinedPatch.JoinNum = 0;
PlayerControlSetRolePatch.Seekers.Clear();
PlayerControlSetRolePatch.Jesters.Clear();
PlayerControlSetRolePatch.FirstAssign = true;
OnGameStartPatch.ScheduleExile = false;
CoShowIntroPatch.IntroInitiated = false;
}
public static PlayerControl[] AllAlivePlayerControls
@@ -355,21 +365,10 @@ public static class Utils
return false;
}
public static void SendPrivateMessage(PlayerControl target, string message)
{
if (!AmongUsClient.Instance.AmHost || PlayerControl.LocalPlayer == null || target == null || target.Data.ClientId == 255) return;
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, 13, SendOption.Reliable, target.Data.ClientId);
writer.Write(message);
writer.Write(PlayerControl.LocalPlayer.PlayerId);
AmongUsClient.Instance.FinishRpcImmediately(writer);
}
public static void ChatCommand(ChatController __instance, string msg, string msg2, bool multi)
{
if (OnGameJoinedPatch.WaitingForChat) return;
OnGameJoinedPatch.WaitingForChat = true;
__instance.freeChatField.textArea.Clear();
@@ -400,6 +399,8 @@ public static class Utils
public static void ModeratorChatCommand(string msg, string msg2, bool multi)
{
if (OnGameJoinedPatch.WaitingForChat) return;
OnGameJoinedPatch.WaitingForChat = true;
new LateTask(() =>
@@ -541,4 +542,38 @@ public static class Utils
PlayerControl.LocalPlayer.CmdReportDeadBody(null);
MeetingHud.Instance.RpcClose();
}
public static MethodBase GetStateMachineMoveNext<T>(string methodName)
{
var typeName = typeof(T).FullName;
var stateMachine = typeof(T).GetNestedTypes().FirstOrDefault(x => x.Name.Contains(methodName));
if (stateMachine == null)
{
Logger.Error($"Failed to find {methodName} state machine for {typeName}", "GetStateMachineMoveNext");
return null;
}
var moveNext = AccessTools.Method(stateMachine, "MoveNext");
if (moveNext == null)
{
Logger.Error($"Failed to find MoveNext method for {typeName}.{methodName}", "GetStateMachineMoveNext");
return null;
}
// Logger.Info($"Found {methodName}.MoveNext", "GetStateMachineMoveNext");
return moveNext;
}
public static readonly Dictionary<byte, string> StoredRoleText = new();
public static string GetRoleText(PlayerControl p)
{
if (p == null) return "";
if (p.Data.RoleType == RoleTypes.Impostor || p.Data.RoleType == RoleTypes.Shapeshifter || p.Data.RoleType == RoleTypes.Phantom || p.Data.RoleType == RoleTypes.Viper || p.Data.RoleType == RoleTypes.ImpostorGhost)
{
return $"<color=#ff1919>{p.Data.RoleType}</color>";
}
else return $"<color=#8cffff>{p.Data.RoleType}</color>";
}
}
+328 -57
View File
@@ -1,6 +1,7 @@
using Hazel;
using InnerNet;
using System;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
@@ -107,7 +108,7 @@ internal static class SendChatPatch
__instance.freeChatField.textArea.SetText(string.Empty);
return false;
}
if (text == "/h" || text == "/help")
if (text == "/help")
{
HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, $"{Translator.Get("allCommandsFull")}");
__instance.freeChatField.textArea.Clear();
@@ -118,6 +119,8 @@ internal static class SendChatPatch
if (text == "/s" || text == "/start")
{
GameStartManager.Instance.BeginGame();
__instance.freeChatField.textArea.Clear();
__instance.freeChatField.textArea.SetText(string.Empty);
return false;
}
@@ -143,65 +146,275 @@ internal static class SendChatPatch
return false;
}
if (__instance.timeSinceLastMessage < 3f || OnGameJoinedPatch.WaitingForChat || CustomRoleManagement.HandlingRoleMessages) return false;
if (text.StartsWith("/vip "))
{
PlayerControl target = null;
string arg = text.Substring(5).Trim();
if (text == "/l" || text == "/lastgame" || text == "/win" || text == "/winner")
foreach (PlayerControl p in PlayerControl.AllPlayerControls)
{
if (p.Data == null || p == PlayerControl.LocalPlayer) continue;
if (p.Data.PlayerName.Equals(arg, StringComparison.OrdinalIgnoreCase))
{
target = p;
break;
}
}
if (target == null)
{
HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, Translator.Get("permFail", arg));
}
else
{
File.AppendAllText(BanManager.VipListPath, "\n" + target.Data.FriendCode);
HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, Translator.Get("vipAdd", target.Data.PlayerName));
}
__instance.freeChatField.textArea.Clear();
__instance.freeChatField.textArea.SetText(string.Empty);
return false;
}
if (text.StartsWith("/moderator "))
{
PlayerControl target = null;
string arg = text.Substring(11).Trim();
foreach (PlayerControl p in PlayerControl.AllPlayerControls)
{
if (p.Data == null || p == PlayerControl.LocalPlayer) continue;
if (p.Data.PlayerName.Equals(arg, StringComparison.OrdinalIgnoreCase))
{
target = p;
break;
}
}
if (target == null)
{
HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, Translator.Get("permFail", arg));
}
else
{
File.AppendAllText(BanManager.ModeratorListPath, "\n" + target.Data.FriendCode);
HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, Translator.Get("moderatorAdd", target.Data.PlayerName));
}
__instance.freeChatField.textArea.Clear();
__instance.freeChatField.textArea.SetText(string.Empty);
return false;
}
if (text.StartsWith("/admin "))
{
PlayerControl target = null;
string arg = text.Substring(7).Trim();
foreach (PlayerControl p in PlayerControl.AllPlayerControls)
{
if (p.Data == null || p == PlayerControl.LocalPlayer) continue;
if (p.Data.PlayerName.Equals(arg, StringComparison.OrdinalIgnoreCase))
{
target = p;
break;
}
}
if (target == null)
{
HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, Translator.Get("permFail", arg));
}
else
{
File.AppendAllText(BanManager.AdminListPath, "\n" + target.Data.FriendCode);
HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, Translator.Get("adminAdd", target.Data.PlayerName));
}
__instance.freeChatField.textArea.Clear();
__instance.freeChatField.textArea.SetText(string.Empty);
return false;
}
if (text.StartsWith("/removevip "))
{
PlayerControl target = null;
string arg = text.Substring(11).Trim();
foreach (PlayerControl p in PlayerControl.AllPlayerControls)
{
if (p.Data == null || p == PlayerControl.LocalPlayer) continue;
if (p.Data.PlayerName.Equals(arg, StringComparison.OrdinalIgnoreCase))
{
target = p;
break;
}
}
if (target == null)
{
HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, Translator.Get("permFail", arg));
}
else
{
File.WriteAllLines(BanManager.VipListPath, File.ReadAllLines(BanManager.VipListPath).Where(x => x.Trim() != target.Data.FriendCode));
HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, Translator.Get("vipRemove", target.Data.PlayerName));
}
__instance.freeChatField.textArea.Clear();
__instance.freeChatField.textArea.SetText(string.Empty);
return false;
}
if (text.StartsWith("/removemoderator "))
{
PlayerControl target = null;
string arg = text.Substring(17).Trim();
foreach (PlayerControl p in PlayerControl.AllPlayerControls)
{
if (p.Data == null || p == PlayerControl.LocalPlayer) continue;
if (p.Data.PlayerName.Equals(arg, StringComparison.OrdinalIgnoreCase))
{
target = p;
break;
}
}
if (target == null)
{
HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, Translator.Get("permFail", arg));
}
else
{
File.WriteAllLines(BanManager.ModeratorListPath, File.ReadAllLines(BanManager.ModeratorListPath).Where(x => x.Trim() != target.Data.FriendCode));
HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, Translator.Get("moderatorRemove", target.Data.PlayerName));
}
__instance.freeChatField.textArea.Clear();
__instance.freeChatField.textArea.SetText(string.Empty);
return false;
}
if (text.StartsWith("/removeadmin "))
{
PlayerControl target = null;
string arg = text.Substring(13).Trim();
foreach (PlayerControl p in PlayerControl.AllPlayerControls)
{
if (p.Data == null || p == PlayerControl.LocalPlayer) continue;
if (p.Data.PlayerName.Equals(arg, StringComparison.OrdinalIgnoreCase))
{
target = p;
break;
}
}
if (target == null)
{
HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, Translator.Get("permFail", arg));
}
else
{
File.WriteAllLines(BanManager.AdminListPath, File.ReadAllLines(BanManager.AdminListPath).Where(x => x.Trim() != target.Data.FriendCode));
HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, Translator.Get("adminRemove", target.Data.PlayerName));
}
__instance.freeChatField.textArea.Clear();
__instance.freeChatField.textArea.SetText(string.Empty);
return false;
}
if (__instance.timeSinceLastMessage < 3f || OnGameJoinedPatch.WaitingForChat || AbilityManagement.HandlingRoleMessages) return false;
if (text == "/l" || text == "/lastgame")
{
if (string.IsNullOrEmpty(NormalGameEndChecker.LastWinReason) || Utils.InGame) return false;
Utils.ChatCommand(__instance, $"{NormalGameEndChecker.LastWinReason}", "", false);
return false;
}
}
if (text == "/r jester"){
Utils.ChatCommand(__instance, Translator.Get("jesterPublic"), "", false);
Utils.ChatCommand(__instance, "Jester:\n\nThe Jester is a Crewmate who can also win alone by getting voted.", "", false);
return false;}
if (text == "/r mayor"){
Utils.ChatCommand(__instance, Translator.Get("mayorPublic", Options.MayorExtraVoteCount.GetInt()), "", false);
Utils.ChatCommand(__instance, $"Mayor:\n\nThe Mayor is a Crewmate with {Options.ExtraVotesCrewmate.GetInt()} additional vote(s). Use them wisely.", "", false);
return false;}
if (text == "/aur" || text == "/amongusrevamped" || text == "/socials")
if (text == "/r tyrant"){
Utils.ChatCommand(__instance, $"Tyrant:\n\nThe Tyrant is an Impostor with {Options.ExtraVotesImpostor.GetInt()} additional vote(s). Use them wisely.", "", false);
return false;}
if (text == "/r workhorse"){
Utils.ChatCommand(__instance, $"Workhorse:\n\nThe Workhorse gains {Options.ExtraVotesPerTask.GetInt()} additional vote(s) per completed task. Votes are rounded down.", "", false);
return false;}
if (text == "/r stealer"){
Utils.ChatCommand(__instance, $"Stealer:\n\nThe Stealer gains {Options.ExtraVotesPerKill.GetInt()} additional vote(s) per killed player. Votes are rounded down.", "", false);
return false;}
if (text == "/r juggernaut"){
Utils.ChatCommand(__instance, $"Juggernaut:\n\nThe Impostors instantly win if the Juggernaut gains {Options.KillsNeededForJuggernaut.GetInt()} kills.", "", false);
return false;}
if (text == "/r tasker"){
Utils.ChatCommand(__instance, "Tasker:\n\nThe Crewmates win if the Tasker completes tasks and is alive. The Tasker has more tasks.", "", false);
return false;}
if (text == "/aur" || text == "/socials")
{
Utils.ChatCommand(__instance, Translator.Get("socialsAll"), "", false);
Utils.ChatCommand(__instance, "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);
return false;
}
if (text == "/0kc" || text == "/0killcooldown")
{
Utils.ChatCommand(__instance, Translator.Get("noKcdMode"), "", false);
Utils.ChatCommand(__instance, "0 Kill Cooldown:\n\nImpostors have no kill cooldown, Crewmates have low tasks\nThink fast and pay attention!", "", false);
return false;
}
if (text == "/sns" || text == "/shiftandseek")
{
Utils.ChatCommand(__instance, Translator.Get("SnSModeOne"), Translator.Get("SnSModeTwo", Options.CrewAutoWinsGameAfter.GetInt(), Options.CantKillTime.GetInt(), Options.MisfiresToSuicide.GetInt()), true);
if (Options.MisfiresToSuicide.GetInt() == 1 || Options.CantKillTime.GetInt() == 0)
{
Utils.ChatCommand(__instance, "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.ChatCommand(__instance, "Shift and Seek:\n\nImpostors can only kill someone while shapeshifted as them\nEmergency Meetings = Off", $"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);
}
return false;
}
if (text == "/sp" || text == "/sr" || text == "/speedrun")
if (text == "/sr" || text == "/speedrun")
{
Utils.ChatCommand(__instance, Translator.Get("speedrunMode", Options.GameAutoEndsAfter.GetInt()), "", false);
Utils.ChatCommand(__instance, $"Speedrun:\n\nEveryone is a crewmate. The 1st player to finish tasks wins the game. Game auto ends after {Options.GameAutoEndsAfter.GetInt()}s", "", false);
return false;
}
if (text == "/r" || text == "/roles" || text == "/gamemode" || text == "/gm")
if (text == "/r" || text == "/roles")
{
switch (Options.Gamemode.GetValue())
{
case 0:
Utils.ChatCommand(__instance, $"Enabled Custom Roles:\n\n{CustomRoleManagement.GetActiveRoles()}", "", false);
AbilityManagement.SendRoleList(__instance, AbilityManagement.RoleList(), false);
break;
case 1:
Utils.ChatCommand(__instance, Translator.Get("noKcdMode"), "", false);
Utils.ChatCommand(__instance, "0 Kill Cooldown:\n\nImpostors have no kill cooldown, Crewmates have low tasks\nThink fast and pay attention!", "", false);
break;
case 2:
Utils.ChatCommand(__instance, Translator.Get("SnSModeOne"), Translator.Get("SnSModeTwo", Options.CrewAutoWinsGameAfter.GetInt(), Options.CantKillTime.GetInt(), Options.MisfiresToSuicide.GetInt()), true);
if (Options.MisfiresToSuicide.GetInt() == 1 || Options.CantKillTime.GetInt() == 0)
{
Utils.ChatCommand(__instance, "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.ChatCommand(__instance, "Shift and Seek:\n\nImpostors can only kill someone while shapeshifted as them\nEmergency Meetings = Off", $"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);
}
break;
case 3:
Utils.ChatCommand(__instance, Translator.Get("speedrunMode", Options.GameAutoEndsAfter.GetInt()), "", false);
Utils.ChatCommand(__instance, $"Speedrun:\n\nEveryone is a crewmate. The 1st player to finish tasks wins the game. Game auto ends after {Options.GameAutoEndsAfter.GetInt()}s", "", false);
break;
}
@@ -210,8 +423,33 @@ internal static class SendChatPatch
__instance.freeChatField.textArea.SetText(string.Empty);
return false;
}
if (text.StartsWith("/t "))
{
string templateName = text[3..].Trim().ToLower();
if (BanManager.Templates.TryGetValue(templateName, out string templateMessage))
{
if (templateMessage.Length < 121)
{
Utils.ChatCommand(__instance, BanManager.CheckTemplate(templateMessage), "", false);
}
else
{
HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, Translator.Get("tooLongTemplate"));
}
}
else
{
Logger.Info($"Could not find template '{templateName}'", "TemplateManager");
HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, $"Template '{templateName}' not found.");
}
__instance.freeChatField.textArea.Clear();
__instance.freeChatField.textArea.SetText(string.Empty);
return false;
}
bool col1 = text.StartsWith("/col ") || text.StartsWith("/cor ");
bool col1 = text.StartsWith("/col ");
bool col2 = text.StartsWith("/color ");
bool col3 = text.StartsWith("/colour ");
@@ -243,10 +481,10 @@ internal static class SendChatPatch
if (!isKick && !isBan && !isColorKick && !isColorBan)
{
__instance.freeChatField.textArea.SetText(converted);
Utils.ChatCommand(__instance, $"{converted}", "", false);
//__instance.freeChatField.textArea.SetText(converted);
//Utils.ChatCommand(__instance, $"{converted}", "", false);
Logger.Info($" {PlayerControl.LocalPlayer.Data.PlayerName}: {msgtext}", "SendChat");
return false;
return true;
}
string arg = text.Substring(isKick ? 6 : isBan ? 5 : isColorKick ? 7 : isColorBan ? 6 : 0).Trim();
@@ -336,7 +574,7 @@ public static class RPCHandlerPatch
BanManager.IsWordBanned(__instance, text);
bool col1 = text.StartsWith("/col ") || text.StartsWith("/cor ");
bool col1 = text.StartsWith("/col ");
bool col2 = text.StartsWith("/color ");
bool col3 = text.StartsWith("/colour ");
@@ -400,28 +638,7 @@ public static class RPCHandlerPatch
}
}
if (CustomRoleManagement.HandlingRoleMessages || OnGameJoinedPatch.WaitingForChat) return;
if (text == "/h" || text == "/help")
{
if (Utils.CheckAccessLevel(__instance.Data.FriendCode) < Options.SlashHelpAndAurCmd.GetValue()) return;
OnGameJoinedPatch.WaitingForChat = true;
new LateTask(() =>
{
Utils.SendPrivateMessage(__instance, Translator.Get("allCommandsOne"));
}, 2.2f, "MHP1");
new LateTask(() =>
{
Utils.SendPrivateMessage(__instance, Translator.Get("allCommandsTwo"));
}, 4.4f, "MHP2");
new LateTask(() =>
{
OnGameJoinedPatch.WaitingForChat = false;
}, 6.6f, "MHP3");
}
if (AbilityManagement.HandlingRoleMessages || OnGameJoinedPatch.WaitingForChat || GameStartManagerUpdatePatch.CountingDown) return;
if (text == "/eg" || text == "/endgame")
{
@@ -446,60 +663,114 @@ public static class RPCHandlerPatch
GameStartManager.Instance.BeginGame();
}
if (text == "/l" || text == "/lastgame" || text == "/win" || text == "/winner")
if (text == "/l" || text == "/lastgame")
{
if (Utils.CheckAccessLevel(__instance.Data.FriendCode) < Options.SlashLastGameCmd.GetValue()) return;
if (string.IsNullOrEmpty(NormalGameEndChecker.LastWinReason) || Utils.InGame) return;
Utils.ModeratorChatCommand($"{NormalGameEndChecker.LastWinReason}", "", false);
}
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);
}
if (text == "/0kc" || text == "/0killcooldown")
{
if (Utils.CheckAccessLevel(__instance.Data.FriendCode) < Options.SlashRolesAndGamemodeCmd.GetValue()) return;
Utils.ModeratorChatCommand(Translator.Get("noKcdMode"), "", false);
Utils.ModeratorChatCommand("0 Kill Cooldown:\n\nImpostors have no kill cooldown, Crewmates have low tasks\nThink fast and pay attention!", "", false);
}
if (text == "/sns" || text == "/shiftandseek")
{
if (Utils.CheckAccessLevel(__instance.Data.FriendCode) < Options.SlashRolesAndGamemodeCmd.GetValue()) return;
Utils.ModeratorChatCommand(Translator.Get("SnSModeOne"), Translator.Get("SnSModeTwo", Options.CrewAutoWinsGameAfter.GetInt(), Options.CantKillTime.GetInt(), Options.MisfiresToSuicide.GetInt()), true);
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", $"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);
}
}
if (text == "/sp" || text == "/sr" || text == "/speedrun")
if (text == "/sr" || text == "/speedrun")
{
if (Utils.CheckAccessLevel(__instance.Data.FriendCode) < Options.SlashRolesAndGamemodeCmd.GetValue()) return;
Utils.ModeratorChatCommand(Translator.Get("speedrunMode", Options.GameAutoEndsAfter.GetInt()), "", false);
Utils.ModeratorChatCommand($"Speedrun:\n\nEveryone is a crewmate. The 1st player to finish tasks wins the game. Game auto ends after {Options.GameAutoEndsAfter.GetInt()}s", "", false);
}
if (text == "/r" || text == "/roles" || text == "/gamemode" || text == "/gm")
if (text == "/r" || text == "/roles")
{
if (Utils.CheckAccessLevel(__instance.Data.FriendCode) < Options.SlashRolesAndGamemodeCmd.GetValue()) return;
switch (Options.Gamemode.GetValue())
{
case 0:
Utils.ModeratorChatCommand($"Enabled Custom Roles:\n\n{CustomRoleManagement.GetActiveRoles()}", "", false);
AbilityManagement.SendRoleList(DestroyableSingleton<HudManager>.Instance.Chat, AbilityManagement.RoleList(), true);
break;
case 1:
Utils.ModeratorChatCommand(Translator.Get("noKcdMode"), "", false);
Utils.ModeratorChatCommand("0 Kill Cooldown:\n\nImpostors have no kill cooldown, Crewmates have low tasks\nThink fast and pay attention!", "", false);
break;
case 2:
Utils.ModeratorChatCommand(Translator.Get("SnSModeOne"), Translator.Get("SnSModeTwo", Options.CrewAutoWinsGameAfter.GetInt(), Options.CantKillTime.GetInt(), Options.MisfiresToSuicide.GetInt()), true);
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", $"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);
}
break;
case 3:
Utils.ModeratorChatCommand(Translator.Get("speedrunMode", Options.GameAutoEndsAfter.GetInt()), "", false);
Utils.ModeratorChatCommand($"Speedrun:\n\nEveryone is a crewmate. The 1st player to finish tasks wins the game. Game auto ends after {Options.GameAutoEndsAfter.GetInt()}s", "", false);
break;
}
}
if (Utils.CheckAccessLevel(__instance.Data.FriendCode) < Options.SlashRolesAndGamemodeCmd.GetValue()) return;
if (text == "/r jester"){
Utils.ModeratorChatCommand(Translator.Get("jesterPublic"), "", false);}
Utils.ModeratorChatCommand("Jester:\n\nThe Jester is a Crewmate who can also win alone by getting voted.", "", false);}
if (text == "/r mayor"){
Utils.ModeratorChatCommand(Translator.Get("mayorPublic", Options.MayorExtraVoteCount.GetInt()), "", false);}
Utils.ModeratorChatCommand($"Mayor:\n\nThe Mayor is a Crewmate with {Options.ExtraVotesCrewmate.GetInt()} additional vote(s). Use them wisely.", "", false);}
if (text == "/r tyrant"){
Utils.ModeratorChatCommand($"Tyrant:\n\nThe Tyrant is an Impostor with {Options.ExtraVotesImpostor.GetInt()} additional vote(s). Use them wisely.", "", false);}
if (text == "/r workhorse"){
Utils.ModeratorChatCommand($"Workhorse:\n\nThe Workhorse gains {Options.ExtraVotesPerTask.GetInt()} additional vote(s) per completed task. Votes are rounded down.", "", false);}
if (text == "/r stealer"){
Utils.ModeratorChatCommand($"Stealer:\n\nThe Stealer gains {Options.ExtraVotesPerKill.GetInt()} additional vote(s) per killed player. Votes are rounded down.", "", false);}
if (text == "/r juggernaut"){
Utils.ModeratorChatCommand($"Juggernaut:\n\nThe Impostors instantly win if the Juggernaut gains {Options.KillsNeededForJuggernaut.GetInt()} kills.", "", false);}
if (text == "/r tasker"){
Utils.ModeratorChatCommand("Tasker:\n\nThe Crewmates win if the Tasker completes tasks and is alive. The Tasker has more tasks.", "", false);}
if (text.StartsWith("/t "))
{
string templateName = text[3..].Trim().ToLower();
if (BanManager.Templates.TryGetValue(templateName, out string templateMessage))
{
if (templateMessage.Length < 121)
{
Utils.ModeratorChatCommand(BanManager.CheckTemplate(templateMessage), "", false);
}
else
{
HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, Translator.Get("tooLongTemplate"));
}
}
}
break;
}
}
+12 -12
View File
@@ -10,11 +10,13 @@ namespace AmongUsRevamped
public static class OptionsMenuBehaviourStartPatch
{
private static ClientOptionItem GM;
private static ClientOptionItem UnlockFPS;
private static ClientOptionItem ShowFPS;
private static ClientOptionItem AutoStart;
private static ClientOptionItem DarkTheme;
private static ClientOptionItem LobbyMusic;
private static ClientOptionItem DisableInfoWhenDead;
private static ClientOptionItem DisableCommandHelper;
private static ClientOptionItem DisableCompatibilityWarning;
public static void Postfix(OptionsMenuBehaviour __instance)
{
@@ -31,20 +33,12 @@ namespace AmongUsRevamped
}
}
if (UnlockFPS == null || UnlockFPS.ToggleButton == null)
{
UnlockFPS = ClientOptionItem.Create(Translator.Get("unlockFPS"), Main.UnlockFps, __instance, UnlockFPSButtonToggle);
static void UnlockFPSButtonToggle()
{
Application.targetFrameRate = Main.UnlockFps.Value ? 120 : 60;
Logger.SendInGame($"FPS Set To {Application.targetFrameRate}");
}
}
if (ShowFPS == null || ShowFPS.ToggleButton == null)
ShowFPS = ClientOptionItem.Create(Translator.Get("showFPS"), Main.ShowFps, __instance);
if (DisableInfoWhenDead == null || DisableInfoWhenDead.ToggleButton == null)
DisableInfoWhenDead = ClientOptionItem.Create(Translator.Get("disableInfoWhenDead"), Main.DisableInfoWhenDead, __instance);
if (AutoStart == null || AutoStart.ToggleButton == null)
{
AutoStart = ClientOptionItem.Create(Translator.Get("autoStart"), Main.AutoStart, __instance, AutoStartButtonToggle);
@@ -65,6 +59,12 @@ namespace AmongUsRevamped
if (LobbyMusic == null || LobbyMusic.ToggleButton == null)
LobbyMusic = ClientOptionItem.Create(Translator.Get("enableLobbyMusic"), Main.LobbyMusic, __instance);
if (DisableCommandHelper == null || DisableCommandHelper.ToggleButton == null)
DisableCommandHelper = ClientOptionItem.Create(Translator.Get("disableCommandHelper"), Main.DisableCommandHelper, __instance);
if (DisableCompatibilityWarning == null || DisableCompatibilityWarning.ToggleButton == null)
DisableCompatibilityWarning = ClientOptionItem.Create(Translator.Get("disableCompatibilityWarning"), Main.DisableCompatibilityWarning, __instance);
}
}
+58 -2
View File
@@ -1,4 +1,5 @@
using System;
using BepInEx.Unity.IL2CPP;
using System;
using System.Text;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using TMPro;
@@ -180,6 +181,7 @@ namespace AmongUsRevamped
private static PassiveButton template;
private static PassiveButton discordButton;
private static PassiveButton gitHubButton;
private static PassiveButton animationSceneButton;
private static Transform buttonParent;
public static void Postfix(MainMenuManager __instance)
{
@@ -212,6 +214,18 @@ namespace AmongUsRevamped
"GitHub");
}
if (animationSceneButton == null)
{
animationSceneButton = CreateButton(
__instance,
"AnimationTestSceneButton",
new(0f, 2.65f, 1f),
new(139, 0, 0, byte.MaxValue),
new(255, 127, 127, byte.MaxValue),
() => SceneChanger.ChangeScene("AnimationTestScene"),
"Animation Tester");
}
var bg = GameObject.Find("BackgroundTexture");
if (bg != null)
{
@@ -230,6 +244,24 @@ namespace AmongUsRevamped
div.SetActive(false);
}
var logo = GameObject.Find("MainUI/AspectScaler/LeftPanel/Sizer/LOGO-AU");
if (logo != null)
{
logo.SetActive(false);
}
var h1 = GameObject.Find("AccountManager/AccountTab/GameHeader/BarSprite/FriendsButton/Highlight/NewRequestActive/Text_TMP");
if (h1 != null)
{
Object.Destroy(h1);
}
var h2 = GameObject.Find("AccountManager/AccountTab/GameHeader/BarSprite/FriendsButton/Highlight/NewRequestActive/Background");
if (h2 != null)
{
Object.Destroy(h2);
}
Transform tintTrans = __instance.transform.Find("MainUI/Tint");
var tint = tintTrans.gameObject;
@@ -290,7 +322,14 @@ namespace AmongUsRevamped
button.name = name;
button.transform.localPosition = localPosition;
button.transform.localScale = new Vector3(0.8f, 1f, 1f);
if (name == "GitHubButton" || name == "DiscordButton")
{
button.transform.localScale = new Vector3(0.8f, 1f, 1f);
}
else
{
button.transform.localScale = new Vector3(1.8f, 1.6f, 1f);
}
var aspect = button.GetComponent<AspectPosition>();
if (aspect != null)
@@ -317,6 +356,23 @@ namespace AmongUsRevamped
return button;
}
}
[HarmonyPatch(typeof(SignInStatusComponent), nameof(SignInStatusComponent.SetOnline))]
public static class SignInStatusComponentSetOnlinePatch
{
private static void Postfix()
{
int pluginCount = IL2CPPChainloader.Instance.Plugins.Count;
Logger.Info($" {pluginCount} Plugins detected", "PluginCheck");
if (pluginCount > 1 && !Main.DisableCompatibilityWarning.Value)
{
DisconnectPopup.Instance.gameObject.SetActive(true);
DisconnectPopup.Instance._textArea.enableWordWrapping = false;
DisconnectPopup.Instance._textArea.text = Translator.Get("pluginWarning");
}
}
}
}
#if !ANDROID
+2 -5
View File
@@ -27,7 +27,6 @@ internal static class DisableDevice
["AirshipRecordsAdmin"] = new(19.89f, 12.60f),
["AirshipCamera"] = new(8.10f, -9.63f),
["AirshipVital"] = new(25.24f, -7.94f),
["FungleCamera"] = new(6.20f, 0.10f),
["FungleVital"] = new(-2.50f, -9.80f),
["SubmergedVital"] = new(5f, 32.54f),
["SubmergedLeftAdmin"] = new(-9.45f, 10.16f),
@@ -58,7 +57,7 @@ internal static class DisableDevice
foreach (PlayerControl pc in Main.AllPlayerControls)
{
if (pc.Data.IsDead || Main.GM.Value && pc == PlayerControl.LocalPlayer) return;
if (pc.Data.IsDead || (Main.GM.Value && pc == PlayerControl.LocalPlayer)) continue;
try
{
@@ -98,7 +97,6 @@ internal static class DisableDevice
if (Options.DisableAirshipVital.GetBool()) doComms |= Vector2.Distance(PlayerPos, DevicePos["AirshipVital"]) <= UsableDistance;
break;
case 5:
if (Options.DisableFungleCamera.GetBool()) doComms |= Vector2.Distance(PlayerPos, DevicePos["FungleCamera"]) <= UsableDistance;
if (Options.DisableFungleVital.GetBool()) doComms |= Vector2.Distance(PlayerPos, DevicePos["FungleVital"]) <= UsableDistance;
break;
}
@@ -148,7 +146,7 @@ public class RemoveDisableDevicesPatch
{
public static void Postfix()
{
if (!Options.DisableDevices.GetBool()) return;
if (!Options.DisableDevices.GetBool() || !AmongUsClient.Instance.AmHost) return;
UpdateDisableDevices();
}
@@ -190,7 +188,6 @@ public class RemoveDisableDevicesPatch
if (Options.DisableAirshipVital.GetBool()) consoles.DoIf(x => x.name == "panel_vitals", x => x.gameObject.GetComponent<CircleCollider2D>().enabled = false);
break;
case 5:
if (Options.DisableFungleCamera.GetBool()) consoles.DoIf(x => x.name == "BinocularsSecurityConsole", x => x.gameObject.GetComponent<PolygonCollider2D>().enabled = false);
if (Options.DisableFungleVital.GetBool()) consoles.DoIf(x => x.name == "VitalsConsole", x => x.gameObject.GetComponent<BoxCollider2D>().enabled = false);
break;
}
+21 -14
View File
@@ -1,28 +1,31 @@
using System;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.SceneManagement;
namespace AmongUsRevamped;
[HarmonyPatch(typeof(AmongUsDateTime), nameof(AmongUsDateTime.UtcNow), MethodType.Getter)]
public static class AmongUsDateTime_UtcNow
{
public static bool Prefix(ref Il2CppSystem.DateTime __result)
{
if (!CreateOptionsPickerPatch.SetDleks) return true;
var managedDate = new DateTime(DateTime.UtcNow.Year, 4, 2, 7, 1, 0, DateTimeKind.Utc);
__result = new Il2CppSystem.DateTime(managedDate.Ticks);
return false;
}
}
class CreateOptionsPickerPatch
{
public static bool SetDleks = false;
public static bool SetDleks2;
private static bool InitiatedDleks;
private static bool isSkeldFlipped = false;
public static bool FlippedSkeld
{
get => isSkeldFlipped;
set
{
if (AmongUsClient.Instance == null || isSkeldFlipped == value) return;
AssetReference temp = AmongUsClient.Instance.ShipPrefabs[3];
AmongUsClient.Instance.ShipPrefabs[3] = AmongUsClient.Instance.ShipPrefabs[0];
AmongUsClient.Instance.ShipPrefabs[0] = temp;
isSkeldFlipped = value;
}
}
private static MapSelectButton DleksButton;
[HarmonyPatch]
public static class GameOptionsMapPickerPatch
@@ -80,6 +83,8 @@ class CreateOptionsPickerPatch
dlekS_ehT_MapButton.Button.OnClick.RemoveAllListeners();
dlekS_ehT_MapButton.Button.OnClick.AddListener((UnityEngine.Events.UnityAction)(() =>
{
FlippedSkeld = true;
__instance.SelectMap(__instance.AllMapIcons[0]);
if (__instance.selectedButton)
@@ -136,6 +141,8 @@ class CreateOptionsPickerPatch
if (__instance.MapName == null) return false;
FlippedSkeld = (__instance.selectedMapId == 3);
if (DleksButton != null) SetDleks = __instance.selectedMapId == 3;
if (__instance.selectedMapId == 3)
+33 -5
View File
@@ -53,29 +53,57 @@ class NormalGameEndChecker
if (Winner == "Jester")
{
LastWinReason = $"Jester wins! (Voted)\n\nImpostors: {impostorList}" + (string.IsNullOrEmpty(customRoles) ? "" : "\n\n" + customRoles);
LastWinReason = "Jester wins! (voted)\n\nImpostors: " + impostorList;
canUpdateWinnerText = false;
return;
}
if (Winner == "Juggernaut")
{
LastWinReason = $"Impostors win! (Juggernaut killed {Options.KillsNeededForJuggernaut.GetInt()} players)\n\nImpostors: " + impostorList;
canUpdateWinnerText = false;
return;
}
if (Winner == "Speedrunner")
{
LastWinReason = "Crewmates win! (Tasker finished tasks)\n\nImpostors: " + impostorList;
canUpdateWinnerText = false;
return;
}
if (Winner == "SnSTimer")
{
LastWinReason = $"Crewmates Win! (Survived {Options.CrewAutoWinsGameAfter.GetInt()}s)\n\n Impostors: " + impostorList;
canUpdateWinnerText = false;
return;
}
if (Winner == "NoOneWinsSpeedrun")
{
LastWinReason = $"No one wins. ({Options.GameAutoEndsAfter.GetInt()}s Timer)";
canUpdateWinnerText = false;
return;
}
if (Utils.AliveImpostors == 0 || Winner == "Crewmate")
{
LastWinReason = $"Crewmates win!\n\nImpostors: {impostorList}" + (string.IsNullOrEmpty(customRoles) ? "" : "\n\n" + customRoles);
LastWinReason = "Crewmates Win!\n\nImpostors: " + impostorList;
canUpdateWinnerText = false;
}
else if (Utils.AliveImpostors >= Utils.AliveCrewmates || Winner == "Impostor")
{
LastWinReason = $"Impostors win!\n\nImpostor: {impostorList}" + (string.IsNullOrEmpty(customRoles) ? "" : "\n\n" + customRoles);
LastWinReason = "Impostors Win!\n\nImpostors: " + impostorList;
canUpdateWinnerText = false;
}
else if (GameData.Instance != null && GameData.Instance.TotalTasks > 0 && GameData.Instance.CompletedTasks >= GameData.Instance.TotalTasks || Winner == "CrewmateTasks")
{
LastWinReason = $"Crewmates win! ({Options.TaskPercentNeededToWin.GetInt()}% Tasks)\n\nImpostors: {impostorList}" + (string.IsNullOrEmpty(customRoles) ? "" : "\n\n" + customRoles);
LastWinReason = $"Crewmates Win! ({Options.TaskPercentNeededToWin.GetInt()}% tasks completed)\n\nImpostors: " + impostorList;
canUpdateWinnerText = false;
}
else if (Options.Gamemode.GetValue() < 2 || Winner == "ImpostorSabotage")
{
LastWinReason = $"Impostors win! (Sabotage)\n\nImpostors: {impostorList}" + (string.IsNullOrEmpty(customRoles) ? "" : "\n\n" + customRoles);
LastWinReason = "Impostors Win! (Sabotage)\n\n Impostors: " + impostorList;
}
}
}
+51 -65
View File
@@ -1,88 +1,74 @@
using System.Reflection;
using Il2CppInterop.Runtime.InteropTypes;
namespace AmongUsRevamped;
[HarmonyPatch]
class ExileControllerWrapUpPatch
{
[HarmonyPatch(typeof(ExileController), nameof(ExileController.WrapUp))]
class ExileControllerPatch
public static MethodBase TargetMethod()
{
public static void Postfix(ExileController __instance)
return AccessTools.Method(typeof(ExileController), nameof(ExileController.WrapUp));
}
public static void Postfix(ExileController __instance)
{
AfterExile(__instance.initData.networkedPlayer);
}
public static void AfterExile(NetworkedPlayerInfo ejectedPlayer)
{
if (!AmongUsClient.Instance.AmHost) return;
if (ejectedPlayer == null) return;
PlayerControl pc = null;
PlayerControl exiledPlayer = ejectedPlayer.Object;
foreach (var p in PlayerControl.AllPlayerControls)
{
AfterExile(__instance.initData.networkedPlayer);
}
public static void AfterExile(NetworkedPlayerInfo ejectedPlayer)
{
if (!AmongUsClient.Instance.AmHost) return;
if (ejectedPlayer == null) return;
PlayerControl pc = null;
foreach (var p in PlayerControl.AllPlayerControls)
if (p.PlayerId == ejectedPlayer.PlayerId)
{
if (p.PlayerId == ejectedPlayer.PlayerId)
{
pc = p;
}
pc = p;
}
if (ejectedPlayer == PlayerControl.LocalPlayer.Data)
if (ejectedPlayer == PlayerControl.LocalPlayer.Data && !Main.DisableInfoWhenDead.Value)
{
if (p.Data.Role.IsImpostor)
{
if (p.Data.Role.IsImpostor)
p.cosmetics.nameText.text = $"{p.Data.PlayerName}<color=red><size=90%>({MurderPlayerPatch.killCount[p.Data.PlayerId]}† - {Utils.StoredRoleText[p.PlayerId]})";
}
else
{
if (!PlayerControlCompleteTaskPatch.playerTasksCompleted.ContainsKey(p.PlayerId))
{
p.cosmetics.nameText.text = $"{p.Data.PlayerName}<color=red><size=90%>({MurderPlayerPatch.killCount[p.Data.PlayerId]}†)";
}
else
{
if (!PlayerControlCompleteTaskPatch.playerTasksCompleted.ContainsKey(p))
{
PlayerControlCompleteTaskPatch.playerTasksCompleted[p] = 0;
}
p.cosmetics.nameText.text = $"{p.Data.PlayerName}<color=green><size=90%>({PlayerControlCompleteTaskPatch.playerTasksCompleted[p]}/{PlayerControlCompleteTaskPatch.tasksPerPlayer[p]})";
PlayerControlCompleteTaskPatch.playerTasksCompleted[p.PlayerId] = 0;
}
p.cosmetics.nameText.text = $"{p.Data.PlayerName}<color=green><size=90%>({PlayerControlCompleteTaskPatch.playerTasksCompleted[p.PlayerId]}/{PlayerControlCompleteTaskPatch.tasksPerPlayer[p.PlayerId]} - {Utils.StoredRoleText[p.PlayerId]})";
}
}
Logger.Info($" {ejectedPlayer.PlayerName} was ejected", "ExileController");
if (CustomRoleManagement.PlayerRoles.TryGetValue(ejectedPlayer.PlayerId, out var role) && role == "Jester")
{
Utils.CustomWinnerEndGame(pc, 1);
NormalGameEndChecker.CheckWinnerText("Jester");
return;
}
if (CustomRoleManagement.HandlingRoleMessages)
{
Logger.Info(" SRM2 is called before SRM1 finished. This should not happen.", "ExileController");
}
else
{
CustomRoleManagement.SendRoleMessages(new Dictionary<string, string>
{
{ "Jester", Translator.Get("jesterPriv")},
{ "Mayor", Translator.Get("mayorPriv", Options.MayorExtraVoteCount.GetInt())},
});
}
}
}
#if ANDROID
[HarmonyPatch(typeof(AirshipExileController), nameof(AirshipExileController.WrapUpAndSpawn))]
class AirshipExileControllerPatchAndroid
{
public static void Postfix(AirshipExileController __instance)
Logger.Info($" {ejectedPlayer.PlayerName} was ejected", "ExileController");
if (PlayerControlSetRolePatch.Jesters.Contains(exiledPlayer))
{
ExileControllerPatch.AfterExile(__instance.initData.networkedPlayer);
Logger.Info($"Jester {ejectedPlayer.PlayerName} wins", "ExilePatch");
Utils.CustomWinnerEndGame(exiledPlayer, 1);
NormalGameEndChecker.CheckWinnerText("Jester");
return;
}
}
#else
[HarmonyPatch(typeof(AirshipExileController._WrapUpAndSpawn_d__11), nameof(AirshipExileController._WrapUpAndSpawn_d__11.MoveNext))]
class AirshipExileControllerPatchPC
[HarmonyPatch]
class AirshipExileControllerPatch
{
public static void Postfix(AirshipExileController._WrapUpAndSpawn_d__11 __instance, ref bool __result)
public static MethodBase TargetMethod()
{
var instance = __instance.__4__this;
ExileControllerPatch.AfterExile(instance.initData.networkedPlayer);
return Utils.GetStateMachineMoveNext<AirshipExileController>(nameof(AirshipExileController.WrapUpAndSpawn));
}
public static void Postfix(AirshipExileController._WrapUpAndSpawn_d__11 __instance)
{
ExileControllerWrapUpPatch.AfterExile(__instance.__4__this.initData.networkedPlayer);
}
}
#endif
}
+5 -5
View File
@@ -113,16 +113,16 @@ namespace AmongUsRevamped
switch ((TabGroup)(tabNum - 3))
{
case TabGroup.SystemSettings:
__instance.MenuDescriptionText.text = "Quality settings to improve comfort and testing.";
__instance.MenuDescriptionText.text = Translator.Get("systemSettingsDesc");
break;
case TabGroup.CustomRoleSettings:
__instance.MenuDescriptionText.text = "Custom Role enabling and settings.";
case TabGroup.AbilitySettings:
__instance.MenuDescriptionText.text = Translator.Get("abilitySettingsDesc");
break;
case TabGroup.ModSettings:
__instance.MenuDescriptionText.text = "Gameplay Settings to improve the in-game experience.";
__instance.MenuDescriptionText.text = Translator.Get("gameplaySettingsDesc");
break;
case TabGroup.GamemodeSettings:
__instance.MenuDescriptionText.text = "Situational settings to apply for specific gamemodes.";
__instance.MenuDescriptionText.text = Translator.Get("gamemodeSettingsDesc");
break;
}
}
+18 -3
View File
@@ -9,6 +9,7 @@ public static class GameStartManagerUpdatePatch
{
public static bool CustomTimerApplied;
public static bool Autostarting;
public static bool CountingDown;
public static void Prefix(GameStartManager __instance)
{
@@ -27,11 +28,16 @@ public static class GameStartManagerUpdatePatch
Autostarting = true;
}
if (__instance.startState == GameStartManager.StartingStates.Countdown && !CustomTimerApplied && !Autostarting)
if (__instance.startState == GameStartManager.StartingStates.Countdown)
{
__instance.countDownTimer = Options.StartCountdown.GetInt();
CustomTimerApplied = true;
CountingDown = true;
if (!CustomTimerApplied && !Autostarting)
{
__instance.countDownTimer = Options.StartCountdown.GetInt();
CustomTimerApplied = true;
}
}
else CountingDown = false;
if (__instance.startState != GameStartManager.StartingStates.Countdown)
{
@@ -106,4 +112,13 @@ public class GameStartManagerStartPatch
}));
}
}
[HarmonyPatch(typeof(GameStartManager), nameof(GameStartManager.BeginGame))]
public class GameStartManagerBeginGamePatch
{
public static void Prefix(GameStartManager __instance)
{
if (Options.NoGameEnd.GetBool()) Logger.SendInGame(Translator.Get("noGameEndWarning"));
}
}
+12 -27
View File
@@ -9,53 +9,38 @@ 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;
NormalGameEndChecker.customRoles = CustomRoleManagement.PlayerToCustomRole();
IntroInitiated = true;
if (CustomRoleManagement.PlayerRoles.Count != 0 && !Utils.isHideNSeek && Options.Gamemode.GetValue() < 2)
{
_ = new LateTask(() =>
{
CustomRoleManagement.SendRoleMessages(new Dictionary<string, string>
{
{ "Jester", Translator.Get("jesterPriv")},
{ "Mayor", Translator.Get("mayorPriv", Options.MayorExtraVoteCount.GetInt())},
});
}, 1f, "BlockACKick");
}
AbilityManagement.SendRoleMessages();
foreach (var p in PlayerControl.AllPlayerControls)
{
p.cosmetics.nameText.text = p.Data.PlayerName;
MurderPlayerPatch.killCount[p.Data.PlayerId] = 0;
MurderPlayerPatch.misfireCount[p.Data.PlayerId] = 0;
PlayerControlCompleteTaskPatch.playerTasksCompleted[p] = 0;
PlayerControlCompleteTaskPatch.tasksPerPlayer[p] = 0;
MurderPlayerPatch.killCount[p.PlayerId] = 0;
MurderPlayerPatch.misfireCount[p.PlayerId] = 0;
PlayerControlCompleteTaskPatch.playerTasksCompleted[p.PlayerId] = 0;
PlayerControlCompleteTaskPatch.tasksPerPlayer[p.PlayerId] = 0;
Logger.Info($" {p.Data.PlayerName} -> {p.Data.RoleType}", "RoleInfo");
}
if (!Utils.isHideNSeek && Options.Gamemode.GetValue() < 2) Logger.Info($" {AbilityManagement.RoleList()}", "AbilityInfo");
if (Options.DisableAnnoyingMeetingCalls.GetBool() && !Utils.isHideNSeek)
{
Utils.CanCallMeetings = false;
_ = new LateTask(() =>
{
Utils.CanCallMeetings = true;
}, Options.ChatBeforeFirstMeeting.GetBool() ? 39.5f : 33f, "MeetingEnabled");
}
if (Options.Gamemode.GetValue() == 2 && Options.SNSChatInGame.GetBool() || Options.Gamemode.GetValue() == 0 && Options.ChatBeforeFirstMeeting.GetBool())
{
_ = new LateTask(() =>
{
PlayerControl.LocalPlayer.CmdReportDeadBody(null);
if (MeetingHud.Instance != null) MeetingHud.Instance.RpcClose();
}, 9f, "SetChatVisible");
}, 33f, "MeetingEnabled");
}
}
}
+61 -7
View File
@@ -51,6 +51,7 @@ internal static class OnGameJoinedPatch
[HarmonyPatch(typeof(AmongUsClient), nameof(AmongUsClient.OnPlayerJoined))]
class OnPlayerJoinedPatch
{
public static int JoinNum;
public static bool HasInvalidFriendCode(string friendcode)
{
if (string.IsNullOrEmpty(friendcode))
@@ -87,14 +88,27 @@ class OnPlayerJoinedPatch
if (!Options.TempBanInvalidFriendCodes.GetBool())
{
AmongUsClient.Instance.KickPlayer(Client.Id, false);
Logger.Info($" {Client.PlayerName} Was kicked for having an invalid FriendCode", "KickInvalidFriendCode");
Logger.SendInGame($" {Client.PlayerName} Was kicked for having an invalid FriendCode");
Logger.Info(Translator.Get("invalidFriendCodeKick", Client.PlayerName), "KickInvalidFriendCode");
Logger.SendInGame(Translator.Get("invalidFriendCodeKick", Client.PlayerName));
}
else
{
if (!BanManager.TempBanWhiteList.Contains(Client.GetHashedPuid())) BanManager.TempBanWhiteList.Add(Client.GetHashedPuid());
AmongUsClient.Instance.KickPlayer(Client.Id, true);
Logger.Info($" {Client.PlayerName} Was banned for having an invalid FriendCode", "BanInvalidFriendCode");
Logger.SendInGame($" {Client.PlayerName} Was banned for having an invalid FriendCode");
Logger.Info(Translator.Get("invalidFriendCodeBan", Client.PlayerName), "BanInvalidFriendCode");
Logger.SendInGame(Translator.Get("invalidFriendCodeBan", Client.PlayerName));
}
}
if (Options.EnableJoinMessages.GetBool())
{
JoinNum++;
BanManager.Templates.TryGetValue("welcome", out string msg);
if (JoinNum >= Options.MessagePerPlayerNum.GetInt())
{
JoinNum = 0;
Utils.ModeratorChatCommand(BanManager.CheckTemplate(msg), "", false);
}
}
}
@@ -106,9 +120,49 @@ class OnPlayerLeftPatch
{
static void Postfix([HarmonyArgument(0)] ClientData client)
{
if (!AmongUsClient.Instance.AmHost || !Utils.InGame) return;
if (!AmongUsClient.Instance.AmHost) return;
Logger.Info($" {client.PlayerName} left the game", "OnPlayerLeft");
if (!Utils.InGame) return;
PlayerControlCompleteTaskPatch.CalculateTaskWin();
}
}
[HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.SetLevel))]
public static class SetLevelPatch
{
public static List<PlayerControl> HandledLevelKicks = [];
public static void Prefix(PlayerControl __instance, uint level)
{
if (AmongUsClient.Instance.AmHost && level < Options.KickLowLevelPlayer.GetInt() - 1 && __instance.Data.ClientId != AmongUsClient.Instance.HostId)
{
PlayerControlCompleteTaskPatch.CalculateTaskWin();
}
if (level == 0 && Options.DontKickLevelOnes.GetBool()) return;
if (HandledLevelKicks.Contains(__instance)) return;
if (!Options.TempBanLowLevelPlayer.GetBool())
{
AmongUsClient.Instance.KickPlayer(__instance.Data.ClientId, false);
Logger.Info($" {__instance.Data.PlayerName} (level {level + 1}) was kicked for being under level {Options.KickLowLevelPlayer.GetInt()}", "KickLowLevelPlayer");
Logger.SendInGame($" {__instance.Data.PlayerName} (level {level + 1}) was kicked for being under level {Options.KickLowLevelPlayer.GetInt()}");
}
else
{
AmongUsClient.Instance.KickPlayer(__instance.Data.ClientId, true);
Logger.Info($" {__instance.Data.PlayerName} (level {level + 1}) was banned for being under level {Options.KickLowLevelPlayer.GetInt()} ", "BanLowLevelPlayer");
Logger.SendInGame($" {__instance.Data.PlayerName} (level {level + 1}) was banned for being under level {Options.KickLowLevelPlayer.GetInt()}");
}
HandledLevelKicks.Add(__instance);
}
}
}
[HarmonyPatch(typeof(GameStartManager), nameof(GameStartManager.Start))]
public static class ShowLobbyTimer_GameStartManager_Start_Postfix
{
public static void Postfix(GameStartManager __instance)
{
if (__instance == null || !GameData.Instance || !AmongUsClient.Instance || AmongUsClient.Instance.NetworkMode == NetworkModes.LocalGame || !AmongUsClient.Instance.AmHost) return;
HudManager.Instance.ShowLobbyTimer(600);
}
}
+1 -1
View File
@@ -23,7 +23,7 @@ internal static class LobbyBehaviourUpdatePatch
else
{
if (mapThemeSound != null) return;
SoundManager.Instance.CrossFadeSound("MapTheme", __instance.MapTheme, 0.5f);
SoundManager.Instance.CrossFadeSound("MapTheme", __instance.MapTheme, 0.1f);
}
}
}
+25 -11
View File
@@ -20,18 +20,33 @@ public static class CheckForEndVotingPatch
byte voterId = ps.TargetPlayerId;
byte votedFor = ps.VotedFor;
PlayerControl pc = GameData.Instance.GetPlayerById(voterId)?.Object;
if (pc == null) continue;
if (votedFor == byte.MaxValue) continue;
if (!votes.ContainsKey(votedFor)) votes[votedFor] = 0;
visualVotes.Add(new MeetingHud.VoterState { VoterId = voterId, VotedForId = votedFor });
if (CustomRoleManagement.PlayerRoles.TryGetValue(voterId, out string role) && role == "Mayor")
{
int extraVotes = Options.MayorExtraVoteCount.GetInt();
if (!votes.TryGetValue(votedFor, out int currentVotes)) currentVotes = 0;
votes[votedFor] = currentVotes + extraVotes;
if (!PlayerControlCompleteTaskPatch.playerTasksCompleted.ContainsKey(voterId)) PlayerControlCompleteTaskPatch.playerTasksCompleted[voterId] = 0;
if (!MurderPlayerPatch.killCount.ContainsKey(voterId)) MurderPlayerPatch.killCount[voterId] = 0;
for (int i = 0; i < extraVotes; i++)
visualVotes.Add(new MeetingHud.VoterState { VoterId = voterId, VotedForId = votedFor });
int extraVotes = 0;
int extraVotesCrewmate = Options.ExtraVotesCrewmate.GetInt();
int extraVotesImpostor = Options.ExtraVotesImpostor.GetInt();
int extraVotesPerTask = (int)(Options.ExtraVotesPerTask.GetFloat()*PlayerControlCompleteTaskPatch.playerTasksCompleted[voterId]+0.1f);
int extraVotesPerKill = (int)(Options.ExtraVotesPerKill.GetFloat()*MurderPlayerPatch.killCount[voterId]+0.1f);
if (!votes.TryGetValue(votedFor, out int currentVotes)) currentVotes = 0;
if (AbilityManagement.IsMayor(pc)) extraVotes += extraVotesCrewmate;
if (AbilityManagement.IsTyrant(pc)) extraVotes += extraVotesImpostor;
if (AbilityManagement.IsWorkhorse(pc)) extraVotes += extraVotesPerTask;
if (AbilityManagement.IsStealer(pc)) extraVotes += extraVotesPerKill;
for (int i = 0; i < extraVotes; i++)
{
visualVotes.Add(new MeetingHud.VoterState { VoterId = voterId, VotedForId = votedFor });
votes[votedFor]++;
}
}
@@ -45,7 +60,6 @@ public static class CheckForEndVotingPatch
}
}
[HarmonyPatch(typeof(MeetingHud), nameof(MeetingHud.Start))]
class MeetingHudStartPatch
{
@@ -65,7 +79,7 @@ class MeetingHudStartPatch
}
}
if (player == null || !PlayerControl.LocalPlayer.Data.IsDead) continue;
if (player == null || !PlayerControl.LocalPlayer.Data.IsDead || Main.DisableInfoWhenDead.Value) continue;
var textTemplate = playerState.NameText;
var taskText = GetProgressText(player);
@@ -93,11 +107,11 @@ class MeetingHudStartPatch
totalTasks++;
if (task.Complete) tasksCompleted++;
}
return $"<color=green>({tasksCompleted}/{totalTasks})</color>";
return $"<color=green>({tasksCompleted}/{totalTasks})</color> - {Utils.GetRoleText(player)}";
}
else
{
return $"<color=red>({MurderPlayerPatch.killCount[player.Data.PlayerId]}†)</color>";
return $"<color=red>({MurderPlayerPatch.killCount[player.Data.PlayerId]}†)</color> - {Utils.GetRoleText(player)}";
}
}
}
+57 -46
View File
@@ -13,13 +13,10 @@ internal class CoStartGamePatch
if (!AmongUsClient.Instance.AmHost) return;
Logger.Info(" -------- GAME STARTED --------", "StartGame");
Logger.Info($" Gamemode: {Options.Gamemode.GetValue()}", "StartGame");
Logger.Info($" Gamemode: {Options.Gamemode.GetString()}", "StartGame");
Logger.Info($" Players: {PlayerControl.AllPlayerControls.Count}", "StartGame");
Logger.Info($" Map: {(MapNames)GameOptionsManager.Instance.CurrentGameOptions.MapId}", "StartGame");
if ((Options.Gamemode.GetValue() == 0 || Options.Gamemode.GetValue() == 1) && !Utils.isHideNSeek)
{
CustomRoleManagement.AssignRoles();
}
NormalGameEndChecker.imps.Clear();
NormalGameEndChecker.LastWinReason = "";
@@ -29,49 +26,27 @@ internal class CoStartGamePatch
[HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.RpcSetRole))]
class PlayerControlSetRolePatch
{
private static int i;
public static bool FirstAssign;
private static HashSet<byte> Seekers = new();
private static readonly HashSet<byte> ProcessedPlayers = new();
public static HashSet<byte> Seekers = new();
public static HashSet<PlayerControl> Jesters = new();
private static readonly System.Random rand = new System.Random();
public static bool Prefix(PlayerControl __instance, ref RoleTypes roleType, ref bool canOverrideRole)
{
if (!FirstAssign || !AmongUsClient.Instance.AmHost) return true;
if (!ProcessedPlayers.Add(__instance.PlayerId)) return true;
canOverrideRole = false;
if (Main.GM.Value && __instance == PlayerControl.LocalPlayer)
{
roleType = RoleTypes.CrewmateGhost;
return true;
roleType = RoleTypes.Crewmate;
OnGameStartPatch.ScheduleExile = true;
}
if (CustomRoleManagement.PlayerRoles.TryGetValue(__instance.PlayerId, out var role) && role == "Mayor" && Options.Gamemode.GetValue() < 2)
{
if (Options.MayorVentToMeeting.GetBool())
{
roleType = RoleTypes.Engineer;
Logger.Info($"{__instance.Data.PlayerName} is Engineer due to being Mayor", "SetRolePatch");
}
else
{
roleType = RoleTypes.Crewmate;
}
}
if (CustomRoleManagement.PlayerRoles.TryGetValue(__instance.PlayerId, out var r) && r == "Jester" && Options.Gamemode.GetValue() < 2)
{
if (Options.JesterCanVent.GetBool())
{
roleType = RoleTypes.Engineer;
Logger.Info($"{__instance.Data.PlayerName} is Engineer due to being Jester", "SetRolePatch");
}
else
{
roleType = RoleTypes.Crewmate;
}
}
if (Utils.isHideNSeek && i == 0)
if (Utils.isHideNSeek && Seekers.Count() == 0 && Options.NumSeekers.GetInt() != 1)
{
int seekersCount = Options.NumSeekers.GetInt();
@@ -95,7 +70,7 @@ class PlayerControlSetRolePatch
}
}
if (Utils.isHideNSeek)
if (Utils.isHideNSeek && Options.NumSeekers.GetInt() != 1)
{
if (Seekers.Contains(__instance.PlayerId)) roleType = RoleTypes.Impostor;
else roleType = RoleTypes.Engineer;
@@ -103,23 +78,59 @@ class PlayerControlSetRolePatch
if (Options.Gamemode.GetValue() == 3 && !Utils.isHideNSeek)
{
if (__instance == PlayerControl.LocalPlayer && Main.GM.Value)
{
PlayerControl.LocalPlayer.myTasks.Clear();
return true;
}
roleType = RoleTypes.Crewmate;
if (Options.EngineerMode.GetBool()) roleType = RoleTypes.Engineer;
else roleType = RoleTypes.Crewmate;
}
i++;
if (i >= PlayerControl.AllPlayerControls.Count)
if (Options.Gamemode.GetValue() == 2 && !Utils.isHideNSeek)
{
if (roleType == RoleTypes.Impostor || roleType == RoleTypes.Phantom || roleType == RoleTypes.Viper) roleType = RoleTypes.Shapeshifter;
}
if (ProcessedPlayers.Count >= PlayerControl.AllPlayerControls.Count)
{
Seekers.Clear();
ProcessedPlayers.Clear();
FirstAssign = false;
i = 0;
Logger.Info("PCSRP successful", "RoleManaging");
}
if (roleType == RoleTypes.Crewmate && Options.CrewmateAbility.GetValue() == 2 ||
roleType == RoleTypes.Scientist && Options.ScientistAbility.GetValue() == 2 ||
roleType == RoleTypes.Engineer && Options.EngineerAbility.GetValue() == 2 ||
roleType == RoleTypes.Noisemaker && Options.NoisemakerAbility.GetValue() == 2 ||
roleType == RoleTypes.Tracker && Options.TrackerAbility.GetValue() == 2 ||
roleType == RoleTypes.Detective && Options.DetectiveAbility.GetValue() == 2)
{
Jesters.Add(__instance);
}
return true;
}
}
[HarmonyPatch(typeof(HudManager), nameof(HudManager.OnGameStart))]
internal static class OnGameStartPatch
{
public static bool ScheduleExile;
public static void Postfix()
{
if (AmongUsClient.Instance.AmHost && Options.Gamemode.GetValue() == 2 && Options.SNSChatInGame.GetBool())
{
PlayerControl.LocalPlayer.CmdReportDeadBody(null);
if (MeetingHud.Instance != null) MeetingHud.Instance.RpcClose();
}
if (ScheduleExile)
{
PlayerControl.LocalPlayer.Exiled();
ScheduleExile = false;
}
foreach (var p in PlayerControl.AllPlayerControls)
{
Utils.StoredRoleText[p.PlayerId] = Utils.GetRoleText(p);
}
}
}
+46 -21
View File
@@ -15,8 +15,9 @@ class ReportDeadBodyPatch
public static bool Prefix(PlayerControl __instance, [HarmonyArgument(0)] NetworkedPlayerInfo target)
{
if (!AmongUsClient.Instance.AmHost || __instance == null) return true;
if (Utils.isHideNSeek) return false;
if (Options.DisableAnnoyingMeetingCalls.GetBool() && !Utils.CanCallMeetings && !Options.ChatBeforeFirstMeeting.GetBool() && target == null)
if (Options.DisableAnnoyingMeetingCalls.GetBool() && !Utils.CanCallMeetings && target == null && Options.Gamemode.GetValue() < 2)
{
Logger.Info($" {__instance.Data.PlayerName} is calling a meeting too fast, attempt blocked", "ReportDeadBodyPatch");
return false;
@@ -26,10 +27,17 @@ class ReportDeadBodyPatch
if (Options.Gamemode.GetValue() == 2 || Options.Gamemode.GetValue() == 3)
{
if (target != null) Logger.Info($" Stopped {__instance.Data.PlayerName} reporting the body of {target.PlayerName}", "ReportDeadBodyPatch");
else Logger.Info($" Stopped {__instance.Data.PlayerName} trying to call a meeting", "ReportDeadBodyPatch");
return false;
if (target != null)
{
Logger.Info($" Stopped {__instance.Data.PlayerName} reporting the body of {target.PlayerName}", "ReportDeadBodyPatch");
return false;
}
if (__instance != PlayerControl.LocalPlayer)
{
Logger.Info($" Stopped {__instance.Data.PlayerName} trying to call a meeting", "ReportDeadBodyPatch");
return false;
}
return true;
}
else return true;
}
@@ -57,22 +65,29 @@ internal static class MurderPlayerPatch
killCount[playerId]++;
Logger.Info($" {__instance.Data.PlayerName} killed {target.Data.PlayerName}", "MurderPlayer");
if (target == PlayerControl.LocalPlayer || PlayerControl.LocalPlayer.Data.IsDead)
if ((target == PlayerControl.LocalPlayer || PlayerControl.LocalPlayer.Data.IsDead) && !Main.DisableInfoWhenDead.Value)
{
foreach (var p in PlayerControl.AllPlayerControls)
{
if (p.Data.Role.IsImpostor)
{
p.cosmetics.nameText.text = $"{p.Data.PlayerName}<color=red><size=90%>({killCount[p.Data.PlayerId]}†)";
p.cosmetics.nameText.text = $"{p.Data.PlayerName}<color=red><size=90%>({killCount[p.Data.PlayerId]}†)</color> - {Utils.StoredRoleText[p.PlayerId]}";
}
else
{
p.cosmetics.nameText.text = $"{p.Data.PlayerName}<color=green><size=90%>({PlayerControlCompleteTaskPatch.playerTasksCompleted[p]}/{PlayerControlCompleteTaskPatch.tasksPerPlayer[p]})";
p.cosmetics.nameText.text = $"{p.Data.PlayerName}<color=green><size=90%>({PlayerControlCompleteTaskPatch.playerTasksCompleted[p.PlayerId]}/{PlayerControlCompleteTaskPatch.tasksPerPlayer[p.PlayerId]})</color> - {Utils.StoredRoleText[p.PlayerId]}";
}
}
}
}
if (Options.Gamemode.GetValue() < 2 && AbilityManagement.IsJuggernaut(__instance) && killCount[__instance.PlayerId] >= Options.KillsNeededForJuggernaut.GetInt())
{
Logger.Info("Juggernaut win", "MurderPlayer");
Utils.ContinueEndGame((byte)GameOverReason.ImpostorsByVote);
NormalGameEndChecker.CheckWinnerText("Juggernaut");
}
//2 = Shift and Seek
if (Options.Gamemode.GetValue() == 2 && !Utils.isHideNSeek)
{
@@ -138,8 +153,8 @@ internal static class CheckShapeshiftPatch
[HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.CompleteTask))]
class PlayerControlCompleteTaskPatch
{
public static Dictionary<PlayerControl, int> playerTasksCompleted = new Dictionary<PlayerControl, int>();
public static Dictionary<PlayerControl, int> tasksPerPlayer = new Dictionary<PlayerControl, int>();
public static Dictionary<byte, int> playerTasksCompleted = new Dictionary<byte, int>();
public static Dictionary<byte, int> tasksPerPlayer = new Dictionary<byte, int>();
public static List<string> ignoredRoles = new List<string> {"Jester"};
public static int ignoredTasks;
public static int ignoredCompletedTasks;
@@ -151,33 +166,43 @@ class PlayerControlCompleteTaskPatch
foreach (var p in PlayerControl.AllPlayerControls)
{
if (ignoredRoles.Contains(CustomRoleManagement.GetRole(p.PlayerId)) && !tasksInitiated)
if (AbilityManagement.IsJester(p) && !tasksInitiated)
{
ignoredTasks += p.Data.Tasks.Count;
tasksInitiated = true;
}
if (!playerTasksCompleted.ContainsKey(p))
if (!playerTasksCompleted.ContainsKey(p.PlayerId))
{
playerTasksCompleted[p] = 0;
playerTasksCompleted[p.PlayerId] = 0;
}
tasksPerPlayer[p] = p.Data.Tasks.Count;
tasksPerPlayer[p.PlayerId] = p.Data.Tasks.Count;
}
playerTasksCompleted[__instance]++;
playerTasksCompleted[__instance.PlayerId]++;
if (ignoredRoles.Contains(CustomRoleManagement.GetRole(__instance.PlayerId)))
if (AbilityManagement.IsJester(__instance))
{
ignoredCompletedTasks = playerTasksCompleted[__instance];
ignoredCompletedTasks = playerTasksCompleted[__instance.PlayerId];
}
Logger.Info($" {__instance.Data.PlayerName} completed {idx}", "TaskPatch");
if (Options.Gamemode.GetValue() < 2)
{
if (AbilityManagement.IsSpeedrunner(__instance) && !__instance.Data.IsDead && playerTasksCompleted[__instance.PlayerId] >= __instance.Data.Tasks.Count)
{
Logger.Info($"Speedrunner {__instance.Data.PlayerName} won", "TaskPatch");
Utils.ContinueEndGame((byte)GameOverReason.CrewmatesByVote);
NormalGameEndChecker.CheckWinnerText("Speedrunner");
}
}
if (Options.Gamemode.GetValue() != 3) CalculateTaskWin();
if (Options.Gamemode.GetValue() == 3)
{
if (!__instance.Data.IsDead && playerTasksCompleted[__instance] >= __instance.Data.Tasks.Count)
if (!__instance.Data.IsDead && playerTasksCompleted[__instance.PlayerId] >= __instance.Data.Tasks.Count)
{
Utils.CustomWinnerEndGame(__instance, 1);
NormalGameEndChecker.LastWinReason = $"{__instance.Data.PlayerName} wins! (Completed tasks)";
@@ -185,16 +210,16 @@ class PlayerControlCompleteTaskPatch
}
}
if (PlayerControl.LocalPlayer.Data.IsDead)
if (PlayerControl.LocalPlayer.Data.IsDead && !Main.DisableInfoWhenDead.Value)
{
TMP_Text nameText = __instance.cosmetics.nameText;
nameText.text = $"{__instance.Data.PlayerName}<color=green><size=90%>({playerTasksCompleted[__instance]}/{tasksPerPlayer[__instance]})</color>";
nameText.text = $"{__instance.Data.PlayerName}<color=green><size=90%>({playerTasksCompleted[__instance.PlayerId]}/{tasksPerPlayer[__instance.PlayerId]})</color> - {Utils.StoredRoleText[__instance.PlayerId]}";
}
}
public static void CalculateTaskWin()
{
if (!Utils.GamePastRoleSelection || Utils.isHideNSeek || Options.NoGameEnd.GetBool()) return;
if (!Utils.GamePastRoleSelection || Utils.isHideNSeek || Options.NoGameEnd.GetBool() || !CoShowIntroPatch.IntroInitiated) return;
//Logger.Info($" Checking if {GameData.Instance.CompletedTasks} - {ignoredCompletedTasks} >= ({GameData.Instance.TotalTasks} - {ignoredTasks}) * 0.01 * {Options.TaskPercentNeededToWin.GetInt()}", "TaskPatch");
+19 -11
View File
@@ -136,7 +136,7 @@ internal static class RpcSetTasksPatch
if (!Options.AllPlayersSameTasks.GetBool())
{
RerollTasks(ref taskTypeIds);
RerollTasks(pc, ref taskTypeIds);
return;
}
@@ -155,23 +155,26 @@ internal static class RpcSetTasksPatch
}
private static void RerollTasks(ref Il2CppStructArray<byte> taskTypeIds)
private static void RerollTasks(PlayerControl pc, ref Il2CppStructArray<byte> taskTypeIds)
{
// Default number of tasks
bool hasCommonTasks = true;
int numCommonTasks = Main.NormalOptions.NumCommonTasks;
int numLongTasks = Main.NormalOptions.NumLongTasks;
int numShortTasks = Main.NormalOptions.NumShortTasks;
if (AbilityManagement.IsSpeedrunner(pc))
{
numLongTasks = Options.SpeedrunnerLongTasks.GetInt();
numShortTasks = Options.SpeedrunnerShortTasks.GetInt();
}
if (taskTypeIds.Length == 0) hasCommonTasks = false;
switch (hasCommonTasks)
{
case false when numLongTasks == 0 && numShortTasks == 0:
numShortTasks = 1;
break;
case true when numLongTasks == Main.NormalOptions.NumLongTasks && numShortTasks == Main.NormalOptions.NumShortTasks:
return;
case false when numLongTasks == 0 && numShortTasks == 0: numShortTasks = 1; break;
case true when numLongTasks == Main.NormalOptions.NumLongTasks && numShortTasks == Main.NormalOptions.NumShortTasks: return;
}
Il2CppSystem.Collections.Generic.List<byte> TasksList = new();
@@ -180,24 +183,28 @@ internal static class RpcSetTasksPatch
Il2CppSystem.Collections.Generic.HashSet<TaskTypes> UsedTaskTypes = new();
var start0 = 0;
var start1 = 0;
var start2 = 0;
// Long tasks
Il2CppSystem.Collections.Generic.List<NormalPlayerTask> CommonTasks = new();
foreach (var task in ShipStatus.Instance.CommonTasks) CommonTasks.Add(task);
Shuffle(CommonTasks);
ShipStatus.Instance.AddTasksFromList(ref start0, numCommonTasks, TasksList, UsedTaskTypes, CommonTasks);
Il2CppSystem.Collections.Generic.List<NormalPlayerTask> LongTasks = new();
foreach (var task in ShipStatus.Instance.LongTasks) LongTasks.Add(task);
Shuffle(LongTasks);
ShipStatus.Instance.AddTasksFromList(ref start1, numLongTasks, TasksList, UsedTaskTypes, LongTasks);
// Short tasks
Il2CppSystem.Collections.Generic.List<NormalPlayerTask> ShortTasks = new();
foreach (var task in ShipStatus.Instance.ShortTasks) ShortTasks.Add(task);
Shuffle(ShortTasks);
ShipStatus.Instance.AddTasksFromList(ref start2, numShortTasks, TasksList, UsedTaskTypes, ShortTasks);
// Apply result
taskTypeIds = new Il2CppStructArray<byte>(TasksList.Count);
for (int i = 0; i < TasksList.Count; i++) taskTypeIds[i] = TasksList[i];
}
@@ -212,4 +219,5 @@ internal static class RpcSetTasksPatch
list[r] = tmp;
}
}
}
+5 -1
View File
@@ -1,5 +1,8 @@
namespace AmongUsRevamped;
//Old Patch for Mayor
/*
[HarmonyPatch(typeof(Vent), nameof(Vent.EnterVent))]
class EnterVentPatch
{
@@ -13,4 +16,5 @@ class EnterVentPatch
Logger.Info($" The Mayor, {pc.Data.PlayerName}, called a meeting by venting", "EnterVent");
}
}
}
}
*/
+52 -28
View File
@@ -29,26 +29,38 @@
<img src="https://github.com/astra1dev/AUnlocker/assets/90265231/14226f03-a003-4efc-b27b-6df53fb394d6" width=410 height=240>****
‎
# 🎮 Features (v1.7.0):
## <b> 🌟 Custom Roles:</b>
# 🎮 Features (v1.8.3):
## <b> 🌟 Custom Abilities:</b>
- Mayor (Crewmate)
- The mayor has extra votes and can call meetings by venting, depending on settings.
- Jester (Neutral)
- The jester has to get voted to win alone and does not win with any other team.
- The Mayor has a configurable amount of extra votes
- Jester (Crewmate)
- The Jester wins alone by getting ejected, can win with Crewmates
- Tasker (Crewmate)
- The Crewmates win if the Tasker completes tasks and is alive
- Workhorse (Crewmate)
- The Workhorse gains additional votes per completed task
- Tyrant (Impostor)
- The Tyrant has a configurable amount of extra votes
- Stealer (Impostor)
- The Stealer gains additional votes per kill
- Juggernaut (Impostor)
- The Impostors win if the Juggernaut gains a set amount of kills
- For the enabled ability list, type /r
- To check ability descriptions, type /r {ability}
## <b>♠️ Client Side settings:</b>
- Game Master
- Unlock FPS
- Game Master (Spectator)
- Show FPS
- Dark Theme
- Toggle Lobby Music
- Customizable strings
- Show/Hide Info When Dead
## <b>⚙️ Technical settings:</b>
- Kick/Ban players under a certain level
- Kick/Ban invalid FriendCodes
- Kick/Ban players who say "start"
- Banword system
- Denyword system
- Banlist system
- DenyName system
- Denyname system
- Multi layer 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
@@ -57,32 +69,40 @@
- Automatically start game
- Automatically rejoin lobby
- Automatically send winner info
- Enable (configurable) Welcome Messages
- The Welcome Template is in Templates.txt
## <b>🔧 Gameplay Settings:</b>
- Dead impostors can sabotage
- Disable critical sabotages (invividual)
- Disable door sabotages
- Disable meeting calls first 30s
- Disable body reports
- Disable devices (per map, individual)
- Override decontamination time (per map)
- Disable spore triggers on The Fungle
- % Tasks completed for Crewmates to win
- Enable/Disable any task
- All players have same tasks
- Hide and Seek: Custom Impostor count
- Hide and Seek: Custom Seeker count
## <b>🏆 Custom Gamemodes:</b>
- 0 Kill Cooldown
- Shift and Seek
- Speedrun
## <b>❓ Other Improvements:</b>
- ehT dlekS map (reverse Skeld)
- Among Us Revamped supports other languages
- Select a language in Language/YourLanguage.txt
- Preset system for mod settings
- Command Helper
- Creatable and customizable Templates
- Eht Dleks (Reverse Skeld) Map
- 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 when dead
- See player kill/task count and Role when dead
- Higher and more accurate Option ranges
- Always visible lobby timer
- Access experimental animation test scene
- <b>🎉 And this all works in public lobbies!</b>
### Hotkeys
@@ -99,26 +119,30 @@
### Chat Commands
| Command | Function |
| ------------------------------------------- | ------------------------------------------------- |
| /h<br>/help | Show command help |
| /l<br>/win | Show winner |
| /r | Show current gamemode/roles description |
| /0kc<br>/sns</br>/sp | Show respective gamemode description |
| /ban <name> | Ban a player by name |
| /kick <name> | Kick a player by name |
| /cban <color> | Ban a player by color |
| /ckick <color> | Kick a player by color |
| /help | Show command help |
| /l<br>/lastgame | Send last game info |
| /r | Send current gamemode/roles description |
| /r {ability} | Send specific Ability info |
| /0kc<br>/sns</br>/sp | Send respective gamemode description |
| /ban {name} | Ban a player by name |
| /kick {name} | Kick a player by name |
| /cban {color} | Ban a player by color |
| /ckick {color} | Kick a player by color |
| /dump | Copy your LogOutput file |
| /endgame | Instantly end the game |
| /endmeeting | Instantly end an ongoing meeting |
| /aur | Sends AUR socials (GitHub, Discord) |
| /color | Sets color. Can be used to bypass color limit |
| /reload | Resets the *Language*.JSON file to default |
| /start | Starts game countdown |
| /eg<br>/endgame | Instantly end an ongoing game |
| /em<br>/endmeeting | Instantly end an ongoing meeting |
| /aur<br>/socials | Send AUR socials (GitHub, Discord) |
| /col<br>/color | Set color. Can be used to bypass color limit |
| /reload | Reset the *Language*.JSON file to default |
| /s<br>/start | Start game countdown |
| /vip<br>/moderator<br>/admin | Add a user to respective list by name |
| /t {template} | Send a Template from Templates.txt |
‎
**Credit to these mods and their developers for their code:**
### :star: [AUnlocker](https://github.com/astra1dev/AUnlocker)
> - Original NumberOptionsPatch
> - Always Show Lobby Timer
### :star: [EHR (Formerly TOHE+)](https://github.com/Gurge44/EndlessHostRoles)
> - Task Patching
### :star: [TOH](https://github.com/tukasa0001/TownOfHost) :
+110 -34
View File
@@ -2,25 +2,29 @@
"LanguageID": "0",
"gameMaster": "Game Master",
"unlockFPS": "Unlock FPS",
"showFPS": "Show FPS",
"autoStart": "Auto Start",
"enableDarkTheme": "Enable Dark Theme",
"enableLobbyMusic": "Lobby Music",
"disableInfoWhenDead": "Hide Info When Dead",
"disableCommandHelper": "Disable Command Helper",
"disableCompatibilityWarning": "Disable Compatibility Warning",
"gameMasterWarning":"You will now spectate games until GM is turned off. WARNING: Custom role notifications will not work with this setting on!",
"gameMasterWarning":"You will now spectate games until Game Master is turned off. WARNING: Ability messages will not be sent and role assigning might be inaccurate if this setting is enabled.",
"cancelStartCountdown": "Start countdown canceled",
"invalidFriendCodeKick": "{0} was kicked for having an invalid Friendcode",
"invalidFriendCodeBan": "{0} was banned for having an invalid Friendcode",
"language": "Language (Requires Restart)",
"gamemode": "Gamemode",
"tabGroupMain": "Moderation",
"kickLowLevelPlayer": "Kick Players Under Level",
"tempBanLowLevelPlayer": "Ban Instead Of Kick",
"kickInvalidFriendCodes": "Kick Invalid FriendCodes",
"dontKickLevelOnes": "Don't Kick Lv.1 Players For Glitched Lobbies",
"kickInvalidFriendCodes": "Kick Invalid (Empty) Friendcodes",
"tempBanInvalidFriendCodes": "Ban Instead Of Kick",
"applyBanList": "Apply BanList",
"applyDenyNameList": "Apply DenyName List",
"applyModeratorList": "Apply Moderator List",
"deniedWordsToKick": "Sent Denied Words To Kick Player",
"moderatorCanUseCommand": "Moderators can use commands",
"autoKickStart": "Kick Players Who Say Start",
"autoKickStartAsBan": "Ban Instead Of Kick",
@@ -32,6 +36,8 @@
"autoStartTimer": "Countdown For Auto Start",
"waitAutoStart": "Auto Start After",
"playerAutoStart": "Players Needed To Auto Start",
"enableJoinMessages": "Enable Welcome Messages",
"messagePerPlayerNum": "Message Per Amount Of Joins",
"tabGroupMisc": "Miscelleneous",
"startCountdown": "Default Starting Countdown",
"colorCommandLevel": "Who Can use Color Commands",
@@ -40,20 +46,18 @@
"tabGroupAccess": "Access Levels",
"slashColorCmd": "Who Can Use /color",
"slashRolesAndGamemodeCmd": "Who Can Use /r",
"slashLastGameCmd": "Who Can Use /l",
"slashHelpAndAurCmd": "Who Can Use /help And /aur",
"slashKickCmd": "Who Can Use /kick And /ckick",
"slashBanCmd": "Who Can Use /ban And /cban",
"slashRolesAndGamemodeCmd": "Who Can Use /r & Templates",
"slashLastGameCmd": "Who Can Use /l & /aur",
"slashKickCmd": "Who Can Use /kick & /ckick",
"slashBanCmd": "Who Can Use /ban & /cban",
"slashEndMeetingCmd": "Who Can Use /endmeeting",
"slashStartAndEndGameCmd": "Who Can Use /startgame And /endgame",
"slashStartAndEndGameCmd": "Who Can Use /startgame & /endgame",
"tabGroupCrewmate": "Crewmate Roles",
"tabGroupNeutral": "Neutral Roles",
"tabGroupImpostor": "Impostor Roles",
"tabGroupStandard": "Standard",
"chatBeforeFirstMeeting": "Force chat 1st round to see roles (experimental)",
"tabGroupHNS": "Hide and Seek",
"numSeekers": "# Seekers",
@@ -76,6 +80,7 @@
"tabGroupSpeedrun": "Speedrun",
"speedrunSettingsOverride": "Auto Update Settings",
"gameAutoEndsAfter": "Game automatically ends after",
"engineerMode": "Everyone Is Engineer",
"tabGroupSabotages": "Sabotages",
"deadImpostorsCanSabotage": "Dead Impostors Can Sabotage",
@@ -115,7 +120,6 @@
"disableAirshipCamera": "Disable Airship Camera",
"disableAirshipVital": "Disable Airship Vitals",
"disableFungleDevices": "Disable Fungle Devices",
"disableFungleCamera": "Disable Fungle Camera",
"disableFungleVital": "Disable Fungle Vitals",
"tabGroupTasks": "Tasks",
@@ -212,27 +216,99 @@
"disableSubmitScan": "Disable Submit Scan",
"disableUploadData": "Disable Upload Data",
"noKcdMode": "0 Kill Cooldown:\n\nImpostors have no kill cooldown, Crewmates have low tasks\nThink fast and pay attention!",
"SnSModeOne": "Shift and Seek:\n\nImpostors can only kill someone while shapeshifted as them\nEmergency Meetings = Off",
"SnSModeTwo": "Crew wins by tasks/surviving {0}s\nImp wins by killing\nOne wrong kill = Can't kill for {1}s\n{2} wrong kill(s) = suicide",
"speedrunMode": "Speedrun:\n\nEveryone is a crewmate. The 1st player to finish tasks wins the game. Game auto ends after {0}s",
"allCommandsFull": "Commands:\n/r - Current mode description\n/0kc, /sns, /sp - Specific mode description\n/l - Shows last winner info\n/kick, /ban - Bans or kicks a player by name\n/ckick, /cban - Bans or kicks a player by color",
"allCommandsOne": "Commands:\n/r - Current mode description\n/0kc, /sns, /sp - Specific mode description\n/l - Shows last winner info",
"allCommandsTwo": "/kick, /ban - Bans or kicks a player by name\n/ckick, /cban - Bans or kicks a player by color",
"socialsAll": "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",
"translationReloaded": "Your file has successfully been reset.\nTo apply the changes, restart your game.",
"allCommandsFull": "<b>ALL COMMANDS:</b>\n\n<b>/help</b>\nShow this message.\n<b>/aur, /socials</b>\nSend Among Us Revamped social links.\n\n<b>/r, /gm</b>\nSend current mode description or ability list.\n<b>/r {ability}</b>\nSend specific ability info.\n<b>/l, /lastgame</b>\nSend last winner info.\n\n<b>/0kc, /0killcooldown</b>\nSend 0 Kill Cooldown mode description.\n<b>/sns, /shiftandseek</b>\nSend Shift and Seek mode description.\n<b>/sp, /speedrun</b>\nSend Speedrun mode description.\n\n/<b>kick, /ban</b>\nKick or ban a player by name.\n<b>/ckick, /cban</b>\nKick or ban a player by color.\n\n<b>/vip /moderator /admin</b>\nAdd a player as VIP, Moderator, or Admin.\n<b>/removevip, /removemoderator, /removeadmin</b>\nRemove VIP, Moderator, or Admin from a player.\n\n<b>/eg, /endgame</b>\nEnd the current game.\n<b>/em, /endmeeting</b>\nEnd the current meeting.\n<b>/s, /start</b>\nBegin the game starting countdown.\n\n<b>/t {template}</b>\nSend a template from AUR-DATA/templates.txt.\n\n<b>/col, /color, /colour</b>\nSet your color, can be used to bypass limits.",
"Mayor": "Mayor",
"mayorPublic": "Mayor:\n\nThe Mayor is a crewmate with {0} extra vote(s). Depending on settings, they can vent to call a meeting.",
"mayorPriv": "Your role is Mayor!\n\nYou are a crewmate with {0} extra vote(s). If you are an Engineer, vent to call a meeting.",
"mayorExtraVoteCount": "Extra Votes",
"mayorVentToMeeting": "Can Vent To Call Meetings",
"translationReloaded": "Your file has successfully been reset.\nTo apply all changes, restart your game.",
"Jester": "Jester",
"jesterPublic": "Jester:\n\nThe Jester wins alone by getting voted. They must act as suspicious as possible.",
"jesterPriv": "Your role is Jester!\nYou are NOT a crewmate!\n\nYou win by getting voted. Act as suspicious as possible.",
"jesterCanVent": "Can Vent",
"tabGroupCrewmateAbilities": "Crewmate Ability Settings",
"crewmateAbility": "Crewmate (Role) Ability",
"scientistAbility": "Scientist Ability",
"engineerAbility": "Engineer Ability",
"noisemakerAbility": "Noisemaker Ability",
"trackerAbility": "Tracker Ability",
"detectiveAbility": "Detective Ability",
"customRoleAnnouncement": "Custom Roles are enabled!\n\nIf you have a Custom Role, it will show in a message below this one.",
"roleDescriptionHelp": "Your Custom Role can be seen at the start of meetings. It is shown by an obvious private text"
"extraVotesCrewmate": "Extra Votes For Mayor",
"extraVotesPerTask": "Extra Votes Per Task For Workhorse",
"speedrunnerShortTasks": "Short Tasks For Tasker",
"speedrunnerLongTasks": "Long Tasks For Tasker",
"tabGroupImpostorAbilities": "Impostor Ability Settings",
"impostorAbility": "Impostor (Role) Ability",
"shapeshifterAbility": "Shapeshifter Ability",
"phantomAbility": "Phantom Ability",
"viperAbility": "Viper Ability",
"extraVotesImpostor": "Extra Votes For Tyrant",
"extraVotesPerKill": "Extra Votes Per Kill For Stealer",
"killsNeededForJuggernaut": "Kills Needed For Juggernaut",
"ability": "Ability",
"templateWelcome": "# In this file you can add Templates, which serve as easy copy-paste alternatives.\n# To create a template, write a new line with the same formatting as the test Template below.\n# Note that Templates can't be longer than 120 characters and can't contain special characters. Having so will kick you.\n\ntest: this is an example template. Type '/t test' to see it.\n\nwelcome: Welcome! This lobby uses Among Us Revamped {ModVersion} by MV. Enjoy!",
"moderatorWelcome": "# In this file you can add Moderators by Friendcode.\n# If you add someone, they will gain a purple name in-game.\n# Go to 'System Settings' in-game to customize Moderator permissions. Below is a Friendcode example.\n\nfriendcode#0000",
"vipWelcome": "# In this file you can add VIP's by Friendcode.\n# If you add someone, they will gain a yellow name in-game.\n# Go to 'System Settings' in-game to customize VIP permissions. Below is a Friendcode example.\n\nfriendcode#0000\n",
"adminWelcome": "# In this file you can add Admins by Friendcode.\n# If you add someone, they will gain a red name in-game.\n# Go to 'System Settings' in-game to customize Admin permissions. Below is a Friendcode example.\n\nfriendcode#0000\n",
"banlistWelcome": "# In this file you can ban players from your lobby by Friendcode.\n# Banning someone in-game will automatically add them here as well. Below is a Friendcode example.\n\nfriendcode#0000\n",
"banwordWelcome": "# In this file you can set denied words, automatically kicking anyone in-game who sends words listed here.\n# Make sure to separate words by using new lines.",
"bannameWelcome": "# In this file you can set denied names, automatically kicking anyone in-game who uses names listed here.\n# Make sure to separate names by using new lines.",
"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": "WARNING: No Game End is enabled",
"tooLongTemplate": "Your Template is longer than 120 characters and would kick you upon sending. Please reduce the length.",
"vipAdd": "Successfully added {0} as VIP.",
"moderatorAdd": "Successfully added {0} as Moderator.",
"adminAdd": "Successfully added {0} as Admin.",
"vipRemove": "Successfully removed VIP from {0}.",
"moderatorRemove": "Successfully removed Moderator from {0}.",
"adminRemove": "Successfully removed Admin from {0}.",
"permFail": "Could not find user '{0}'. Did you write it correctly?",
"helpDesc": "Show all commands and what they do.",
"snsDesc": "Send Shift and Seek gamemode Description.",
"0kcDesc": "Send 0 Kill Cooldown gamemode Description.",
"SrDesc": "Send Speedrun gamemode Description.",
"egDesc": "End the current game.",
"emDesc": "End the current meeting.",
"aurDesc": "Send Among Us Revamped social links.",
"sDesc": "Start the game countdown.",
"rDesc": "/r sends active abilities or current gamemode. /r {ability} sends specific ability info",
"rolesDesc": "Send all abilities/gamemode overview.",
"kickDesc": "Kick a player by name.",
"ckickDesc": "Kick a player by color.",
"banDesc": "Ban a player by name.",
"cbanDesc": "Ban a player by color.",
"dumpDesc": "Copy LogOutput into a seperate file.",
"colDesc": "Set your color.",
"reloadDesc": "Reload language file.",
"vipDesc": "Add user as VIP.",
"moderatorDesc": "Add user as Moderator.",
"adminDesc": "Add user as admin.",
"cremoveVipDesc": "Remove VIP from user.",
"removeModeratorDesc": "Remove Moderator from user.",
"removeAdminDesc": "Remove Admin from user.",
"lastgameDesc": "Send last game info.",
"templateDesc": "Send a specified template from AUR-DATA/templates.txt.",
"banWordKick": "{0} was kicked because they sent a banned word {1} time(s)",
"pluginWarning": "<color=red><size=5><b>WARNING:</color></b></size>\n<size=3><b>You have 2 or more detected Plugins.</size></b>\nAmong Us Revamped is not compatible with most mods.\nIf you find bugs, they are most likely due to incompatibility.",
"systemSettings": "System Settings",
"abilitySettings": "Ability Settings",
"gameplaySettings": "Gameplay Settings",
"gamemodeSettings": "Gamemode Settings",
"systemSettingsDesc": "Quality settings to improve comfort and testing.",
"abilitySettingsDesc": "Ability settings to enhance vanilla roles.",
"gameplaySettingsDesc": "Gameplay settings to improve the in-game experience.",
"gamemodeSettingsDesc": "Situational settings to apply for specific gamemodes.",
"everyone": "Everyone",
"vipAndAbove": "<color=yellow>VIP</color> And Above",
"moderatorAndAbove": "<color=purple>Moderator</color> And Above",
"admin": "<color=red>Admin</color>",
"onlyYou": "Only You"
}
+313
View File
@@ -0,0 +1,313 @@
{
"LanguageID": "1",
"gameMaster": "Spettatore",
"showFPS": "Mostra FPS",
"autoStart": "Auto Start",
"enableDarkTheme": "Abilità Tema Scuro",
"enableLobbyMusic": "Musica Lobby",
"disableInfoWhenDead": "Nascondi Info da Morto",
"disableCommandHelper": "Disabilita Command Helper",
"disableCompatibilityWarning": "Disattiva avviso di compatibilità",
"gameMasterWarning":"Assisterai alle partite come spettatore finché la modalità Spettatore non viene disattivata.AVVISO:I messaggi delle abilità non verranno inviati e l'assegnazione dei ruoli potrebbe non essere accurata se questa impostazione è attiva.",
"cancelStartCountdown": "Conto alla rovescia di inizio annullato",
"invalidFriendCodeKick": "{0} è stato espulso per avere un codice amico non valido",
"invalidFriendCodeBan": "{0} è stato bannato per avere un codice amico non valido",
"language": "Lingua (Richiede il riavvio)",
"gamemode": "Modalità di gioco",
"tabGroupMain": "Moderazione",
"kickLowLevelPlayer": "Espelli giocatori sotto il livello",
"tempBanLowLevelPlayer": "Banna invece di espellere",
"dontKickLevelOnes": "Non espellere i giocatori di livello 1 per lobby glitched",
"kickInvalidFriendCodes": "Espelli codici amico non validi (vuoti)",
"tempBanInvalidFriendCodes": "Banna invece di espellere",
"deniedWordsToKick": "Inviate parole proibite per espellere il giocatore",
"moderatorCanUseCommand": "I moderatori possono usare i comandi",
"autoKickStart": "Espelli i giocatori che dicono Start",
"autoKickStartAsBan": "Banna invece di espellere",
"autoKickStartTimes": "Messaggi di Start necessari per l'espulsione",
"autoKickStartStrength": "Modalità di rilevamento rigorosa",
"tabGroupAutomation": "Automazione",
"autoSendGameInfo": "Invia automaticamente le informazioni sul vincitore",
"autoRejoinLobby": "Rientra automaticamente nella lobby",
"autoStartTimer": "Conto alla rovescia per l'Auto Start",
"waitAutoStart": "Auto Start dopo",
"playerAutoStart": "Giocatori necessari per l'Auto Start",
"enableJoinMessages": "Abilita i messaggi di benvenuto",
"messagePerPlayerNum": "Messaggio in base al numero di accessi",
"tabGroupMisc": "Varie",
"startCountdown": "Conto alla rovescia di inizio predefinito",
"colorCommandLevel": "Chi può usare i comandi colore",
"allowFortegreen": "Consenti il colore Verde Forte",
"noGameEnd": "Nessuna fine del gioco",
"tabGroupAccess": "Livelli di accesso",
"slashColorCmd": "Chi può usare /color",
"slashRolesAndGamemodeCmd": "Chi può usare /r e i template",
"slashLastGameCmd": "Chi può usare /l e /aur",
"slashKickCmd": "Chi può usare /kick e /ckick",
"slashBanCmd": "Chi può usare /ban e /cban",
"slashEndMeetingCmd": "Chi può usare /endmeeting",
"slashStartAndEndGameCmd": "Chi può usare /startgame e /endgame",
"tabGroupCrewmate": "Ruoli degli astronauti",
"tabGroupNeutral": "Ruoli dei neutrali",
"tabGroupImpostor": "Ruoli degli impostori",
"tabGroupStandard": "Standard",
"tabGroupHNS": "Nascondino",
"numSeekers": "# Cercatori",
"tabGroup0Kcd": "Ricarica uccisione a 0",
"noKcdSettingsOverride": "Aggiorna automaticamente le impostazioni",
"tabGroupSNS": "Mutaforma e cerca",
"snsChatInGame": "Chat durante il gioco (sperimentale)",
"snsSettingsOverride": "Aggiorna automaticamente le impostazioni",
"cantKillTime": "Dopo un errore, non può uccidere per",
"misfiresToSuicide": "Suicidio dopo un numero di errori",
"crewAutoWinsGameAfter": "Gli astronauti vincono automaticamente dopo",
"snsDisableSabotage": "Disabilita i sabotaggi critici SnS",
"snsDisableReactor": "Disabilita il sabotaggio del reattore",
"snsDisableOxygen": "Disabilita il sabotaggio dell'ossigeno",
"snsDisableLights": "Disabilita il sabotaggio delle luci",
"snsDisableComms": "Disabilita il sabotaggio delle comunicazioni",
"snsDisableHeli": "Disabilita il sabotaggio della rotta di collisione",
"snsDisableMushroomMixup": "Disabilita il sabotaggio della miscela di funghi",
"snsDisableCloseDoor": "Disabilita i sabotaggi delle porte SnS",
"tabGroupSpeedrun": "Speedrun",
"speedrunSettingsOverride": "Aggiorna automaticamente le impostazioni",
"gameAutoEndsAfter": "Il gioco termina automaticamente dopo",
"engineerMode": "Tutti sono ingegneri",
"tabGroupSabotages": "Sabotaggi",
"deadImpostorsCanSabotage": "Gli impostori morti possono sabotare",
"disableSabotage": "Disabilita i sabotaggi critici",
"disableReactor": "Disabilita il sabotaggio del reattore",
"disableOxygen": "Disabilita il sabotaggio dell'ossigeno",
"disableLights": "Disabilita il sabotaggio delle luci",
"disableComms": "Disabilita il sabotaggio delle comunicazioni",
"disableHeli": "Disabilita il sabotaggio della rotta di collisione",
"disableMushroomMixup": "Disabilita il sabotaggio della miscela di funghi",
"disableCloseDoor": "Disabilita i sabotaggi delle porte",
"tabGroupGameplayGeneral": "Generale",
"disableAnnoyingMeetingCalls": "Disabilita le chiamate di riunione nei primi 30s",
"disableReport": "Disabilita le segnalazioni dei corpi",
"changeDecontaminationTime": "Ignora il tempo di decontaminazione (Solo standard)",
"decontaminationTimeOnMiraHQ": "Durata decontaminazione Mira HQ",
"decontaminationDoorOpenTimeOnMiraHQ": "Durata apertura porte decontaminazione Mira HQ",
"decontaminationTimeOnPolus": "Durata decontaminazione Polus",
"decontaminationDoorOpenTimeOnPolus": "Durata apertura porte decontaminazione Polus",
"disableSporeTrigger": "Disabilita le spore su The Fungle",
"disableDevices": "Disabilita i dispositivi",
"disableSkeldDevices": "Disabilita i dispositivi di The Skeld",
"disableSkeldAdmin": "Disabilita l'amministrazione di The Skeld",
"disableSkeldCamera": "Disabilita le telecamere di The Skeld",
"disableMiraHQDevices": "Disabilita i dispositivi di Mira HQ",
"disableMiraHQAdmin": "Disabilita l'amministrazione di Mira HQ",
"disableMiraHQDoorLog": "Disabilita il registro delle porte di Mira HQ",
"disablePolusDevices": "Disabilita i dispositivi di Polus",
"disablePolusAdmin": "Disabilita l'amministrazione di Polus",
"disablePolusCamera": "Disabilita le telecamere di Polus",
"disablePolusVital": "Disabilita i parametri vitali di Polus",
"disableAirshipDevices": "Disabilita i dispositivi di Airship",
"disableAirshipCockpitAdmin": "Disabilita l'amministrazione della cabina di pilotaggio di Airship",
"disableAirshipRecordsAdmin": "Disabilita l'amministrazione degli archivi di Airship",
"disableAirshipCamera": "Disabilita le telecamere di Airship",
"disableAirshipVital": "Disabilita i parametri vitali di Airship",
"disableFungleDevices": "Disabilita i dispositivi di The Fungle",
"disableFungleVital": "Disabilita i parametri vitali di The Fungle",
"tabGroupTasks": "Incarichi",
"allPlayersSameTasks": "Tutti hanno gli stessi incarichi",
"overrideTaskSettings": "Disabilita gli incarichi",
"taskPercentNeededToWin": "% Incarichi completati per la vittoria degli astronauti",
"disableMiraTasks": "Disabilita gli incarichi di Mira HQ",
"disableBuyBeverage": "Disabilita Acquista bevanda",
"disableMeasureWeather": "Disabilita Misura il tempo",
"disableProcessData": "Disabilita Elabora dati",
"disableRunDiagnostics": "Disabilita Esegui diagnostica",
"disableSortSamples": "Disabilita Ordina i campioni",
"disablePolusTasks": "Disabilita gli incarichi di Polus",
"disableActivateWeatherNodes": "Disabilita Attiva i nodi meteo",
"disableAlignTelescope": "Disabilita Allinea il telescopio",
"disableFillCanisters": "Disabilita Riempi le bombole",
"disableInsertKeys": "Disabilita Inserisci le chiavi",
"disableOpenWaterways": "Disabilita Apri i canali dell'acqua",
"disableRebootWifi": "Disabilita Riavvia il Wi-Fi",
"disableRepairDrill": "Disabilita Ripara il trapano",
"disableScanBoardingPass": "Disabilita Scansiona la carta d'imbarco",
"disableAirshipTasks": "Disabilita gli incarichi di Airship",
"disableCleanToilet": "Disabilita Pulisci il bagno",
"disableDecontaminate": "Disabilita Decontamina",
"disableDevelopPhotos": "Disabilita Sviluppa le foto",
"disableDressMannequin": "Disabilita Vesti il manichino",
"disableFixShower": "Disabilita Ripara la doccia",
"disableMakeBurger": "Disabilita Prepara un hamburger",
"disablePickUpTowels": "Disabilita Raccogli gli asciugamani",
"disablePolishRuby": "Disabilita Lucida il rubino",
"disablePutAwayPistols": "Disabilita Metti via le pistole",
"disablePutAwayRifles": "Disabilita Metti via i fucili",
"disableRewindTapes": "Disabilita Riavvolgi i nastri",
"disableResetBreaker": "Disabilita Ripristina gli interruttori",
"disableSortRecords": "Disabilita Ordina i record",
"disableStartFans": "Disabilita Avvia i ventilatori",
"disableUnlockSafe": "Disabilita Sblocca la cassaforte",
"disableFungleTasks": "Disabilita gli incarichi di The Fungle",
"disableBuildSandcastle": "Disabilita Costruisci il castello di sabbia",
"disableCatchFish": "Disabilita Pesca i pesci",
"disableCollectSamples": "Disabilita Raccogli i campioni",
"disableCollectShells": "Disabilita Raccogli le conchiglie",
"disableCollectVegetables": "Disabilita Raccogli le verdure",
"disableCrankGenerator": "Disabilita Gira la manovella del generatore",
"disableExtractFuel": "Disabilita Estrai il carburante",
"disableFixAntenna": "Disabilita Ripara l'antenna",
"disableHelpCritter": "Disabilita Aiuta la creatura",
"disableHoistSupplies": "Disabilita Solleva le provviste",
"disableLiftWeights": "Disabilita Solleva i pesi",
"disableMineOres": "Disabilita Estrai i minerali",
"disablePlayVideoGame": "Disabilita Gioca al videogioco",
"disablePolishGem": "Disabilita Lucida la gemma",
"disableReplaceParts": "Disabilita Sostituisci le parti",
"disableRoastMarshmallow": "Disabilita Arrostisci il marshmallow",
"disableThrowFisbee": "Disabilita Lancia il frisbee",
"disableFindSignal": "Disabilita Trova il segnale",
"disableMiscCommonTasks": "Disabilita gli incarichi comuni globali",
"disableEnterIdCode": "Disabilita Inserisci il codice ID",
"disableFixWiring": "Disabilita Ripara i cavi elettrici",
"disableSwipeCard": "Disabilita Striscia la tessera",
"disableMiscShortTasks": "Disabilita gli incarichi brevi globali",
"disableAssembleArtifact": "Disabilita Assembla l'artefatto",
"disableChartCourse": "Disabilita Traccia la rotta",
"disableCleanO2Filter": "Disabilita Pulisci il filtro dell'O2",
"disableCleanVent": "Disabilita Pulisci il condotto",
"disableMonitorMushroom": "Disabilita Monitora il fungo",
"disableMonitorTree": "Disabilita Monitora l'albero",
"disablePrimeShields": "Disabilita Attiva gli scudi",
"disableRecordTemperature": "Disabilita Registra la temperatura",
"disableStabilizeSteering": "Disabilita Stabilizza la guida",
"disableStoreArtifacts": "Disabilita Conserva gli artefatti",
"disableUnlockManifolds": "Disabilita Sblocca i collettori",
"disableMiscLongTasks": "Disabilita gli incarichi lunghi globali",
"disableAlignEngineOutput": "Disabilita Allinea l'uscita del motore",
"disableClearAsteroids": "Disabilita Distruggi gli asteroidi",
"disableEmptyChute": "Disabilita Svuota lo scivolo",
"disableInspectSample": "Disabilita Ispeziona il campione",
"disableReplaceWaterJug": "Disabilita Sostituisci il boccione dell'acqua",
"disableStartReactor": "Disabilita Avvia il reattore",
"disableWaterPlants": "Disabilita Annaffia le piante",
"disableMiscMixedTasks": "Disabilita gli incarichi misti globali",
"disableCalibrateDistributor": "Disabilita Calibra il distributore",
"disableDivertPower": "Disabilita Devia l'energia",
"disableEmptyGarbage": "Disabilita Svuota la spazzatura",
"disableFuelEngines": "Disabilita Rifornisci i motori",
"disableSubmitScan": "Disabilita Invia la scansione",
"disableUploadData": "Disabilita Carica i dati",
"allCommandsFull": "<b>TUTTI I COMANDI:</b>\n\n<b>/help</b>\nMostra questo messaggio.\n<b>/aur, /socials</b>\nInvia i link social di Among Us Revamped.\n\n<b>/r, /gm</b>\nInvia la descrizione della modalità corrente o l'elenco delle abilità.\n<b>/r {ability}</b>\nInvia le informazioni di un'abilità specifica.\n<b>/l, /lastgame</b>\nInvia le informazioni sull'ultimo vincitore.\n\n<b>/0kc, /0killcooldown</b>\nInvia la descrizione della modalità Ricarica uccisione a 0.\n<b>/sns, /shiftandseek</b>\nInvia la descrizione della modalità Mutaforma e cerca.\n<b>/sp, /speedrun</b>\nInvia la descrizione della modalità Speedrun.\n\n/<b>kick, /ban</b>\nEspelli o banna un giocatore per nome.\n<b>/ckick, /cban</b>\nEspelli o banna un giocatore per colore.\n\n<b>/vip /moderator /admin</b>\nAggiungi un giocatore come VIP, Moderatore o Admin.\n<b>/removevip, /removemoderator, /removeadmin</b>\nRimuovi VIP, Moderatore o Admin da un giocatore.\n\n<b>/eg, /endgame</b>\nTermina la partita corrente.\n<b>/em, /endmeeting</b>\nTermina la riunione corrente.\n<b>/s, /start</b>\nAvvia il conto alla rovescia di inizio partita.\n\n<b>/t {template}</b>\nInvia un template da AUR-DATA/templates.txt.\n\n<b>/col, /color, /colour</b>\nImposta il tuo colore, può essere usato per aggirare i limiti.",
"translationReloaded": "Il tuo file è stato ripristinato con successo.\nPer applicare tutte le modifiche, riavvia il gioco.",
"tabGroupCrewmateAbilities": "Impostazioni abilità astronauta",
"crewmateAbility": "Abilità dell'astronauta (Ruolo)",
"scientistAbility": "Abilità dello scienziato",
"engineerAbility": "Abilità dell'ingegnere",
"noisemakerAbility": "Abilità del noisemaker",
"trackerAbility": "Abilità del tracker",
"detectiveAbility": "Abilità del detective",
"extraVotesCrewmate": "Voti extra per il sindaco",
"extraVotesPerTask": "Voti extra per incarico per lo sgobbone",
"speedrunnerShortTasks": "Incarichi brevi per il tasker",
"speedrunnerLongTasks": "Incarichi lunghi per il tasker",
"tabGroupImpostorAbilities": "Impostazioni abilità impostore",
"impostorAbility": "Abilità dell'impostore (Ruolo)",
"shapeshifterAbility": "Abilità del mutaforma",
"phantomAbility": "Abilità del fantasma",
"viperAbility": "Abilità della vipera",
"extraVotesImpostor": "Voti extra per il tiranno",
"extraVotesPerKill": "Voti extra per uccisione per il ladro",
"killsNeededForJuggernaut": "Uccisioni necessarie per il juggernaut",
"ability": "Abilità",
"templateWelcome": "# In questo file puoi aggiungere i Template, che fungono da comode alternative per il copia-incolla.\n# Per creare un template, scrivi una nuova riga con la stessa formattazione del Template di prova qui sotto.\n# Nota che i Template non possono superare i 120 caratteri e non possono contenere caratteri speciali. In caso contrario verrai espulso.\n\ntest: questo è un esempio di template. Digita '/t test' per vederlo.\n\nwelcome: Benvenuto! Questa lobby utilizza Among Us Revamped {ModVersion} di MV. Buon divertimento!",
"moderatorWelcome": "# In questo file puoi aggiungere i Moderatori tramite Codice Amico.\n# Se aggiungi qualcuno, otterrà un nome viola all'interno del gioco.\n# Vai su 'Impostazioni di sistema' nel gioco per personalizzare i permessi dei Moderatori. Di seguito è riportato un esempio di Codice Amico.\n\nfriendcode#0000",
"vipWelcome": "# In questo file puoi aggiungere i VIP tramite Codice Amico.\n# Se aggiungi qualcuno, otterrà un nome giallo all'interno del gioco.\n# Vai su 'Impostazioni di sistema' nel gioco per personalizzare i permessi dei VIP. Di seguito è riportato un esempio di Codice Amico.\n\nfriendcode#0000\n",
"adminWelcome": "# In questo file puoi aggiungere gli Admin tramite Codice Amico.\n# Se aggiungi qualcuno, otterrà un nome rosso all'interno del gioco.\n# Vai su 'Impostazioni di sistema' nel gioco per personalizzare i permessi degli Admin. Di seguito è riportato un esempio di Codice Amico.\n\nfriendcode#0000\n",
"banlistWelcome": "# In questo file puoi bannare i giocatori dalla tua lobby tramite Codice Amico.\n# Bannare qualcuno nel gioco lo aggiungerà automaticamente anche qui. Di seguito è riportato un esempio di Codice Amico.\n\nfriendcode#0000\n",
"banwordWelcome": "# In questo file puoi impostare le parole proibite, espellendo automaticamente chiunque invii nel gioco le parole elencate qui.\n# Assicurati di separare le parole usando le nuove righe.",
"bannameWelcome": "# In questo file puoi impostare i nomi proibiti, espellendo automaticamente chiunque utilizzi nel gioco i nomi elencati qui.\n# Assicurati di separare i nomi usando le nuove righe.",
"noGameEndWarning": "AVVISO: La modalità Nessuna fine del gioco è attiva",
"tooLongTemplate": "Il tuo Template supera i 120 caratteri e comporterebbe la tua espulsione al momento dell'invio. Per favore, riducine la lunghezza.",
"vipAdd": "Aggiunto con successo {0} come VIP.",
"moderatorAdd": "Aggiunto con successo {0} come Moderatore.",
"adminAdd": "Aggiunto con successo {0} come Admin.",
"vipRemove": "Rimosso con successo VIP da {0}.",
"moderatorRemove": "Rimosso con successo Moderatore da {0}.",
"adminRemove": "Rimosso con successo Admin da {0}.",
"permFail": "Impossibile trovare l'utente '{0}'. Lo hai scritto correttamente?",
"helpDesc": "Mostra tutti i comandi e la loro funzione.",
"snsDesc": "Invia la descrizione della modalità di gioco Mutaforma e cerca.",
"0kcDesc": "Invia la descrizione della modalità di gioco Ricarica uccisione a 0.",
"SrDesc": "Invia la descrizione della modalità di gioco Speedrun.",
"egDesc": "Termina la partita corrente.",
"emDesc": "Termina la riunione corrente.",
"aurDesc": "Invia i link social di Among Us Revamped.",
"sDesc": "Avvia il conto alla rovescia del gioco.",
"rDesc": "/r invia le abilità attive o la modalità di gioco corrente. /r {ability} invia le informazioni di un'abilità specifica",
"rolesDesc": "Invia una panoramica di tutte le abilità/modalità di gioco.",
"kickDesc": "Espelli un giocatore per nome.",
"ckickDesc": "Espelli un giocatore per colore.",
"banDesc": "Banna un giocatore per nome.",
"cbanDesc": "Banna un giocatore per colore.",
"dumpDesc": "Copia il LogOutput in un file separato.",
"colDesc": "Imposta il tuo colore.",
"reloadDesc": "Ricarica il file della lingua.",
"vipDesc": "Aggiungi utente come VIP.",
"moderatorDesc": "Aggiungi utente come Moderatore.",
"adminDesc": "Aggiungi utente come admin.",
"cremoveVipDesc": "Rimuovi VIP dall'utente.",
"removeModeratorDesc": "Rimuovi Moderatore dall'utente.",
"removeAdminDesc": "Rimuovi Admin dall'utente.",
"lastgameDesc": "Invia le informazioni dell'ultima partita.",
"templateDesc": "Invia un template specificato da AUR-DATA/templates.txt.",
"banWordKick": "{0} è stato espulso perché ha inviato una parola proibita {1} volta/e",
"pluginWarning": "<color=red><size=5><b>AVVISO:</color></b></size>\n<size=3><b>Hai 2 o più Plugin rilevati.</size></b>\nAmong Us Revamped non è compatibile con la maggior parte delle mod.\nSe riscontri dei bug, molto probabilmente sono dovuti all'incompatibilità.",
"systemSettings": "Impostazioni di sistema",
"abilitySettings": "Impostazioni abilità",
"gameplaySettings": "Impostazioni di gioco",
"gamemodeSettings": "Impostazioni modalità di gioco",
"systemSettingsDesc": "Impostazioni di qualità per migliorare il comfort e i test.",
"abilitySettingsDesc": "Impostazioni delle abilità per potenziare i ruoli base.",
"gameplaySettingsDesc": "Impostazioni di gioco per migliorare l'esperienza in partita.",
"gamemodeSettingsDesc": "Impostazioni situazionali da applicare per specifiche modalità di gioco.",
"everyone": "Tutti",
"vipAndAbove": "<color=yellow>VIP</color> e superiori",
"moderatorAndAbove": "<color=purple>Moderatori</color> e superiori",
"admin": "<color=red>Admin</color>",
"onlyYou": "Solo tu"
}
+313
View File
@@ -0,0 +1,313 @@
{
"LanguageID": "2",
"gameMaster": "游戏大师(Game Master)",
"showFPS": "显示帧率 (FPS)",
"autoStart": "自动开始",
"enableDarkTheme": "启用深色主题",
"enableLobbyMusic": "大厅音乐",
"disableInfoWhenDead": "死亡后隐藏信息",
"disableCommandHelper": "禁用命令助手",
"disableCompatibilityWarning": "关闭兼容性警告",
"gameMasterWarning": "您现在将进入观战模式,直到关闭游戏主管。警告:启用此设置后,可能无法发送技能消息,且身份分配可能不准确。",
"cancelStartCountdown": "已取消开始倒计时",
"invalidFriendCodeKick": "{0} 因好友代码无效被踢出房间",
"invalidFriendCodeBan": "{0} 因好友代码无效被封禁",
"language": "语言 (需要重启)",
"gamemode": "游戏模式",
"tabGroupMain": "管理设置",
"kickLowLevelPlayer": "踢出等级低于此级别的玩家",
"tempBanLowLevelPlayer": "改为封禁而非踢出",
"dontKickLevelOnes": "不要因房间故障踢出 1 级玩家",
"kickInvalidFriendCodes": "踢出无效 (空) 好友代码",
"tempBanInvalidFriendCodes": "改为封禁而非踢出",
"deniedWordsToKick": "发送违禁词时踢出玩家",
"moderatorCanUseCommand": "管理人员可以使用命令",
"autoKickStart": "自动踢出发送“Start”的玩家",
"autoKickStartAsBan": "改为封禁而非踢出",
"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": "禁用丛林 (Fungle) 设备",
"disableFungleVital": "禁用丛林 (Fungle) 生命体征表",
"tabGroupTasks": "任务设置",
"allPlayersSameTasks": "所有人拥有相同的任务",
"overrideTaskSettings": "禁用任务",
"taskPercentNeededToWin": "船员获胜所需的任务完成百分比",
"disableMiraTasks": "禁用米拉总部 (Mira HQ) 任务",
"disableBuyBeverage": "禁用“购买饮料”",
"disableMeasureWeather": "禁用“测量天气”",
"disableProcessData": "禁用“处理数据”",
"disableRunDiagnostics": "禁用“运行诊断”",
"disableSortSamples": "禁用“整理样品”",
"disablePolusTasks": "禁用波勒斯 (Polus) 任务",
"disableActivateWeatherNodes": "禁用“激活天气节点”",
"disableAlignTelescope": "禁用“校准望远镜”",
"disableFillCanisters": "禁用“加注气罐”",
"disableInsertKeys": "禁用“插入钥匙”",
"disableOpenWaterways": "禁用“打开水路”",
"disableRebootWifi": "禁用“重启无线网络”",
"disableRepairDrill": "禁用“修理钻机”",
"disableScanBoardingPass": "禁用“扫描登机牌”",
"disableAirshipTasks": "禁用飞艇 (Airship) 任务",
"disableCleanToilet": "禁用“清理厕所”",
"disableDecontaminate": "禁用“洗消净化”",
"disableDevelopPhotos": "禁用“冲洗照片”",
"disableDressMannequin": "禁用“给假人穿衣服”",
"disableFixShower": "禁用“修理淋浴喷头”",
"disableMakeBurger": "禁用“做汉堡”",
"disablePickUpTowels": "禁用“捡起毛巾”",
"disablePolishRuby": "禁用“打磨红宝石”",
"disablePutAwayPistols": "禁用“放回手枪”",
"disablePutAwayRifles": "禁用“放回步枪”",
"disableRewindTapes": "禁用“倒带”",
"disableResetBreaker": "禁用“重置断路器”",
"disableSortRecords": "禁用“整理记录”",
"disableStartFans": "禁用“启动风扇”",
"disableUnlockSafe": "禁用“开保险箱”",
"disableFungleTasks": "禁用丛林 (Fungle) 任务",
"disableBuildSandcastle": "禁用“堆沙堡”",
"disableCatchFish": "禁用“钓鱼”",
"disableCollectSamples": "禁用“采集样品”",
"disableCollectShells": "禁用“收集贝壳”",
"disableCollectVegetables": "禁用“采摘蔬菜”",
"disableCrankGenerator": "禁用“摇动发电机”",
"disableExtractFuel": "禁用“提取燃料”",
"disableFixAntenna": "禁用“修理天线”",
"disableHelpCritter": "禁用“帮助小动物”",
"disableHoistSupplies": "禁用“吊起物资”",
"disableLiftWeights": "禁用“举重”",
"disableMineOres": "禁用“开采矿石”",
"disablePlayVideoGame": "禁用“玩电子游戏”",
"disablePolishGem": "禁用“打磨宝石”",
"disableReplaceParts": "禁用“更换零件”",
"disableRoastMarshmallow": "禁用“烤棉花糖”",
"disableThrowFisbee": "禁用“扔飞盘”",
"disableFindSignal": "禁用“寻找信号”",
"disableMiscCommonTasks": "禁用全局常规任务",
"disableEnterIdCode": "禁用“输入账号密码”",
"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": "<b>所有命令:</b>\n\n<b>/help</b>\n显示此帮助信息。\n<b>/aur, /socials</b>\n发送 Among Us Revamped 的社交链接。\n\n<b>/r, /gm</b>\n发送当前模式介绍或技能列表。\n<b>/r {ability}</b>\n发送指定技能的详细信息。\n<b>/l, /lastgame</b>\n发送上一局获胜者的信息。\n\n<b>/0kc, /0killcooldown</b>\n发送 0秒击杀冷却 模式介绍。\n<b>/sns, /shiftandseek</b>\n发送 变形与搜寻 模式介绍。\n<b>/sp, /speedrun</b>\n发送 速通 模式介绍。\n\n/<b>kick, /ban</b>\n通过名字踢出或封禁玩家。\n<b>/ckick, /cban</b>\n通过颜色踢出或封禁玩家。\n\n<b>/vip /moderator /admin</b>\n将玩家设为 VIP、管理员(Moderator) 或 超级管理员(Admin)。\n<b>/removevip, /removemoderator, /removeadmin</b>\n移除玩家的 VIP、管理员 或 超级管理员权限。\n\n<b>/eg, /endgame</b>\n结束当前游戏。\n<b>/em, /endmeeting</b>\n结束当前会议。\n<b>/s, /start</b>\n开始游戏开局倒计时。\n\n<b>/t {template}</b>\n发送 AUR-DATA/templates.txt 中的指定模板。\n\n<b>/col, /color, /colour</b>\n设置您的颜色,可用于绕过限制。",
"translationReloaded": "您的文件已成功重置。\n要应用所有更改,请重启游戏。",
"tabGroupCrewmateAbilities": "船员技能设置",
"crewmateAbility": "船员(职业)技能",
"scientistAbility": "科学家技能",
"engineerAbility": "工程师技能",
"noisemakerAbility": "噪音制造者技能",
"trackerAbility": "追踪者技能",
"detectiveAbility": "侦探技能",
"extraVotesCrewmate": "市长额外票数",
"extraVotesPerTask": "老黄牛每项任务获得的额外票数",
"speedrunnerShortTasks": "任务达人的短任务",
"speedrunnerLongTasks": "任务达人的长任务",
"tabGroupImpostorAbilities": "内鬼技能设置",
"impostorAbility": "内鬼(职业)技能",
"shapeshifterAbility": "伪装者技能",
"phantomAbility": "魔魂技能",
"viperAbility": "蝰蛇技能",
"extraVotesImpostor": "暴君额外票数",
"extraVotesPerKill": "小偷每击杀获得的额外票数",
"killsNeededForJuggernaut": "主宰所需的击杀数",
"ability": "技能",
"templateWelcome": "# 在此文件中,您可以添加模板,以便快捷复制粘贴。\n# 要创建新模板,请另起一行并使用与下方测试模板相同的格式。\n# 请注意,模板长度不能超过 120 个字符,且不能包含特殊字符,否则您会被踢出房间。\n\ntest: 这是一个示例模板。输入 '/t test' 即可查看。\n\nwelcome: 欢迎!本大厅使用的是由 MV 制作的 Among Us Revamped {ModVersion}。祝您玩得开心!",
"moderatorWelcome": "# 在此文件中,您可以通过好友代码添加管理员 (Moderator)。\n# 添加后,他们在游戏内的名字将变为紫色。\n# 请前往游戏内的“系统设置”自定义管理员权限。下方为好友代码示例。\n\nfriendcode#0000",
"vipWelcome": "# 在此文件中,您可以通过好友代码添加 VIP。\n# 添加后,他们在游戏内的名字将变为黄色。\n# 请前往游戏内的“系统设置”自定义 VIP 权限。下方为好友代码示例。\n\nfriendcode#0000\n",
"adminWelcome": "# 在此文件中,您可以通过好友代码添加超级管理员 (Admin)。\n# 添加后,他们在游戏内的名字将变为红色。\n# 请前往游戏内的“系统设置”自定义超级管理员权限。下方为好友代码示例。\n\nfriendcode#0000\n",
"banlistWelcome": "# 在此文件中,您可以通过好友代码将玩家从您的大厅中封禁。\n# 在游戏内封禁某人也会自动将其同步到此处。下方为好友代码示例。\n\nfriendcode#0000\n",
"banwordWelcome": "# 在此文件中,您可以设置违禁词,任何在游戏内发送此处所列词汇的玩家将被自动踢出。\n# 请务必使用换行来分隔不同的词汇。",
"bannameWelcome": "# 在此文件中,您可以设置违禁名字,任何在游戏内使用此处所列名字的玩家将被自动踢出。\n# 请务必使用换行来分隔不同的名字。",
"noGameEndWarning": "警告:“游戏永不结束”已启用",
"tooLongTemplate": "您的模板超过了 120 个字符,发送时会导致您被踢出。请缩减长度。",
"vipAdd": "成功将 {0} 添加为 VIP。",
"moderatorAdd": "成功将 {0} 添加为管理员 (Moderator)。",
"adminAdd": "成功将 {0} 添加为超级管理员 (Admin)。",
"vipRemove": "已成功移除 {0} 的 VIP 权限。",
"moderatorRemove": "已成功移除 {0} 的管理员 (Moderator) 权限。",
"adminRemove": "已成功移除 {0} 的超级管理员 (Admin) 权限。",
"permFail": "找不到用户 '{0}'。请检查拼写是否正确?",
"helpDesc": "显示所有命令及其功能。",
"snsDesc": "发送 变形与搜寻 (Shift and Seek) 游戏模式介绍。",
"0kcDesc": "发送 0秒击杀冷却 (0 Kill Cooldown) 游戏模式介绍。",
"SrDesc": "发送 速通 (Speedrun) 游戏模式介绍。",
"egDesc": "结束当前游戏。",
"emDesc": "结束当前会议。",
"aurDesc": "发送 Among Us Revamped 社交链接。",
"sDesc": "开始游戏倒计时。",
"rDesc": "/r 发送活跃技能或当前模式。/r {ability} 发送特定技能信息",
"rolesDesc": "发送所有技能/游戏模式总览。",
"kickDesc": "通过名字踢出玩家。",
"ckickDesc": "通过颜色踢出玩家。",
"banDesc": "通过名字封禁玩家。",
"cbanDesc": "通过颜色封禁玩家。",
"dumpDesc": "将 LogOutput(日志输出)复制到独立文件中。",
"colDesc": "设置您的颜色。",
"reloadDesc": "重新加载语言文件。",
"vipDesc": "将用户添加为 VIP。",
"moderatorDesc": "将用户添加为管理员 (Moderator)。",
"adminDesc": "将用户添加为超级管理员 (Admin)。",
"cremoveVipDesc": "移除用户的 VIP 权限。",
"removeModeratorDesc": "移除用户的管理员 (Moderator) 权限。",
"removeAdminDesc": "移除用户的超级管理员 (Admin) 权限。",
"lastgameDesc": "发送上一局游戏信息。",
"templateDesc": "发送 AUR-DATA/templates.txt 中指定的模板。",
"banWordKick": "{0} 因发送违禁词被踢出,累计次数:{1} 次",
"pluginWarning": "<color=red><size=5><b>警告:</color></b></size>\n<size=3><b>检测到您启用了 2 个或更多插件。</size></b>\nAmong Us Revamped 与大多数模组不兼容。\n如果遇到 Bug,极有可能是因为冲突所致。",
"systemSettings": "系统设置",
"abilitySettings": "能力设置",
"gameplaySettings": "游戏设置",
"gamemodeSettings": "模式设置",
"systemSettingsDesc": "用于提升舒适度与测试的画质/系统设置。",
"abilitySettingsDesc": "用于增强原版角色能力的设置。",
"gameplaySettingsDesc": "用于改善游戏内体验的设置。",
"gamemodeSettingsDesc": "适用于特定游戏模式的情境设置。",
"everyone": "所有人",
"vipAndAbove": "<color=yellow>VIP</color> 及以上",
"moderatorAndAbove": "<color=purple>管理员</color> 及以上",
"admin": "<color=red>管理员</color>",
"onlyYou": "仅自己"
}
+279
View File
@@ -0,0 +1,279 @@
{
"LanguageID": "3",
"gameMaster": "Maestro del Juego",
"showFPS": "Mostrar FPS",
"autoStart": "Inicio automático",
"enableDarkTheme": "Activar tema oscuro",
"enableLobbyMusic": "Música de la sala",
"disableInfoWhenDead": "Ocultar información al morir",
"disableCommandHelper": "Desactivar ayuda para comandos",
"disableCompatibilityWarning": "Desactivar advertencia de compatibilidad",
"gameMasterWarning": "Ahora observarás las partidas hasta que se desactive el Maestro del Juego. ADVERTENCIA: No se enviarán mensajes de habilidades y la asignación de roles podría ser inexacta si esta opción está activada.",
"cancelStartCountdown": "La cuenta regresiva de inicio fue cancelada",
"invalidFriendCodeKick": "{0} fue expulsado por tener un código de amigo no válido",
"invalidFriendCodeBan": "{0} fue bloqueado por tener un código de amigo no válido",
"language": "Idioma (requiere reiniciar)",
"gamemode": "Modo de juego",
"tabGroupMain": "Moderación",
"kickLowLevelPlayer": "Expulsar jugadores cuyo nivel sea menor que",
"tempBanLowLevelPlayer": "Bloquear en lugar de expulsar",
"dontKickLevelOnes": "No expulsar jugadores Nv.1 por salas bugueadas",
"kickInvalidFriendCodes": "Expulsar códigos de amigo no válidos (vacíos)",
"tempBanInvalidFriendCodes": "Bloquear en lugar de expulsar",
"deniedWordsToKick": "Palabras prohibidas para expulsar jugadores",
"moderatorCanUseCommand": "Los moderadores pueden usar comandos",
"autoKickStart": "Expulsar jugadores que digan \"start\"",
"autoKickStartAsBan": "Bloquear en lugar de expulsar",
"autoKickStartTimes": "Mensajes de \"start\" necesarios para expulsar",
"autoKickStartStrength": "Modo de detección estricto",
"tabGroupAutomation": "Automatización",
"autoSendGameInfo": "Enviar automáticamente información del ganador",
"autoRejoinLobby": "Volver automáticamente a la sala",
"autoStartTimer": "Cuenta regresiva para inicio automático",
"waitAutoStart": "Inicio automático después de",
"playerAutoStart": "Jugadores mínimos para inicio automático",
"enableJoinMessages": "Activar mensajes de bienvenida",
"messagePerPlayerNum": "Mensaje cada X jugadores que entren",
"tabGroupMisc": "Varios",
"startCountdown": "Cuenta regresiva inicial predeterminada",
"colorCommandLevel": "Quién puede usar comandos de color",
"allowFortegreen": "Permitir color Fortegreen",
"noGameEnd": "Sin fin de partida",
"tabGroupAccess": "Niveles de acceso",
"slashColorCmd": "Quién puede usar /color",
"slashRolesAndGamemodeCmd": "Quién puede usar /r y plantillas",
"slashLastGameCmd": "Quién puede usar /l y /aur",
"slashKickCmd": "Quién puede usar /kick y /ckick",
"slashBanCmd": "Quién puede usar /ban y /cban",
"slashEndMeetingCmd": "Quién puede usar /endmeeting",
"slashStartAndEndGameCmd": "Quién puede usar /startgame y /endgame",
"tabGroupCrewmate": "Roles de tripulante",
"tabGroupNeutral": "Roles neutrales",
"tabGroupImpostor": "Roles de impostor",
"tabGroupStandard": "Estándar",
"tabGroupHNS": "Escondite",
"numSeekers": "# Buscadores",
"tabGroup0Kcd": "0 de enfriamiento para matar",
"noKcdSettingsOverride": "Actualizar configuración automáticamente",
"tabGroupSNS": "Shift and Seek",
"snsChatInGame": "Chat durante la partida (experimental)",
"snsSettingsOverride": "Actualizar configuración automáticamente",
"cantKillTime": "Después de fallar, no puede matar durante",
"misfiresToSuicide": "Suicidarse después de cierta cantidad de fallos",
"crewAutoWinsGameAfter": "Los tripulantes ganan automáticamente después de",
"snsDisableSabotage": "Desactivar sabotajes críticos de SnS",
"snsDisableReactor": "Desactivar sabotaje del reactor",
"snsDisableOxygen": "Desactivar sabotaje de O2",
"snsDisableLights": "Desactivar sabotaje de luces",
"snsDisableComms": "Desactivar sabotaje de comunicaciones",
"snsDisableHeli": "Desactivar sabotaje de Crash Course",
"snsDisableMushroomMixup": "Desactivar sabotaje de mezcla de hongos",
"snsDisableCloseDoor": "Desactivar sabotajes de puertas de SnS",
"tabGroupSpeedrun": "Speedrun",
"speedrunSettingsOverride": "Actualizar configuración automáticamente",
"gameAutoEndsAfter": "La partida termina automáticamente después de",
"engineerMode": "Todos son ingenieros",
"tabGroupSabotages": "Sabotajes",
"deadImpostorsCanSabotage": "Los impostores muertos pueden sabotear",
"disableSabotage": "Desactivar sabotajes críticos",
"disableReactor": "Desactivar sabotaje del reactor",
"disableOxygen": "Desactivar sabotaje de O2",
"disableLights": "Desactivar sabotaje de luces",
"disableComms": "Desactivar sabotaje de comunicaciones",
"disableHeli": "Desactivar sabotaje de Crash Course",
"disableMushroomMixup": "Desactivar sabotaje de mezcla de hongos",
"disableCloseDoor": "Desactivar sabotajes de puertas",
"tabGroupGameplayGeneral": "General",
"disableAnnoyingMeetingCalls": "Desactivar reuniones durante los primeros 30 s",
"disableReport": "Desactivar reportes de cuerpos",
"changeDecontaminationTime": "Cambiar tiempo de descontaminación (solo estándar)",
"decontaminationTimeOnMiraHQ": "Duración de descontaminación en Mira HQ",
"decontaminationDoorOpenTimeOnMiraHQ": "Duración de apertura de puerta en Mira HQ",
"decontaminationTimeOnPolus": "Duración de descontaminación en Polus",
"decontaminationDoorOpenTimeOnPolus": "Duración de apertura de puerta en Polus",
"disableSporeTrigger": "Desactivar esporas en The Fungle",
"disableDevices": "Desactivar dispositivos",
"disableSkeldDevices": "Desactivar dispositivos de Skeld",
"disableSkeldAdmin": "Desactivar Admin de Skeld",
"disableSkeldCamera": "Desactivar cámaras de Skeld",
"disableMiraHQDevices": "Desactivar dispositivos de Mira HQ",
"disableMiraHQAdmin": "Desactivar Admin de Mira HQ",
"disableMiraHQDoorLog": "Desactivar registro de puertas de Mira HQ",
"disablePolusDevices": "Desactivar dispositivos de Polus",
"disablePolusAdmin": "Desactivar Admin de Polus",
"disablePolusCamera": "Desactivar cámaras de Polus",
"disablePolusVital": "Desactivar vitales de Polus",
"disableAirshipDevices": "Desactivar dispositivos de Airship",
"disableAirshipCockpitAdmin": "Desactivar Admin de cabina de Airship",
"disableAirshipRecordsAdmin": "Desactivar Admin de archivos de Airship",
"disableAirshipCamera": "Desactivar cámaras de Airship",
"disableAirshipVital": "Desactivar vitales de Airship",
"disableFungleDevices": "Desactivar dispositivos de Fungle",
"disableFungleVital": "Desactivar vitales de Fungle",
"tabGroupTasks": "Tareas",
"allPlayersSameTasks": "Todos tienen las mismas tareas",
"overrideTaskSettings": "Desactivar tareas",
"taskPercentNeededToWin": "% de tareas completadas para que ganen los tripulantes",
"disableMiraTasks": "Desactivar tareas de Mira HQ",
"disableBuyBeverage": "Desactivar Tarea Comprar Bebida",
"disableMeasureWeather": "Desactivar Tarea Medir Clima",
"disableProcessData": "Desactivar Tarea Procesar Datos",
"disableRunDiagnostics": "Desactivar Tarea Realizar Diagnóstico",
"disableSortSamples": "Desactivar Tarea Ordenar Muestras",
"disablePolusTasks": "Desactivar tareas de Polus",
"disableActivateWeatherNodes": "Desactivar Tarea Reparar Nodo de Clima",
"disableAlignTelescope": "Desactivar Tarea Alinear Telescopio",
"disableFillCanisters": "Desactivar Tarea Llenar Bombonas",
"disableInsertKeys": "Desactivar Tarea Insertar Llaves",
"disableOpenWaterways": "Desactivar Tarea Abrir Canales de Agua",
"disableRebootWifi": "Desactivar Tarea Reiniciar Wi-Fi",
"disableRepairDrill": "Desactivar Tarea Reparar Taladro",
"disableScanBoardingPass": "Desactivar Tarea Escanear Tarjeta de Embarque",
"disableAirshipTasks": "Desactivar tareas de Airship",
"disableCleanToilet": "Desactivar Tarea Limpiar Inodoro",
"disableDecontaminate": "Desactivar Tarea Descontaminar",
"disableDevelopPhotos": "Desactivar Tarea Revelar Fotos",
"disableDressMannequin": "Desactivar Tarea Vestir Maniquí",
"disableFixShower": "Desactivar Tarea Arreglar Duchas",
"disableMakeBurger": "Desactivar Tarea Preparar Hamburguesa",
"disablePickUpTowels": "Desactivar Tarea Recoger Toallas",
"disablePolishRuby": "Desactivar Tarea Pulir Rubí",
"disablePutAwayPistols": "Desactivar Tarea Guardar Pistolas",
"disablePutAwayRifles": "Desactivar Tarea Guardar Rifles",
"disableRewindTapes": "Desactivar Tarea Rebobinar Cintas",
"disableResetBreaker": "Desactivar Tarea Reiniciar Interruptores",
"disableSortRecords": "Desactivar Tarea Ordenar Registros",
"disableStartFans": "Desactivar Tarea Encender Ventiladores",
"disableUnlockSafe": "Desactivar Tarea Abrir Caja Fuerte",
"disableFungleTasks": "Desactivar tareas de Fungle",
"disableBuildSandcastle": "Desactivar Construir Castillo de Arena",
"disableCatchFish": "Desactivar Atrapar Peces",
"disableCollectSamples": "Desactivar Recolectar Muestras",
"disableCollectShells": "Desactivar Recolectar Caracoles",
"disableCollectVegetables": "Desactivar Recolectar Vegetales",
"disableCrankGenerator": "Desactivar Activar Generador",
"disableExtractFuel": "Desactivar Extraer Combustible",
"disableFixAntenna": "Desactivar Arreglar Antena",
"disableHelpCritter": "Desactivar Ayudar a la Criatura",
"disableHoistSupplies": "Desactivar Llevar Suministros",
"disableLiftWeights": "Desactivar Levantar Pesas",
"disableMineOres": "Desactivar Extraer Minerales",
"disablePlayVideoGame": "Desactivar Jugar Videojuegos",
"disablePolishGem": "Desactivar Pulir Gema",
"disableReplaceParts": "Desactivar Reemplazar Partes",
"disableRoastMarshmallow": "Desactivar Asar Malvavisco",
"disableThrowFisbee": "Desactivar Lanzar Frisbee",
"disableFindSignal": "Desactivar Encontrar Señal",
"disableMiscCommonTasks": "Desactivar tareas comunes globales",
"disableEnterIdCode": "Desactivar Tarea Introducir ID",
"disableFixWiring": "Desactivar Tarea Arreglar Cableado",
"disableSwipeCard": "Desactivar Tarea Pasar Tarjeta",
"disableMiscShortTasks": "Desactivar tareas cortas globales",
"disableAssembleArtifact": "Desactivar Tarea Montar Artefacto",
"disableChartCourse": "Desactivar Tarea Trazar Ruta",
"disableCleanO2Filter": "Desactivar Tarea Limpiar Filtro de O2",
"disableCleanVent": "Desactivar Tarea Limpiar Ventila",
"disableMonitorMushroom": "Desactivar monitorear hongo",
"disableMonitorTree": "Desactivar Tarea Monitorizar Árbol",
"disablePrimeShields": "Desactivar Tarea Preparar Escudos",
"disableRecordTemperature": "Desactivar Tarea Registrar Temperatura",
"disableStabilizeSteering": "Desactivar Tarea Estabilizar Dirección",
"disableStoreArtifacts": "Desactivar Tarea Almacenar Artefactos",
"disableUnlockManifolds": "Desactivar Tarea Desbloquear Colectores",
"disableMiscLongTasks": "Desactivar tareas largas globales",
"disableAlignEngineOutput": "Desactivar Tarea Alinear la Salida del Motor",
"disableClearAsteroids": "Desactivar Tarea Destruir Asteroides",
"disableEmptyChute": "Desactivar Tarea Vaciar Contenedor",
"disableInspectSample": "Desactivar Tarea Examinar Muestras",
"disableReplaceWaterJug": "Desactivar Tarea Reemplazar Bidón de Agua",
"disableStartReactor": "Desactivar Tarea Arrancar Reactor",
"disableWaterPlants": "Desactivar Tarea Regar Plantas",
"disableMiscMixedTasks": "Desactivar tareas mixtas globales",
"disableCalibrateDistributor": "Desactivar Tarea Calibrar Distribuidor",
"disableDivertPower": "Desactivar Tarea Desviar Energía",
"disableEmptyGarbage": "Desactivar Tarea Vaciar Basurero",
"disableFuelEngines": "Desactivar Tarea Recargar Motores",
"disableSubmitScan": "Desactivar Tarea Enviar Escaneo",
"disableUploadData": "Desactivar Tarea Subir Datos",
"allCommandsFull": "<b>TODOS LOS COMANDOS:</b>\n\n<b>/help</b>\nMuestra este mensaje.\n<b>/aur, /socials</b>\nEnviar los enlaces sociales de Among Us Revamped.\n\n<b>/r, /gm</b>\nEnviar la descripción del modo actual o la lista de habilidades.\n<b>/r {ability}</b>\nEnviar información sobre una habilidad específica.\n<b>/l, /lastgame</b>\nEnviar la información del ganador anterior.\n\n<b>/0kc, /0killcooldown</b>\nEnviar la descripción del modo 0 de enfriamiento para matar.\n<b>/sns, /shiftandseek</b>\nEnviar la descripción del modo Shift and Seek.\n<b>/sp, /speedrun</b>\nEnviar la descripción del modo Speedrun.\n\n/<b>kick, /ban</b>\nExpulsa o bloquea a un jugador por nombre.\n<b>/ckick, /cban</b>\nExpulsa o bloquea a un jugador por color.\n\n<b>/vip /moderator /admin</b>\nAgrega a un jugador como VIP, moderador o administrador.\n<b>/removevip, /removemoderator, /removeadmin</b>\nElimina VIP, moderador o administrador de un jugador.\n\n<b>/eg, /endgame</b>\nTermina la partida actual.\n<b>/em, /endmeeting</b>\nTermina la reunión actual.\n<b>/s, /start</b>\nInicia la cuenta regresiva de la partida.\n\n<b>/t {template}</b>\nEnviar una plantilla de AUR-DATA/templates.txt.\n\n<b>/col, /color, /colour</b>\nCambia tu color; puede usarse para evitar límites.",
"translationReloaded": "Tu archivo se reinició correctamente.\nPara aplicar todos los cambios, reinicia el juego.",
"tabGroupCrewmateAbilities": "Configuración de habilidades de tripulante",
"crewmateAbility": "Habilidad de tripulante (rol)",
"scientistAbility": "Habilidad de científico",
"engineerAbility": "Habilidad de ingeniero",
"noisemakerAbility": "Habilidad de alertador",
"trackerAbility": "Habilidad de rastreador",
"detectiveAbility": "Habilidad de detective",
"extraVotesCrewmate": "Votos extra para el alcalde",
"extraVotesPerTask": "Votos extra por tarea para el trabajador",
"speedrunnerShortTasks": "Tareas cortas para el trabajador",
"speedrunnerLongTasks": "Tareas largas para el trabajador",
"tabGroupImpostorAbilities": "Configuración de habilidades de impostor",
"impostorAbility": "Habilidad de impostor (rol)",
"shapeshifterAbility": "Habilidad de cambiaformas",
"phantomAbility": "Habilidad de fantasma",
"viperAbility": "Habilidad de víbora",
"extraVotesImpostor": "Votos extra para el tirano",
"extraVotesPerKill": "Votos extra por asesinato para el ladrón",
"killsNeededForJuggernaut": "Muertes necesarias para el Juggernauta",
"ability": "Habilidad",
"templateWelcome": "# En este archivo puedes agregar plantillas, que sirven como alternativas fáciles de copiar y pegar.\n# Para crear una plantilla, escribe una nueva línea con el mismo formato que la plantilla de prueba de abajo.\n# Ten en cuenta que las plantillas no pueden tener más de 120 caracteres ni contener caracteres especiales. Si los tienen, te expulsarán.\n\ntest: esta es una plantilla de ejemplo. Escribe '/t test' para verla.\n\nwelcome: ¡Bienvenido! Esta sala usa Among Us Revamped {ModVersion} por MV. ¡Diviértete!",
"moderatorWelcome": "# En este archivo puedes agregar moderadores por código de amigo.\n# Si agregas a alguien, tendrá un nombre morado dentro del juego.\n# Ve a \"Configuración del sistema\" dentro del juego para personalizar los permisos de moderador. Abajo hay un ejemplo de código de amigo.\n\nfriendcode#0000",
"vipWelcome": "# En este archivo puedes agregar VIPs por código de amigo.\n# Si agregas a alguien, tendrá un nombre amarillo dentro del juego.\n# Ve a \"Configuración del sistema\" dentro del juego para personalizar los permisos de VIP. Abajo hay un ejemplo de código de amigo.\n\nfriendcode#0000\n",
"adminWelcome": "# En este archivo puedes agregar administradores por código de amigo.\n# Si agregas a alguien, tendrá un nombre rojo dentro del juego.\n# Ve a \"Configuración del sistema\" dentro del juego para personalizar los permisos de administrador. Abajo hay un ejemplo de código de amigo.\n\nfriendcode#0000\n",
"banlistWelcome": "# En este archivo puedes bloquear a jugadores en tu sala por código de amigo.\n# Bloquear a alguien dentro del juego también lo agregará aquí automáticamente. Abajo hay un ejemplo de código de amigo.\n\nfriendcode#0000\n",
"banwordWelcome": "# En este archivo puedes establecer palabras prohibidas para expulsar automáticamente a cualquiera que las envíe dentro del juego.\n# Asegúrate de separar las palabras usando líneas nuevas.",
"bannameWelcome": "# En este archivo puedes establecer nombres prohibidos para expulsar automáticamente a cualquiera que los use dentro del juego.\n# Asegúrate de separar los nombres usando líneas nuevas.",
"noGameEndWarning": "ADVERTENCIA: Sin fin de partida está activado",
"tooLongTemplate": "Tu plantilla tiene más de 120 caracteres y te expulsaría al enviarla. Reduce su longitud.",
"vipAdd": "Se agregó correctamente a {0} como VIP.",
"moderatorAdd": "Se agregó correctamente a {0} como moderador.",
"adminAdd": "Se agregó correctamente a {0} como administrador.",
"vipRemove": "Se eliminó correctamente el VIP de {0}.",
"moderatorRemove": "Se eliminó correctamente el moderador de {0}.",
"adminRemove": "Se eliminó correctamente el administrador de {0}.",
"permFail": "No se pudo encontrar al usuario '{0}'. ¿Lo escribiste correctamente?",
"helpDesc": "Muestra todos los comandos y lo que hacen.",
"snsDesc": "Enviar la descripción del modo de juego Shift and Seek.",
"0kcDesc": "Enviar la descripción del modo de juego 0 de enfriamiento para matar.",
"SrDesc": "Enviar la descripción del modo de juego Speedrun.",
"egDesc": "Termina la partida actual.",
"emDesc": "Termina la reunión actual.",
"aurDesc": "Envía los enlaces sociales de Among Us Revamped.",
"sDesc": "Inicia la cuenta regresiva de la partida.",
"rDesc": "/r envía las habilidades activas o el modo de juego actual. /r {ability} envía información de una habilidad específica",
"rolesDesc": "Enviar el resumen de todas las habilidades/modo de juego.",
"kickDesc": "Expulsa a un jugador por nombre.",
"ckickDesc": "Expulsa a un jugador por color.",
"banDesc": "Bloquea a un jugador por nombre.",
"cbanDesc": "Bloquea a un jugador por color.",
"dumpDesc": "Copia LogOutput en un archivo separado.",
"colDesc": "Cambia tu color.",
"reloadDesc": "Recarga el archivo de idioma.",
"vipDesc": "Agrega al usuario como VIP.",
"moderatorDesc": "Agrega al usuario como moderador.",
"adminDesc": "Agrega al usuario como administrador.",
"cremoveVipDesc": "Elimina VIP del usuario.",
"removeModeratorDesc": "Elimina moderador del usuario.",
"removeAdminDesc": "Elimina administrador del usuario.",
"lastgameDesc": "Enviar información de la última partida.",
"templateDesc": "Enviar una plantilla especificada de AUR-DATA/templates.txt.",
"banWordKick": "{0} fue expulsado porque envió una palabra prohibida {1} veces",
"pluginWarning": "<color=red><size=5><b>ADVERTENCIA:</color></b></size>\n<size=3><b>Se han detectado 2 o más plugins.</size></b>\nAmong Us Revamped no es compatible con la mayoría de mods.\nSi encuentras errores, probablemente se deban a incompatibilidad.",
"systemSettings": "Configuración del sistema",
"abilitySettings": "Configuración de habilidades",
"gameplaySettings": "Configuración de la partida",
"gamemodeSettings": "Configuración del modo de juego",
"systemSettingsDesc": "Ajustes de calidad para mejorar la comodidad y facilitar las pruebas.",
"abilitySettingsDesc": "Ajustes de habilidades para mejorar los roles originales.",
"gameplaySettingsDesc": "Ajustes de la partida para mejorar la experiencia de juego.",
"gamemodeSettingsDesc": "Ajustes específicos para determinados modos de juego.",
"everyone": "Todos",
"vipAndAbove": "<color=yellow>VIP</color> o superior",
"moderatorAndAbove": "<color=purple>Moderador</color> o superior",
"admin": "<color=red>Administrador</color>",
"onlyYou": "Solo tú"
}