mirror of
https://github.com/ApeMV/AmongUsRevamped.git
synced 2026-10-22 07:36:05 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cbc66948c0 | ||
|
|
f456eb63d5 | ||
|
|
8e013830b6 | ||
|
|
5e74dd1f84 | ||
|
|
ca39da4d64 | ||
|
|
5558350749 | ||
|
|
9a0b38c276 | ||
|
|
0f2516fdf5 |
No files matched your search
+3
-2
@@ -43,11 +43,12 @@ public partial class Main : BasePlugin
|
||||
|
||||
public static bool HasArgumentException;
|
||||
public static string CredentialsText;
|
||||
public const string ModVersion = "v1.7.6";
|
||||
public const string ModVersion = "v1.8.2";
|
||||
|
||||
public static float GameTimer;
|
||||
|
||||
public static readonly Dictionary<int, int> SayStartTimes = [];
|
||||
public static readonly Dictionary<int, int> SayDeniedWordTimes = [];
|
||||
|
||||
public static PlayerControl[] AllPlayerControls
|
||||
{
|
||||
@@ -96,7 +97,7 @@ public partial class Main : BasePlugin
|
||||
Translator.Init();
|
||||
Translator.Reload();
|
||||
BanManager.Init();
|
||||
|
||||
|
||||
Harmony.PatchAll();
|
||||
|
||||
ConsoleManager.DetachConsole();
|
||||
|
||||
@@ -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="2026.3.31" 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" />
|
||||
|
||||
+15
-4
@@ -170,17 +170,28 @@ public static class BanManager
|
||||
{
|
||||
if (input == "" || !AmongUsClient.Instance.AmHost || Utils.CheckAccessLevel(player.Data.FriendCode) > 0) return false;
|
||||
|
||||
int clientId = player.Data.ClientId;
|
||||
var bannedWords = File.ReadAllLines(BanWordPath).Where(x => !x.StartsWith("#"));
|
||||
|
||||
if (bannedWords.Where(code => !string.IsNullOrWhiteSpace(code)).Any(code => input.Contains(code, StringComparison.OrdinalIgnoreCase)))
|
||||
{
|
||||
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))]
|
||||
|
||||
@@ -78,11 +78,11 @@ internal static class CommandHelper
|
||||
[HarmonyPostfix]
|
||||
public static void Postfix(TextBoxTMP __instance)
|
||||
{
|
||||
if (!HudManager.InstanceExists || HudManager.Instance.Chat == null || HudManager.Instance.Chat.freeChatField == null || __instance != HudManager.Instance.Chat.freeChatField.textArea) return;
|
||||
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)
|
||||
if (Main.DisableCommandHelper.Value || !AmongUsClient.Instance.AmHost)
|
||||
{
|
||||
HelperText.enabled = false;
|
||||
if (HelperText != null) HelperText.enabled = false;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -65,7 +65,14 @@ namespace AmongUsRevamped
|
||||
"Tyrant", "Stealer", "Juggernaut", "None"
|
||||
};
|
||||
|
||||
public static readonly string[] languages =
|
||||
{
|
||||
"English", "French"
|
||||
};
|
||||
|
||||
//System
|
||||
public static OptionItem Language;
|
||||
|
||||
public static OptionItem Gamemode;
|
||||
|
||||
public static OptionItem TabGroupMain;
|
||||
@@ -77,6 +84,8 @@ namespace AmongUsRevamped
|
||||
public static OptionItem KickInvalidFriendCodes;
|
||||
public static OptionItem TempBanInvalidFriendCodes;
|
||||
|
||||
public static OptionItem DeniedWordsToKick;
|
||||
|
||||
public static OptionItem AutoKickStart;
|
||||
public static OptionItem AutoKickStartAsBan;
|
||||
public static OptionItem AutoKickStartTimes;
|
||||
@@ -103,7 +112,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;
|
||||
@@ -350,6 +358,9 @@ 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)
|
||||
@@ -398,7 +409,6 @@ 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);
|
||||
@@ -623,10 +633,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));
|
||||
|
||||
@@ -151,13 +151,13 @@ public static class AbilityManagement
|
||||
public static string RoleInfoString(PlayerControl player)
|
||||
{
|
||||
if (!AmongUsClient.Instance.AmHost) return "";
|
||||
if (IsMayor(player)) return Translator.Get("youAreMayor", Options.ExtraVotesCrewmate.GetInt());
|
||||
if (IsWorkhorse(player)) return Translator.Get("youAreWorkhorse", Options.ExtraVotesPerTask.GetFloat());
|
||||
if (IsJester(player)) return Translator.Get("youAreJester");
|
||||
if (IsSpeedrunner(player)) return Translator.Get("youAreSpeedrunner");
|
||||
if (IsTyrant(player)) return Translator.Get("youAreTyrant", Options.ExtraVotesImpostor.GetInt());
|
||||
if (IsStealer(player)) return Translator.Get("youAreStealer", Options.ExtraVotesPerKill.GetFloat());
|
||||
if (IsJuggernaut(player)) return Translator.Get("youAreJuggernaut", Options.KillsNeededForJuggernaut.GetInt());
|
||||
if (IsMayor(player)) return $"Your Ability: Mayor\n\nYou are a Crewmate with {Options.ExtraVotesCrewmate.GetInt()} additional vote(s). Use them wisely.";
|
||||
if (IsWorkhorse(player)) return $"Your Ability: Workhorse\n\nYou gain {Options.ExtraVotesPerTask.GetFloat()} additional vote(s) per completed task. Votes are rounded down.";
|
||||
if (IsJester(player)) return "Your Ability: Jester\n\nYou can optionally win alone by getting voted, you are still a Crewmate.";
|
||||
if (IsSpeedrunner(player)) return "Your Ability: Tasker\n\nThe Crewmates win if you complete tasks while being alive. You have more tasks.";
|
||||
if (IsTyrant(player)) return $"Your Ability: Tyrant\n\nYou are an Impostor with {Options.ExtraVotesImpostor.GetInt()} additional vote(s). Use them wisely.";
|
||||
if (IsStealer(player)) return $"Your Ability: Stealer\n\nYou gain {Options.ExtraVotesPerKill.GetFloat()} additional vote(s) per killed player. Votes are rounded down.";
|
||||
if (IsJuggernaut(player)) return $"Your Ability: Juggernaut\n\nThe Impostor team instantly wins if you gain {Options.KillsNeededForJuggernaut.GetInt()} kills.";
|
||||
else return "";
|
||||
}
|
||||
|
||||
@@ -165,7 +165,7 @@ public static class AbilityManagement
|
||||
private static int PendingRoleMessages = 0;
|
||||
public static void SendRoleMessages()
|
||||
{
|
||||
if (!AmongUsClient.Instance.AmHost) return;
|
||||
if (!AmongUsClient.Instance.AmHost || Options.Gamemode.GetValue() > 1) return;
|
||||
|
||||
if (string.IsNullOrEmpty(RoleList()) || PlayerControl.LocalPlayer.Data.IsDead)
|
||||
{
|
||||
@@ -175,12 +175,12 @@ public static class AbilityManagement
|
||||
}
|
||||
|
||||
var players = PlayerControl.AllPlayerControls.ToArray().ToList();
|
||||
float delay = 4.4f;
|
||||
float delay = 6.6f;
|
||||
|
||||
PendingRoleMessages = 0;
|
||||
HandlingRoleMessages = true;
|
||||
|
||||
SendRoleList(DestroyableSingleton<HudManager>.Instance.Chat, AbilityManagement.RoleList(), false);
|
||||
SendRoleList(DestroyableSingleton<HudManager>.Instance.Chat, AbilityManagement.RoleList(), true);
|
||||
|
||||
foreach (var player in players)
|
||||
{
|
||||
|
||||
@@ -111,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
|
||||
@@ -123,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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,15 +10,17 @@ public static class Translator
|
||||
{
|
||||
public enum SupportedLangs
|
||||
{
|
||||
English
|
||||
English,
|
||||
French
|
||||
}
|
||||
|
||||
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");
|
||||
CheckLanguageFile(_currentLang);
|
||||
LoadLanguage(_currentLang);
|
||||
}
|
||||
|
||||
+8
-1
@@ -228,6 +228,12 @@ public static class Utils
|
||||
|
||||
OnPlayerJoinedPatch.JoinNum = 0;
|
||||
|
||||
PlayerControlSetRolePatch.Seekers.Clear();
|
||||
PlayerControlSetRolePatch.Jesters.Clear();
|
||||
PlayerControlSetRolePatch.FirstAssign = true;
|
||||
|
||||
OnGameStartPatch.ScheduleExile = false;
|
||||
CoShowIntroPatch.IntroInitiated = false;
|
||||
}
|
||||
|
||||
public static PlayerControl[] AllAlivePlayerControls
|
||||
@@ -572,10 +578,11 @@ public static class Utils
|
||||
return null;
|
||||
}
|
||||
|
||||
Logger.Info($"Found {methodName}.MoveNext", "GetStateMachineMoveNext");
|
||||
// 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 "";
|
||||
|
||||
+62
-27
@@ -332,54 +332,61 @@ internal static class SendChatPatch
|
||||
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.ExtraVotesCrewmate.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 == "/r tyrant"){
|
||||
Utils.ChatCommand(__instance, Translator.Get("tyrantPublic", Options.ExtraVotesImpostor.GetInt()), "", false);
|
||||
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, Translator.Get("workhorsePublic", Options.ExtraVotesPerTask.GetFloat()), "", false);
|
||||
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, Translator.Get("stealerPublic", Options.ExtraVotesPerKill.GetFloat()), "", false);
|
||||
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, Translator.Get("juggernautPublic", Options.KillsNeededForJuggernaut.GetInt()), "", false);
|
||||
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, Translator.Get("speedrunnerPublic"), "", false);
|
||||
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 == "/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;
|
||||
}
|
||||
|
||||
@@ -392,15 +399,22 @@ internal static class SendChatPatch
|
||||
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;
|
||||
|
||||
}
|
||||
@@ -656,21 +670,35 @@ public static class RPCHandlerPatch
|
||||
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 == "/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")
|
||||
@@ -683,15 +711,22 @@ public static class RPCHandlerPatch
|
||||
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;
|
||||
|
||||
}
|
||||
@@ -700,25 +735,25 @@ public static class RPCHandlerPatch
|
||||
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.ExtraVotesCrewmate.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(Translator.Get("tyrantPublic", Options.ExtraVotesImpostor.GetInt()), "", false);}
|
||||
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(Translator.Get("workhorsePublic", Options.ExtraVotesPerTask.GetFloat()), "", false);}
|
||||
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(Translator.Get("stealerPublic", Options.ExtraVotesPerKill.GetFloat()), "", false);}
|
||||
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(Translator.Get("juggernautPublic", Options.KillsNeededForJuggernaut.GetInt()), "", false);}
|
||||
Utils.ModeratorChatCommand($"Juggernaut:\n\nThe Impostors instantly win if the Juggernaut gains {Options.KillsNeededForJuggernaut.GetInt()} kills.", "", false);}
|
||||
|
||||
if (text == "/r tasker"){
|
||||
Utils.ModeratorChatCommand(Translator.Get("speedrunnerPublic"), "", false);}
|
||||
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 "))
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
DisconnectPopup.Instance.gameObject.SetActive(true);
|
||||
DisconnectPopup.Instance._textArea.enableWordWrapping = false;
|
||||
DisconnectPopup.Instance._textArea.text = Translator.Get("pluginWarning");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if !ANDROID
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -53,43 +53,57 @@ class NormalGameEndChecker
|
||||
|
||||
if (Winner == "Jester")
|
||||
{
|
||||
LastWinReason = Translator.Get("jesterWin") + impostorList;
|
||||
LastWinReason = "Jester wins! (voted)\n\nImpostors: " + impostorList;
|
||||
canUpdateWinnerText = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (Winner == "Juggernaut")
|
||||
{
|
||||
LastWinReason = Translator.Get("juggernautWin", Options.KillsNeededForJuggernaut.GetInt()) + impostorList;
|
||||
LastWinReason = $"Impostors win! (Juggernaut killed {Options.KillsNeededForJuggernaut.GetInt()} players)\n\nImpostors: " + impostorList;
|
||||
canUpdateWinnerText = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (Winner == "Speedrunner")
|
||||
{
|
||||
LastWinReason = Translator.Get("speedrunnerWin") + impostorList;
|
||||
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 = Translator.Get("crewmateWin") + impostorList;
|
||||
LastWinReason = "Crewmates Win!\n\nImpostors: " + impostorList;
|
||||
canUpdateWinnerText = false;
|
||||
}
|
||||
else if (Utils.AliveImpostors >= Utils.AliveCrewmates || Winner == "Impostor")
|
||||
{
|
||||
LastWinReason = Translator.Get("impostorWin") + impostorList;
|
||||
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 = Translator.Get("crewmateWinTasks", Options.TaskPercentNeededToWin.GetInt()) + impostorList;
|
||||
LastWinReason = $"Crewmates Win! ({Options.TaskPercentNeededToWin.GetInt()}% tasks completed)\n\nImpostors: " + impostorList;
|
||||
canUpdateWinnerText = false;
|
||||
}
|
||||
else if (Options.Gamemode.GetValue() < 2 || Winner == "ImpostorSabotage")
|
||||
{
|
||||
LastWinReason = Translator.Get("impostorWinMisc") + impostorList;
|
||||
LastWinReason = "Impostors Win! (Sabotage)\n\n Impostors: " + impostorList;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ class ExileControllerWrapUpPatch
|
||||
{
|
||||
if (p.Data.Role.IsImpostor)
|
||||
{
|
||||
p.cosmetics.nameText.text = $"{p.Data.PlayerName}<color=red><size=90%>({MurderPlayerPatch.killCount[p.Data.PlayerId]}†)";
|
||||
p.cosmetics.nameText.text = $"{p.Data.PlayerName}<color=red><size=90%>({MurderPlayerPatch.killCount[p.Data.PlayerId]}† - {Utils.StoredRoleText[p.PlayerId]})";
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -42,7 +42,7 @@ class ExileControllerWrapUpPatch
|
||||
{
|
||||
PlayerControlCompleteTaskPatch.playerTasksCompleted[p.PlayerId] = 0;
|
||||
}
|
||||
p.cosmetics.nameText.text = $"{p.Data.PlayerName}<color=green><size=90%>({PlayerControlCompleteTaskPatch.playerTasksCompleted[p.PlayerId]}/{PlayerControlCompleteTaskPatch.tasksPerPlayer[p.PlayerId]})";
|
||||
p.cosmetics.nameText.text = $"{p.Data.PlayerName}<color=green><size=90%>({PlayerControlCompleteTaskPatch.playerTasksCompleted[p.PlayerId]}/{PlayerControlCompleteTaskPatch.tasksPerPlayer[p.PlayerId]} - {Utils.StoredRoleText[p.PlayerId]})";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+3
-10
@@ -9,12 +9,15 @@ namespace AmongUsRevamped;
|
||||
[HarmonyPatch(typeof(HudManager), nameof(HudManager.CoShowIntro))]
|
||||
internal static class CoShowIntroPatch
|
||||
{
|
||||
public static bool IntroInitiated;
|
||||
public static void Postfix(IntroCutscene __instance)
|
||||
{
|
||||
Logger.Info(" Intro initiated", "CoShowIntro");
|
||||
|
||||
if (!AmongUsClient.Instance.AmHost) return;
|
||||
|
||||
IntroInitiated = true;
|
||||
|
||||
AbilityManagement.SendRoleMessages();
|
||||
|
||||
foreach (var p in PlayerControl.AllPlayerControls)
|
||||
@@ -39,16 +42,6 @@ internal static class CoShowIntroPatch
|
||||
Utils.CanCallMeetings = true;
|
||||
}, 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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -88,14 +88,15 @@ 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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -153,4 +154,15 @@ public static class SetLevelPatch
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -13,8 +13,9 @@ 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");
|
||||
|
||||
NormalGameEndChecker.imps.Clear();
|
||||
NormalGameEndChecker.LastWinReason = "";
|
||||
@@ -25,9 +26,9 @@ 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();
|
||||
|
||||
@@ -35,17 +36,17 @@ class PlayerControlSetRolePatch
|
||||
{
|
||||
if (!FirstAssign || !AmongUsClient.Instance.AmHost) return true;
|
||||
|
||||
var oldRole = roleType;
|
||||
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 (Utils.isHideNSeek && i == 0)
|
||||
if (Utils.isHideNSeek && Seekers.Count() == 0)
|
||||
{
|
||||
int seekersCount = Options.NumSeekers.GetInt();
|
||||
|
||||
@@ -77,22 +78,21 @@ class PlayerControlSetRolePatch
|
||||
|
||||
if (Options.Gamemode.GetValue() == 3 && !Utils.isHideNSeek)
|
||||
{
|
||||
if (__instance == PlayerControl.LocalPlayer && Main.GM.Value)
|
||||
{
|
||||
PlayerControl.LocalPlayer.myTasks.Clear();
|
||||
return true;
|
||||
}
|
||||
|
||||
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");
|
||||
}
|
||||
|
||||
@@ -105,7 +105,32 @@ class PlayerControlSetRolePatch
|
||||
{
|
||||
Jesters.Add(__instance);
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(HudManager), nameof(HudManager.OnGameStart))]
|
||||
internal static class OnGameStartPatch
|
||||
{
|
||||
public static bool ScheduleExile;
|
||||
public static void Postfix()
|
||||
{
|
||||
if (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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -63,11 +71,11 @@ internal static class MurderPlayerPatch
|
||||
{
|
||||
if (p.Data.Role.IsImpostor)
|
||||
{
|
||||
p.cosmetics.nameText.text = $"{p.Data.PlayerName}<color=red><size=90%>({killCount[p.Data.PlayerId]}†)</color> - {Utils.GetRoleText(p)}";
|
||||
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.PlayerId]}/{PlayerControlCompleteTaskPatch.tasksPerPlayer[p.PlayerId]})</color> - {Utils.GetRoleText(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]}";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -205,13 +213,13 @@ class PlayerControlCompleteTaskPatch
|
||||
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.PlayerId]}/{tasksPerPlayer[__instance.PlayerId]})</color> - {Utils.GetRoleText(__instance)}";
|
||||
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");
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
<img src="https://github.com/astra1dev/AUnlocker/assets/90265231/14226f03-a003-4efc-b27b-6df53fb394d6" width=410 height=240>****
|
||||
|
||||
|
||||
# 🎮 Features (v1.7.6):
|
||||
# 🎮 Features (v1.8.2):
|
||||
## <b> 🌟 Custom Abilities:</b>
|
||||
- Mayor (Crewmate)
|
||||
- The Mayor has a configurable amount of extra votes
|
||||
@@ -54,7 +54,6 @@
|
||||
- Dark Theme
|
||||
- Toggle Lobby Music
|
||||
- Show/Hide Info When Dead
|
||||
- Customizable strings
|
||||
## <b>⚙️ Technical settings:</b>
|
||||
- Kick/Ban players under a certain level
|
||||
- Kick/Ban invalid FriendCodes
|
||||
@@ -89,6 +88,7 @@
|
||||
- Shift and Seek
|
||||
- Speedrun
|
||||
## <b>❓ Other Improvements:</b>
|
||||
- Preset system for mod settings
|
||||
- Command Helper
|
||||
- Creatable and customizable Templates
|
||||
- Eht Dleks (Reverse Skeld) Map
|
||||
@@ -99,6 +99,8 @@
|
||||
- Zoom out in lobby or 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
|
||||
@@ -118,26 +120,27 @@
|
||||
| /help | Show command help |
|
||||
| /l<br>/lastgame | Send last game info |
|
||||
| /r | Send current gamemode/roles description |
|
||||
| /r <ability> | Send specific Ability info |
|
||||
| /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 |
|
||||
| /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 |
|
||||
| /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 |
|
||||
| /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 |
|
||||
| /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) :
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
"LanguageID": "0",
|
||||
|
||||
"gameMaster": "Game Master",
|
||||
"unlockFPS": "Unlock FPS",
|
||||
"showFPS": "Show FPS",
|
||||
"autoStart": "Auto Start",
|
||||
"enableDarkTheme": "Enable Dark Theme",
|
||||
@@ -10,20 +9,21 @@
|
||||
"disableInfoWhenDead": "Hide Info When Dead",
|
||||
"disableCommandHelper": "Disable Command Helper",
|
||||
|
||||
"gameMasterWarning":"You will now spectate games until Game Master is turned off.",
|
||||
"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",
|
||||
"dontKickLevelOnes": "Don't Kick Lv.1 Players For Glitched Lobbies",
|
||||
"kickInvalidFriendCodes": "Kick Invalid FriendCodes",
|
||||
"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",
|
||||
@@ -45,20 +45,18 @@
|
||||
|
||||
"tabGroupAccess": "Access Levels",
|
||||
"slashColorCmd": "Who Can Use /color",
|
||||
"slashRolesAndGamemodeCmd": "Who Can Use /r And Templates",
|
||||
"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",
|
||||
@@ -121,7 +119,6 @@
|
||||
"disableAirshipCamera": "Disable Airship Camera",
|
||||
"disableAirshipVital": "Disable Airship Vitals",
|
||||
"disableFungleDevices": "Disable Fungle Devices",
|
||||
"disableFungleCamera": "Disable Fungle Camera",
|
||||
"disableFungleVital": "Disable Fungle Vitals",
|
||||
|
||||
"tabGroupTasks": "Tasks",
|
||||
@@ -218,28 +215,9 @@
|
||||
"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": "<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.",
|
||||
|
||||
"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.",
|
||||
|
||||
"mayorPublic": "Mayor:\n\nThe Mayor is a Crewmate with {0} additional vote(s). Use them wisely.",
|
||||
"tyrantPublic": "Tyrant:\n\nThe Tyrant is an Impostor with {0} additional vote(s). Use them wisely.",
|
||||
|
||||
"juggernautPublic": "Juggernaut:\n\nThe Impostors instantly win if the Juggernaut gains {0} kills.",
|
||||
"speedrunnerPublic": "Tasker:\n\nThe Crewmates win if the Tasker completes tasks and is alive. The Tasker has more tasks.",
|
||||
|
||||
"stealerPublic": "Stealer:\n\nThe Stealer gains {0} additional vote(s) per killed player. Votes are rounded down.",
|
||||
"workhorsePublic": "Workhorse:\n\nThe Workhorse gains {0} additional vote(s) per completed task. Votes are rounded down.",
|
||||
|
||||
"jesterPublic": "Jester:\n\nThe Jester is a Crewmate who can also win alone by getting voted.",
|
||||
|
||||
"customRoleAnnouncement": "Custom Roles are enabled!\n\nIf you have a Custom Role, it will show in a message below this one.",
|
||||
"translationReloaded": "Your file has successfully been reset.\nTo apply all changes, restart your game.",
|
||||
|
||||
"tabGroupCrewmateAbilities": "Crewmate Ability Settings",
|
||||
"crewmateAbility": "Crewmate (Role) Ability",
|
||||
@@ -264,22 +242,6 @@
|
||||
"extraVotesPerKill": "Extra Votes Per Kill For Stealer",
|
||||
"killsNeededForJuggernaut": "Kills Needed For Juggernaut",
|
||||
|
||||
"youAreMayor": "Your Ability: Mayor\n\nYou are a Crewmate with {0} additional vote(s). Use them wisely.",
|
||||
"youAreJester": "Your Ability: Jester\n\nYou can optionally win alone by getting voted, you are still a Crewmate.",
|
||||
"youAreSpeedrunner": "Your Ability: Tasker\n\nThe Crewmates win if you complete tasks while being alive. You have more tasks.",
|
||||
"youAreTyrant": "Your Ability: Tyrant\n\nYou are an Impostor with {0} additional vote(s). Use them wisely.",
|
||||
"youAreStealer": "Your Ability: Stealer\n\nYou gain {0} additional vote(s) per killed player. Votes are rounded down.",
|
||||
"youAreWorkhorse": "Your Ability: Workhorse\n\nYou gain {0} additional vote(s) per completed task. Votes are rounded down.",
|
||||
"youAreJuggernaut": "Your Ability: Juggernaut\n\nThe Impostor team instantly wins if you gain {0} kills.",
|
||||
|
||||
"jesterWin": "Jester wins! (voted)\n\nImpostors: ",
|
||||
"speedrunnerWin": "Crewmates win! (Tasker finished tasks)\n\nImpostors: ",
|
||||
"juggernautWin": "Impostors win! (Juggernaut killed {0} players)\n\nImpostors: ",
|
||||
"crewmateWin": "Crewmates Win!\n\nImpostors: ",
|
||||
"impostorWin": "Impostors Win!\n\nImpostors: ",
|
||||
"crewmateWinTasks": "Crewmates Win! ({0}% tasks completed)\n\nImpostors: ",
|
||||
"impostorWinMisc": "Impostors Win! (Sabotage)\n\n Impostors: ",
|
||||
|
||||
"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!",
|
||||
@@ -310,7 +272,7 @@
|
||||
"emDesc": "End the current meeting.",
|
||||
"aurDesc": "Send Among Us Revamped social links.",
|
||||
"sDesc": "Start the game countdown.",
|
||||
"rDesc": "/r send active abilities or current gamemode. /r {ability} send specific ability info",
|
||||
"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.",
|
||||
@@ -326,5 +288,9 @@
|
||||
"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."
|
||||
"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."
|
||||
}
|
||||
Reference in new issue
Block a user