Compare commits

...
10 Commits
Author SHA1 Message Date
Ape 59384ec415 I promise this is the last one 2026-01-13 16:35:37 +01:00
Ape 43c3826aeb Another readme change 2026-01-13 16:32:26 +01:00
Ape 6869dc80b4 Merge branch 'main' of https://github.com/ApeMV/AmongUsRevamped 2026-01-13 16:26:47 +01:00
Ape 016ad4ba06 DenyName, Many SnS fixes, Gamemode behavior change 2026-01-13 16:26:43 +01:00
Ape 0ee0937254 Update readme from mobile - hope this works 2026-01-12 19:19:58 +01:00
Ape 4c5d53bc01 v1.1.0 v2 2026-01-12 00:34:08 +01:00
Ape 19ed93e308 1.1.0
Updated version number from v1.0.1 to v1.1.0 and added new features.
2026-01-12 00:33:35 +01:00
Ape ef8febf979 v1.1.0 - Fixes, Speedrun GM, Moderators, Commands,
Yeah it's a lot
2026-01-12 00:29:40 +01:00
Ape 1e18868bf5 Merge branch 'main' of https://github.com/ApeMV/AmongUsRevamped 2026-01-08 21:57:14 +01:00
Ape 7944956053 Random bullshit go! (Did Innersloth break this?) 2026-01-08 21:57:11 +01:00
14 changed files with 295 additions and 44 deletions

No files matched your search

