mirror of
https://github.com/ApeMV/AmongUsRevamped.git
synced 2026-10-22 07:36:05 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7dafbcf479 | ||
|
|
2e9d32b50d | ||
|
|
cde461c4a4 | ||
|
|
62d66e170b | ||
|
|
c201211afb | ||
|
|
cc1950f543 | ||
|
|
2764e073af | ||
|
|
6f53cacb32 | ||
|
|
f4d9d8101f | ||
|
|
f18dc3fa31 | ||
|
|
0d55683088 | ||
|
|
9572c8ca53 | ||
|
|
2e66fb54f9 |
No files matched your search
@@ -0,0 +1,78 @@
|
||||
name: Bug Report
|
||||
description: Report a bug/crash for Among Us Revamped.
|
||||
labels: ["type: bug"]
|
||||
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
**Attachments**
|
||||
- Please upload logs to help diagnose the issue (retrieved using /dump command).
|
||||
- If applicable, include screenshots or videos to provide more context.
|
||||
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: Description
|
||||
description: Describe the bug in detail.
|
||||
placeholder: |
|
||||
A clear and concise description of what the bug is.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: expected-behavior
|
||||
attributes:
|
||||
label: Expected Behavior
|
||||
description: Describe what you expected to happen.
|
||||
placeholder: |
|
||||
A clear and concise description of what you expected to happen.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: steps-to-reproduce
|
||||
attributes:
|
||||
label: Steps to Reproduce
|
||||
description: Provide a minimal set of steps to reproduce the issue.
|
||||
placeholder: |
|
||||
1. Step one
|
||||
2. Step two
|
||||
3. Step three
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: game-platform
|
||||
attributes:
|
||||
label: Game Platform
|
||||
description: Select the platform you are using Among Us on.
|
||||
options:
|
||||
- Steam
|
||||
- Itch.io
|
||||
- Epic Games Store
|
||||
- Microsoft Store
|
||||
- Xbox App
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: other-mods
|
||||
attributes:
|
||||
label: Other Mods
|
||||
description: List any other Among Us mods you are using (e.g., AUnlocker v1.3.1).
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: checkboxes
|
||||
id: verification
|
||||
attributes:
|
||||
label: Verification
|
||||
description: Make sure that you have checked the following before submitting your bug report
|
||||
options:
|
||||
- label: I confirm that this issue does not occur in the vanilla game (without Among Us Revamped or BepInEx installed).
|
||||
required: true
|
||||
- label: I confirm that I have searched existing issues and this is not a duplicate.
|
||||
required: true
|
||||
- label: I confirm that I am using the latest version of Among Us Revamped and Among Us.
|
||||
required: true
|
||||
@@ -0,0 +1 @@
|
||||
blank_issues_enabled: false
|
||||
@@ -0,0 +1,29 @@
|
||||
name: Other
|
||||
description: For anything outside the main categories
|
||||
labels: ["type: other"]
|
||||
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
**Attachments**
|
||||
- Please don't use this issue category to bypass requirements.
|
||||
|
||||
- type: textarea
|
||||
id: otherdescription
|
||||
attributes:
|
||||
label: Description
|
||||
description: Describe your issue in detail.
|
||||
placeholder: |
|
||||
A clear and concise description of your issue.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: checkboxes
|
||||
id: otherverification
|
||||
attributes:
|
||||
label: Verification
|
||||
description: Make sure that you have checked the following before submitting your issue
|
||||
options:
|
||||
- label: I confirm that this issue does not fall under any other categories.
|
||||
required: true
|
||||
@@ -0,0 +1,42 @@
|
||||
name: Suggestion
|
||||
description: Create a suggestion for Among Us Revamped
|
||||
labels: ["type: suggestion"]
|
||||
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
**Note**
|
||||
- Please share as much detail as you can.
|
||||
- Please consider that Among Us Revamped is a Host-Only mod.
|
||||
|
||||
- type: textarea
|
||||
id: suggestiondescription
|
||||
attributes:
|
||||
label: Description
|
||||
description: Describe the suggestion in detail.
|
||||
placeholder: |
|
||||
A clear and concise description of what the suggestion is.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: suggestionrelevancy
|
||||
attributes:
|
||||
label: Reason
|
||||
description: Describe what makes the suggestion relevant.
|
||||
placeholder: |
|
||||
A clear and concise description of what makes the suggestion relevant.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: checkboxes
|
||||
id: suggestionverification
|
||||
attributes:
|
||||
label: Verification
|
||||
description: Make sure that you have checked the following before submitting your suggestion
|
||||
options:
|
||||
- label: I confirm that this suggestion is not a previously denied duplicate.
|
||||
required: true
|
||||
- label: I confirm that this feature does not exist yet.
|
||||
required: true
|
||||
@@ -0,0 +1,32 @@
|
||||
name: Support
|
||||
description: Ask support for Among Us Revamped
|
||||
labels: ["type: support"]
|
||||
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
**Attachments**
|
||||
- Please join our Discord for support if possible, as giving it is easier there.
|
||||
- Please only ask support related to Among Us Revamped.
|
||||
|
||||
- type: textarea
|
||||
id: supportdescription
|
||||
attributes:
|
||||
label: Description
|
||||
description: Describe the question in detail.
|
||||
placeholder: |
|
||||
A clear and concise description of what the question is.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: checkboxes
|
||||
id: supportverification
|
||||
attributes:
|
||||
label: Verification
|
||||
description: Make sure that you have checked the following before submitting your question
|
||||
options:
|
||||
- label: I confirm that my question isn't answered on the GitHub main page.
|
||||
required: true
|
||||
- label: I confirm that I have searched for answers before asking here.
|
||||
required: true
|
||||
@@ -0,0 +1,21 @@
|
||||
<!--- Please provide a general summary of your changes in the Title above -->
|
||||
|
||||
### Requirements
|
||||
|
||||
<!--- Do not post a pull request if any requirement is not met. -->
|
||||
|
||||
* [ ] I confirm this PR was not generated by AI
|
||||
* [ ] I confirm this PR has been tested and functions as intended
|
||||
|
||||
### Classification
|
||||
|
||||
<!--- Put an `x` in all the boxes that apply -->
|
||||
|
||||
* [ ] Bug Fix
|
||||
* [ ] New Feature
|
||||
* [ ] Refactor/Optimization
|
||||
* [ ] Other
|
||||
|
||||
## Description
|
||||
|
||||
<!--- Describe your changes in detail. You can also include screenshots here. -->
|
||||
+3
-3
@@ -38,13 +38,13 @@ public partial class Main : BasePlugin
|
||||
public static ConfigEntry<bool> DisableCommandHelper { get; private set; }
|
||||
public static ConfigEntry<bool> DisableCompatibilityWarning { get; private set; }
|
||||
|
||||
public static NormalGameOptionsV10 NormalOptions => GameOptionsManager.Instance != null ? GameOptionsManager.Instance.currentNormalGameOptions : null;
|
||||
public static HideNSeekGameOptionsV10 HideNSeekOptions => GameOptionsManager.Instance != null ? GameOptionsManager.Instance.currentHideNSeekGameOptions : null;
|
||||
public static NormalGameOptionsV11 NormalOptions => GameOptionsManager.Instance != null ? GameOptionsManager.Instance.currentNormalGameOptions : null;
|
||||
public static HideNSeekGameOptionsV11 HideNSeekOptions => GameOptionsManager.Instance != null ? GameOptionsManager.Instance.currentHideNSeekGameOptions : null;
|
||||
public static MapNames CurrentMap => (MapNames)NormalOptions.MapId;
|
||||
|
||||
public static bool HasArgumentException;
|
||||
public static string CredentialsText;
|
||||
public const string ModVersion = "v1.9.5";
|
||||
public const string ModVersion = "v2.0.4";
|
||||
|
||||
public static float GameTimer;
|
||||
public static float AfkTimer;
|
||||
|
||||
@@ -18,8 +18,8 @@
|
||||
<ItemGroup>
|
||||
<PackageReference Include="BepInEx.Unity.IL2CPP" Version="6.0.0-be.735" ExcludeAssets="runtime;native" />
|
||||
|
||||
<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="AmongUs.GameLibs.Steam" Version="2026.8.18" PrivateAssets="all" Condition="'$(Configuration)' == 'Release'"/>
|
||||
<PackageReference Include="AmongUs.GameLibs.Android" Version="2026.8.18" PrivateAssets="all" Condition="'$(Configuration)' == 'Android'"/>
|
||||
|
||||
<PackageReference Include="BepInEx.AutoPlugin" Version="1.1.0" PrivateAssets="all" />
|
||||
<PackageReference Include="BepInEx.IL2CPP.MSBuild" Version="2.1.0-rc.1" PrivateAssets="all" ExcludeAssets="runtime" />
|
||||
|
||||
@@ -29,7 +29,6 @@ public static class BanManager
|
||||
private static string TemplatePath = $"{DataPath}/AUR-DATA/Templates.txt";
|
||||
private static string StartWordsPath = $"{DataPath}/AUR-DATA/Startwords.txt";
|
||||
public static Dictionary<string, string> Templates = new();
|
||||
public static List<string> TempBanWhiteList = [];
|
||||
public static void Init()
|
||||
{
|
||||
try
|
||||
@@ -81,7 +80,7 @@ public static class BanManager
|
||||
public static void AddBanPlayer(ClientData player)
|
||||
{
|
||||
if (!AmongUsClient.Instance.AmHost || player == null) return;
|
||||
if (!CheckBanList(player?.FriendCode, player?.GetHashedPuid()) && !TempBanWhiteList.Contains(player?.GetHashedPuid()))
|
||||
if (!CheckBanList(player?.FriendCode, player?.GetHashedPuid()))
|
||||
{
|
||||
if (player?.GetHashedPuid() != "" && player?.GetHashedPuid() != null && player?.GetHashedPuid() != "e3b0cb855")
|
||||
{
|
||||
@@ -106,13 +105,6 @@ public static class BanManager
|
||||
Logger.Info($"{player.PlayerName} was in the BanList and has been banned", "BanListBan");
|
||||
return;
|
||||
}
|
||||
if (TempBanWhiteList.Contains(player?.GetHashedPuid()))
|
||||
{
|
||||
AmongUsClient.Instance.KickPlayer(player.Id, true);
|
||||
//This should not happen
|
||||
Logger.Info($"{player.PlayerName} was in the Temporary BanList", "TempBan");
|
||||
return;
|
||||
}
|
||||
}
|
||||
public static bool CheckBanList(string code, string hashedpuid = "")
|
||||
{
|
||||
|
||||
@@ -26,6 +26,7 @@ internal static class CommandHelper
|
||||
|
||||
new Cmd { Name = new[] { "/sns" }, Prompt = "/sns", Description = Translator.Get("snsDesc"), HasVariable = false },
|
||||
new Cmd { Name = new[] { "/shiftandseek" }, Prompt = "/shiftandseek", Description = Translator.Get("snsDesc"), HasVariable = false },
|
||||
new Cmd { Name = new[] { "/sns2" }, Prompt = "/sns2", Description = Translator.Get("snsTwoDesc"), HasVariable = false },
|
||||
|
||||
new Cmd { Name = new[] { "/0kc" }, Prompt = "/0kc", Description = Translator.Get("0kcDesc"), HasVariable = false },
|
||||
new Cmd { Name = new[] { "/0killcooldown" }, Prompt = "/0killcooldown", Description = Translator.Get("0kcDesc"), HasVariable = false },
|
||||
@@ -82,7 +83,11 @@ internal static class CommandHelper
|
||||
new Cmd { Name = new[] { "/clearseeker" }, Prompt = "/clearseeker", Description = Translator.Get("clearSeekerDesc"), HasVariable = false },
|
||||
|
||||
new Cmd { Name = new[] { "/mapvote" }, Prompt = "/mapvote", Description = Translator.Get("mapVoteDesc"), HasVariable = false },
|
||||
new Cmd { Name = new[] { "/allmapvote" }, Prompt = "/allmapvote", Description = Translator.Get("allMapVoteDesc"), HasVariable = false }
|
||||
new Cmd { Name = new[] { "/allmapvote" }, Prompt = "/allmapvote", Description = Translator.Get("allMapVoteDesc"), HasVariable = false },
|
||||
new Cmd { Name = new[] { "/gmvote" }, Prompt = "/gmvote", Description = Translator.Get("modeVoteDesc"), HasVariable = false },
|
||||
|
||||
new Cmd { Name = new[] { "/private" }, Prompt = "/private", Description = Translator.Get("privateDesc"), HasVariable = false },
|
||||
new Cmd { Name = new[] { "/public" }, Prompt = "/public", Description = Translator.Get("publicDesc"), HasVariable = false }
|
||||
};
|
||||
|
||||
[HarmonyPostfix]
|
||||
|
||||
@@ -104,6 +104,8 @@ namespace AmongUsRevamped
|
||||
public static OptionItem TimeBeforeMapPoll;
|
||||
public static OptionItem AutomaticAllMapPoll;
|
||||
public static OptionItem TimeBeforeAllMapPoll;
|
||||
public static OptionItem AutomaticModePoll;
|
||||
public static OptionItem TimeBeforeModePoll;
|
||||
|
||||
public static OptionItem TabGroupAutostart;
|
||||
public static OptionItem AutoStartTimer;
|
||||
@@ -121,6 +123,7 @@ namespace AmongUsRevamped
|
||||
|
||||
public static OptionItem TabGroupMisc;
|
||||
public static OptionItem MapVoteDuration;
|
||||
public static OptionItem ModeVoteDuration;
|
||||
public static OptionItem StartCountdown;
|
||||
public static OptionItem ColorCommandLevel;
|
||||
public static OptionItem AllowFortegreen;
|
||||
@@ -148,9 +151,22 @@ namespace AmongUsRevamped
|
||||
public static OptionItem DisableMushroomMixup;
|
||||
public static OptionItem DisableCloseDoor;
|
||||
|
||||
public static OptionItem TabGroupGameplayGeneral;
|
||||
public static OptionItem DisableAnnoyingMeetingCalls;
|
||||
public static OptionItem TabGroupCustomizeSabotages;
|
||||
public static OptionItem CustomizeSabotages;
|
||||
public static OptionItem SabotageCooldown;
|
||||
public static OptionItem SkeldReactorDuration;
|
||||
public static OptionItem SkeldO2Duration;
|
||||
public static OptionItem MiraReactorDuration;
|
||||
public static OptionItem MiraO2Duration;
|
||||
public static OptionItem PolusReactorDuration;
|
||||
public static OptionItem AirshipReactorDuration;
|
||||
public static OptionItem FungleReactorDuration;
|
||||
public static OptionItem FungleMushroomMixupDuration;
|
||||
|
||||
public static OptionItem TabGroupGameplayGeneral;
|
||||
public static OptionItem ShieldFirstDeath;
|
||||
public static OptionItem ShieldFirstDeathDuration;
|
||||
public static OptionItem DisableAnnoyingMeetingCalls;
|
||||
public static OptionItem ChangeDecontaminationTime;
|
||||
public static OptionItem DecontaminationTimeOnMiraHQ;
|
||||
public static OptionItem DecontaminationDoorOpenTimeOnMiraHQ;
|
||||
@@ -294,8 +310,9 @@ namespace AmongUsRevamped
|
||||
public static OptionItem TabGroupSNS;
|
||||
public static OptionItem SNSChatInGame;
|
||||
public static OptionItem SNSChatInGameExtend;
|
||||
public static OptionItem SNSChatInGameExtend2;
|
||||
public static OptionItem SNSChatInGameFast;
|
||||
public static OptionItem CrewAutoWinsGameAfter;
|
||||
public static OptionItem MisfiresToSuicide;
|
||||
public static OptionItem SNSDisableSabotage;
|
||||
public static OptionItem SNSDisableReactor;
|
||||
public static OptionItem SNSDisableOxygen;
|
||||
@@ -313,6 +330,7 @@ namespace AmongUsRevamped
|
||||
public static OptionItem TabGroupPNS;
|
||||
public static OptionItem PNSChatInGame;
|
||||
public static OptionItem PNSChatInGameExtend;
|
||||
public static OptionItem PNSChatInGameFast;
|
||||
public static OptionItem PNSCrewAutoWinsGameAfter;
|
||||
public static OptionItem BadMoveTimeToSuicide;
|
||||
public static OptionItem PNSDisableSabotage;
|
||||
@@ -410,6 +428,10 @@ namespace AmongUsRevamped
|
||||
TimeBeforeAllMapPoll = IntegerOptionItem.Create(60157, Translator.Get("timeBeforeMapPoll"), new(10, 300, 5), 10, TabGroup.SystemSettings, false)
|
||||
.SetValueFormat(OptionFormat.Seconds)
|
||||
.SetParent(AutomaticAllMapPoll);
|
||||
AutomaticModePoll = BooleanOptionItem.Create(60158, Translator.Get("automaticModePoll"), false, TabGroup.SystemSettings, false);
|
||||
TimeBeforeModePoll = IntegerOptionItem.Create(60159, Translator.Get("timeBeforeMapPoll"), new(10, 300, 5), 20, TabGroup.SystemSettings, false)
|
||||
.SetValueFormat(OptionFormat.Seconds)
|
||||
.SetParent(AutomaticModePoll);
|
||||
|
||||
TabGroupAutostart = TextOptionItem.Create(64425, Translator.Get("tabGroupAutostart"), TabGroup.SystemSettings)
|
||||
.SetColor(Color.yellow);
|
||||
@@ -438,7 +460,10 @@ namespace AmongUsRevamped
|
||||
MapVoteDuration = IntegerOptionItem.Create(60379, Translator.Get("mapVoteDuration"), new(5, 60, 5), 20, TabGroup.SystemSettings, false)
|
||||
.SetValueFormat(OptionFormat.Seconds)
|
||||
.SetColor(Color.red);
|
||||
StartCountdown = IntegerOptionItem.Create(60380, Translator.Get("startCountdown"), new(1, 5, 1), 5, TabGroup.SystemSettings, false)
|
||||
ModeVoteDuration = IntegerOptionItem.Create(60380, Translator.Get("modeVoteDuration"), new(5, 60, 5), 20, TabGroup.SystemSettings, false)
|
||||
.SetValueFormat(OptionFormat.Seconds)
|
||||
.SetColor(Color.red);
|
||||
StartCountdown = IntegerOptionItem.Create(60381, Translator.Get("startCountdown"), new(1, 5, 1), 5, TabGroup.SystemSettings, false)
|
||||
.SetValueFormat(OptionFormat.Seconds)
|
||||
.SetColor(Color.red);
|
||||
AllowFortegreen = BooleanOptionItem.Create(60382, Translator.Get("allowFortegreen"), false, TabGroup.SystemSettings, false)
|
||||
@@ -456,36 +481,39 @@ namespace AmongUsRevamped
|
||||
TabGroupSNS = TextOptionItem.Create(70050, Translator.Get("tabGroupSNS"), TabGroup.GamemodeSettings)
|
||||
.SetColor(Color.green);
|
||||
SNSChatInGame = BooleanOptionItem.Create(70051, Translator.Get("snsChatInGame"), false, TabGroup.GamemodeSettings, false);
|
||||
SNSChatInGameExtend = BooleanOptionItem.Create(70052, Translator.Get("snsChatInGameExtend"), false, TabGroup.GamemodeSettings, false)
|
||||
SNSChatInGameExtend = BooleanOptionItem.Create(70052, Translator.Get("snsChatInGameExtend"), true, TabGroup.GamemodeSettings, false)
|
||||
.SetParent(SNSChatInGame);
|
||||
MisfiresToSuicide = IntegerOptionItem.Create(70053, Translator.Get("misfiresToSuicide"), new(1, 10, 1), 1, TabGroup.GamemodeSettings, false);
|
||||
CrewAutoWinsGameAfter = IntegerOptionItem.Create(70054, Translator.Get("crewAutoWinsGameAfter"), new(60, 600, 10), 300, TabGroup.GamemodeSettings, false)
|
||||
SNSChatInGameExtend2 = BooleanOptionItem.Create(70053, Translator.Get("snsChatInGameExtendTwo"), true, TabGroup.GamemodeSettings, false)
|
||||
.SetParent(SNSChatInGame);
|
||||
SNSChatInGameFast = BooleanOptionItem.Create(70054, Translator.Get("snsChatInGameFast"), false, TabGroup.GamemodeSettings, false)
|
||||
.SetParent(SNSChatInGame);
|
||||
CrewAutoWinsGameAfter = IntegerOptionItem.Create(70056, Translator.Get("crewAutoWinsGameAfter"), new(60, 600, 10), 300, TabGroup.GamemodeSettings, false)
|
||||
.SetValueFormat(OptionFormat.Seconds);
|
||||
SNSDisableSabotage = BooleanOptionItem.Create(70055, Translator.Get("snsDisableSabotage"), true, TabGroup.GamemodeSettings, false)
|
||||
SNSDisableSabotage = BooleanOptionItem.Create(70057, Translator.Get("snsDisableSabotage"), true, TabGroup.GamemodeSettings, false)
|
||||
.SetColor(Color.red);
|
||||
SNSDisableReactor = BooleanOptionItem.Create(70056, Translator.Get("snsDisableReactor"), true, TabGroup.GamemodeSettings, false)
|
||||
SNSDisableReactor = BooleanOptionItem.Create(70058, Translator.Get("snsDisableReactor"), true, TabGroup.GamemodeSettings, false)
|
||||
.SetParent(SNSDisableSabotage)
|
||||
.SetColor(new Color32(255, 153, 153, byte.MaxValue));
|
||||
SNSDisableOxygen = BooleanOptionItem.Create(70057, Translator.Get("snsDisableOxygen"), true, TabGroup.GamemodeSettings, false)
|
||||
SNSDisableOxygen = BooleanOptionItem.Create(70059, Translator.Get("snsDisableOxygen"), true, TabGroup.GamemodeSettings, false)
|
||||
.SetParent(SNSDisableSabotage)
|
||||
.SetColor(new Color32(255, 153, 153, byte.MaxValue));
|
||||
SNSDisableLights = BooleanOptionItem.Create(70058, Translator.Get("snsDisableLights"), true, TabGroup.GamemodeSettings, false)
|
||||
SNSDisableLights = BooleanOptionItem.Create(70060, Translator.Get("snsDisableLights"), true, TabGroup.GamemodeSettings, false)
|
||||
.SetParent(SNSDisableSabotage)
|
||||
.SetColor(new Color32(255, 153, 153, byte.MaxValue));
|
||||
SNSDisableComms = BooleanOptionItem.Create(70059, Translator.Get("snsDisableComms"), true, TabGroup.GamemodeSettings, false)
|
||||
SNSDisableComms = BooleanOptionItem.Create(70061, Translator.Get("snsDisableComms"), true, TabGroup.GamemodeSettings, false)
|
||||
.SetParent(SNSDisableSabotage)
|
||||
.SetColor(new Color32(255, 153, 153, byte.MaxValue));
|
||||
SNSDisableHeli = BooleanOptionItem.Create(70060, Translator.Get("snsDisableHeli"), true, TabGroup.GamemodeSettings, false)
|
||||
SNSDisableHeli = BooleanOptionItem.Create(70062, Translator.Get("snsDisableHeli"), true, TabGroup.GamemodeSettings, false)
|
||||
.SetParent(SNSDisableSabotage)
|
||||
.SetColor(new Color32(255, 153, 153, byte.MaxValue));
|
||||
SNSDisableMushroomMixup = BooleanOptionItem.Create(70061, Translator.Get("snsDisableMushroomMixup"), true, TabGroup.GamemodeSettings, false)
|
||||
SNSDisableMushroomMixup = BooleanOptionItem.Create(70063, Translator.Get("snsDisableMushroomMixup"), true, TabGroup.GamemodeSettings, false)
|
||||
.SetParent(SNSDisableSabotage)
|
||||
.SetColor(new Color32(255, 153, 153, byte.MaxValue));
|
||||
SNSDisableCloseDoor = BooleanOptionItem.Create(70062, Translator.Get("snsDisableCloseDoor"), true, TabGroup.GamemodeSettings, false)
|
||||
SNSDisableCloseDoor = BooleanOptionItem.Create(70064, Translator.Get("snsDisableCloseDoor"), true, TabGroup.GamemodeSettings, false)
|
||||
.SetColor(Color.red);
|
||||
SNSImpostorsCanVent = BooleanOptionItem.Create(70063, Translator.Get("snsImpostorCanVent"), true, TabGroup.GamemodeSettings, false);
|
||||
SNSImpostorsCanVent = BooleanOptionItem.Create(70065, Translator.Get("snsImpostorCanVent"), true, TabGroup.GamemodeSettings, false);
|
||||
|
||||
TabGroupSpeedrun = TextOptionItem.Create(70075, Translator.Get("tabGroupSpeedrun"), TabGroup.GamemodeSettings)
|
||||
TabGroupSpeedrun = TextOptionItem.Create(70076, Translator.Get("tabGroupSpeedrun"), TabGroup.GamemodeSettings)
|
||||
.SetColor(Color.green);
|
||||
GameAutoEndsAfter = IntegerOptionItem.Create(70077, Translator.Get("gameAutoEndsAfter"), new(0, 600, 10), 300, TabGroup.GamemodeSettings, false)
|
||||
.SetValueFormat(OptionFormat.Seconds);
|
||||
@@ -493,8 +521,10 @@ namespace AmongUsRevamped
|
||||
|
||||
TabGroupPNS = TextOptionItem.Create(70100, Translator.Get("tabGroupPNS"), TabGroup.GamemodeSettings)
|
||||
.SetColor(Color.green);
|
||||
PNSChatInGame = BooleanOptionItem.Create(70102, Translator.Get("snsChatInGame"), false, TabGroup.GamemodeSettings, false);
|
||||
PNSChatInGameExtend = BooleanOptionItem.Create(70103, Translator.Get("snsChatInGameExtend"), false, TabGroup.GamemodeSettings, false)
|
||||
PNSChatInGame = BooleanOptionItem.Create(70101, Translator.Get("snsChatInGame"), false, TabGroup.GamemodeSettings, false);
|
||||
PNSChatInGameExtend = BooleanOptionItem.Create(70102, Translator.Get("snsChatInGameExtend"), false, TabGroup.GamemodeSettings, false)
|
||||
.SetParent(PNSChatInGame);
|
||||
PNSChatInGameFast = BooleanOptionItem.Create(70103, Translator.Get("snsChatInGameFast"), false, TabGroup.GamemodeSettings, false)
|
||||
.SetParent(PNSChatInGame);
|
||||
BadMoveTimeToSuicide = IntegerOptionItem.Create(70104, Translator.Get("badMoveTimeToSuicide"), new(1, 30, 1), 3, TabGroup.GamemodeSettings, false)
|
||||
.SetValueFormat(OptionFormat.Seconds);
|
||||
@@ -549,12 +579,54 @@ namespace AmongUsRevamped
|
||||
DisableMushroomMixup = BooleanOptionItem.Create(60462, Translator.Get("disableMushroomMixup"), false, TabGroup.ModSettings, false)
|
||||
.SetParent(DisableSabotage)
|
||||
.SetColor(new Color32(255, 153, 153, byte.MaxValue));
|
||||
DisableCloseDoor = BooleanOptionItem.Create(60566, Translator.Get("disableCloseDoor"), false, TabGroup.ModSettings, false)
|
||||
DisableCloseDoor = BooleanOptionItem.Create(60463, Translator.Get("disableCloseDoor"), false, TabGroup.ModSettings, false)
|
||||
.SetColor(Color.red);
|
||||
|
||||
|
||||
TabGroupCustomizeSabotages = TextOptionItem.Create(60500, Translator.Get("tabGroupCustomizeSabotages"), TabGroup.ModSettings)
|
||||
.SetColor(Color.blue);
|
||||
CustomizeSabotages = BooleanOptionItem.Create(60501, Translator.Get("customizeSabotages"), false, TabGroup.ModSettings, false);
|
||||
|
||||
SabotageCooldown = IntegerOptionItem.Create(60502, Translator.Get("sabotageCooldown"), new(5, 60, 5), 30, TabGroup.ModSettings, false)
|
||||
.SetValueFormat(OptionFormat.Seconds)
|
||||
.SetParent(CustomizeSabotages);
|
||||
|
||||
SkeldReactorDuration = IntegerOptionItem.Create(60503, Translator.Get("skeldReactorDuration"), new(15, 60, 5), 30, TabGroup.ModSettings, false)
|
||||
.SetValueFormat(OptionFormat.Seconds)
|
||||
.SetParent(CustomizeSabotages);
|
||||
SkeldO2Duration = IntegerOptionItem.Create(60504, Translator.Get("skeldO2Duration"), new(15, 60, 5), 30, TabGroup.ModSettings, false)
|
||||
.SetValueFormat(OptionFormat.Seconds)
|
||||
.SetParent(CustomizeSabotages);
|
||||
|
||||
MiraReactorDuration = IntegerOptionItem.Create(60505, Translator.Get("miraReactorDuration"), new(15, 90, 5), 45, TabGroup.ModSettings, false)
|
||||
.SetValueFormat(OptionFormat.Seconds)
|
||||
.SetParent(CustomizeSabotages);
|
||||
MiraO2Duration = IntegerOptionItem.Create(60506, Translator.Get("miraO2Duration"), new(15, 90, 5), 45, TabGroup.ModSettings, false)
|
||||
.SetValueFormat(OptionFormat.Seconds)
|
||||
.SetParent(CustomizeSabotages);
|
||||
|
||||
PolusReactorDuration = IntegerOptionItem.Create(60507, Translator.Get("polusReactorDuration"), new(20, 90, 5), 60, TabGroup.ModSettings, false)
|
||||
.SetValueFormat(OptionFormat.Seconds)
|
||||
.SetParent(CustomizeSabotages);
|
||||
|
||||
AirshipReactorDuration = IntegerOptionItem.Create(60508, Translator.Get("airshipReactorDuration"), new(30, 90, 5), 90, TabGroup.ModSettings, false)
|
||||
.SetValueFormat(OptionFormat.Seconds)
|
||||
.SetParent(CustomizeSabotages);
|
||||
|
||||
FungleReactorDuration = IntegerOptionItem.Create(60509, Translator.Get("fungleReactorDuration"), new(15, 90, 5), 60, TabGroup.ModSettings, false)
|
||||
.SetValueFormat(OptionFormat.Seconds)
|
||||
.SetParent(CustomizeSabotages);
|
||||
FungleMushroomMixupDuration = IntegerOptionItem.Create(60510, Translator.Get("fungleMushroomMixupDuration"), new(5, 30, 5), 10, TabGroup.ModSettings, false)
|
||||
.SetValueFormat(OptionFormat.Seconds)
|
||||
.SetParent(CustomizeSabotages);
|
||||
|
||||
TabGroupGameplayGeneral = TextOptionItem.Create(60564, Translator.Get("tabGroupGameplayGeneral"), TabGroup.ModSettings)
|
||||
.SetColor(Color.blue);
|
||||
DisableAnnoyingMeetingCalls = BooleanOptionItem.Create(60565, Translator.Get("disableAnnoyingMeetingCalls"), false, TabGroup.ModSettings, false);
|
||||
ShieldFirstDeath = BooleanOptionItem.Create(60565, Translator.Get("shieldFirstDeath"), false, TabGroup.ModSettings, false);
|
||||
ShieldFirstDeathDuration = IntegerOptionItem.Create(60566, Translator.Get("shieldFirstDeathDuration"), new(10, 120, 5), 30, TabGroup.ModSettings, false)
|
||||
.SetParent(ShieldFirstDeath)
|
||||
.SetValueFormat(OptionFormat.Seconds);
|
||||
DisableAnnoyingMeetingCalls = BooleanOptionItem.Create(60567, Translator.Get("disableAnnoyingMeetingCalls"), false, TabGroup.ModSettings, false);
|
||||
|
||||
ChangeDecontaminationTime = BooleanOptionItem.Create(60550, Translator.Get("changeDecontaminationTime"), false, TabGroup.ModSettings, false);
|
||||
DecontaminationTimeOnMiraHQ = FloatOptionItem.Create(60551, Translator.Get("decontaminationTimeOnMiraHQ"), new(0.5f, 10f, 0.25f), 3f, TabGroup.ModSettings, false)
|
||||
|
||||
+51
-2
@@ -107,7 +107,42 @@ internal class EACR
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 202: // SMC
|
||||
try
|
||||
{
|
||||
AmongUsClient.Instance.KickPlayer(pc.Data.ClientId, true);
|
||||
Logger.SendInGame($"{pc.Data.PlayerName} was banned for MMC CallId (cheating)");
|
||||
Logger.Info($" {pc.Data.PlayerName} was banned for MMC CallId (cheating)", "EACR");
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
}
|
||||
break;
|
||||
case 201:
|
||||
try
|
||||
{
|
||||
var firstString = sr.ReadString();
|
||||
var secondString = sr.ReadString();
|
||||
sr.ReadInt32();
|
||||
|
||||
var flag = string.IsNullOrEmpty(firstString) && string.IsNullOrEmpty(secondString);
|
||||
|
||||
if (!flag)
|
||||
{
|
||||
AmongUsClient.Instance.KickPlayer(pc.Data.ClientId, true);
|
||||
Logger.SendInGame($"{pc.Data.PlayerName} was banned for MMC chat CallId (cheating)");
|
||||
Logger.Info($" {pc.Data.PlayerName} was banned for MMC chat CallId (cheating)", "EACR");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@@ -184,7 +219,7 @@ internal class EACR
|
||||
goto YesCheat;
|
||||
}
|
||||
|
||||
if (Utils.IsMeeting && MeetingHud.Instance.state != MeetingHud.VoteStates.Animating)
|
||||
if (Utils.IsMeeting && MeetingHud.Instance.state != MeetingHud.MeetingStates.Animating)
|
||||
{
|
||||
Logger.SendInGame($"{player.Data.PlayerName} might have called an invalid sabotage (cheating)");
|
||||
Logger.Info($" {player.Data.PlayerName} might have called an invalid sabotage (cheating)", "EACR");
|
||||
@@ -222,4 +257,18 @@ internal class EACR
|
||||
Logger.SendInGame($"{player.Data.PlayerName} was banned for invalidly completing a task (cheating)");
|
||||
Logger.Info($" {player.Data.PlayerName} was banned for invalidly completing a task", "EACR");
|
||||
}
|
||||
|
||||
public static void MurderCheat(PlayerControl player)
|
||||
{
|
||||
AmongUsClient.Instance.KickPlayer(player.Data.ClientId, true);
|
||||
Logger.SendInGame($"{player.Data.PlayerName} was banned for invalidly murdering a player (cheating)");
|
||||
Logger.Info($" {player.Data.PlayerName} was banned for invalidly murdering a player", "EACR");
|
||||
}
|
||||
|
||||
public static void MeetingCheat(PlayerControl player)
|
||||
{
|
||||
AmongUsClient.Instance.KickPlayer(player.Data.ClientId, true);
|
||||
Logger.SendInGame($"{player.Data.PlayerName} was banned for invalidly calling a meeting (cheating)");
|
||||
Logger.Info($" {player.Data.PlayerName} was banned for invalidly calling a meeting", "EACR");
|
||||
}
|
||||
}
|
||||
+26
-52
@@ -119,54 +119,18 @@ public static class FixedUpdate
|
||||
}
|
||||
}
|
||||
|
||||
// We check if any SnS Shapshifter is currently nearby their correct target.
|
||||
// If so, the global Kill Cooldown is set to 1 and all killing actions may proceed.
|
||||
// If not, the global Kill Cooldown is set to 0.
|
||||
// While this value is 0, the game stops the kill cooldown from decreasing.
|
||||
// If the Kill Cooldown value is 0 by default (which it will be at the start of a match), Among Us does not allow kills at all.
|
||||
// This means most of the time, we can successfully prevent invalid kills.
|
||||
// The only problem is that if one Shapeshifter is nearby their correct target, while another is not, the second Shapeshifter can kill too.
|
||||
if (Options.Gamemode.GetValue() == 1 && !Utils.isHideNSeek && !Utils.IsLobby)
|
||||
{
|
||||
bool shapeshifterNearTarget = false;
|
||||
|
||||
foreach (var p in PlayerControl.AllPlayerControls)
|
||||
{
|
||||
if (p.Data == null || p.Data.IsDead || p.shapeshiftTargetPlayerId == byte.MaxValue) continue;
|
||||
if (p.Data == null || p.Data.IsDead || p.Data.RoleType == RoleTypes.Shapeshifter) continue;
|
||||
|
||||
PlayerControl shapeshiftTarget = null;
|
||||
|
||||
foreach (var t in PlayerControl.AllPlayerControls)
|
||||
if (p.protectedByGuardianId == -1)
|
||||
{
|
||||
if (t.Data == null || t.Data.IsDead) continue;
|
||||
|
||||
if (t.Data.PlayerId == p.shapeshiftTargetPlayerId)
|
||||
{
|
||||
shapeshiftTarget = t;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (shapeshiftTarget == null) continue;
|
||||
|
||||
float distance = Vector2.Distance(p.GetTruePosition(), shapeshiftTarget.GetTruePosition());
|
||||
|
||||
if (distance <= 3f)
|
||||
{
|
||||
shapeshifterNearTarget = true;
|
||||
break;
|
||||
p.RpcProtectPlayer(p, p.cosmetics.ColorId);
|
||||
}
|
||||
p.Data.MarkDirty();
|
||||
}
|
||||
|
||||
|
||||
float newCooldown = shapeshifterNearTarget ? 1f : 0f;
|
||||
|
||||
if (Main.NormalOptions.KillCooldown != newCooldown)
|
||||
{
|
||||
Main.NormalOptions.KillCooldown = newCooldown;
|
||||
OptionManager.SyncGameOptions();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -202,12 +166,6 @@ class FixedUpdateInGamePatch
|
||||
private static float t;
|
||||
private static GameObject settingsLabel;
|
||||
|
||||
public static bool CanUseKillButton(PlayerControl pc)
|
||||
{
|
||||
pc.Data.Role.CanUseKillButton = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
public static void Postfix(PlayerControl __instance)
|
||||
{
|
||||
if (__instance == null || __instance.PlayerId == 255 || !AmongUsClient.Instance.AmHost) return;
|
||||
@@ -245,20 +203,36 @@ class FixedUpdateInGamePatch
|
||||
break;
|
||||
|
||||
case 1: // SnS
|
||||
if (Utils.InGame) return;
|
||||
if (Main.NormalOptions.KillCooldown != 1f) Main.NormalOptions.KillCooldown = 1f;
|
||||
if (!Utils.InGame)
|
||||
{
|
||||
if (Main.NormalOptions.KillCooldown != 2.5f)
|
||||
{
|
||||
Main.NormalOptions.KillCooldown = 2.5f;
|
||||
Main.NormalOptions.roleOptions.SetRoleRate(RoleTypes.Shapeshifter, 3, 100);
|
||||
Main.NormalOptions.roleOptions.SetRoleRate(RoleTypes.Phantom, 0, 0);
|
||||
Main.NormalOptions.roleOptions.SetRoleRate(RoleTypes.Viper, 0, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 2: // Speedrun
|
||||
break;
|
||||
|
||||
case 3: // PnS
|
||||
if (Utils.InGame) return;
|
||||
if (Main.NormalOptions.KillCooldown != 1f) Main.NormalOptions.KillCooldown = 1f;
|
||||
if (!Utils.InGame)
|
||||
{
|
||||
if (Main.NormalOptions.KillCooldown != 1f)
|
||||
{
|
||||
Main.NormalOptions.KillCooldown = 1f;
|
||||
Main.NormalOptions.roleOptions.SetRoleRate(RoleTypes.Shapeshifter, 0, 0);
|
||||
Main.NormalOptions.roleOptions.SetRoleRate(RoleTypes.Phantom, 3, 100);
|
||||
Main.NormalOptions.roleOptions.SetRoleRate(RoleTypes.Viper, 0, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (Utils.InGame && !Utils.IsMeeting && !ExileController.Instance)
|
||||
if (Utils.InGame && !Utils.IsMeeting && !ExileController.Instance && Main.GameTimer > 6)
|
||||
{
|
||||
// 1 = Shift and Seek
|
||||
if (Options.Gamemode.GetValue() == 1 && !Utils.isHideNSeek && Options.CrewAutoWinsGameAfter.GetInt() != 0 && !Options.NoGameEnd.GetBool())
|
||||
@@ -285,7 +259,7 @@ class FixedUpdateInGamePatch
|
||||
}
|
||||
}
|
||||
// 3 = Poof and Seek
|
||||
if (Options.Gamemode.GetValue() == 3 && !Utils.isHideNSeek)
|
||||
if (Options.Gamemode.GetValue() == 3 && !Utils.isHideNSeek && !Options.NoGameEnd.GetBool())
|
||||
{
|
||||
if (Main.GameTimer > Options.PNSCrewAutoWinsGameAfter.GetInt())
|
||||
{
|
||||
|
||||
@@ -7,7 +7,8 @@ namespace AmongUsRevamped;
|
||||
|
||||
public static class OptionManager
|
||||
{
|
||||
private static OptionBackupData CachedOptions;
|
||||
private static float OldKillCooldown;
|
||||
|
||||
public static void SyncGameOptions()
|
||||
{
|
||||
if (!AmongUsClient.Instance.AmHost) return;
|
||||
@@ -29,17 +30,19 @@ public static class OptionManager
|
||||
{
|
||||
if (!AmongUsClient.Instance.AmHost) return;
|
||||
|
||||
CachedOptions = new OptionBackupData(GameOptionsManager.Instance.CurrentGameOptions);
|
||||
OldKillCooldown = Main.NormalOptions.KillCooldown;
|
||||
}
|
||||
|
||||
public static void RestoreOptions()
|
||||
{
|
||||
if (!AmongUsClient.Instance.AmHost || CachedOptions == null) return;
|
||||
|
||||
var restored = CachedOptions.Restore(GameOptionsManager.Instance.CurrentGameOptions);
|
||||
|
||||
GameOptionsManager.Instance.CurrentGameOptions = restored;
|
||||
if (!AmongUsClient.Instance.AmHost) return;
|
||||
|
||||
if (Main.NormalOptions.KillCooldown != OldKillCooldown)
|
||||
{
|
||||
Main.NormalOptions.KillCooldown = OldKillCooldown;
|
||||
Logger.Info("Force overrided Kill Cooldown back to original", "RestoreOptions");
|
||||
}
|
||||
|
||||
SyncGameOptions();
|
||||
}
|
||||
}
|
||||
@@ -13,6 +13,12 @@ namespace AmongUsRevamped
|
||||
{
|
||||
Logger.Info($" Disconnected due to {reason}/{stringReason}, ping:{__instance.Ping})", "DisconnectManager");
|
||||
|
||||
if (!EOSManager.Instance.loginFlowFinished || EOSManager.Instance.authExpiredCallbackTriggered)
|
||||
{
|
||||
Logger.Info("Attempted to log in using EOS", "DisconnectManager");
|
||||
EOSManager.Instance.AdultPermissionsFlow();
|
||||
}
|
||||
|
||||
if (!Options.Rehost.GetBool() || reason == DisconnectReasons.NewConnection || reason == DisconnectReasons.ConnectionLimit || reason == DisconnectReasons.ExitGame) return;
|
||||
|
||||
_ = new LateTask(() =>
|
||||
|
||||
+104
-3
@@ -38,10 +38,10 @@ 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 byte CustomGameOverReason;
|
||||
public static bool CanCallMeetings;
|
||||
public static bool HasMurdered;
|
||||
|
||||
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}";
|
||||
@@ -200,21 +200,24 @@ public static class Utils
|
||||
|
||||
public static void ClearLeftoverData()
|
||||
{
|
||||
Logger.Info(" Cleared Leftover Data", "Utils");
|
||||
|
||||
RpcSetTasksPatch.GlobalTaskIds = null;
|
||||
HandlingGameEnd = false;
|
||||
OnGameJoinedPatch.AutoStartCheck = false;
|
||||
Main.GameTimer = 0f;
|
||||
Main.AfkTimer = 0f;
|
||||
FixedUpdate.Position.Clear();
|
||||
|
||||
NormalGameEndChecker.canUpdateWinnerText = true;
|
||||
MurderPlayerPatch.misfireCount.Clear();
|
||||
MurderPlayerPatch.killCount.Clear();
|
||||
HasMurdered = false;
|
||||
|
||||
LateTask.Tasks.RemoveAll(x => x.name != "RehostManager");
|
||||
NormalGameEndChecker.ImpCheckComplete = false;
|
||||
CreateOptionsPickerPatch.SetDleks2 = false;
|
||||
CanCallMeetings = true;
|
||||
PlayerControlSetRolePatch.FirstAssign = true;
|
||||
|
||||
PlayerControlCompleteTaskPatch.playerTasksCompleted.Clear();
|
||||
PlayerControlCompleteTaskPatch.tasksPerPlayer.Clear();
|
||||
@@ -224,6 +227,7 @@ public static class Utils
|
||||
|
||||
OnPlayerJoinedPatch.JoinNum = 0;
|
||||
|
||||
PlayerControlSetRolePatch.ProcessedPlayers.Clear();
|
||||
PlayerControlSetRolePatch.Seekers.Clear();
|
||||
PlayerControlSetRolePatch.FirstAssign = true;
|
||||
PlayerControlSetRolePatch.manualSeekers.Clear();
|
||||
@@ -240,6 +244,13 @@ public static class Utils
|
||||
dleksVotes = 0;
|
||||
HasVoted.Clear();
|
||||
MapVoteActive = false;
|
||||
|
||||
standardVotes = 0;
|
||||
noKillCooldownVotes = 0;
|
||||
speedrunVotes = 0;
|
||||
shiftAndSeekVotes = 0;
|
||||
poofAndSeekVotes = 0;
|
||||
ModeVoteActive = false;
|
||||
}
|
||||
|
||||
public static PlayerControl[] AllAlivePlayerControls
|
||||
@@ -598,7 +609,7 @@ public static class Utils
|
||||
public static readonly List<byte> HasVoted = [];
|
||||
public static void MapVote(bool dleks, bool moderator)
|
||||
{
|
||||
if (MapVoteActive) return;
|
||||
if (MapVoteActive || ModeVoteActive) return;
|
||||
|
||||
DleksEnabled = dleks;
|
||||
MapVoteActive = true;
|
||||
@@ -676,4 +687,94 @@ public static class Utils
|
||||
MapVoteActive = false;
|
||||
}, Options.MapVoteDuration.GetInt(), "MapPoll");
|
||||
}
|
||||
|
||||
public static int standardVotes;
|
||||
public static int noKillCooldownVotes;
|
||||
public static int speedrunVotes;
|
||||
public static int shiftAndSeekVotes;
|
||||
public static int poofAndSeekVotes;
|
||||
public static bool ModeVoteActive;
|
||||
public static readonly List<byte> HasModeVoted = [];
|
||||
public static void ModeVote(bool moderator)
|
||||
{
|
||||
if (ModeVoteActive || MapVoteActive) return;
|
||||
|
||||
ModeVoteActive = true;
|
||||
|
||||
if (moderator) Utils.ModeratorChatCommand("A Gamemode vote is active!\n\nA: None\nB: No Kill Cooldown\nC: Speedrun\nD: SnS\nE: PnS\n\nType /vote 'letter' to vote.", "", false);
|
||||
else Utils.ChatCommand(DestroyableSingleton<HudManager>.Instance.Chat, "A Gamemode vote is active!\n\nA: None\nB: No Kill Cooldown\nC: Speedrun\nD: SnS\nE: PnS\n\nType /vote 'letter' to vote.", "", false);
|
||||
|
||||
new LateTask(() =>
|
||||
{
|
||||
int highest = standardVotes;
|
||||
string winner = "None";
|
||||
byte modeId = 0;
|
||||
bool tie = false;
|
||||
|
||||
void Check(int votes, string name, byte id)
|
||||
{
|
||||
if (votes > highest)
|
||||
{
|
||||
highest = votes;
|
||||
winner = name;
|
||||
modeId = id;
|
||||
tie = false;
|
||||
}
|
||||
else if (votes == highest)
|
||||
{
|
||||
tie = true;
|
||||
}
|
||||
}
|
||||
|
||||
Check(noKillCooldownVotes, "0 Kill Cooldown", 0);
|
||||
Check(speedrunVotes, "Speedrun", 2);
|
||||
Check(shiftAndSeekVotes, "Shift and Seek", 1);
|
||||
Check(poofAndSeekVotes, "Poof and Seek", 3);
|
||||
|
||||
string voteResults = $"Standard: {standardVotes}\n" + $"No Kill Cooldown: {noKillCooldownVotes}\n" + $"Speedrun: {speedrunVotes}\n" + $"Shift and Seek: {shiftAndSeekVotes}\n" + $"Poof and Seek: {poofAndSeekVotes}";
|
||||
if (highest == 0)
|
||||
{
|
||||
ModeratorChatCommand("We have a winner! Just kidding. No one voted.", "", false);
|
||||
}
|
||||
else if (tie)
|
||||
{
|
||||
ModeratorChatCommand($"Gamemode vote tied. No new mode selected.\n\n{voteResults}", "", false);
|
||||
}
|
||||
else
|
||||
{
|
||||
ModeratorChatCommand(SendChatPatch.ConvertNum($"Winner: {winner} ({highest})\n\n{voteResults}"), "", false);
|
||||
Options.Gamemode.SetValue(modeId);
|
||||
|
||||
if (winner == "0 Kill Cooldown")
|
||||
{
|
||||
Main.NormalOptions.KillCooldown = 0.01f;
|
||||
}
|
||||
|
||||
}
|
||||
standardVotes = 0;
|
||||
noKillCooldownVotes = 0;
|
||||
speedrunVotes = 0;
|
||||
shiftAndSeekVotes = 0;
|
||||
poofAndSeekVotes = 0;
|
||||
HasVoted.Clear();
|
||||
|
||||
ModeVoteActive = false;
|
||||
}, Options.ModeVoteDuration.GetInt(), "ModePoll");
|
||||
}
|
||||
|
||||
// As of v2026.8.18, Innersloth bans the host for hacking if the start game button is pressed when any player is not Serialized (or something similar).
|
||||
// CheckValidData serves as an emergency blockage to prevent this and stop host from being kicked.
|
||||
public static bool CheckValidData()
|
||||
{
|
||||
if (!AmongUsClient.Instance.AmHost) return true;
|
||||
|
||||
foreach (var p in PlayerControl.AllPlayerControls)
|
||||
{
|
||||
if (p == null || !p.hasBeenSerialized)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
+217
-20
@@ -147,6 +147,24 @@ internal static class SendChatPatch
|
||||
return false;
|
||||
}
|
||||
|
||||
if (text == "/private")
|
||||
{
|
||||
__instance.freeChatField.textArea.Clear();
|
||||
__instance.freeChatField.textArea.SetText(string.Empty);
|
||||
|
||||
if (Utils.InGame) return false;
|
||||
AmongUsClient.Instance.ChangeGamePublic(false);
|
||||
}
|
||||
|
||||
if (text == "/public")
|
||||
{
|
||||
__instance.freeChatField.textArea.Clear();
|
||||
__instance.freeChatField.textArea.SetText(string.Empty);
|
||||
|
||||
if (Utils.InGame) return false;
|
||||
AmongUsClient.Instance.ChangeGamePublic(true);
|
||||
}
|
||||
|
||||
if (text.StartsWith("/vip "))
|
||||
{
|
||||
PlayerControl target = null;
|
||||
@@ -420,12 +438,92 @@ internal static class SendChatPatch
|
||||
}
|
||||
}
|
||||
|
||||
if (text == "/vote a" && Utils.MapVoteActive && !Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) {Utils.skeldVotes++; Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId);}
|
||||
if (text == "/vote b" && Utils.MapVoteActive && !Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) {Utils.miraVotes++; Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId);}
|
||||
if (text == "/vote c" && Utils.MapVoteActive && !Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) {Utils.polusVotes++; Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId);}
|
||||
if (text == "/vote d" && Utils.MapVoteActive && !Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) {Utils.airshipVotes++; Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId);}
|
||||
if (text == "/vote e" && Utils.MapVoteActive && !Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) {Utils.fungleVotes++; Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId);}
|
||||
if (text == "/vote f" && Utils.MapVoteActive && !Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId) && Utils.DleksEnabled) {Utils.dleksVotes++; Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId);}
|
||||
if (text == "/gmvote")
|
||||
{
|
||||
if (Utils.IsLobby)
|
||||
{
|
||||
Utils.ModeVote(false);
|
||||
|
||||
__instance.freeChatField.textArea.Clear();
|
||||
__instance.freeChatField.textArea.SetText(string.Empty);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (text == "/vote a")
|
||||
{
|
||||
if (Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) return true;
|
||||
if (Utils.MapVoteActive && !Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId))
|
||||
{
|
||||
Utils.skeldVotes++;
|
||||
}
|
||||
if (Utils.ModeVoteActive)
|
||||
{
|
||||
Utils.standardVotes++;
|
||||
}
|
||||
Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId);
|
||||
}
|
||||
if (text == "/vote b")
|
||||
{
|
||||
if (Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) return true;
|
||||
if (Utils.MapVoteActive)
|
||||
{
|
||||
Utils.miraVotes++;
|
||||
}
|
||||
if (Utils.ModeVoteActive)
|
||||
{
|
||||
Utils.noKillCooldownVotes++;
|
||||
}
|
||||
Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId);
|
||||
}
|
||||
if (text == "/vote c")
|
||||
{
|
||||
if (Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) return true;
|
||||
if (Utils.MapVoteActive)
|
||||
{
|
||||
Utils.polusVotes++;
|
||||
}
|
||||
if (Utils.ModeVoteActive)
|
||||
{
|
||||
Utils.speedrunVotes++;
|
||||
}
|
||||
Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId);
|
||||
}
|
||||
if (text == "/vote d")
|
||||
{
|
||||
if (Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) return true;
|
||||
if (Utils.MapVoteActive)
|
||||
{
|
||||
Utils.airshipVotes++;
|
||||
}
|
||||
if (Utils.ModeVoteActive)
|
||||
{
|
||||
Utils.shiftAndSeekVotes++;
|
||||
}
|
||||
Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId);
|
||||
}
|
||||
if (text == "/vote e")
|
||||
{
|
||||
if (Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) return true;
|
||||
if (Utils.MapVoteActive)
|
||||
{
|
||||
Utils.fungleVotes++;
|
||||
}
|
||||
if (Utils.ModeVoteActive)
|
||||
{
|
||||
Utils.poofAndSeekVotes++;
|
||||
}
|
||||
Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId);
|
||||
}
|
||||
if (text == "/vote f")
|
||||
{
|
||||
if (Utils.HasVoted.Contains(PlayerControl.LocalPlayer.Data.PlayerId)) return true;
|
||||
if (Utils.MapVoteActive && Utils.DleksEnabled)
|
||||
{
|
||||
Utils.dleksVotes++;
|
||||
}
|
||||
Utils.HasVoted.Add(PlayerControl.LocalPlayer.Data.PlayerId);
|
||||
}
|
||||
|
||||
if (text == "/l" || text == "/lastgame")
|
||||
{
|
||||
@@ -445,13 +543,18 @@ internal static class SendChatPatch
|
||||
|
||||
if (text == "/0kc" || text == "/0killcooldown")
|
||||
{
|
||||
Utils.ChatCommand(__instance, "0 Kill Cooldown:\n\nImpostors have no kill cooldown, Crewmates have low tasks\nThink fast and pay attention!", "", false);
|
||||
Utils.ChatCommand(__instance, "0 Kill Cooldown:\n\nImpostors have no kill cooldown, and can't kill after a game starts for 5 seconds", "", false);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (text == "/sns" || text == "/shiftandseek")
|
||||
{
|
||||
Utils.ChatCommand(__instance, "Shift and Seek:\n\nImpostors can only kill someone while shapeshifted as them\nMeetings & Reports = 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);
|
||||
Utils.ChatCommand(__instance, "Shift and Seek:\n\nImpostors can only kill someone while shapeshifted as them\nMeetings & Reports = Off", $"Crewmates win by tasks/surviving {Options.CrewAutoWinsGameAfter.GetInt()}s\nImpostors win by killing\nWrong kills are blocked. Kill animations are off", true);
|
||||
return false;
|
||||
}
|
||||
if (text == "/sns2" || text == "/shiftandseek2")
|
||||
{
|
||||
Utils.ChatCommand(__instance, "Correctly killing a target will directly turn them into a ghost and leave no dead body", "", false);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -474,12 +577,12 @@ internal static class SendChatPatch
|
||||
case 0:
|
||||
if (GameOptionsManager.Instance.CurrentGameOptions.GetFloat(FloatOptionNames.KillCooldown) == 0.01f)
|
||||
{
|
||||
Utils.ChatCommand(__instance, "0 Kill Cooldown:\n\nImpostors have no kill cooldown, Crewmates have low tasks\nThink fast and pay attention!", "", false);
|
||||
Utils.ChatCommand(__instance, "0 Kill Cooldown:\n\nImpostors have no kill cooldown, and can't kill after a game starts for 5 seconds", "", false);
|
||||
}
|
||||
break;
|
||||
|
||||
case 1:
|
||||
Utils.ChatCommand(__instance, "Shift and Seek:\n\nImpostors can only kill someone while shapeshifted as them\nMeetings & Reports = 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);
|
||||
Utils.ChatCommand(__instance, "Shift and Seek:\n\nImpostors can only kill someone while shapeshifted as them\nMeetings & Reports = Off", $"Crewmates win by tasks/surviving {Options.CrewAutoWinsGameAfter.GetInt()}s\nImpostors win by killing\nWrong kills are blocked. Kill animations are off", true);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
@@ -746,6 +849,18 @@ public static class RPCHandlerPatch
|
||||
}
|
||||
}
|
||||
|
||||
if (text == "/private")
|
||||
{
|
||||
if (Utils.CheckAccessLevel(__instance.Data.FriendCode) < Options.SlashStartAndEndGameCmd.GetValue() || Utils.InGame) return;
|
||||
AmongUsClient.Instance.ChangeGamePublic(false);
|
||||
}
|
||||
|
||||
if (text == "/public")
|
||||
{
|
||||
if (Utils.CheckAccessLevel(__instance.Data.FriendCode) < Options.SlashStartAndEndGameCmd.GetValue() || Utils.InGame) return;
|
||||
AmongUsClient.Instance.ChangeGamePublic(true);
|
||||
}
|
||||
|
||||
if (text == "/s" || text == "/start")
|
||||
{
|
||||
if (Utils.CheckAccessLevel(__instance.Data.FriendCode) < Options.SlashStartAndEndGameCmd.GetValue()) return;
|
||||
@@ -771,13 +886,90 @@ public static class RPCHandlerPatch
|
||||
Utils.MapVote(true, true);
|
||||
}
|
||||
}
|
||||
|
||||
if (text == "/gmvote")
|
||||
{
|
||||
if (Utils.IsLobby)
|
||||
{
|
||||
if (Utils.CheckAccessLevel(__instance.Data.FriendCode) < Options.SlashMapAndSeekerCmd.GetValue()) return;
|
||||
Utils.ModeVote(true);
|
||||
}
|
||||
}
|
||||
|
||||
if (text == "/vote a" && Utils.MapVoteActive && !Utils.HasVoted.Contains(__instance.Data.PlayerId)) {Utils.skeldVotes++; Utils.HasVoted.Add(__instance.Data.PlayerId);}
|
||||
if (text == "/vote b" && Utils.MapVoteActive && !Utils.HasVoted.Contains(__instance.Data.PlayerId)) {Utils.miraVotes++; Utils.HasVoted.Add(__instance.Data.PlayerId);}
|
||||
if (text == "/vote c" && Utils.MapVoteActive && !Utils.HasVoted.Contains(__instance.Data.PlayerId)) {Utils.polusVotes++; Utils.HasVoted.Add(__instance.Data.PlayerId);}
|
||||
if (text == "/vote d" && Utils.MapVoteActive && !Utils.HasVoted.Contains(__instance.Data.PlayerId)) {Utils.airshipVotes++; Utils.HasVoted.Add(__instance.Data.PlayerId);}
|
||||
if (text == "/vote e" && Utils.MapVoteActive && !Utils.HasVoted.Contains(__instance.Data.PlayerId)) {Utils.fungleVotes++; Utils.HasVoted.Add(__instance.Data.PlayerId);}
|
||||
if (text == "/vote f" && Utils.MapVoteActive && !Utils.HasVoted.Contains(__instance.Data.PlayerId) && Utils.DleksEnabled) {Utils.dleksVotes++; Utils.HasVoted.Add(__instance.Data.PlayerId);}
|
||||
if (text == "/vote a")
|
||||
{
|
||||
if (Utils.HasVoted.Contains(__instance.Data.PlayerId)) return;
|
||||
if (Utils.MapVoteActive)
|
||||
{
|
||||
Utils.skeldVotes++;
|
||||
}
|
||||
if (Utils.ModeVoteActive)
|
||||
{
|
||||
Utils.standardVotes++;
|
||||
}
|
||||
Utils.HasVoted.Add(__instance.Data.PlayerId);
|
||||
}
|
||||
if (text == "/vote b")
|
||||
{
|
||||
if (Utils.HasVoted.Contains(__instance.Data.PlayerId)) return;
|
||||
if (Utils.MapVoteActive)
|
||||
{
|
||||
Utils.miraVotes++;
|
||||
}
|
||||
if (Utils.ModeVoteActive)
|
||||
{
|
||||
Utils.noKillCooldownVotes++;
|
||||
}
|
||||
Utils.HasVoted.Add(__instance.Data.PlayerId);
|
||||
}
|
||||
if (text == "/vote c")
|
||||
{
|
||||
if (Utils.HasVoted.Contains(__instance.Data.PlayerId)) return;
|
||||
if (Utils.MapVoteActive)
|
||||
{
|
||||
Utils.polusVotes++;
|
||||
}
|
||||
if (Utils.ModeVoteActive)
|
||||
{
|
||||
Utils.speedrunVotes++;
|
||||
}
|
||||
Utils.HasVoted.Add(__instance.Data.PlayerId);
|
||||
}
|
||||
if (text == "/vote d")
|
||||
{
|
||||
if (Utils.HasVoted.Contains(__instance.Data.PlayerId)) return;
|
||||
if (Utils.MapVoteActive)
|
||||
{
|
||||
Utils.airshipVotes++;
|
||||
}
|
||||
if (Utils.ModeVoteActive)
|
||||
{
|
||||
Utils.shiftAndSeekVotes++;
|
||||
}
|
||||
Utils.HasVoted.Add(__instance.Data.PlayerId);
|
||||
}
|
||||
if (text == "/vote e")
|
||||
{
|
||||
if (Utils.HasVoted.Contains(__instance.Data.PlayerId)) return;
|
||||
if (Utils.MapVoteActive)
|
||||
{
|
||||
Utils.fungleVotes++;
|
||||
}
|
||||
if (Utils.ModeVoteActive)
|
||||
{
|
||||
Utils.poofAndSeekVotes++;
|
||||
}
|
||||
Utils.HasVoted.Add(__instance.Data.PlayerId);
|
||||
}
|
||||
if (text == "/vote f")
|
||||
{
|
||||
if (Utils.HasVoted.Contains(__instance.Data.PlayerId)) return;
|
||||
if (Utils.MapVoteActive && Utils.DleksEnabled)
|
||||
{
|
||||
Utils.dleksVotes++;
|
||||
}
|
||||
Utils.HasVoted.Add(__instance.Data.PlayerId);
|
||||
}
|
||||
|
||||
if (text == "/l" || text == "/lastgame")
|
||||
{
|
||||
@@ -795,12 +987,17 @@ public static class RPCHandlerPatch
|
||||
if (text == "/0kc" || text == "/0killcooldown")
|
||||
{
|
||||
if (Utils.CheckAccessLevel(__instance.Data.FriendCode) < Options.SlashRolesAndGamemodeCmd.GetValue()) return;
|
||||
Utils.ModeratorChatCommand("0 Kill Cooldown:\n\nImpostors have no kill cooldown, Crewmates have low tasks\nThink fast and pay attention!", "", false);
|
||||
Utils.ModeratorChatCommand("0 Kill Cooldown:\n\nImpostors have no kill cooldown, and can't kill after a game starts for 5 seconds", "", false);
|
||||
}
|
||||
if (text == "/sns" || text == "/shiftandseek")
|
||||
{
|
||||
if (Utils.CheckAccessLevel(__instance.Data.FriendCode) < Options.SlashRolesAndGamemodeCmd.GetValue()) return;
|
||||
Utils.ModeratorChatCommand("Shift and Seek:\n\nImpostors can only kill someone while shapeshifted as them\nMeetings & Reports = 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);
|
||||
Utils.ModeratorChatCommand("Shift and Seek:\n\nImpostors can only kill someone while shapeshifted as them\nMeetings & Reports = Off", $"Crewmates win by tasks/surviving {Options.CrewAutoWinsGameAfter.GetInt()}s\nImpostors win by killing\nWrong kills are blocked. Kill animations are off", true);
|
||||
}
|
||||
if (text == "/sns2" || text == "/shiftandseek2")
|
||||
{
|
||||
if (Utils.CheckAccessLevel(__instance.Data.FriendCode) < Options.SlashRolesAndGamemodeCmd.GetValue()) return;
|
||||
Utils.ModeratorChatCommand("Correctly killing a target will directly turn them into a ghost and leave no dead body", "", false);
|
||||
}
|
||||
|
||||
if (text == "/sr" || text == "/speedrun")
|
||||
@@ -823,12 +1020,12 @@ public static class RPCHandlerPatch
|
||||
case 0:
|
||||
if (GameOptionsManager.Instance.CurrentGameOptions.GetFloat(FloatOptionNames.KillCooldown) == 0.01f)
|
||||
{
|
||||
Utils.ModeratorChatCommand("0 Kill Cooldown:\n\nImpostors have no kill cooldown, Crewmates have low tasks\nThink fast and pay attention!", "", false);
|
||||
Utils.ModeratorChatCommand("0 Kill Cooldown:\n\nImpostors have no kill cooldown, and can't kill after a game starts for 5 seconds", "", false);
|
||||
}
|
||||
break;
|
||||
|
||||
case 1:
|
||||
Utils.ModeratorChatCommand("Shift and Seek:\n\nImpostors can only kill someone while shapeshifted as them\nMeetings & Reports = 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);
|
||||
Utils.ModeratorChatCommand("Shift and Seek:\n\nImpostors can only kill someone while shapeshifted as them\nMeetings & Reports = Off", $"Crewmates win by tasks/surviving {Options.CrewAutoWinsGameAfter.GetInt()}s\nImpostors win by killing\nWrong kills are blocked. Kill animations are off", true);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
|
||||
@@ -49,7 +49,7 @@ internal static class DisableDevice
|
||||
|
||||
public static void FixedUpdate()
|
||||
{
|
||||
if (!AmongUsClient.Instance.AmHost || ShipStatus.Instance == null || !Utils.GamePastRoleSelection) return;
|
||||
if (!AmongUsClient.Instance.AmHost || ShipStatus.Instance == null || !OnGameStartPatch.PastStartScreen) return;
|
||||
frame = frame == 5 ? 0 : ++frame;
|
||||
if (frame != 0) return;
|
||||
|
||||
|
||||
+12
-10
@@ -11,9 +11,9 @@ public static class EndGameManagerPatch
|
||||
public static void Postfix(EndGameManager __instance)
|
||||
{
|
||||
Logger.Info(" -------- GAME ENDED --------", "EndGame");
|
||||
Utils.ClearLeftoverData();
|
||||
|
||||
//OptionManager.RestoreOptions();
|
||||
Utils.ClearLeftoverData();
|
||||
OptionManager.RestoreOptions();
|
||||
|
||||
EndGameNavigation navigation = __instance.Navigation;
|
||||
if (!AmongUsClient.Instance.AmHost || __instance == null || navigation == null || !Options.AutoRejoinLobby.GetBool()) return;
|
||||
@@ -27,10 +27,11 @@ class NormalGameEndChecker
|
||||
public static bool ImpCheckComplete;
|
||||
public static string LastWinReason = "";
|
||||
public static List<PlayerControl> imps = new List<PlayerControl>();
|
||||
public static string firstDeath;
|
||||
public static string firstDeathString => firstDeath != "" ? $"\n\nFirst death: {firstDeath}" : "";
|
||||
|
||||
public static bool Prefix()
|
||||
{
|
||||
|
||||
if (Options.NoGameEnd.GetBool() || Options.Gamemode.GetValue() == 2 || Utils.HandlingGameEnd) return false;
|
||||
|
||||
var allPlayers = PlayerControl.AllPlayerControls.ToArray();
|
||||
@@ -49,20 +50,21 @@ class NormalGameEndChecker
|
||||
public static string customRoles { get; set; }
|
||||
public static void CheckWinnerText(string Winner)
|
||||
{
|
||||
var impostorList = string.Join(", ", imps.Select(p => p.Data.PlayerName));
|
||||
string impostorList = string.Join(", ", imps.Select(p => p.Data.PlayerName));
|
||||
string impostorString = impostorList != "" ? $"\n\n Impostors: {impostorList}" : "";
|
||||
|
||||
if (!canUpdateWinnerText) return;
|
||||
|
||||
if (Winner == "SnSTimer")
|
||||
{
|
||||
LastWinReason = $"Crewmates Win! (Survived {Options.CrewAutoWinsGameAfter.GetInt()}s)\n\n Impostors: " + impostorList;
|
||||
LastWinReason = $"Crewmates Win! (Survived {Options.CrewAutoWinsGameAfter.GetInt()}s)" + impostorString + firstDeathString;
|
||||
canUpdateWinnerText = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (Winner == "PnSTimer")
|
||||
{
|
||||
LastWinReason = $"Crewmates Win! (Survived {Options.CrewAutoWinsGameAfter.GetInt()}s)\n\n Impostors: " + impostorList;
|
||||
LastWinReason = $"Crewmates Win! (Survived {Options.CrewAutoWinsGameAfter.GetInt()}s)" + impostorString + firstDeathString;
|
||||
canUpdateWinnerText = false;
|
||||
return;
|
||||
}
|
||||
@@ -76,22 +78,22 @@ class NormalGameEndChecker
|
||||
|
||||
if ((Options.Gamemode.GetValue() != 2 && Utils.AliveImpostors == 0) || Winner == "Crewmate")
|
||||
{
|
||||
LastWinReason = "Crewmates Win!\n\nImpostors: " + impostorList;
|
||||
LastWinReason = "Crewmates Win!" + impostorString + firstDeathString;
|
||||
canUpdateWinnerText = false;
|
||||
}
|
||||
else if ((Options.Gamemode.GetValue() != 2 && Utils.AliveImpostors >= Utils.AliveCrewmates) || Winner == "Impostor")
|
||||
{
|
||||
LastWinReason = "Impostors Win!\n\nImpostors: " + impostorList;
|
||||
LastWinReason = "Impostors Win!" + impostorString + firstDeathString;
|
||||
canUpdateWinnerText = false;
|
||||
}
|
||||
else if (GameData.Instance != null && GameData.Instance.TotalTasks > 0 && GameData.Instance.CompletedTasks >= GameData.Instance.TotalTasks || Winner == "CrewmateTasks")
|
||||
{
|
||||
LastWinReason = $"Crewmates Win! ({Options.TaskPercentNeededToWin.GetInt()}% tasks completed)\n\nImpostors: " + impostorList;
|
||||
LastWinReason = $"Crewmates Win! ({Options.TaskPercentNeededToWin.GetInt()}% tasks completed)" + impostorString + firstDeathString;
|
||||
canUpdateWinnerText = false;
|
||||
}
|
||||
else if (Options.Gamemode.GetValue() < 1 || Winner == "ImpostorSabotage")
|
||||
{
|
||||
LastWinReason = "Impostors Win! (Sabotage)\n\n Impostors: " + impostorList;
|
||||
LastWinReason = "Impostors Win! (Sabotage)" + impostorString + firstDeathString;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,6 +20,27 @@ class ExileControllerWrapUpPatch
|
||||
public static void AfterExile(NetworkedPlayerInfo ejectedPlayer)
|
||||
{
|
||||
if (!AmongUsClient.Instance.AmHost) return;
|
||||
|
||||
if ((Options.SNSChatInGameFast.GetBool() && Options.Gamemode.GetValue() == 1) || (Options.PNSChatInGameFast.GetBool() && Options.Gamemode.GetValue() == 3))
|
||||
{
|
||||
if (Main.GM.Value && !Utils.IsDead)
|
||||
{
|
||||
Logger.Info($" Game Master Successful", "StartGame");
|
||||
PlayerControl.LocalPlayer.Exiled();
|
||||
PlayerControl.LocalPlayer.RpcSetRole(RoleTypes.CrewmateGhost);
|
||||
}
|
||||
}
|
||||
|
||||
if (Options.Gamemode.GetValue() == 1)
|
||||
{
|
||||
foreach (var p in PlayerControl.AllPlayerControls)
|
||||
{
|
||||
if (p.Data == null || p.Data.IsDead || p.Data.RoleType == RoleTypes.Shapeshifter) continue;
|
||||
p.RpcProtectPlayer(p, p.cosmetics.ColorId);
|
||||
p.Data.MarkDirty();
|
||||
}
|
||||
}
|
||||
|
||||
if (ejectedPlayer == null) return;
|
||||
|
||||
PlayerControl pc = null;
|
||||
|
||||
@@ -20,12 +20,22 @@ public static class GameStartManagerUpdatePatch
|
||||
|
||||
__instance.MinPlayers = 1;
|
||||
|
||||
if (!Utils.CheckValidData())
|
||||
{
|
||||
__instance.StartButton.gameObject.SetActive(false);
|
||||
}
|
||||
else if (__instance.startState != GameStartManager.StartingStates.Countdown)
|
||||
{
|
||||
__instance.StartButton.gameObject.SetActive(true);
|
||||
}
|
||||
|
||||
if (Main.AutoStart.Value && OnGameJoinedPatch.AutoStartCheck && GameStartManager.InstanceExists && __instance.startState != GameStartManager.StartingStates.Countdown && GameData.Instance?.PlayerCount >= Options.PlayerAutoStart.GetInt())
|
||||
{
|
||||
__instance.startState = GameStartManager.StartingStates.Countdown;
|
||||
__instance.countDownTimer = Options.AutoStartTimer.GetFloat();
|
||||
__instance.StartButton.gameObject.SetActive(false);
|
||||
Autostarting = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (__instance.startState == GameStartManager.StartingStates.Countdown)
|
||||
|
||||
+55
-6
@@ -15,10 +15,34 @@ internal static class CoShowIntroPatch
|
||||
|
||||
if (!AmongUsClient.Instance.AmHost) return;
|
||||
|
||||
//OptionManager.CacheOptions();
|
||||
OptionManager.CacheOptions();
|
||||
|
||||
foreach (var p in PlayerControl.AllPlayerControls)
|
||||
{
|
||||
p.protectedByGuardianId = -1;
|
||||
|
||||
if (NormalGameEndChecker.firstDeath != null && NormalGameEndChecker.firstDeath == p.Data.PlayerName && Options.ShieldFirstDeath.GetBool() && Options.Gamemode.GetValue() != 1)
|
||||
{
|
||||
if (Main.NormalOptions.roleOptions.TryGetRoleOptions<GuardianAngelRoleOptionsV11>(RoleTypes.GuardianAngel, out var GuardianAngelOptions))
|
||||
{
|
||||
var oldGA = GuardianAngelOptions.ImpostorsCanSeeProtect;
|
||||
var oldGAProt = GuardianAngelOptions.ProtectionDurationSeconds;
|
||||
GuardianAngelOptions.ProtectionDurationSeconds = Options.ShieldFirstDeathDuration.GetFloat();
|
||||
GuardianAngelOptions.ImpostorsCanSeeProtect = true;
|
||||
|
||||
_ = new LateTask(() =>
|
||||
{ GuardianAngelOptions.ImpostorsCanSeeProtect = oldGA;
|
||||
GuardianAngelOptions.ProtectionDurationSeconds = oldGAProt + 6;
|
||||
OptionManager.SyncGameOptions();
|
||||
}, Options.ShieldFirstDeathDuration.GetFloat(), "RevertGAProtTime");
|
||||
}
|
||||
|
||||
OptionManager.SyncGameOptions();
|
||||
p.RpcProtectPlayer(p, p.cosmetics.ColorId);
|
||||
p.Data.MarkDirty();
|
||||
Logger.Info($" {p.Data.PlayerName} has been granted a shield for {Options.ShieldFirstDeathDuration.GetInt()}s", "RoleInfo");
|
||||
}
|
||||
|
||||
p.cosmetics.nameText.text = p.Data.PlayerName;
|
||||
|
||||
MurderPlayerPatch.killCount[p.PlayerId] = 0;
|
||||
@@ -35,17 +59,40 @@ internal static class CoShowIntroPatch
|
||||
_ = new LateTask(() =>
|
||||
{
|
||||
Utils.CanCallMeetings = true;
|
||||
}, 33f, "MeetingEnabled");
|
||||
}, 34f, "MeetingEnabled");
|
||||
}
|
||||
|
||||
if (Options.Gamemode.GetValue() == 1 && Options.SNSChatInGameExtend.GetBool() && !Utils.isHideNSeek)
|
||||
if (Options.Gamemode.GetValue() == 1 && !Utils.isHideNSeek)
|
||||
{
|
||||
Utils.ModeratorChatCommand("Shift and Seek:\n\nImpostors can only kill someone while shapeshifted as them\nMeetings & Reports = 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);
|
||||
if (Main.NormalOptions.roleOptions.TryGetRoleOptions<GuardianAngelRoleOptionsV11>(RoleTypes.GuardianAngel, out var GuardianAngelOptions))
|
||||
{
|
||||
GuardianAngelOptions.ProtectionDurationSeconds = 254f;
|
||||
}
|
||||
OptionManager.SyncGameOptions();
|
||||
|
||||
foreach (var p in PlayerControl.AllPlayerControls)
|
||||
{
|
||||
if (p.Data == null || p.Data.IsDead || p.Data.RoleType == RoleTypes.Shapeshifter) continue;
|
||||
p.RpcProtectPlayer(p, p.cosmetics.ColorId);
|
||||
p.Data.MarkDirty();
|
||||
}
|
||||
|
||||
if (Options.SNSChatInGameExtend.GetBool())
|
||||
{
|
||||
Utils.ModeratorChatCommand("Shift and Seek:\n\nImpostors can only kill someone while shapeshifted as them\nMeetings & Reports = Off", $"Crewmates win by tasks/surviving {Options.CrewAutoWinsGameAfter.GetInt()}s\nImpostors win by killing\nWrong kills are blocked. Kill animations are off", true);
|
||||
}
|
||||
if (Options.SNSChatInGameExtend2.GetBool())
|
||||
{
|
||||
_ = new LateTask(() =>
|
||||
{
|
||||
Utils.ChatCommand(DestroyableSingleton<HudManager>.Instance.Chat, "Correctly killing a target will directly turn them into a ghost and leave no dead body", "", false);
|
||||
}, 6.6f, "SNSChatInGameExtend2");
|
||||
}
|
||||
}
|
||||
|
||||
if ((GameOptionsManager.Instance.CurrentGameOptions.GetFloat(FloatOptionNames.KillCooldown) == 0.01f))
|
||||
{
|
||||
Main.NormalOptions.KillCooldown = 8f;
|
||||
Main.NormalOptions.KillCooldown = 5f;
|
||||
OptionManager.SyncGameOptions();
|
||||
|
||||
_ = new LateTask(() =>
|
||||
@@ -59,7 +106,7 @@ internal static class CoShowIntroPatch
|
||||
{
|
||||
if (Options.PNSChatInGame.GetBool())
|
||||
{
|
||||
Main.NormalOptions.KillCooldown = 13f;
|
||||
Main.NormalOptions.KillCooldown = 5f;
|
||||
OptionManager.SyncGameOptions();
|
||||
|
||||
_ = new LateTask(() =>
|
||||
@@ -85,6 +132,8 @@ internal static class CoShowIntroPatch
|
||||
{
|
||||
Utils.ModeratorChatCommand($"Poof and Seek:\n\nImpostors can only move while vanished\n Meetings & Reports = Off\nVisibly moving {Options.BadMoveTimeToSuicide.GetInt()}s as Phantom = Suicide", $"Crewmates win by doing tasks or surviving {Options.PNSCrewAutoWinsGameAfter.GetInt()}s\nImpostors win by killing everyone", true);
|
||||
}
|
||||
|
||||
NormalGameEndChecker.firstDeath = "";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ internal static class OnGameJoinedPatch
|
||||
public static bool AutoStartCheck;
|
||||
public static void Postfix()
|
||||
{
|
||||
Logger.Info(" -------- JOINED GAME --------", "OnGameJoined");
|
||||
Logger.Info(" -------- GAME JOINED --------", "OnGameJoined");
|
||||
|
||||
if (!AmongUsClient.Instance.AmHost) return;
|
||||
|
||||
@@ -60,6 +60,13 @@ internal static class OnGameJoinedPatch
|
||||
Utils.MapVote(true, true);
|
||||
}, Options.TimeBeforeAllMapPoll.GetInt(), "AutoMapPoll");
|
||||
}
|
||||
if (Options.AutomaticModePoll.GetBool())
|
||||
{
|
||||
new LateTask(() =>
|
||||
{
|
||||
Utils.ModeVote(true);
|
||||
}, Options.TimeBeforeModePoll.GetInt(), "AutoModePoll");
|
||||
}
|
||||
|
||||
if (Options.Public.GetBool() && DisconnectManager.Rehosting)
|
||||
{
|
||||
@@ -93,7 +100,6 @@ class OnPlayerJoinedPatch
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void Postfix([HarmonyArgument(0)] ClientData Client)
|
||||
{
|
||||
Logger.Info($" {Client.PlayerName} / {Client.FriendCode} / {Client.PlatformData.Platform}", "Joined The Game");
|
||||
@@ -114,7 +120,6 @@ class OnPlayerJoinedPatch
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!BanManager.TempBanWhiteList.Contains(Client.GetHashedPuid())) BanManager.TempBanWhiteList.Add(Client.GetHashedPuid());
|
||||
AmongUsClient.Instance.KickPlayer(Client.Id, true);
|
||||
Logger.Info(Translator.Get("invalidFriendCodeBan", Client.PlayerName), "BanInvalidFriendCode");
|
||||
Logger.SendInGame(Translator.Get("invalidFriendCodeBan", Client.PlayerName));
|
||||
@@ -205,6 +210,42 @@ public static class ShowLobbyTimer_GameStartManager_Start_Postfix
|
||||
{
|
||||
if (__instance == null || !GameData.Instance || !AmongUsClient.Instance || AmongUsClient.Instance.NetworkMode == NetworkModes.LocalGame || !AmongUsClient.Instance.AmHost) return;
|
||||
|
||||
// Toes who nose
|
||||
//Main.NormalOptions.MaxPlayers = 100;
|
||||
//OptionManager.SyncGameOptions();
|
||||
HudManager.Instance.ShowLobbyTimer(600);
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(GameData), nameof(GameData.ShowNotification))]
|
||||
public static class ShowNotificationPatch
|
||||
{
|
||||
static bool Prefix(string playerName, DisconnectReasons reason)
|
||||
{
|
||||
switch (reason)
|
||||
{
|
||||
case DisconnectReasons.ExitGame:
|
||||
Logger.Info($" {playerName} left the game. ({reason})", "ShowNotificationPatch");
|
||||
Logger.SendInGame($" {playerName} left the game. ({reason})");
|
||||
return false;
|
||||
|
||||
case DisconnectReasons.Sanctions:
|
||||
case DisconnectReasons.Hacking:
|
||||
case DisconnectReasons.Banned:
|
||||
Logger.Info($" {playerName} was banned from the game. ({reason})", "ShowNotificationPatch");
|
||||
Logger.SendInGame($" {playerName} was banned from the game. ({reason})");
|
||||
return false;
|
||||
|
||||
case DisconnectReasons.DuplicateConnectionDetected:
|
||||
case DisconnectReasons.ClientTimeout:
|
||||
case DisconnectReasons.Kicked:
|
||||
Logger.Info($" {playerName} was kicked from the game. ({reason})", "ShowNotificationPatch");
|
||||
Logger.SendInGame($" {playerName} was kicked from the game. ({reason})");
|
||||
return false;
|
||||
|
||||
default:
|
||||
Logger.Info($" {playerName} disconnected from the game. ({reason})", "ShowNotificationPatch");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -70,7 +70,7 @@ class MeetingHudStartPatch
|
||||
PlayerControl player = null;
|
||||
foreach (var pc in PlayerControl.AllPlayerControls)
|
||||
{
|
||||
if (pc.PlayerId == playerState.TargetPlayerId)
|
||||
if (pc.PlayerId == playerState.PlayerId)
|
||||
{
|
||||
player = pc;
|
||||
break;
|
||||
@@ -89,7 +89,7 @@ class MeetingHudStartPatch
|
||||
taskTextMeeting.text = taskText;
|
||||
taskTextMeeting.gameObject.name = "TaskTextMeeting";
|
||||
taskTextMeeting.enableWordWrapping = false;
|
||||
taskTextMeeting.enabled = player.AmOwner || player.PlayerId == playerState.TargetPlayerId;
|
||||
taskTextMeeting.enabled = player.AmOwner || player.PlayerId == playerState.PlayerId;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -126,6 +126,11 @@ public static class NumberOption_Initialize
|
||||
__instance.Increment = 0.05f;
|
||||
break;
|
||||
|
||||
case StringNames.JudgeTaskRequirement:
|
||||
__instance.Increment = 1f;
|
||||
__instance.ValidRange = new FloatRange(0f, 100f);
|
||||
break;
|
||||
|
||||
default:
|
||||
__instance.Increment = 1f;
|
||||
break;
|
||||
|
||||
+129
-15
@@ -1,4 +1,5 @@
|
||||
using AmongUs.GameOptions;
|
||||
using BepInEx.Unity.IL2CPP.Utils.Collections;
|
||||
using System;
|
||||
using InnerNet;
|
||||
using UnityEngine;
|
||||
@@ -32,7 +33,7 @@ internal class CoStartGamePatch
|
||||
class PlayerControlSetRolePatch
|
||||
{
|
||||
public static bool FirstAssign;
|
||||
private static readonly HashSet<byte> ProcessedPlayers = new();
|
||||
public static readonly HashSet<byte> ProcessedPlayers = new();
|
||||
public static HashSet<byte> Seekers = new();
|
||||
public static HashSet<byte> manualSeekers = new();
|
||||
private static readonly System.Random rand = new System.Random();
|
||||
@@ -100,16 +101,10 @@ class PlayerControlSetRolePatch
|
||||
else roleType = RoleTypes.Crewmate;
|
||||
}
|
||||
|
||||
if (Options.Gamemode.GetValue() == 1 && !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;
|
||||
Logger.Info(" PCSRP successful", "RoleManaging");
|
||||
}
|
||||
|
||||
@@ -135,18 +130,137 @@ internal static class OnGameStartPatch
|
||||
if (MeetingHud.Instance != null) MeetingHud.Instance.RpcClose();
|
||||
}
|
||||
|
||||
if (AmongUsClient.Instance.AmHost && Main.GM.Value)
|
||||
{
|
||||
Logger.Info($" Game Master Successful", "StartGame");
|
||||
PlayerControl.LocalPlayer.Exiled();
|
||||
PlayerControl.LocalPlayer.RpcSetRole(RoleTypes.CrewmateGhost);
|
||||
}
|
||||
|
||||
foreach (var p in PlayerControl.AllPlayerControls)
|
||||
{
|
||||
Utils.StoredRoleText[p.PlayerId] = Utils.GetRoleText(p);
|
||||
}
|
||||
|
||||
PastStartScreen = true;
|
||||
|
||||
if (AmongUsClient.Instance.AmHost && Main.GM.Value)
|
||||
{
|
||||
if ((Options.SNSChatInGameFast.GetBool() && Options.Gamemode.GetValue() == 1) || (Options.PNSChatInGameFast.GetBool() && Options.Gamemode.GetValue() == 3)) return;
|
||||
|
||||
Logger.Info($" Game Master Successful", "StartGame");
|
||||
PlayerControl.LocalPlayer.Exiled();
|
||||
PlayerControl.LocalPlayer.RpcSetRole(RoleTypes.CrewmateGhost);
|
||||
}
|
||||
}
|
||||
|
||||
// All Patches below are for the speeded up Chat In Game.
|
||||
// We force the complete intro to skip using 2 patches.
|
||||
// Some PlayerData related things return null when you do this, so we have to set those all as well.
|
||||
[HarmonyPatch(typeof(ShhhBehaviour), nameof(ShhhBehaviour.PlayAnimation))]
|
||||
public static class ShhhBehaviourPlayAnimationPatch
|
||||
{
|
||||
static bool Prefix()
|
||||
{
|
||||
if (!AmongUsClient.Instance.AmHost) return true;
|
||||
|
||||
if ((Options.SNSChatInGameFast.GetBool() && Options.Gamemode.GetValue() == 1) || (Options.PNSChatInGameFast.GetBool() && Options.Gamemode.GetValue() == 3))
|
||||
{
|
||||
HudManager.Instance.shhhEmblem.gameObject.SetActive(false);
|
||||
return false;
|
||||
}
|
||||
else return true;
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(IntroCutscene), nameof(IntroCutscene.CoBegin))]
|
||||
public static class IntroCutsceneCoBeginPatch
|
||||
{
|
||||
public static void Postfix(IntroCutscene __instance, ref Il2CppSystem.Collections.IEnumerator __result)
|
||||
{
|
||||
if (!AmongUsClient.Instance.AmHost) return;
|
||||
|
||||
if ((Options.SNSChatInGameFast.GetBool() && Options.Gamemode.GetValue() == 1) || (Options.PNSChatInGameFast.GetBool() && Options.Gamemode.GetValue() == 3))
|
||||
{
|
||||
__result = SkipIntro(__instance, __result).WrapToIl2Cpp();
|
||||
}
|
||||
}
|
||||
|
||||
private static System.Collections.IEnumerator SkipIntro(IntroCutscene i, Il2CppSystem.Collections.IEnumerator k)
|
||||
{
|
||||
int steps = 0;
|
||||
|
||||
while (k.MoveNext() && steps++ < 1024) {}
|
||||
|
||||
if (steps >= 1024)
|
||||
{
|
||||
if (i != null && i.gameObject != null) i.gameObject.SetActive(false);
|
||||
}
|
||||
yield break;
|
||||
}
|
||||
}
|
||||
|
||||
private static NamePlateViewData meetingNameplate;
|
||||
[HarmonyPatch(typeof(CosmeticsCache), nameof(CosmeticsCache.GetNameplate))]
|
||||
public static class CosmeticsCacheGetNameplatePatch
|
||||
{
|
||||
public static bool Prefix(ref NamePlateViewData __result)
|
||||
{
|
||||
if (!AmongUsClient.Instance.AmHost) return true;
|
||||
|
||||
if ((Options.SNSChatInGameFast.GetBool() && Options.Gamemode.GetValue() == 1) || (Options.PNSChatInGameFast.GetBool() && Options.Gamemode.GetValue() == 3))
|
||||
{
|
||||
if (MeetingHud.Instance == null) return true;
|
||||
|
||||
if (meetingNameplate == null)
|
||||
{
|
||||
meetingNameplate = ScriptableObject.CreateInstance<NamePlateViewData>();
|
||||
meetingNameplate.Image = null;
|
||||
}
|
||||
|
||||
__result = meetingNameplate;
|
||||
return false;
|
||||
}
|
||||
else return true;
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(CosmeticsCache), nameof(CosmeticsCache.Destroy))]
|
||||
public static class CosmeticsCacheDestroyPatch
|
||||
{
|
||||
public static void Postfix()
|
||||
{
|
||||
if (!AmongUsClient.Instance.AmHost) return;
|
||||
|
||||
if ((Options.SNSChatInGameFast.GetBool() && Options.Gamemode.GetValue() == 1) || (Options.PNSChatInGameFast.GetBool() && Options.Gamemode.GetValue() == 3))
|
||||
{
|
||||
if (meetingNameplate != null) Object.Destroy(meetingNameplate);
|
||||
meetingNameplate = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(ShapeshifterPanel), nameof(ShapeshifterPanel.SetPlayer))]
|
||||
public static class ShapeshifterPanelSetPlayerPatch
|
||||
{
|
||||
public static bool Prefix(ShapeshifterPanel __instance, int index, NetworkedPlayerInfo playerInfo, Il2CppSystem.Action onShift)
|
||||
{
|
||||
if (__instance == null || playerInfo == null || !AmongUsClient.Instance.AmHost) return true;
|
||||
|
||||
if ((Options.SNSChatInGameFast.GetBool() && Options.Gamemode.GetValue() == 1) || (Options.PNSChatInGameFast.GetBool() && Options.Gamemode.GetValue() == 3))
|
||||
{
|
||||
__instance.shapeshift = onShift;
|
||||
__instance.PlayerIcon.SetFlipX(false);
|
||||
__instance.PlayerIcon.ToggleName(false);
|
||||
|
||||
SpriteRenderer[] componentsInChildren = __instance.GetComponentsInChildren<SpriteRenderer>();
|
||||
foreach (var spriteRenderer in componentsInChildren)
|
||||
{
|
||||
spriteRenderer.material.SetInt(PlayerMaterial.MaskLayer, index + 2);
|
||||
}
|
||||
|
||||
__instance.PlayerIcon.SetMaskLayer(index + 2);
|
||||
__instance.PlayerIcon.UpdateFromEitherPlayerDataOrCache(playerInfo, PlayerOutfitType.Default, PlayerMaterial.MaskType.ComplexUI, false, null);
|
||||
|
||||
__instance.NameText.text = playerInfo.PlayerName;
|
||||
__instance.LevelNumberText.text = ProgressionManager.FormatVisualLevel(playerInfo.PlayerLevel);
|
||||
|
||||
return false;
|
||||
}
|
||||
else return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -23,6 +23,12 @@ class ReportDeadBodyPatch
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!OnGameStartPatch.PastStartScreen && __instance != PlayerControl.LocalPlayer)
|
||||
{
|
||||
EACR.MeetingCheat(__instance);
|
||||
return false;
|
||||
}
|
||||
|
||||
// target == null means meeting
|
||||
|
||||
if (Options.Gamemode.GetValue() == 1 || Options.Gamemode.GetValue() == 2 || Options.Gamemode.GetValue() == 3)
|
||||
@@ -51,7 +57,7 @@ internal static class MurderPlayerPatch
|
||||
|
||||
public static void Prefix(PlayerControl __instance, [HarmonyArgument(0)] PlayerControl target, [HarmonyArgument(1)] MurderResultFlags resultFlags, ref bool __state)
|
||||
{
|
||||
if (!AmongUsClient.Instance.AmHost || !resultFlags.HasFlag(MurderResultFlags.Succeeded)) return;
|
||||
if (!AmongUsClient.Instance.AmHost) return;
|
||||
|
||||
byte playerId = __instance.Data.PlayerId;
|
||||
|
||||
@@ -60,11 +66,37 @@ internal static class MurderPlayerPatch
|
||||
killCount[playerId] = 0;
|
||||
}
|
||||
|
||||
if (resultFlags.HasFlag(MurderResultFlags.Succeeded))
|
||||
{
|
||||
if (Options.Gamemode.GetValue() == 1 && !Utils.isHideNSeek)
|
||||
{
|
||||
if (target.Data.PlayerId == __instance.shapeshiftTargetPlayerId) return;
|
||||
Logger.Info($" {__instance.Data.PlayerName} directly killed {target.Data.PlayerName} in SnS, forcing suicide. (Are they hacking?)", "MurderPlayer");
|
||||
__instance.RpcSetRole(RoleTypes.ImpostorGhost);
|
||||
}
|
||||
else
|
||||
{
|
||||
killCount[playerId]++;
|
||||
Logger.Info($" {__instance.Data.PlayerName} killed {target.Data.PlayerName}", "MurderPlayer");
|
||||
if (string.IsNullOrEmpty(NormalGameEndChecker.firstDeath))
|
||||
{
|
||||
NormalGameEndChecker.firstDeath = target.Data.PlayerName;
|
||||
Utils.HasMurdered = true;
|
||||
}
|
||||
}
|
||||
|
||||
killCount[playerId]++;
|
||||
Logger.Info($" {__instance.Data.PlayerName} killed {target.Data.PlayerName}", "MurderPlayer");
|
||||
if (target.Data.RoleType == RoleTypes.Impostor ||
|
||||
target.Data.RoleType == RoleTypes.Shapeshifter ||
|
||||
target.Data.RoleType == RoleTypes.Phantom ||
|
||||
target.Data.RoleType == RoleTypes.Viper ||
|
||||
target.Data.IsDead)
|
||||
{
|
||||
if (__instance != PlayerControl.LocalPlayer) return;
|
||||
EACR.MurderCheat(__instance);
|
||||
}
|
||||
}
|
||||
|
||||
if ((target == PlayerControl.LocalPlayer || PlayerControl.LocalPlayer.Data.IsDead) && !Main.DisableInfoWhenDead.Value)
|
||||
if ((target == PlayerControl.LocalPlayer || PlayerControl.LocalPlayer.Data.IsDead) && !Main.DisableInfoWhenDead.Value && resultFlags.HasFlag(MurderResultFlags.Succeeded))
|
||||
{
|
||||
foreach (var p in PlayerControl.AllPlayerControls)
|
||||
{
|
||||
@@ -80,32 +112,28 @@ internal static class MurderPlayerPatch
|
||||
}
|
||||
|
||||
//1 = Shift and Seek
|
||||
if (Options.Gamemode.GetValue() == 1 && !Utils.isHideNSeek)
|
||||
if (Options.Gamemode.GetValue() == 1 && !Utils.isHideNSeek && resultFlags.HasFlag(MurderResultFlags.FailedProtected))
|
||||
{
|
||||
if (!resultFlags.HasFlag(MurderResultFlags.Succeeded)) return;
|
||||
|
||||
if (target.Data.PlayerId == __instance.shapeshiftTargetPlayerId)
|
||||
{
|
||||
killCount[playerId]++;
|
||||
Logger.Info($" {__instance.Data.PlayerName} correctly killed {target.Data.PlayerName} ", "SNSKillManager");
|
||||
target.RpcSetRole(RoleTypes.CrewmateGhost);
|
||||
if (string.IsNullOrEmpty(NormalGameEndChecker.firstDeath))
|
||||
{
|
||||
NormalGameEndChecker.firstDeath = target.Data.PlayerName;
|
||||
Utils.HasMurdered = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!misfireCount.ContainsKey(playerId))
|
||||
misfireCount[playerId] = 0;
|
||||
|
||||
misfireCount[playerId]++;
|
||||
|
||||
if (misfireCount[__instance.Data.PlayerId] >= Options.MisfiresToSuicide.GetFloat())
|
||||
{
|
||||
__instance.RpcSetRole(RoleTypes.ImpostorGhost);
|
||||
Logger.Info($" {__instance.Data.PlayerName} misfired {misfireCount[playerId]} time(s) and suicided", "SNSKillManager");
|
||||
Logger.SendInGame($" {__instance.Data.PlayerName} misfired {misfireCount[playerId]} time(s) and suicided");
|
||||
}
|
||||
Logger.Info($" {__instance.Data.PlayerName} misfired trying to kill {target.Data.PlayerName}. Blocking kill", "SNSKillManager");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
[HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.CheckShapeshift))]
|
||||
internal static class CheckShapeshiftPatch
|
||||
{
|
||||
@@ -123,6 +151,7 @@ internal static class CheckShapeshiftPatch
|
||||
else return true;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
[HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.CompleteTask))]
|
||||
class PlayerControlCompleteTaskPatch
|
||||
@@ -186,7 +215,7 @@ class PlayerControlCompleteTaskPatch
|
||||
|
||||
public static void CalculateTaskWin()
|
||||
{
|
||||
if (!Utils.GamePastRoleSelection || Utils.isHideNSeek || Options.NoGameEnd.GetBool() || !OnGameStartPatch.PastStartScreen) return;
|
||||
if (!OnGameStartPatch.PastStartScreen || Utils.isHideNSeek || Options.NoGameEnd.GetBool() || !OnGameStartPatch.PastStartScreen) return;
|
||||
|
||||
//Logger.Info($" Checking if {GameData.Instance.CompletedTasks} - {ignoredCompletedTasks} >= ({GameData.Instance.TotalTasks} - {ignoredTasks}) * 0.01 * {Options.TaskPercentNeededToWin.GetInt()}", "TaskPatch");
|
||||
|
||||
|
||||
@@ -70,6 +70,14 @@ public static class SabotageSystemTypeRepairDamagePatch
|
||||
}
|
||||
else return true;
|
||||
}
|
||||
|
||||
public static void Postfix(SabotageSystemType __instance)
|
||||
{
|
||||
if (!Options.CustomizeSabotages.GetBool() || !AmongUsClient.Instance.AmHost) return;
|
||||
|
||||
__instance.Timer = Options.SabotageCooldown.GetInt();
|
||||
__instance.IsDirty = true;
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(ShipStatus), nameof(ShipStatus.CloseDoorsOfType))]
|
||||
@@ -113,4 +121,155 @@ public static class MessageReaderUpdateSystemPatch
|
||||
}
|
||||
else return true;
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(ReactorSystemType))]
|
||||
public static class ReactorSystemTypePatch
|
||||
{
|
||||
private static bool SetDuration = true;
|
||||
|
||||
[HarmonyPatch(nameof(ReactorSystemType.Deteriorate))]
|
||||
[HarmonyPrefix]
|
||||
public static void Deteriorate_Prefix(ReactorSystemType __instance)
|
||||
{
|
||||
if (!AmongUsClient.Instance.AmHost || Main.NormalOptions.MapId == 4 || !Options.CustomizeSabotages.GetBool()) return;
|
||||
|
||||
if (!__instance.IsActive || !ShipStatus.Instance || !SetDuration)
|
||||
{
|
||||
if (!SetDuration && !__instance.IsActive) SetDuration = true;
|
||||
return;
|
||||
}
|
||||
|
||||
Logger.Info($" {ShipStatus.Instance.Type} - {SetDuration}", "ReactorSystemTypePatch");
|
||||
SetDuration = false;
|
||||
|
||||
switch (ShipStatus.Instance.Type)
|
||||
{
|
||||
case ShipStatus.MapType.Ship:
|
||||
__instance.Countdown = Options.SkeldReactorDuration.GetFloat();
|
||||
return;
|
||||
case ShipStatus.MapType.Hq:
|
||||
__instance.Countdown = Options.MiraReactorDuration.GetFloat();
|
||||
return;
|
||||
case ShipStatus.MapType.Pb:
|
||||
__instance.Countdown = Options.PolusReactorDuration.GetFloat();
|
||||
return;
|
||||
case ShipStatus.MapType.Fungle:
|
||||
__instance.Countdown = Options.FungleReactorDuration.GetFloat();
|
||||
return;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
[HarmonyPatch(nameof(ReactorSystemType.Deteriorate))]
|
||||
[HarmonyPostfix]
|
||||
public static void Deteriorate_Postfix(ReactorSystemType __instance)
|
||||
{
|
||||
if (__instance.IsActive && __instance.Countdown <= 0 && !Utils.HandlingGameEnd)
|
||||
{
|
||||
Utils.ContinueEndGame((byte)GameOverReason.ImpostorsBySabotage);
|
||||
NormalGameEndChecker.CheckWinnerText("ImpostorSabotage");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(HeliSabotageSystem))]
|
||||
public static class HeliSabotageSystemPatch
|
||||
{
|
||||
private static bool SetDuration = true;
|
||||
|
||||
[HarmonyPatch(nameof(HeliSabotageSystem.Deteriorate))]
|
||||
[HarmonyPrefix]
|
||||
public static void Deteriorate_Prefix(HeliSabotageSystem __instance)
|
||||
{
|
||||
if (!AmongUsClient.Instance.AmHost || Main.NormalOptions.MapId != 4 || !Options.CustomizeSabotages.GetBool()) return;
|
||||
|
||||
if (!__instance.IsActive || !ShipStatus.Instance || !SetDuration)
|
||||
{
|
||||
if (!SetDuration && !__instance.IsActive) SetDuration = true;
|
||||
return;
|
||||
}
|
||||
|
||||
Logger.Info($" {ShipStatus.Instance.Type} - {SetDuration}", "HeliSabotageSystemPatch");
|
||||
SetDuration = false;
|
||||
|
||||
__instance.Countdown = Options.AirshipReactorDuration.GetFloat();
|
||||
}
|
||||
[HarmonyPatch(nameof(HeliSabotageSystem.Deteriorate))]
|
||||
[HarmonyPostfix]
|
||||
public static void Deteriorate_Postfix(HeliSabotageSystem __instance)
|
||||
{
|
||||
if (__instance.IsActive && __instance.Countdown <= 0 && !Utils.HandlingGameEnd)
|
||||
{
|
||||
Utils.ContinueEndGame((byte)GameOverReason.ImpostorsBySabotage);
|
||||
NormalGameEndChecker.CheckWinnerText("ImpostorSabotage");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(LifeSuppSystemType))]
|
||||
public static class LifeSuppSystemTypePatch
|
||||
{
|
||||
private static bool SetDuration = true;
|
||||
|
||||
[HarmonyPatch(nameof(LifeSuppSystemType.Deteriorate))]
|
||||
[HarmonyPrefix]
|
||||
public static void Deteriorate_Prefix(LifeSuppSystemType __instance)
|
||||
{
|
||||
if (!AmongUsClient.Instance.AmHost || Main.NormalOptions.MapId == 2 || Main.NormalOptions.MapId == 4 || Main.NormalOptions.MapId == 5 || !Options.CustomizeSabotages.GetBool()) return;
|
||||
|
||||
if (!__instance.IsActive || !ShipStatus.Instance || !SetDuration)
|
||||
{
|
||||
if (!SetDuration && !__instance.IsActive) SetDuration = true;
|
||||
return;
|
||||
}
|
||||
|
||||
Logger.Info($" {ShipStatus.Instance.Type} - {SetDuration}", "LifeSuppSystemType");
|
||||
SetDuration = false;
|
||||
|
||||
switch (ShipStatus.Instance.Type)
|
||||
{
|
||||
case ShipStatus.MapType.Ship:
|
||||
__instance.Countdown = Options.SkeldO2Duration.GetFloat();
|
||||
return;
|
||||
case ShipStatus.MapType.Hq:
|
||||
__instance.Countdown = Options.MiraO2Duration.GetFloat();
|
||||
return;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
[HarmonyPatch(nameof(LifeSuppSystemType.Deteriorate))]
|
||||
[HarmonyPostfix]
|
||||
public static void Deteriorate_Postfix(LifeSuppSystemType __instance)
|
||||
{
|
||||
if (__instance.IsActive && __instance.Countdown <= 0 && !Utils.HandlingGameEnd)
|
||||
{
|
||||
Utils.ContinueEndGame((byte)GameOverReason.ImpostorsBySabotage);
|
||||
NormalGameEndChecker.CheckWinnerText("ImpostorSabotage");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(MushroomMixupSabotageSystem), nameof(MushroomMixupSabotageSystem.Deteriorate))]
|
||||
public static class MushroomMixupSabotageSystemPatch
|
||||
{
|
||||
private static bool SetDuration = true;
|
||||
public static void Prefix(MushroomMixupSabotageSystem __instance, ref bool __state)
|
||||
{
|
||||
__state = __instance.IsActive;
|
||||
|
||||
if (!AmongUsClient.Instance.AmHost || Main.NormalOptions.MapId != 5 || !Options.CustomizeSabotages.GetBool()) return;
|
||||
|
||||
if (!__instance.IsActive || !ShipStatus.Instance || !SetDuration)
|
||||
{
|
||||
if (!SetDuration && !__instance.IsActive) SetDuration = true;
|
||||
return;
|
||||
}
|
||||
|
||||
Logger.Info($" {ShipStatus.Instance.Type} - {SetDuration}", "MushroomMixupSabotageSystem");
|
||||
SetDuration = false;
|
||||
|
||||
__instance.currentSecondsUntilHeal = Options.FungleMushroomMixupDuration.GetFloat();
|
||||
}
|
||||
}
|
||||
@@ -1,24 +1,23 @@
|
||||
# Welcome to Among Us Revamped!
|
||||
<h1 align="center">Welcome to Among Us Revamped!</h1>
|
||||
<br>
|
||||
|
||||
</p>
|
||||
<p align="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://ko-fi.com/apemv">
|
||||
<img src="https://img.shields.io/badge/Donate%20on-Ko--fi-ff5f5f?style=for-the-badge&logo=ko-fi&logoColor=white">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<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>
|
||||
|
||||
<a href="../../releases">
|
||||
<img src="https://img.shields.io/github/downloads/ApeMV/AmongUsRevamped/total?style=for-the-badge&color=red">
|
||||
</a>
|
||||
|
||||
<a href="../../releases/latest">
|
||||
<img src="https://img.shields.io/github/downloads/ApeMV/AmongUsRevamped/latest/total?style=for-the-badge">
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/ApeMV/AmongUsRevamped/releases">
|
||||
<img src="https://img.shields.io/github/downloads/ApeMV/AmongUsRevamped/total?style=for-the-badge&color=red"/>
|
||||
</a>
|
||||
<a href="https://github.com/ApeMV/AmongUsRevamped/releases/latest">
|
||||
<img src="https://img.shields.io/github/downloads/ApeMV/AmongUsRevamped/latest/total?style=for-the-badge"/>
|
||||
</a>
|
||||
</p>
|
||||
|
||||
# 💡 How To Install:
|
||||
@@ -37,14 +36,15 @@
|
||||
<img src="https://github.com/astra1dev/AUnlocker/assets/90265231/14226f03-a003-4efc-b27b-6df53fb394d6" width=410 height=240>****
|
||||
|
||||
|
||||
# 🎮 Features (v1.9.4):
|
||||
# 🎮 Features (v2.0.4):
|
||||
|
||||
## <b>♠️ Client Side settings:</b>
|
||||
- Game Master (Spectator)
|
||||
- Show FPS
|
||||
- Dark Theme
|
||||
- Toggle Game Master (Spectator)
|
||||
- Toggle Show FPS
|
||||
- Toggle Dark Theme
|
||||
- Toggle Lobby Music
|
||||
- Show/Hide Info When Dead
|
||||
- Toggle Info When Dead
|
||||
- Toggle Command Helper
|
||||
## <b>⚙️ Technical settings:</b>
|
||||
- Advanced AFK Detection system
|
||||
- Kick/Ban players under/above a certain level
|
||||
@@ -53,7 +53,7 @@
|
||||
- Banlist system
|
||||
- Denyword and Denyname system
|
||||
- Advanced Moderator system
|
||||
- To add Admins, Moderators and VIP's, type the user's Friendcode in the designated files located in AUR-DATA
|
||||
- To add Admins/Moderators/VIP's, type the user's Friendcode in the designated files located in AUR-DATA
|
||||
- Enable No Game End
|
||||
- Custom starting countdown
|
||||
## <b>♻️ Automation settings:</b>
|
||||
@@ -63,6 +63,7 @@
|
||||
- Automatically Send Map Votes
|
||||
- Enable (configurable) Welcome Messages from Templates.txt
|
||||
## <b>🔧 Gameplay Settings:</b>
|
||||
- Change sabotage cooldown and durations
|
||||
- Dead impostors can sabotage
|
||||
- Disable critical sabotages (invividual)
|
||||
- Disable door sabotages
|
||||
@@ -73,6 +74,7 @@
|
||||
- % Tasks completed for Crewmates to win
|
||||
- Enable/Disable any task
|
||||
- All players have same tasks
|
||||
- Shield player who died first
|
||||
- Hide and Seek: Custom Seeker count
|
||||
## <b>🏆 Custom Gamemodes:</b>
|
||||
- 0 Kill Cooldown -> Set Kill Cooldown to 0.01
|
||||
@@ -83,8 +85,9 @@
|
||||
- Detect invalid sabotages
|
||||
- Detect malformed RPC's
|
||||
- Detect invalid venting
|
||||
- Detect Invalid animations
|
||||
- Detect Invalid task completions
|
||||
- Detect invalid animations
|
||||
- Detect invalid task completions
|
||||
- Detect invalid kills
|
||||
- Detect immortality cheats
|
||||
- Block attempted votekicks
|
||||
- These are all enabled by default
|
||||
@@ -92,18 +95,15 @@
|
||||
- Lanuage support: English, Italian, Japanese, Russian, Simplified Chinese, Spanish
|
||||
- Select a language in Language/YourLanguage.txt
|
||||
- Preset system for mod settings
|
||||
- Command Helper
|
||||
- Creatable and customizable Templates
|
||||
- Eht Dleks (Reverse Skeld) Map
|
||||
- Ability to cancel starting countdown
|
||||
- Improved main menu
|
||||
- Faster startup time
|
||||
- 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
|
||||
- Manually set multiple Seekers in HnS
|
||||
- <b>🎉 And this all works in public lobbies!</b>
|
||||
|
||||
### Hotkeys
|
||||
@@ -142,6 +142,9 @@
|
||||
| /clearseekers | Clears manual Seeker list in HnS |
|
||||
| /mapvote | Starts a vote for the map. Default maps only |
|
||||
| /allmapvote | Starts a vote for the map. Includes Eht Dleks |
|
||||
| /gmvote | Starts a vote for the gamemode |
|
||||
| /private | Sets lobby to private |
|
||||
| /public | Sets lobby to public |
|
||||
|
||||
|
||||
**Credit to these mods and their developers for their code:**
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
"allowFortegreen": "Allow Fortegreen Color",
|
||||
"noGameEnd": "No Game End",
|
||||
"mapVoteDuration": "Map Vote Duration",
|
||||
"modeVoteDuration": "Gamemode Vote Duration",
|
||||
|
||||
"tabGroupDeniedWords": "Denied Words",
|
||||
"enableDeniedWords": "Kick Players Who Say Denied Words",
|
||||
@@ -64,11 +65,11 @@
|
||||
"slashColorCmd": "Who Can Use /color",
|
||||
"slashRolesAndGamemodeCmd": "Who Can Use /r & Templates",
|
||||
"slashLastGameCmd": "Who Can Use /l & /aur",
|
||||
"slashMapAndSeekerCmd": "Who Can Use /seeker & /mapvote",
|
||||
"slashMapAndSeekerCmd": "Who Can Use /seeker & Create Votes",
|
||||
"slashKickCmd": "Who Can Use /kick & /ckick",
|
||||
"slashBanCmd": "Who Can Use /ban & /cban",
|
||||
"slashEndMeetingCmd": "Who Can Use /endmeeting",
|
||||
"slashStartAndEndGameCmd": "Who Can Use /startgame & /endgame",
|
||||
"slashStartAndEndGameCmd": "Who Can Use /start & /endgame",
|
||||
|
||||
"tabGroupCrewmate": "Crewmate Roles",
|
||||
"tabGroupNeutral": "Neutral Roles",
|
||||
@@ -83,6 +84,8 @@
|
||||
"tabGroupSNS": "Shift and Seek",
|
||||
"snsChatInGame": "Chat during gameplay (experimental)",
|
||||
"snsChatInGameExtend": "Send gamemode info after game start",
|
||||
"snsChatInGameExtendTwo": "Send extended info after game start",
|
||||
"snsChatInGameFast": "Faster Meeting (experimental+)",
|
||||
"snsSettingsOverride": "Auto Update Settings",
|
||||
"cantKillTime": "After Misfiring, Can't kill for",
|
||||
"misfiresToSuicide": "Suicide After Amount Of Misfires",
|
||||
@@ -95,12 +98,25 @@
|
||||
"snsDisableHeli": "Disable Crash Course Sabotage",
|
||||
"snsDisableMushroomMixup": "Disable Mushroom Mixup Sabotage",
|
||||
"snsDisableCloseDoor": "Disable SnS Door Sabotages",
|
||||
|
||||
"tabGroupCustomizeSabotages": "Customize Sabotages",
|
||||
"customizeSabotages": "Enable Sabotage Customizations",
|
||||
"sabotageCooldown": "Critical Sabotage Cooldown",
|
||||
"skeldReactorDuration": "Skeld Reactor Duration",
|
||||
"skeldO2Duration": "Skeld O2 Duration",
|
||||
"miraReactorDuration": "Mira Reactor Duration",
|
||||
"miraO2Duration": "Mira O2 Duration",
|
||||
"polusReactorDuration": "Polus Reactor Duration",
|
||||
"airshipReactorDuration": "Airship Reactor Duration",
|
||||
"fungleReactorDuration": "Fungle Reactor Duration",
|
||||
"fungleMushroomMixupDuration": "Fungle Mixup Duration",
|
||||
|
||||
"tabGroupSpeedrun": "Speedrun",
|
||||
"speedrunSettingsOverride": "Auto Update Settings",
|
||||
"gameAutoEndsAfter": "Game automatically ends after",
|
||||
"engineerMode": "Everyone Is Engineer",
|
||||
|
||||
"tabGroupSabotages": "Sabotages",
|
||||
"tabGroupSabotages": "Disable Sabotages",
|
||||
"deadImpostorsCanSabotage": "Dead Impostors Can Sabotage",
|
||||
"disableSabotage": "Disable Critical Sabotages",
|
||||
"disableReactor": "Disable Reactor Sabotage",
|
||||
@@ -112,6 +128,8 @@
|
||||
"disableCloseDoor": "Disable Door Sabotages",
|
||||
|
||||
"tabGroupGameplayGeneral": "General",
|
||||
"shieldFirstDeath": "Shield Player Who Died First",
|
||||
"shieldFirstDeathDuration": "Shield Duration",
|
||||
"disableAnnoyingMeetingCalls": "Disable Meeting Calls First 30s",
|
||||
"disableReport": "Disable Body Reports",
|
||||
"changeDecontaminationTime": "Override Decontamination Time (Standard Only)",
|
||||
@@ -234,7 +252,7 @@
|
||||
"disableSubmitScan": "Disable Submit Scan",
|
||||
"disableUploadData": "Disable Upload Data",
|
||||
|
||||
"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.\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>/pns, /poofandseek</b>\nSend Poof 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.\n\n<b>/seeker {name}</b>\nForce someone as Seeker in HnS.\n<b>/seekers</b>\nShow forced seeker list.\n<b>/clearseeker</b>\nClear forced seeker list.\n\n<b>/mapvote</b>\nStarts a map vote containing default maps.\n\n<b>/allmapvote</b>\nStarts a map vote that includes Eht Dleks.",
|
||||
"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.\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>/sns2</b>\nSend extended Shift and Seek mode description\n<b>/pns, /poofandseek</b>\nSend Poof 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.\n\n<b>/seeker {name}</b>\nForce someone as Seeker in HnS.\n<b>/seekers</b>\nShow forced seeker list.\n<b>/clearseeker</b>\nClear forced seeker list.\n\n<b>/mapvote</b>\nStarts a map vote containing default maps.\n<b>/allmapvote</b>\nStarts a map vote that includes Eht Dleks.\n<b>/gmvote</b>\nStarts a gamemode vote.",
|
||||
|
||||
"translationReloaded": "Your file has successfully been reset.\nTo apply all changes, restart your game.",
|
||||
|
||||
@@ -262,6 +280,7 @@
|
||||
|
||||
"helpDesc": "Show all commands and what they do.",
|
||||
"snsDesc": "Send Shift and Seek gamemode Description.",
|
||||
"snsTwoDesc": "Send Shift and Seek extended Description.",
|
||||
"0kcDesc": "Send 0 Kill Cooldown gamemode Description.",
|
||||
"SrDesc": "Send Speedrun gamemode Description.",
|
||||
"pnsDesc": "Send Poof and Seek gamemode Description.",
|
||||
@@ -291,6 +310,9 @@
|
||||
"clearSeekerDesc": "Clears the manual Seeker list.",
|
||||
"mapVoteDesc": "Starts a vote between the 5 core maps.",
|
||||
"allMapVoteDesc": "Starts a vote between all 6 maps, including Eht Dleks.",
|
||||
"modeVoteDesc": "Starts a vote between all gamemodes.",
|
||||
"privateDesc": "Changes lobby visibility to private.",
|
||||
"publicDesc": "Changes lobby visibility to public.",
|
||||
|
||||
"banWordKick": "{0} was kicked because they sent a word in DeniedWords.txt {1} time(s)",
|
||||
"startWordKick": "{0} was kicked because they sent a word in StartWords.txt {1} time(s)",
|
||||
@@ -336,11 +358,12 @@
|
||||
|
||||
"automaticMapPoll": "Automatic /mapvote After Rejoining",
|
||||
"automaticAllMapPoll": "Automatic /allmapvote After Rejoining",
|
||||
"timeBeforeMapPoll": "Time Before Poll Starts",
|
||||
"timeBeforeMapPoll": "Time Before Vote Starts",
|
||||
"automaticModePoll": "Automatic /gmvote After Rejoining",
|
||||
|
||||
"pnsDisableSabotage": "Disable PnS Critical Sabotages",
|
||||
"pnsDisableCloseDoor": "Disable PnS Door Sabotages",
|
||||
"tabGroupPNS": "Poof and Seek",
|
||||
"badMoveTimeToSuicide": "Phantom Suicides After Visibly Moving For",
|
||||
"snsImpostorCanVent": "Impostors can vent"
|
||||
"snsImpostorCanVent": "Impostors Can Vent"
|
||||
}
|
||||
@@ -73,6 +73,19 @@
|
||||
"snsDisableHeli": "Disabilita Sabotaggio Collisione",
|
||||
"snsDisableMushroomMixup": "Disabilita Sabotaggio Caos dei Funghi",
|
||||
"snsDisableCloseDoor": "Disabilita Sabotaggio Porte in Modalità Clone",
|
||||
|
||||
"tabGroupCustomizeSabotages": "Customize Sabotages",
|
||||
"customizeSabotages": "Enable Sabotage Customizations",
|
||||
"sabotageCooldown": "Critical Sabotage Cooldown",
|
||||
"skeldReactorDuration": "Skeld Reactor Duration",
|
||||
"skeldO2Duration": "Skeld O2 Duration",
|
||||
"miraReactorDuration": "Mira Reactor Duration",
|
||||
"miraO2Duration": "Mira O2 Duration",
|
||||
"polusReactorDuration": "Polus Reactor Duration",
|
||||
"airshipReactorDuration": "Airship Reactor Duration",
|
||||
"fungleReactorDuration": "Fungle Reactor Duration",
|
||||
"fungleMushroomMixupDuration": "Fungle Mixup Duration",
|
||||
|
||||
"tabGroupSpeedrun": "Speedrun",
|
||||
"speedrunSettingsOverride": "Aggiorna Automaticamente Impostazioni",
|
||||
"gameAutoEndsAfter": "La partita finisce automaticamente dopo",
|
||||
|
||||
@@ -76,6 +76,19 @@
|
||||
"snsDisableHeli": "墜落危険サボタージュを無効化",
|
||||
"snsDisableMushroomMixup": "キノコシャッフルサボタージュを無効化",
|
||||
"snsDisableCloseDoor": "SnSドア閉鎖を無効化",
|
||||
|
||||
"tabGroupCustomizeSabotages": "Customize Sabotages",
|
||||
"customizeSabotages": "Enable Sabotage Customizations",
|
||||
"sabotageCooldown": "Critical Sabotage Cooldown",
|
||||
"skeldReactorDuration": "Skeld Reactor Duration",
|
||||
"skeldO2Duration": "Skeld O2 Duration",
|
||||
"miraReactorDuration": "Mira Reactor Duration",
|
||||
"miraO2Duration": "Mira O2 Duration",
|
||||
"polusReactorDuration": "Polus Reactor Duration",
|
||||
"airshipReactorDuration": "Airship Reactor Duration",
|
||||
"fungleReactorDuration": "Fungle Reactor Duration",
|
||||
"fungleMushroomMixupDuration": "Fungle Mixup Duration",
|
||||
|
||||
"tabGroupSpeedrun": "スピードラン",
|
||||
"speedrunSettingsOverride": "設定を自動更新",
|
||||
"gameAutoEndsAfter": "ゲームの自動終了時間",
|
||||
@@ -336,10 +349,21 @@
|
||||
"automaticMapPoll": "再参加後に /mapvote を自動実行",
|
||||
"automaticAllMapPoll": "再参加後に /allmapvote を自動実行",
|
||||
"timeBeforeMapPoll": "投票開始までの待機時間",
|
||||
"pnsDesc": "Poof and Seekゲームモードの説明を送信します。",
|
||||
"pnsDisableSabotage": "PnSの重大なサボタージュを無効にする",
|
||||
"pnsDisableCloseDoor": "PnSのドア閉鎖サボタージュを無効にする",
|
||||
"tabGroupPNS": "Poof and Seek",
|
||||
"badMoveTimeToSuicide": "幻象師が明らかに移動した後、自殺するまでの時間",
|
||||
"snsImpostorCanVent": "インポスターはベントを使用できる",
|
||||
"modeVoteDuration": "ゲームモード投票時間",
|
||||
"snsChatInGameExtendTwo": "ゲーム開始後に拡張情報を送信",
|
||||
"snsChatInGameFast": "高速会議(実験的+)",
|
||||
"shieldFirstDeath": "最初に死亡したプレイヤーをシールドで保護",
|
||||
"shieldFirstDeathDuration": "シールド持続時間",
|
||||
"snsTwoDesc": "Shift and Seekの拡張説明を送信。",
|
||||
"modeVoteDesc": "すべてのゲームモードから投票を開始します。",
|
||||
"automaticModePoll": "再参加後に自動で /gmvote を実行",
|
||||
|
||||
"pnsDisableSabotage": "Disable PnS Critical Sabotages",
|
||||
"pnsDisableCloseDoor": "Disable PnS Door Sabotages",
|
||||
"tabGroupPNS": "Poof and Seek",
|
||||
"badMoveTimeToSuicide": "Phantom Suicides After Visibly Moving For",
|
||||
"snsImpostorCanVent": "Impostors can vent"
|
||||
"privateDesc": "Changes lobby visibility to private.",
|
||||
"publicDesc": "Changes lobby visibility to public."
|
||||
}
|
||||
@@ -73,6 +73,19 @@
|
||||
"snsDisableHeli": "Выключить Сабботаж Столкновения",
|
||||
"snsDisableMushroomMixup": "Выключить Сабботаж Грибного Переполоха",
|
||||
"snsDisableCloseDoor": "Выключить Сабботаж Дверей в Режиме Клона",
|
||||
|
||||
"tabGroupCustomizeSabotages": "Customize Sabotages",
|
||||
"customizeSabotages": "Enable Sabotage Customizations",
|
||||
"sabotageCooldown": "Critical Sabotage Cooldown",
|
||||
"skeldReactorDuration": "Skeld Reactor Duration",
|
||||
"skeldO2Duration": "Skeld O2 Duration",
|
||||
"miraReactorDuration": "Mira Reactor Duration",
|
||||
"miraO2Duration": "Mira O2 Duration",
|
||||
"polusReactorDuration": "Polus Reactor Duration",
|
||||
"airshipReactorDuration": "Airship Reactor Duration",
|
||||
"fungleReactorDuration": "Fungle Reactor Duration",
|
||||
"fungleMushroomMixupDuration": "Fungle Mixup Duration",
|
||||
|
||||
"tabGroupSpeedrun": "Спидран",
|
||||
"speedrunSettingsOverride": "Автоматически Обновлять Настройки",
|
||||
"gameAutoEndsAfter": "Игра автоматически заканчивается после",
|
||||
@@ -337,10 +350,21 @@
|
||||
"automaticAllMapPoll": "Автоматический /allmapvote После Перезахода",
|
||||
"timeBeforeMapPoll": "Время До Начала Голосования За Карты",
|
||||
|
||||
"pnsDisableSabotage": "Disable PnS Critical Sabotages",
|
||||
"pnsDisableCloseDoor": "Disable PnS Door Sabotages",
|
||||
"tabGroupPNS": "Poof and Seek",
|
||||
"badMoveTimeToSuicide": "Phantom Suicides After Visibly Moving For",
|
||||
"snsImpostorCanVent": "Impostors can vent"
|
||||
"pnsDisableSabotage": "Выключить Критические Саботажи В Режиме Фантомные Прятки",
|
||||
"pnsDisableCloseDoor": "Выключить Саботажи Дверей В Режиме Фантомные Прятки",
|
||||
"tabGroupPNS": "Фантомные Прятки",
|
||||
"badMoveTimeToSuicide": "Файнтомы Самоубиваются После Видимого Движения После",
|
||||
"snsImpostorCanVent": "Предатели Могут Уходить в Люк",
|
||||
"pnsDesc": "Отправляет Информацию о Режиме Фантомных Прятках.",
|
||||
"modeVoteDuration": "Врямя Голосования За Режим",
|
||||
"snsChatInGameExtendTwo": "Отправить увеличенную инфо после начала игры",
|
||||
"snsChatInGameFast": "Быстрые Собрания (экспериментальное+)",
|
||||
"shieldFirstDeath": "Защищать Игрока Который Умер Первым",
|
||||
"shieldFirstDeathDuration": "Длительность Щита",
|
||||
"snsTwoDesc": "Отправить Увеличенное Описание Клона.",
|
||||
"modeVoteDesc": "Начать Голосование между всеми режимами.",
|
||||
"automaticModePoll": "Автоматический /gmvote После Перезахода",
|
||||
|
||||
"privateDesc": "Changes lobby visibility to private.",
|
||||
"publicDesc": "Changes lobby visibility to public."
|
||||
}
|
||||
@@ -76,6 +76,19 @@
|
||||
"snsDisableHeli": "禁用坠机危机破坏",
|
||||
"snsDisableMushroomMixup": "禁用迷幻蘑菇破坏",
|
||||
"snsDisableCloseDoor": "禁用 SnS 关门破坏",
|
||||
|
||||
"tabGroupCustomizeSabotages": "Customize Sabotages",
|
||||
"customizeSabotages": "Enable Sabotage Customizations",
|
||||
"sabotageCooldown": "Critical Sabotage Cooldown",
|
||||
"skeldReactorDuration": "Skeld Reactor Duration",
|
||||
"skeldO2Duration": "Skeld O2 Duration",
|
||||
"miraReactorDuration": "Mira Reactor Duration",
|
||||
"miraO2Duration": "Mira O2 Duration",
|
||||
"polusReactorDuration": "Polus Reactor Duration",
|
||||
"airshipReactorDuration": "Airship Reactor Duration",
|
||||
"fungleReactorDuration": "Fungle Reactor Duration",
|
||||
"fungleMushroomMixupDuration": "Fungle Mixup Duration",
|
||||
|
||||
"tabGroupSpeedrun": "速通模式 (Speedrun)",
|
||||
"speedrunSettingsOverride": "自动更新设置",
|
||||
"gameAutoEndsAfter": "游戏在此时间后自动结束",
|
||||
@@ -323,10 +336,21 @@
|
||||
"automaticMapPoll": "重新加入后自发起起 /mapvote",
|
||||
"automaticAllMapPoll": "重新加入后自动发起 /allmapvote",
|
||||
"timeBeforeMapPoll": "投票开始前等待時間",
|
||||
"pnsDesc": "发送 Poof and Seek 幻象与躲藏 游戏模式说明。",
|
||||
"pnsDisableSabotage": "禁用 PnS 紧急破坏。",
|
||||
"pnsDisableCloseDoor": "禁用 PnS 关门破坏。",
|
||||
"tabGroupPNS": "Poof and Seek",
|
||||
"badMoveTimeToSuicide": "幻象师在明显移动后自杀的时间。",
|
||||
"snsImpostorCanVent": "内鬼可以使用通风管。",
|
||||
"modeVoteDuration": "游戏模式投票时长",
|
||||
"snsChatInGameExtendTwo": "游戏开始后发送扩展信息",
|
||||
"snsChatInGameFast": "快速会议(实验性+)",
|
||||
"shieldFirstDeath": "护盾保护第一个死亡的玩家",
|
||||
"shieldFirstDeathDuration": "护盾持续时间",
|
||||
"snsTwoDesc": "发送 Shift and Seek 扩展说明。",
|
||||
"modeVoteDesc": "在所有游戏模式之间发起投票。",
|
||||
"automaticModePoll": "重新加入后自动执行 /gmvote",
|
||||
|
||||
"pnsDisableSabotage": "Disable PnS Critical Sabotages",
|
||||
"pnsDisableCloseDoor": "Disable PnS Door Sabotages",
|
||||
"tabGroupPNS": "Poof and Seek",
|
||||
"badMoveTimeToSuicide": "Phantom Suicides After Visibly Moving For",
|
||||
"snsImpostorCanVent": "Impostors can vent"
|
||||
"privateDesc": "Changes lobby visibility to private.",
|
||||
"publicDesc": "Changes lobby visibility to public."
|
||||
}
|
||||
@@ -94,6 +94,19 @@
|
||||
"snsDisableHeli": "Desactivar sabotaje de Crash Course",
|
||||
"snsDisableMushroomMixup": "Desactivar sabotaje de mezcla de hongos",
|
||||
"snsDisableCloseDoor": "Desactivar sabotajes de puertas de SnS",
|
||||
|
||||
"tabGroupCustomizeSabotages": "Customize Sabotages",
|
||||
"customizeSabotages": "Enable Sabotage Customizations",
|
||||
"sabotageCooldown": "Critical Sabotage Cooldown",
|
||||
"skeldReactorDuration": "Skeld Reactor Duration",
|
||||
"skeldO2Duration": "Skeld O2 Duration",
|
||||
"miraReactorDuration": "Mira Reactor Duration",
|
||||
"miraO2Duration": "Mira O2 Duration",
|
||||
"polusReactorDuration": "Polus Reactor Duration",
|
||||
"airshipReactorDuration": "Airship Reactor Duration",
|
||||
"fungleReactorDuration": "Fungle Reactor Duration",
|
||||
"fungleMushroomMixupDuration": "Fungle Mixup Duration",
|
||||
|
||||
"tabGroupSpeedrun": "Speedrun",
|
||||
"speedrunSettingsOverride": "Actualizar configuración automáticamente",
|
||||
"gameAutoEndsAfter": "La partida termina automáticamente después de",
|
||||
@@ -294,10 +307,20 @@
|
||||
"moderatorAndAbove": "<color=purple>Moderador</color> o superior",
|
||||
"admin": "<color=red>Administrador</color>",
|
||||
"onlyYou": "Solo tú",
|
||||
|
||||
"pnsDisableSabotage": "Disable PnS Critical Sabotages",
|
||||
"pnsDisableCloseDoor": "Disable PnS Door Sabotages",
|
||||
"pnsDisableSabotage": "Desactivar sabotajes críticos de PnS",
|
||||
"pnsDisableCloseDoor": "Desactivar sabotajes de puertas de PnS",
|
||||
"tabGroupPNS": "Poof and Seek",
|
||||
"badMoveTimeToSuicide": "Phantom Suicides After Visibly Moving For",
|
||||
"snsImpostorCanVent": "Impostors can vent"
|
||||
"badMoveTimeToSuicide": "El Fantasma se suicida después de moverse visiblemente durante",
|
||||
"snsImpostorCanVent": "Los impostores pueden usar conductos",
|
||||
"modeVoteDuration": "Duración de la votación de modo de juego",
|
||||
"snsChatInGameExtendTwo": "Enviar información ampliada al iniciar la partida",
|
||||
"snsChatInGameFast": "Reunión más rápida (experimental+)",
|
||||
"shieldFirstDeath": " Proteger al primer jugador que murió",
|
||||
"shieldFirstDeathDuration": "Duración de la protección",
|
||||
"snsTwoDesc": "Enviar la descripción ampliada de Shift and Seek.",
|
||||
"modeVoteDesc": "Inicia una votación entre todos los modos de juego.",
|
||||
"automaticModePoll": "/gmvote automático al volver a la sala",
|
||||
|
||||
"privateDesc": "Changes lobby visibility to private.",
|
||||
"publicDesc": "Changes lobby visibility to public."
|
||||
}
|
||||
Reference in new issue
Block a user