mirror of
https://github.com/ApeMV/AmongUsRevamped.git
synced 2026-10-22 15:41:19 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
30c436f80b | ||
|
|
7c0be8b4bb |
No files matched your search
+17
-1
@@ -29,7 +29,7 @@ public partial class Main : BasePlugin
|
||||
public static NormalGameOptionsV10 NormalOptions => GameOptionsManager.Instance != null ? GameOptionsManager.Instance.currentNormalGameOptions : null;
|
||||
public static bool HasArgumentException;
|
||||
public static string CredentialsText;
|
||||
public const string ModVersion = "v1.2.0";
|
||||
public const string ModVersion = "v1.2.1";
|
||||
|
||||
public static float GameTimer;
|
||||
|
||||
@@ -105,4 +105,20 @@ public partial class Main : BasePlugin
|
||||
Gray = 15,
|
||||
Tan = 16
|
||||
}
|
||||
|
||||
// Innersloth now censors messages with more than 5 numbers. This is the best bypass I can give
|
||||
public enum BasicNumberToLetter
|
||||
{
|
||||
Zero = 0,
|
||||
One = 1,
|
||||
Two = 2,
|
||||
Three = 3,
|
||||
Four = 4,
|
||||
Five = 5,
|
||||
Six = 6,
|
||||
Seven = 7,
|
||||
Eight = 8,
|
||||
Nine = 9,
|
||||
Ten = 10
|
||||
}
|
||||
}
|
||||
@@ -40,6 +40,7 @@ namespace AmongUsRevamped
|
||||
public static OptionItem ApplyBanList;
|
||||
public static OptionItem ApplyDenyNameList;
|
||||
public static OptionItem ApplyModeratorList;
|
||||
public static OptionItem ModeratorCanUseCommand;
|
||||
|
||||
public static OptionItem TabGroupAutomation;
|
||||
|
||||
@@ -208,6 +209,7 @@ namespace AmongUsRevamped
|
||||
ApplyBanList = BooleanOptionItem.Create(60110, "Apply BanList", true, TabGroup.SystemSettings, true);
|
||||
ApplyDenyNameList = BooleanOptionItem.Create(60120, "Apply DenyName List", true, TabGroup.SystemSettings, false);
|
||||
ApplyModeratorList = BooleanOptionItem.Create(60121, "Apply Moderator List", true, TabGroup.SystemSettings, false);
|
||||
ModeratorCanUseCommand = BooleanOptionItem.Create(60122, "Moderators can use commands", true, TabGroup.SystemSettings, false);
|
||||
|
||||
TabGroupAutomation = TextOptionItem.Create(60149, "Automation", TabGroup.SystemSettings)
|
||||
.SetColor(Color.yellow);
|
||||
@@ -240,7 +242,7 @@ namespace AmongUsRevamped
|
||||
SNSSettingsOverride = BooleanOptionItem.Create(70051, "Auto Update Settings", true, TabGroup.GamemodeSettings, false);
|
||||
CantKillTime = IntegerOptionItem.Create(70053, "After Misfiring, Can't kill for", new(0, 60, 5), 20, TabGroup.GamemodeSettings, false)
|
||||
.SetValueFormat(OptionFormat.Seconds);
|
||||
MisfiresToSuicide = IntegerOptionItem.Create(70052, "Suicide After Amount Of Misfires", new(1, 15, 1), 2, TabGroup.GamemodeSettings, false);
|
||||
MisfiresToSuicide = IntegerOptionItem.Create(70052, "Suicide After Amount Of Misfires", new(1, 10, 1), 2, TabGroup.GamemodeSettings, false);
|
||||
CrewAutoWinsGameAfter = IntegerOptionItem.Create(70054, "Crewmates Automatically Win After", new(0, 600, 10), 300, TabGroup.GamemodeSettings, false)
|
||||
.SetValueFormat(OptionFormat.Seconds);
|
||||
|
||||
|
||||
+84
-1
@@ -27,7 +27,7 @@ public static class Utils
|
||||
|
||||
public static int allAlivePlayersCount => AllAlivePlayerControls.Count();
|
||||
public static int AliveCrewmates => AllAlivePlayerControls.Count(pc => !pc.Data.Role.IsImpostor);
|
||||
public static int AliveImpostors => AllAlivePlayerControls.Count(pc => pc.Data.Role.IsImpostor);
|
||||
public static int AliveImpostors => AllAlivePlayerControls.Count(pc => pc.Data.Role.IsImpostor || pc.isNew);
|
||||
|
||||
public static bool IsLobby => AmongUsClient.Instance.GameState == InnerNetClient.GameStates.Joined;
|
||||
public static bool InGame => AmongUsClient.Instance && AmongUsClient.Instance.GameState == InnerNetClient.GameStates.Started;
|
||||
@@ -256,4 +256,87 @@ 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)
|
||||
{
|
||||
OnGameJoinedPatch.WaitingForChat = true;
|
||||
|
||||
__instance.freeChatField.textArea.Clear();
|
||||
__instance.freeChatField.textArea.SetText(string.Empty);
|
||||
|
||||
PlayerControl.LocalPlayer.RpcSendChat($"{msg}");
|
||||
|
||||
new LateTask(() =>
|
||||
{
|
||||
if (multi && msg2 != "")
|
||||
{
|
||||
PlayerControl.LocalPlayer.RpcSendChat($"{msg2}");
|
||||
}
|
||||
|
||||
if (!multi)
|
||||
{
|
||||
OnGameJoinedPatch.WaitingForChat = false;
|
||||
}
|
||||
}, 2.2f, "ChatCommand1");
|
||||
|
||||
if (!multi || msg2 == "") return;
|
||||
|
||||
new LateTask(() =>
|
||||
{
|
||||
OnGameJoinedPatch.WaitingForChat = false;
|
||||
}, 4.4f, "ChatCommand2");
|
||||
}
|
||||
|
||||
public static void ModeratorChatCommand(string msg, string msg2, bool multi)
|
||||
{
|
||||
OnGameJoinedPatch.WaitingForChat = true;
|
||||
|
||||
new LateTask(() =>
|
||||
{
|
||||
PlayerControl.LocalPlayer.RpcSendChat($"{msg}");
|
||||
}, 2.2f, "ModeratorChatCommand1");
|
||||
|
||||
new LateTask(() =>
|
||||
{
|
||||
if (multi && msg2 != "")
|
||||
{
|
||||
PlayerControl.LocalPlayer.RpcSendChat($"{msg2}");
|
||||
}
|
||||
|
||||
if (!multi)
|
||||
{
|
||||
OnGameJoinedPatch.WaitingForChat = false;
|
||||
}
|
||||
}, 4.4f, "ModeratorChatCommand2");
|
||||
|
||||
if (!multi || msg2 == "") return;
|
||||
|
||||
new LateTask(() =>
|
||||
{
|
||||
OnGameJoinedPatch.WaitingForChat = false;
|
||||
}, 6.6f, "ModeratorChatCommand3");
|
||||
}
|
||||
|
||||
public static string BasicIntToWord(int value)
|
||||
{
|
||||
if (Enum.IsDefined(typeof(Main.BasicNumberToLetter), value))
|
||||
{
|
||||
return ((Main.BasicNumberToLetter)value).ToString();
|
||||
}
|
||||
|
||||
return value.ToString();
|
||||
}
|
||||
}
|
||||
+125
-84
@@ -26,62 +26,51 @@ internal static class ChatControllerUpdatePatch
|
||||
[HarmonyPatch(typeof(ChatController), nameof(ChatController.SendChat))]
|
||||
internal static class SendChatPatch
|
||||
{
|
||||
public static string noKcdMode = "0 Kill Cooldown:\n\nImpostors have no kill cooldown, Crewmates have low tasks\nThink fast and pay attention!";
|
||||
public static string SnSModeOne = "Shift and Seek:\n\nImpostors can only kill someone while shapeshifted as them\nSabotages & Meetings = Off";
|
||||
public static string SnSModeTwo = $"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{Utils.BasicIntToWord(Options.MisfiresToSuicide.GetInt())} wrong kills = suicide";
|
||||
public static string speedrunMode = $"Speedrun:\n\nEveryone is a crewmate The 1st player to finish tasks wins the game Game auto ends after {Options.GameAutoEndsAfter.GetInt()}s";
|
||||
|
||||
public static string 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";
|
||||
public static string allCommandsOne = "Commands:\n/r - Current mode description\n/0kc, /sns, /sp - Specific mode description\n/l - Shows last winner info";
|
||||
public static string allCommandsTwo = "/kick, /ban - Bans or kicks a player by name\n/ckick, /cban - Bans or kicks a player by color";
|
||||
|
||||
public static bool Prefix(ChatController __instance)
|
||||
{
|
||||
string text = __instance.freeChatField.textArea.text.Trim();
|
||||
string noKcdMode = "0 Kill Cooldown Mode:\n\nImpostors have no kill cooldown, Crewmates have low tasks.\nThink fast and pay attention.";
|
||||
string SnSModeOne = "Shift and Seek Mode:\n\nImps can only kill someone while shapeshifted as them.\nSabotages & Meetings = Off.";
|
||||
string SnSModeTwo = $"Crew wins by tasks/surviving {Options.CrewAutoWinsGameAfter.GetInt()}s.\nImp wins by killing Crew.\n1 Wrong kill = Can't kill for {Options.CantKillTime.GetInt()}s.\n{Options.MisfiresToSuicide.GetInt()} Wrong kills = suicide.";
|
||||
string speedrunMode = $"Speedrun Mode:\n\nEveryone is a crewmate. The 1st player to finish tasks wins the game. Game auto ends after {Options.GameAutoEndsAfter.GetInt()}s";
|
||||
|
||||
if (text == "/h" || text == "/help")
|
||||
if (__instance.timeSinceLastMessage < 3f || OnGameJoinedPatch.WaitingForChat) return false;
|
||||
|
||||
if (text == "/h" || text == "/help" || text == "/cmd" || text == "/commands")
|
||||
{
|
||||
// PlayerControl.LocalPlayer.SendChat("All AUR commands:\n/0kc - Sends the 0 Kill Cooldown gamemode description to everyone");
|
||||
HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, $"{allCommandsFull}");
|
||||
__instance.freeChatField.textArea.Clear();
|
||||
__instance.freeChatField.textArea.SetText(string.Empty);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (__instance.timeSinceLastMessage < 3f || OnGameJoinedPatch.WaitingForChat) return false;
|
||||
|
||||
if (text == "/l" || text == "/lastgame" || text == "/win" || text == "/winner")
|
||||
{
|
||||
Utils.ShowLastResult();
|
||||
__instance.timeSinceLastMessage = 0.8f;
|
||||
__instance.freeChatField.textArea.Clear();
|
||||
__instance.freeChatField.textArea.SetText(string.Empty);
|
||||
if (string.IsNullOrEmpty(NormalGameEndChecker.LastWinReason) || Utils.InGame) return false;
|
||||
Utils.ChatCommand(__instance, $"{NormalGameEndChecker.LastWinReason}", "", false);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (text == "/0kc" || text == "/0kcd" || text == "/0killcooldown")
|
||||
{
|
||||
PlayerControl.LocalPlayer.RpcSendChat($"{noKcdMode}");
|
||||
__instance.timeSinceLastMessage = 0.8f;
|
||||
__instance.freeChatField.textArea.Clear();
|
||||
__instance.freeChatField.textArea.SetText(string.Empty);
|
||||
Utils.ChatCommand(__instance, $"{noKcdMode}", "", false);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (text == "/sns" || text == "/shiftandseek" || text == "/shift&seek")
|
||||
{
|
||||
PlayerControl.LocalPlayer.RpcSendChat($"{SnSModeOne}");
|
||||
__instance.timeSinceLastMessage = 0.8f;
|
||||
__instance.freeChatField.textArea.Clear();
|
||||
__instance.freeChatField.textArea.SetText(string.Empty);
|
||||
|
||||
new LateTask(() =>
|
||||
{
|
||||
if (!Utils.IsLobby) return;
|
||||
PlayerControl.LocalPlayer.RpcSendChat($"{SnSModeTwo}");
|
||||
__instance.timeSinceLastMessage = 0.8f;
|
||||
}, 2.2f, "SNSTutorial2");
|
||||
Utils.ChatCommand(__instance, $"{SnSModeOne}", $"{SnSModeTwo}", true);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (text == "/sp" || text == "/sr" || text == "/speedrun")
|
||||
{
|
||||
PlayerControl.LocalPlayer.RpcSendChat($"{speedrunMode}");
|
||||
__instance.timeSinceLastMessage = 0.8f;
|
||||
__instance.freeChatField.textArea.Clear();
|
||||
__instance.freeChatField.textArea.SetText(string.Empty);
|
||||
Utils.ChatCommand(__instance, $"{speedrunMode}", "", false);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -90,37 +79,22 @@ internal static class SendChatPatch
|
||||
switch (Options.Gamemode.GetValue())
|
||||
{
|
||||
case 0:
|
||||
PlayerControl.LocalPlayer.RpcSendChat($"Custom roles:\nThere are no custom roles.");
|
||||
__instance.timeSinceLastMessage = 0.8f;
|
||||
__instance.freeChatField.textArea.Clear();
|
||||
__instance.freeChatField.textArea.SetText(string.Empty);
|
||||
PlayerControl.LocalPlayer.RpcSendChat($"Custom roles:\nThere are no custom roles.");
|
||||
__instance.timeSinceLastMessage = 0.8f;
|
||||
__instance.freeChatField.textArea.Clear();
|
||||
__instance.freeChatField.textArea.SetText(string.Empty);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
PlayerControl.LocalPlayer.RpcSendChat($"{noKcdMode}");
|
||||
__instance.timeSinceLastMessage = 0.8f;
|
||||
__instance.freeChatField.textArea.Clear();
|
||||
__instance.freeChatField.textArea.SetText(string.Empty);
|
||||
Utils.ChatCommand(__instance, $"{noKcdMode}", "", false);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
PlayerControl.LocalPlayer.RpcSendChat($"{SnSModeOne}");
|
||||
__instance.timeSinceLastMessage = 0.8f;
|
||||
__instance.freeChatField.textArea.Clear();
|
||||
__instance.freeChatField.textArea.SetText(string.Empty);
|
||||
|
||||
new LateTask(() =>
|
||||
{
|
||||
PlayerControl.LocalPlayer.RpcSendChat($"{SnSModeTwo}");
|
||||
__instance.timeSinceLastMessage = 0.8f;
|
||||
}, 2.2f, "SNSTutorial2");
|
||||
Utils.ChatCommand(__instance, $"{SnSModeOne}", $"{SnSModeTwo}", true);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
PlayerControl.LocalPlayer.RpcSendChat($"{speedrunMode}");
|
||||
__instance.timeSinceLastMessage = 0.8f;
|
||||
__instance.freeChatField.textArea.Clear();
|
||||
__instance.freeChatField.textArea.SetText(string.Empty);
|
||||
Utils.ChatCommand(__instance, $"{speedrunMode}", "", false);
|
||||
break;
|
||||
|
||||
}
|
||||
@@ -193,50 +167,117 @@ public static class RPCHandlerPatch
|
||||
{
|
||||
case RpcCalls.SendChat:
|
||||
{
|
||||
string chatText = subReader.ReadString();
|
||||
Logger.Info($" {__instance.Data.PlayerName}: {chatText}", "SendChat");
|
||||
string text = subReader.ReadString();
|
||||
Logger.Info($" {__instance.Data.PlayerName}: {text}", "SendChat");
|
||||
|
||||
// Banning works by name and color. Commands are seperated incase someone has a color as their name
|
||||
bool isKick = chatText.StartsWith("/kick ");
|
||||
bool isBan = chatText.StartsWith("/ban ");
|
||||
if (!Utils.IsPlayerModerator(__instance.Data.FriendCode) || !Options.ModeratorCanUseCommand.GetBool()) return;
|
||||
|
||||
bool isColorKick = chatText.StartsWith("/ckick ");
|
||||
bool isColorBan = chatText.StartsWith("/cban ");
|
||||
|
||||
bool banLog = isBan || isColorBan;
|
||||
|
||||
if (!isKick && !isBan && !isColorKick && !isColorBan) return;
|
||||
|
||||
if (Utils.IsPlayerModerator(__instance.Data.FriendCode))
|
||||
if (text == "/h" || text == "/help" || text == "/cmd" || text == "/commands")
|
||||
{
|
||||
string arg = chatText.Substring(isKick ? 6 : isBan ? 5 : isColorKick ? 7 : isColorBan ? 6 : 0).Trim();
|
||||
OnGameJoinedPatch.WaitingForChat = true;
|
||||
|
||||
PlayerControl target = null;
|
||||
|
||||
foreach (PlayerControl p in PlayerControl.AllPlayerControls)
|
||||
new LateTask(() =>
|
||||
{
|
||||
if (p.Data == null || p == PlayerControl.LocalPlayer || Utils.IsPlayerModerator(p.Data.FriendCode)) continue;
|
||||
Utils.SendPrivateMessage(__instance, $"{SendChatPatch.allCommandsOne}");
|
||||
}, 2.2f, "MHP1");
|
||||
|
||||
if ((isKick || isBan) && p.Data.PlayerName.Equals(arg, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
target = p;
|
||||
break;
|
||||
}
|
||||
new LateTask(() =>
|
||||
{
|
||||
Utils.SendPrivateMessage(__instance, $"{SendChatPatch.allCommandsTwo}");
|
||||
}, 4.4f, "MHP2");
|
||||
|
||||
if ((isColorKick || isColorBan) && Utils.TryGetColorId(arg, out byte colorId))
|
||||
new LateTask(() =>
|
||||
{
|
||||
OnGameJoinedPatch.WaitingForChat = false;
|
||||
}, 6.6f, "MHP3");
|
||||
}
|
||||
|
||||
if (text == "/l" || text == "/lastgame" || text == "/win" || text == "/winner")
|
||||
{
|
||||
if (string.IsNullOrEmpty(NormalGameEndChecker.LastWinReason) || Utils.InGame) return;
|
||||
Utils.ModeratorChatCommand($"{NormalGameEndChecker.LastWinReason}", "", false);
|
||||
}
|
||||
|
||||
if (text == "/0kc" || text == "/0kcd" || text == "/0killcooldown")
|
||||
{
|
||||
Utils.ModeratorChatCommand($"{SendChatPatch.noKcdMode}", "", false);
|
||||
}
|
||||
if (text == "/sns" || text == "/shiftandseek" || text == "/shift&seek")
|
||||
{
|
||||
Utils.ModeratorChatCommand($"{SendChatPatch.SnSModeOne}", $"{SendChatPatch.SnSModeTwo}", true);
|
||||
}
|
||||
|
||||
if (text == "/sp" || text == "/sr" || text == "/speedrun")
|
||||
{
|
||||
Utils.ModeratorChatCommand($"{SendChatPatch.speedrunMode}", "", false);
|
||||
}
|
||||
|
||||
if (text == "/r" || text == "/roles" || text == "/gamemode" || text == "/gm")
|
||||
{
|
||||
switch (Options.Gamemode.GetValue())
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
|
||||
case 1:
|
||||
Utils.ModeratorChatCommand($"{SendChatPatch.noKcdMode}", "", false);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
Utils.ModeratorChatCommand($"{SendChatPatch.SnSModeOne}", $"{SendChatPatch.SnSModeTwo}", true);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
Utils.ModeratorChatCommand($"{SendChatPatch.speedrunMode}", "", false);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
// Banning works by name and color. Commands are seperated incase someone has a color as their name
|
||||
bool isKick = text.StartsWith("/kick ");
|
||||
bool isBan = text.StartsWith("/ban ");
|
||||
|
||||
bool isColorKick = text.StartsWith("/ckick ");
|
||||
bool isColorBan = text.StartsWith("/cban ");
|
||||
|
||||
bool banLog = isBan || isColorBan;
|
||||
|
||||
if (!isKick && !isBan && !isColorKick && !isColorBan) return;
|
||||
|
||||
if (Utils.IsPlayerModerator(__instance.Data.FriendCode))
|
||||
{
|
||||
string arg = text.Substring(isKick ? 6 : isBan ? 5 : isColorKick ? 7 : isColorBan ? 6 : 0).Trim();
|
||||
|
||||
PlayerControl target = null;
|
||||
|
||||
foreach (PlayerControl p in PlayerControl.AllPlayerControls)
|
||||
{
|
||||
if (p.Data.DefaultOutfit.ColorId == colorId)
|
||||
if (p.Data == null || p == PlayerControl.LocalPlayer || Utils.IsPlayerModerator(p.Data.FriendCode)) continue;
|
||||
|
||||
if ((isKick || isBan) && p.Data.PlayerName.Equals(arg, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
target = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (target != null)
|
||||
{
|
||||
AmongUsClient.Instance.KickPlayer(target.Data.ClientId, isBan || isColorBan);
|
||||
Logger.Info($" {__instance.Data.PlayerName} {(banLog ? "banned" : "kicked")} {target.Data.PlayerName}", "Kick&BanCommand");
|
||||
if ((isColorKick || isColorBan) && Utils.TryGetColorId(arg, out byte colorId))
|
||||
{
|
||||
if (p.Data.DefaultOutfit.ColorId == colorId)
|
||||
{
|
||||
target = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (target != null)
|
||||
{
|
||||
AmongUsClient.Instance.KickPlayer(target.Data.ClientId, isBan || isColorBan);
|
||||
Logger.Info($" {__instance.Data.PlayerName} {(banLog ? "banned" : "kicked")} {target.Data.PlayerName}", "Kick&BanCommand");
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -28,7 +28,7 @@ class NormalGameEndChecker
|
||||
public static bool Prefix()
|
||||
{
|
||||
|
||||
if (Options.NoGameEnd.GetBool() || Options.Gamemode.GetValue() == 3 || Options.Gamemode.GetValue() == 2 && Main.NormalOptions.NumImpostors*2 < Utils.allAlivePlayersCount) return false;
|
||||
if (Options.NoGameEnd.GetBool() || Options.Gamemode.GetValue() == 3) return false;
|
||||
|
||||
var allPlayers = PlayerControl.AllPlayerControls.ToArray();
|
||||
|
||||
|
||||
@@ -14,17 +14,10 @@ internal class ApplyCustomImpostorCount
|
||||
NormalGameEndChecker.imps.Clear();
|
||||
NormalGameEndChecker.LastWinReason = "";
|
||||
|
||||
// Normal game = Impostor to prevent blocking task win. HNS = Crewmate to prevent Seeker detection range bugging.
|
||||
if (Main.GM.Value)
|
||||
{
|
||||
if (!Utils.isHideNSeek)
|
||||
{
|
||||
PlayerControl.LocalPlayer.RpcSetRole(AmongUs.GameOptions.RoleTypes.ImpostorGhost, false);
|
||||
}
|
||||
if (Utils.isHideNSeek)
|
||||
{
|
||||
PlayerControl.LocalPlayer.RpcSetRole(AmongUs.GameOptions.RoleTypes.CrewmateGhost, false);
|
||||
}
|
||||
PlayerControl.LocalPlayer.myTasks.Clear();
|
||||
}
|
||||
|
||||
if (Options.Gamemode.GetValue() == 3 && !Utils.isHideNSeek)
|
||||
|
||||
@@ -141,16 +141,19 @@ internal static class MurderPlayerPatch
|
||||
|
||||
misfireCount[playerId]++;
|
||||
|
||||
__instance.RpcSetRole(RoleTypes.Crewmate);
|
||||
__instance.isNew = true;
|
||||
Logger.Info($" {__instance.Data.PlayerName} killed {target.Data.PlayerName} incorrectly and can't kill for {Options.CantKillTime.GetInt()}s", "SNSKillManager");
|
||||
Logger.SendInGame($" {__instance.Data.PlayerName} killed {target.Data.PlayerName}, incorrectly and can't kill for {Options.CantKillTime.GetInt()}s");
|
||||
|
||||
new LateTask(() =>
|
||||
if (misfireCount[__instance.Data.PlayerId] < Options.MisfiresToSuicide.GetFloat())
|
||||
{
|
||||
__instance.isNew = false;
|
||||
if (!__instance.Data.IsDead) {__instance.RpcSetRole(RoleTypes.Shapeshifter, false);}
|
||||
}, Options.CantKillTime.GetInt(), "SNSResetRole");
|
||||
__instance.RpcSetRole(RoleTypes.Crewmate);
|
||||
__instance.isNew = true;
|
||||
Logger.Info($" {__instance.Data.PlayerName} killed {target.Data.PlayerName} incorrectly and can't kill for {Options.CantKillTime.GetInt()}s", "SNSKillManager");
|
||||
Logger.SendInGame($" {__instance.Data.PlayerName} killed {target.Data.PlayerName} incorrectly and can't kill for {Options.CantKillTime.GetInt()}s");
|
||||
|
||||
new LateTask(() =>
|
||||
{
|
||||
__instance.isNew = false;
|
||||
if (!__instance.Data.IsDead) {__instance.RpcSetRole(RoleTypes.Shapeshifter, false);}
|
||||
}, Options.CantKillTime.GetInt(), "SNSResetRole");
|
||||
}
|
||||
|
||||
if (misfireCount[__instance.Data.PlayerId] >= Options.MisfiresToSuicide.GetFloat())
|
||||
{
|
||||
|
||||
@@ -128,6 +128,12 @@ internal static class RpcSetTasksPatch
|
||||
PlayerControl pc = __instance.Object;
|
||||
if (pc == null) return;
|
||||
|
||||
if (Main.GM.Value && pc == PlayerControl.LocalPlayer)
|
||||
{
|
||||
taskTypeIds = new Il2CppStructArray<byte>(0);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Options.AllPlayersSameTasks.GetBool())
|
||||
{
|
||||
RerollTasks(ref taskTypeIds);
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
</p>
|
||||
|
||||
# 💡 How To Install:
|
||||
- <b>If you have BepInEx, download AmongUsRevamped.dll in releases and move it into Among Us → BepinEx → Plugins</b>
|
||||
- <b>If you have BepInEx, download AUR.dll in releases and move it into Among Us → BepinEx → Plugins</b>
|
||||
- <b> If you don't have BepInEx:</b>
|
||||
- Download the latest .zip file in the releases tab
|
||||
- Extract the contents of the zip into your Among Us folder
|
||||
@@ -29,7 +29,7 @@
|
||||
<img src="https://github.com/astra1dev/AUnlocker/assets/90265231/14226f03-a003-4efc-b27b-6df53fb394d6" width=410 height=240>****
|
||||
|
||||
|
||||
# 🎮 Features (v1.1.1):
|
||||
# 🎮 Features (v1.2.1):
|
||||
- <b>🔶 Client Side settings:</b>
|
||||
- Game Master
|
||||
- Unlock FPS
|
||||
@@ -39,14 +39,16 @@
|
||||
- <b>🔷 Technical settings:</b>
|
||||
- Kick/Ban players under a certain level
|
||||
- Kick/Ban invalid FriendCodes
|
||||
- Kick/Ban command using names instead of ID's
|
||||
- Kick/Ban command using names
|
||||
- Ckick/Cban command using colors
|
||||
- DenyName system
|
||||
- Moderator system
|
||||
- Banlist system
|
||||
- Enable No Game End
|
||||
- Banlist
|
||||
- <b>🔶 Automatic settings:</b>
|
||||
- Auto start game + conditions for it
|
||||
- <b>🔶 Automation settings:</b>
|
||||
- Auto start game and conditions for it
|
||||
- Auto rejoin lobby
|
||||
- Auto send winner info
|
||||
- <b>🔷 Gameplay Settings:</b>
|
||||
- Disable critical sabotages
|
||||
- Disable door sabotages
|
||||
@@ -61,10 +63,11 @@
|
||||
- <b>🔷 Extra features:</b>
|
||||
- Shift + L + Enter - Force End Game
|
||||
- Shift + M + Enter - Force Call/Close Meeting
|
||||
- Gamemode info commands -> /0kc /0killcooldown | /sns /shiftandseek |/sp /speedrun
|
||||
- /help command
|
||||
- Specific gamemode info commands -> /0kc, /sns, /sp
|
||||
- Current gamemode info command -> /r
|
||||
- Zoom out in lobby or when dead
|
||||
- Kick players while in game
|
||||
- Unlimited Option ranges
|
||||
- Unlimited default Option ranges
|
||||
- Logging for useful information
|
||||
- <b>🎉 And this all without Modded Protocol!</b>
|
||||
|
||||
|
||||
Reference in new issue
Block a user