+1 -1
View File
@@ -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.0.0";
public const string ModVersion = "v1.1.1";
public static float GameTimer;
+6
View File
@@ -12,6 +12,7 @@ namespace AmongUsRevamped;
public static class BanManager
{
public static string RemoveHtmlTags(this string str) => Regex.Replace(str, "<[^>]*?>", "");
private static readonly string DenyNameListPath = "./AUR-DATA/DenyNameList.txt";
private static string BanListPath = "./AUR-DATA/BanList.txt";
private static string ModeratorListPath = "./AUR-DATA/ModeratorList.txt";
public static List<string> TempBanWhiteList = [];
@@ -21,6 +22,11 @@ public static class BanManager
{
Directory.CreateDirectory("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");
+14 -2
View File
@@ -23,7 +23,7 @@ namespace AmongUsRevamped
public static readonly string[] gameModes =
{
"None", "0 Kill Cooldown", "Shift And Seek"
"None", "0 Kill Cooldown", "Shift And Seek", "Speedrun"
};
//System
@@ -38,6 +38,7 @@ namespace AmongUsRevamped
public static OptionItem TempBanInvalidFriendCodes;
public static OptionItem ApplyBanList;
public static OptionItem ApplyDenyNameList;
public static OptionItem ApplyModeratorList;
public static OptionItem AutoRejoinLobby;
@@ -174,6 +175,10 @@ namespace AmongUsRevamped
public static OptionItem CantKillTime;
public static OptionItem MisfiresToSuicide;
public static OptionItem TabGroupSpeedrun;
public static OptionItem SpeedrunSettingsOverride;
public static OptionItem GameAutoEndsAfter;
public static bool IsLoaded = false;
@@ -198,7 +203,8 @@ namespace AmongUsRevamped
.SetParent(KickInvalidFriendCodes);
ApplyBanList = BooleanOptionItem.Create(60110, "Apply BanList", true, TabGroup.SystemSettings, true);
ApplyModeratorList = BooleanOptionItem.Create(60120, "Apply ModeratorList", true, TabGroup.SystemSettings, false);
ApplyDenyNameList = BooleanOptionItem.Create(60120, "Apply DenyName List", true, TabGroup.SystemSettings, false);
ApplyModeratorList = BooleanOptionItem.Create(60121, "Apply Moderator List", true, TabGroup.SystemSettings, false);
AutoRejoinLobby = BooleanOptionItem.Create(60210, "Auto Rejoin Lobby", false, TabGroup.SystemSettings, false);
AutoStartTimer = IntegerOptionItem.Create(44420, "Countdown For Auto Start", new(1, 600, 1), 5, TabGroup.SystemSettings, false)
@@ -232,6 +238,12 @@ namespace AmongUsRevamped
CrewAutoWinsGameAfter = IntegerOptionItem.Create(70054, "Crewmates Automatically Win After", new(0, 600, 10), 300, TabGroup.GamemodeSettings, false)
.SetValueFormat(OptionFormat.Seconds);
TabGroupSpeedrun = TextOptionItem.Create(70075, "Speedrun", TabGroup.GamemodeSettings)
.SetColor(Color.blue);
SpeedrunSettingsOverride = BooleanOptionItem.Create(70076, "Auto Update Settings", true, TabGroup.GamemodeSettings, false);
GameAutoEndsAfter = IntegerOptionItem.Create(70077, "Game automatically ends after", new(0, 600, 10), 300, TabGroup.GamemodeSettings, false)
.SetValueFormat(OptionFormat.Seconds);
// Gameplay Settings
DisableSabotage = BooleanOptionItem.Create(60565, "Disable Critical Sabotages", false, TabGroup.ModSettings, false)
+16 -1
View File
@@ -36,10 +36,25 @@ public static class FixedUpdate
{
Main.GameTimer = 0f;
MessageWriter writer = AmongUsClient.Instance.StartEndGame();
writer.Write((byte)GameOverReason.ImpostorDisconnect);
AmongUsClient.Instance.FinishEndGame(writer);
Logger.Info($" Crewmates won because the game took longer than {Options.CrewAutoWinsGameAfter.GetInt()}s", "SNSManager");
}
}
// 3 = Speedrun
if (Options.Gamemode.GetValue() == 3 && !Utils.isHideNSeek && Options.GameAutoEndsAfter.GetInt() != 0 && !Options.NoGameEnd.GetBool())
{
Main.GameTimer += Time.fixedDeltaTime;
if (Main.GameTimer > Options.GameAutoEndsAfter.GetInt())
{
Main.GameTimer = 0f;
MessageWriter writer = AmongUsClient.Instance.StartEndGame();
writer.Write((byte)GameOverReason.CrewmatesByVote);
AmongUsClient.Instance.FinishEndGame(writer);
Logger.Info($" Crewmates win because the game took longer than {Options.CrewAutoWinsGameAfter.GetInt()}s", "SNSManager");
Logger.Info($" No one won because the game took longer than {Options.GameAutoEndsAfter.GetInt()}s", "SpeedrunManager");
}
}
}
+60 -2
View File
@@ -25,6 +25,8 @@ public static class Utils
public static long TimeStamp => EpochStartSeconds + (long)Stopwatch.Elapsed.TotalSeconds;
public static int allAlivePlayersCount => AllAlivePlayerControls.Count();
public static bool IsLobby => AmongUsClient.Instance.GameState == InnerNetClient.GameStates.Joined;
public static bool InGame => AmongUsClient.Instance && AmongUsClient.Instance.GameState == InnerNetClient.GameStates.Started;
public static bool isHideNSeek => GameOptionsManager.Instance.CurrentGameOptions.GameMode == GameModes.HideNSeek;
@@ -35,6 +37,8 @@ public static class Utils
public static bool IsFreePlay => AmongUsClient.Instance.NetworkMode == NetworkModes.FreePlay;
public static bool IsMeeting => InGame && (MeetingHud.Instance);
public static bool GamePastRoleSelection => Main.GameTimer > 10f;
public static bool HandlingGameEnd;
public static string ColorString(Color32 color, string str) => $"<#{color.r:x2}{color.g:x2}{color.b:x2}{color.a:x2}>{str}</color>";
public static string ColorToHex(Color32 color) => $"#{color.r:x2}{color.g:x2}{color.b:x2}{color.a:x2}";
@@ -43,11 +47,28 @@ public static class Utils
{
if (friendCode == "") return false;
var friendCodesFilePath = @"./AUR-DATA/Moderators.txt";
var friendCodesFilePath = @"./AUR-DATA/ModeratorList.txt";
var friendCodes = File.ReadAllLines(friendCodesFilePath);
return friendCodes.Any(code => code.Contains(friendCode));
}
public static bool IsPlayerInDenyName(ClientData client, string name)
{
if (name == "" || !AmongUsClient.Instance.AmHost || !Options.ApplyDenyNameList.GetBool()) return false;
var denyNameFilePath = @"./AUR-DATA/DenyNameList.txt";
var deniedNames = File.ReadAllLines(denyNameFilePath);
if (deniedNames.Where(code => !string.IsNullOrWhiteSpace(code)).Any(code => name.Contains(code, StringComparison.OrdinalIgnoreCase)))
{
AmongUsClient.Instance.KickPlayer(client.Id, false);
Logger.Info($" {name} was kicked because their name was in DenyNameList.txt", "Kick");
Logger.SendInGame($" {name} was kicked because their name was in DenyNameList.txt");
return true;
}
else return false;
}
public static string GetTabName(TabGroup tab)
{
switch (tab)
@@ -63,6 +84,11 @@ public static class Utils
}
}
public static bool IsCustomOption(NumberOption option)
{
return option.GetComponent<OptionItem>() != null;
}
public static void DestroyTranslator(this GameObject obj)
{
var translator = obj.GetComponent<TextTranslatorTMP>();
@@ -164,4 +190,36 @@ public static class Utils
try { return AmongUsClient.Instance.allClients.ToArray().FirstOrDefault(cd => cd.Id == id); }
catch { return null; }
}
}
public static void ClearLeftoverData()
{
RpcSetTasksPatch.GlobalTaskIds = null;
HandlingGameEnd = false;
OnGameJoinedPatch.AutoStartCheck = false;
Main.GameTimer = 0f;
MurderPlayerPatch.misfireCount.Clear();
LateTask.Tasks.Clear();
}
public static PlayerControl[] AllAlivePlayerControls
{
get
{
int count = PlayerControl.AllPlayerControls.Count;
var result = new PlayerControl[count];
var i = 0;
foreach (PlayerControl pc in PlayerControl.AllPlayerControls)
{
if (pc == null || pc.Data == null || pc.PlayerId >= 254 || pc.Data.IsDead || (pc.Data.Disconnected)) continue;
result[i++] = pc;
}
if (i == 0) return [];
Array.Resize(ref result, i);
return result;
}
}
}
+116
View File
@@ -0,0 +1,116 @@
using Hazel;
using InnerNet;
using System;
using UnityEngine;
// https://github.com/SuperNewRoles/SuperNewRoles/blob/master/SuperNewRoles/Patches/LobbyBehaviourPatch.cs
namespace AmongUsRevamped;
[HarmonyPatch(typeof(ChatController), nameof(ChatController.Update))]
internal static class ChatControllerUpdatePatch
{
public static void Postfix(ChatController __instance)
{
if (Main.DarkTheme.Value)
{
__instance.freeChatField.background.color = new Color32(40, 40, 40, byte.MaxValue);
__instance.quickChatField.background.color = new Color32(40, 40, 40, byte.MaxValue);
__instance.quickChatField.text.color = Color.white;
}
else __instance.freeChatField.textArea.outputText.color = Color.black;
}
}
[HarmonyPatch(typeof(ChatController), nameof(ChatController.SendChat))]
internal static class SendChatPatch
{
public static bool Prefix(ChatController __instance)
{
string text = __instance.freeChatField.textArea.text.Trim();
if (text == "/h" || text == "/help")
{
// PlayerControl.LocalPlayer.SendChat("All AUR commands:\n/0kc - Sends the 0 Kill Cooldown gamemode description to everyone");
return false;
}
if (__instance.timeSinceLastMessage < 3f) return false;
if (text == "/0kc" || text == "/0kcd" || text == "/0killcooldown")
{
PlayerControl.LocalPlayer.RpcSendChat("0 Kill Cooldown Mode:\n\nImpostors have no kill cooldown, Crewmates have low tasks.\nThink fast and pay attention.");
__instance.timeSinceLastMessage = 0.8f;
__instance.freeChatField.textArea.Clear();
__instance.freeChatField.textArea.SetText(string.Empty);
return false;
}
if (text == "/sns" || text == "/shiftandseek" || text == "/shift&seek")
{
PlayerControl.LocalPlayer.RpcSendChat("Shift and Seek Mode:\n\nImps can only kill someone while shapeshifted as them.\nSabotages & Meetings = Off.");
__instance.timeSinceLastMessage = 0.8f;
__instance.freeChatField.textArea.Clear();
__instance.freeChatField.textArea.SetText(string.Empty);
new LateTask(() =>
{
PlayerControl.LocalPlayer.RpcSendChat($"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.");
__instance.timeSinceLastMessage = 0.8f;
}, 2.2f, "SNSTutorial2");
return false;
}
if (text == "/sp" || text == "/sr" || text == "/speedrun")
{
PlayerControl.LocalPlayer.RpcSendChat($"Speedrun Mode:\n\nEveryone is a crewmate. The 1st player to finish tasks wins the game. Game auto ends after {Options.GameAutoEndsAfter.GetInt()}s");
__instance.timeSinceLastMessage = 0.8f;
__instance.freeChatField.textArea.Clear();
__instance.freeChatField.textArea.SetText(string.Empty);
return false;
}
else return true;
}
}
[HarmonyPatch(typeof(PlayerControl), "RpcSendChat")]
public static class PC_RpcSendChat
{
// Banning works by Name and not Id
public static void Prefix(PlayerControl __instance, ref string chatText)
{
if (!AmongUsClient.Instance.AmHost)
return;
bool isKick = chatText.StartsWith("/kick ");
bool isBan = chatText.StartsWith("/ban ");
if (!isKick && !isBan)
return;
if (__instance == PlayerControl.LocalPlayer || Utils.IsPlayerModerator(__instance.Data.FriendCode))
{
string kickedPlayerName = chatText.Substring(isBan ? 5 : 6).Trim();
PlayerControl target = null;
foreach (PlayerControl p in PlayerControl.AllPlayerControls)
{
if (p.Data != null && !Utils.IsPlayerModerator(p.Data.FriendCode) && p != PlayerControl.LocalPlayer && p.Data.PlayerName.Equals(kickedPlayerName, StringComparison.OrdinalIgnoreCase))
{
target = p;
break;
}
}
if (target == null)
return;
AmongUsClient.Instance.KickPlayer(target.Data.ClientId, isBan);
Logger.Info($" {__instance.Data.PlayerName} {(isBan ? "banned" : "kicked")} {target.Data.PlayerName}", "Kick&BanCommand");
}
}
}
+1 -5
View File
@@ -51,11 +51,7 @@ namespace AmongUsRevamped
{
private static void Postfix(VersionShower __instance)
{
RpcSetTasksPatch.GlobalTaskIds = null;
OnGameJoinedPatch.AutoStartCheck = false;
Main.GameTimer = 0f;
MurderPlayerPatch.misfireCount.Clear();
LateTask.Tasks.Clear();
Utils.ClearLeftoverData();
Main.CredentialsText = $"<color=#FFD700>Among Us Revamped</color><color=#ffffff> {Main.ModVersion}</color>";
+3 -7
View File
@@ -10,11 +10,7 @@ public static class EndGameManagerPatch
{
public static void Postfix(EndGameManager __instance)
{
RpcSetTasksPatch.GlobalTaskIds = null;
OnGameJoinedPatch.AutoStartCheck = false;
Main.GameTimer = 0f;
MurderPlayerPatch.misfireCount.Clear();
LateTask.Tasks.Clear();
Utils.ClearLeftoverData();
EndGameNavigation navigation = __instance.Navigation;
if (!AmongUsClient.Instance.AmHost || __instance == null || navigation == null || !Options.AutoRejoinLobby.GetBool()) return;
@@ -27,7 +23,7 @@ class NormalGameEndChecker
{
public static bool Prefix()
{
if (Options.NoGameEnd.GetBool()) return false;
if (Options.NoGameEnd.GetBool() || Options.Gamemode.GetValue() == 3 || Options.Gamemode.GetValue() == 2 && Main.NormalOptions.NumImpostors*2 < Utils.allAlivePlayersCount ) return false;
else return true;
}
}
@@ -60,6 +56,6 @@ internal class ControllerManagerUpdatePatch
}
else
PlayerControl.LocalPlayer.ReportDeadBody(PlayerControl.LocalPlayer.Data);
}
}
}
}
+6
View File
@@ -56,6 +56,12 @@ class OnPlayerJoinedPatch
{
BanManager.CheckBanPlayer(Client);
Utils.IsPlayerInDenyName(Client, Client.PlayerName);
if (Utils.IsPlayerModerator(Client.FriendCode) && Options.ApplyModeratorList.GetBool())
{
Logger.Info($" {Client.PlayerName} is moderator", "ModeratorCheck");
}
if (HasInvalidFriendCode(Client.FriendCode) && Options.KickInvalidFriendCodes.GetBool())
{
+2
View File
@@ -47,6 +47,8 @@ public static class NumberOption_Initialize
{
public static void Postfix(NumberOption __instance)
{
if (ModGameOptionsMenu.TabIndex >= 3) return;
if (Utils.isHideNSeek || !Utils.isHideNSeek && __instance.Title != StringNames.GameNumImpostors && __instance.Title != StringNames.GamePlayerSpeed)
{
__instance.ValidRange = new FloatRange(-900f, 900f);
+23 -1
View File
@@ -24,6 +24,23 @@ internal class ApplyCustomImpostorCount
}
}
if (Options.Gamemode.GetValue() == 3 && !Utils.isHideNSeek)
{
foreach (var p in PlayerControl.AllPlayerControls)
{
p.RpcSetRole(AmongUs.GameOptions.RoleTypes.Crewmate, false);
new LateTask(() =>
{
p.RpcSetRole(AmongUs.GameOptions.RoleTypes.Crewmate, false);
}, 5f, "Speedrun Secondary RPCSetRole");
new LateTask(() =>
{
p.RpcSetRole(AmongUs.GameOptions.RoleTypes.Crewmate, false);
}, 9f, "Speedrun Tertiary RPCSetRole");
}
}
if (Utils.isHideNSeek)
{
@@ -61,7 +78,12 @@ internal class ApplyCustomImpostorCount
new LateTask(() =>
{
p.RpcSetRole(AmongUs.GameOptions.RoleTypes.Impostor, false);
}, 9f, "Secondary RPCSetRole");
}, 5f, "HNS Secondary RPCSetRole");
new LateTask(() =>
{
p.RpcSetRole(AmongUs.GameOptions.RoleTypes.Impostor, false);
}, 9f, "HNS Tertiary RPCSetRole");
}
}
}
+27 -3
View File
@@ -3,6 +3,7 @@ using AmongUs.GameOptions;
using Hazel;
using InnerNet;
using System;
using UnityEngine;
namespace AmongUsRevamped;
[HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.FixedUpdate))]
@@ -12,12 +13,14 @@ class FixedUpdateInGamePatch
{
if (__instance == null || __instance.PlayerId == 255) return;
GameObject g = GameObject.Find("GameSettingsLabel");
// 0Kc
if (Options.Gamemode.GetValue() == 1 && !Utils.isHideNSeek && Main.NormalOptions.KillCooldown != 0.01f)
{
Main.NormalOptions.KillCooldown = 0.01f;
if (Options.NoKcdSettingsOverride.GetBool())
if (Options.NoKcdSettingsOverride.GetBool() && g == null)
{
Main.NormalOptions.EmergencyCooldown = 0;
Main.NormalOptions.DiscussionTime = 0;
@@ -35,7 +38,7 @@ class FixedUpdateInGamePatch
{
Main.NormalOptions.KillCooldown = 2.5f;
if (Options.SNSSettingsOverride.GetBool())
if (Options.SNSSettingsOverride.GetBool() && g == null)
{
Main.NormalOptions.NumEmergencyMeetings = 0;
@@ -47,6 +50,27 @@ class FixedUpdateInGamePatch
}
}
// Speedrun
if (Options.Gamemode.GetValue() == 3 && !Utils.isHideNSeek && g == null)
{
Main.NormalOptions.NumEmergencyMeetings = 0;
Main.NormalOptions.TaskBarMode = 0;
if (__instance.AllTasksCompleted() && Utils.InGame && Utils.GamePastRoleSelection && !Utils.HandlingGameEnd)
{
Utils.HandlingGameEnd = true;
__instance.RpcSetRole(AmongUs.GameOptions.RoleTypes.ImpostorGhost, false);
new LateTask(() =>
{
MessageWriter writer = AmongUsClient.Instance.StartEndGame();
writer.Write((byte)GameOverReason.ImpostorsByVote);
AmongUsClient.Instance.FinishEndGame(writer);
}, 1f, "SpeedrunSetWinner");
}
}
if (Options.Gamemode.GetValue() == 0 && Main.NormalOptions.KillCooldown <= 0.01f)
{
Main.NormalOptions.KillCooldown = 25f;
@@ -128,7 +152,7 @@ internal static class MurderPlayerPatch
if (!__instance.Data.IsDead) {__instance.RpcSetRole(RoleTypes.Shapeshifter, false);}
}, Options.CantKillTime.GetInt(), "SNSResetRole");
if (misfireCount[__instance.Data.PlayerId] >= Options.MisfiresToSuicide.GetValue())
if (misfireCount[__instance.Data.PlayerId] >= Options.MisfiresToSuicide.GetFloat())
{
__instance.RpcSetRole(RoleTypes.ImpostorGhost);
Logger.Info($" {__instance.Data.PlayerName} misfired {misfireCount[playerId]} times and suicided", "SNSKillManager");
@@ -3,26 +3,8 @@ using InnerNet;
using System;
using UnityEngine;
// https://github.com/SuperNewRoles/SuperNewRoles/blob/master/SuperNewRoles/Patches/LobbyBehaviourPatch.cs
namespace AmongUsRevamped;
[HarmonyPatch(typeof(ChatController), nameof(ChatController.Update))]
internal static class ChatControllerUpdatePatch
{
public static void Postfix(ChatController __instance)
{
if (Main.DarkTheme.Value)
{
__instance.freeChatField.background.color = new Color32(40, 40, 40, byte.MaxValue);
__instance.quickChatField.background.color = new Color32(40, 40, 40, byte.MaxValue);
__instance.quickChatField.text.color = Color.white;
}
else __instance.freeChatField.textArea.outputText.color = Color.black;
}
}
[HarmonyPatch(typeof(VoteBanSystem), nameof(VoteBanSystem.AddVote))]
internal static class AddVotePatch
{
+20 -4
View File
@@ -1,6 +1,17 @@
# 📎 AmongUsRevamped
- AmongUsRevamped is a Host-Only mod with one goal: Creating the best Among Us experience possible without Modded Protocol. This includes new settings, utilities and even custom Gamemodes! Enjoy the countless features and feel free to contact me for anything regarding this mod. Happy gaming!
‎
# Welcome to AmongUsRevamped!
<br>
</p>
<p align="center">
<center>
<a href="https://discord.gg/83Zhzhyhya" target="_blank"><img src="https://img.shields.io/badge/Discord%20-%231DA1F2.svg?&style=for-the-badge&logo=discord&logoColor=white&color=5662f6"/></a>
<a href="https://github.com/apemv/AmongUsRevamped/releases/latest" target="_blank"><img src="https://img.shields.io/badge/Latest Version%20-%231DA1F2.svg?&style=for-the-badge&logo=github&logoColor=white&color=181717"/></a>
</center>
</p>
# 💡 How To Install:
- <b>If you have BepInEx, download AmongUsRevamped.dll in releases and move it into Among Us → BepinEx → Plugins</b>
@@ -18,7 +29,7 @@
<img src="https://github.com/astra1dev/AUnlocker/assets/90265231/14226f03-a003-4efc-b27b-6df53fb394d6" width=410 height=240>****
‎
# 🎮 Features (v1.0.1):
# 🎮 Features (v1.1.1):
- <b>🔶 Client Side settings:</b>
- Game Master
- Unlock FPS
@@ -28,6 +39,9 @@
- <b>🔷 Technical settings:</b>
- Kick/Ban players under a certain level
- Kick/Ban invalid FriendCodes
- Kick/Ban command using names instead of ID's
- DenyName system
- Moderator system
- Enable No Game End
- Banlist
- <b>🔶 Automatic settings:</b>
@@ -43,9 +57,11 @@
- <b>🔶 Custom Gamemodes:</b>
- 0 Kill Cooldown
- Shift and Seek
- Speedrun
- <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
- Zoom out in lobby or when dead
- Kick players while in game
- Unlimited Option ranges