diff --git a/CTA/CustomTeamAssigner/CustomRoles.cs b/CTA/CustomTeamAssigner/CustomRoles.cs
index ad4eaee44..d85a22d65 100644
--- a/CTA/CustomTeamAssigner/CustomRoles.cs
+++ b/CTA/CustomTeamAssigner/CustomRoles.cs
@@ -58,6 +58,7 @@ public enum CustomRoles
EvilTracker,
Exclusionary,
Fabricator,
+ Fakeshifter,
Fireworker,
Forger,
Framer,
@@ -251,6 +252,7 @@ public enum CustomRoles
Rhapsode,
Ricochet,
Safeguard,
+ Scanner,
Scout,
SecurityGuard,
Sensor,
@@ -279,6 +281,7 @@ public enum CustomRoles
Tracefinder,
Tree,
Tunneler,
+ Unshifter,
Vacuum,
Ventguard,
Veteran,
diff --git a/CustomRoles.cs b/CustomRoles.cs
index ad4eaee44..d85a22d65 100644
--- a/CustomRoles.cs
+++ b/CustomRoles.cs
@@ -58,6 +58,7 @@ public enum CustomRoles
EvilTracker,
Exclusionary,
Fabricator,
+ Fakeshifter,
Fireworker,
Forger,
Framer,
@@ -251,6 +252,7 @@ public enum CustomRoles
Rhapsode,
Ricochet,
Safeguard,
+ Scanner,
Scout,
SecurityGuard,
Sensor,
@@ -279,6 +281,7 @@ public enum CustomRoles
Tracefinder,
Tree,
Tunneler,
+ Unshifter,
Vacuum,
Ventguard,
Veteran,
diff --git a/Main.cs b/Main.cs
index c03f64734..1679fa999 100644
--- a/Main.cs
+++ b/Main.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
@@ -496,6 +496,8 @@ public class Main : BasePlugin
{ CustomRoles.TimeMaster, "#44baff" },
{ CustomRoles.Crusader, "#C65C39" },
{ CustomRoles.Speedrunner, "#800080" },
+ { CustomRoles.Unshifter, "#00b4eb" },
+ { CustomRoles.Scanner, "#42f5a7" },
// Neutrals
{ CustomRoles.Arsonist, "#ff6633" },
{ CustomRoles.Pyromaniac, "#ff6633" },
diff --git a/Modules/CustomRolesHelper.cs b/Modules/CustomRolesHelper.cs
index e636d728a..78406c8f6 100644
--- a/Modules/CustomRolesHelper.cs
+++ b/Modules/CustomRolesHelper.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
@@ -365,6 +365,9 @@ internal static class CustomRolesHelper
CustomRoles.Lurker => CustomRoles.Impostor,
CustomRoles.Doomsayer => CustomRoles.Crewmate,
CustomRoles.Godfather => CustomRoles.Impostor,
+ CustomRoles.Unshifter => CustomRoles.Impostor,
+ CustomRoles.Scanner => CustomRoles.Phantom,
+ CustomRoles.Fakeshifter => CustomRoles.Shapeshifter,
CustomRoles.Silencer => Silencer.SilenceMode.GetValue() switch
{
0 => CustomRoles.Impostor,
@@ -484,6 +487,8 @@ internal static class CustomRolesHelper
CustomRoles.Deputy => UsePets && Deputy.UsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
CustomRoles.Bestower => UsePets && Bestower.UsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
CustomRoles.Retributionist => UsePets && Retributionist.UsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
+ CustomRoles.Unshifter => RoleTypes.Impostor,
+ CustomRoles.Scanner => RoleTypes.Phantom,
CustomRoles.Arsonist => RoleTypes.Impostor,
CustomRoles.Jackal => RoleTypes.Impostor,
CustomRoles.Medusa => RoleTypes.Impostor,
@@ -825,7 +830,8 @@ internal static class CustomRolesHelper
CustomRoles.Devourer or
CustomRoles.Camouflager or
CustomRoles.Twister or
- CustomRoles.Lurker;
+ CustomRoles.Lurker or
+ CustomRoles.Fakeshifter;
}
public static bool IsNeutral(this CustomRoles role, bool check = false)
diff --git a/Modules/ExtendedPlayerControl.cs b/Modules/ExtendedPlayerControl.cs
index fe481bdf2..b8b77b47c 100644
--- a/Modules/ExtendedPlayerControl.cs
+++ b/Modules/ExtendedPlayerControl.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
@@ -703,6 +703,23 @@ internal static class ExtendedPlayerControl
if (!forced) Logger.Info($"{player.GetNameWithRole()}'s role basis was changed to {newRoleType} ({newCustomRole}) (from role: {playerRole}) - oldRoleIsDesync: {oldRoleIsDesync}, newRoleIsDesync: {newRoleIsDesync}", "RpcChangeRoleBasis");
}
+ public static void RpcShapeshiftDesync(this PlayerControl shapeshifter, PlayerControl target, PlayerControl seer, bool animate)
+ {
+ if (shapeshifter == null || target == null || seer == null) return;
+
+ int clientId = seer.OwnerId;
+
+ if (AmongUsClient.Instance.ClientId == clientId)
+ {
+ shapeshifter.Shapeshift(target, animate);
+ return;
+ }
+
+ MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(shapeshifter.NetId, (byte)RpcCalls.Shapeshift, SendOption.Reliable, clientId);
+ writer.WriteNetObject(target);
+ writer.Write(animate);
+ AmongUsClient.Instance.FinishRpcImmediately(writer);
+ }
// https://github.com/Ultradragon005/TownofHost-Enhanced/blob/ea5f1e8ea87e6c19466231c305d6d36d511d5b2d/Modules/Utils.cs
public static bool SyncGeneralOptions(this CustomRpcSender sender, PlayerControl player)
diff --git a/Modules/Translator.cs b/Modules/Translator.cs
index aeb5b61b0..4d917d746 100644
--- a/Modules/Translator.cs
+++ b/Modules/Translator.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
diff --git a/Patches/PlayerControlPatch.cs b/Patches/PlayerControlPatch.cs
index 3a622450f..aa1c1247e 100644
--- a/Patches/PlayerControlPatch.cs
+++ b/Patches/PlayerControlPatch.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Linq;
using AmongUs.GameOptions;
@@ -812,7 +812,14 @@ internal static class CheckShapeshiftPatch
{
public static bool Prefix(PlayerControl __instance, [HarmonyArgument(0)] PlayerControl target /*, [HarmonyArgument(1)] bool shouldAnimate*/)
{
- return ShapeshiftPatch.ProcessShapeshift(__instance, target); // return false to cancel the shapeshift
+ if (ShapeshiftPatch.ProcessShapeshift(__instance, target))
+ {
+ bool animated = !Options.DisableShapeshiftAnimations.GetBool()
+ && !Options.DisableAllShapeshiftAnimations.GetBool()
+ && !__instance.GetCustomRole().IsNoAnimationShifter();
+ __instance.RpcShapeshift(target, animated);
+ }
+ return false;
}
}
@@ -937,6 +944,21 @@ internal static class ShapeshiftPatch
{
if (!Main.ProcessShapeshifts || !GameStates.IsInTask || __instance == null || target == null) return;
+ bool animated = !Options.DisableShapeshiftAnimations.GetBool()
+ && !Options.DisableAllShapeshiftAnimations.GetBool()
+ && !__instance.GetCustomRole().IsNoAnimationShifter();
+
+ float ssTimer = animated ? 1.2f : 0.5f;
+
+ LateTask.New(() =>
+ {
+ if (AmongUsClient.Instance.AmHost)
+ {
+ __instance.RpcSetName(Main.AllPlayerNames[target.PlayerId]);
+ NotifyRoles(NoCache: true);
+ }
+ }, ssTimer, "PlayerControl.Shapeshift Prefix Patch - Force Name");
+
bool shapeshifting = __instance.PlayerId != target.PlayerId;
foreach (PlayerControl pc in Main.EnumerateAlivePlayerControls())
diff --git a/Resources/Lang/ar_SA.json b/Resources/Lang/ar_SA.jsonc
similarity index 100%
rename from Resources/Lang/ar_SA.json
rename to Resources/Lang/ar_SA.jsonc
diff --git a/Resources/Lang/be_BY.json b/Resources/Lang/be_BY.jsonc
similarity index 100%
rename from Resources/Lang/be_BY.json
rename to Resources/Lang/be_BY.jsonc
diff --git a/Resources/Lang/cs_CZ.json b/Resources/Lang/cs_CZ.jsonc
similarity index 100%
rename from Resources/Lang/cs_CZ.json
rename to Resources/Lang/cs_CZ.jsonc
diff --git a/Resources/Lang/de_DE.json b/Resources/Lang/de_DE.jsonc
similarity index 100%
rename from Resources/Lang/de_DE.json
rename to Resources/Lang/de_DE.jsonc
diff --git a/Resources/Lang/en_US.jsonc b/Resources/Lang/en_US.jsonc
index 2ed81fed2..8f62151b0 100644
--- a/Resources/Lang/en_US.jsonc
+++ b/Resources/Lang/en_US.jsonc
@@ -1,4 +1,4 @@
-{
+{
/* ==============================
CORE & FREQUENTLY USED STRINGS
============================== */
@@ -1279,6 +1279,15 @@
"SafeguardInfoLong": "(Crewmates):\\nAs the Safeguard, you get a temporary shield with each task you complete.",
"SafeguardSuffix": "<#00ffa5>You're shielded",
"SafeguardSuffixTimer": "<#00ffa5>You're shielded for {0}s",
+ "Scanner": "Scanner",
+ "ScannerInfo": "Scan for Invisble Players and Make them Visible Again",
+ "ScannerInfoLong": "(Crewmates)\nAs the Scanner, Vanish to activate your ability. If any invisible player stays near you by a certain amount of time, they become visible again.",
+ "ScannerCooldown": "Ability Cooldown",
+ "ScannerDuration": "Ability Duration",
+ "ScannerAbilityRange": "Ability Range",
+ "ScannerTimeLimit": "Time Limit for invisible players on range to appear",
+ "ScannerWarningInRange": "A Scanner is near you! If you don't get away in {0}s, you will become visible again!",
+ "ScannerNowVisible": "The Scanner has made you visible again!",
"ScientistEHR": "Scientist",
"ScientistEHRInfo": "Access portable vitals from anywhere",
"ScientistEHRInfoLong": "(Crewmates):\\nAs the Scientist, you have a portable tablet with the crew's vitals on it. Use this any way you'd like. Catching self-reports, extra intel on body age, etc.",
@@ -1513,6 +1522,15 @@
"TunnelerInfoLong": "(Crewmates):\\nAs the Tunneler, you may mark a position by petting, and then you can teleport back to the marked position by petting again.",
"UndercoverInfo": "Impostors see you as their partner",
"UndercoverInfoLong": "(Crewmates):\\nThe Impostors knows who Undercover is and sees him as a teammate, but Undercover himself does not know who the Impostors are.",
+ "Unshifter": "Unshifter",
+ "UnshifterInfo": "Unshift Shapeshifted Players",
+ "UnshifterInfoLong": "(Crewmates)\nAs the Unshifter(Credits to Dechis), you may use your kill button on someone to unshift them if they are shapeshifted. Using the kill button in Non-Shifted players does nothing but a message. Depending on settings, the target may receive a notification.",
+ "UnshifterCooldown": "Unshift Cooldown",
+ "UnshifterUseLimit": "Maximum Unshift Attempts",
+ "UnshifterTargetKnows": "Target Knows they're being unshifted",
+ "UnshifterTargetNotShifted": "Target is not Shapeshifted.",
+ "UnshifterSuccess": "Target was Shapeshifted! Unshift successful!",
+ "UnshifterTargetNotify": "You've been unshifted by an Unshifter!",
"Vacuum": "Vacuum",
"VacuumInfo": "Suck In Dead Bodies",
"VacuumInfoLong": "(Crewmates):\\nAs the Vacuum, while using your ability, all kills' bodies will teleport to you.",
@@ -1826,6 +1844,10 @@
"FabricatorInfoLong": "(Impostors):\\nAs the Fabricator, you can use /cmd fabricate {deathreason} to set the death reason for your next kill. Replace '{deathreason}' with one of the available death reasons in the mod.",
"Fabricator.InvalidDeathReason": "<#ff5555>X <#bb0000>Invalid death reason '<#ffffff>{0}'!",
"Fabricator.SetDeathReason": "<#00ff00>✓ <#00bb00>Your next kill will have the death reason: <#ffffff>{0}",
+ "Fakeshifter": "Fakeshifter",
+ "FakeshifterInfo": "Make a Player Fake-Shapeshift",
+ "FakeshifterInfoLong": "(Impostors):\nAs the Fakeshifter, you can use your shapeshift menu to mark a player. That player will appear for everyone, except themselves, as a random player. After some time, that same player will shapeshift back to their original appearance, and play the egg animation for everyone.",
+ "FakeshifterAbilityDuration": "Delay for the target to shapeshift back",
"Fireworker": "Fireworker",
"FireworkerInfo": "Go out with a BANG",
"FireworkerInfoLong": "(Impostors):\\nAs a Fireworker, you can plant up to three firework bombs using vanish/by petting. If you're the last impostor standing, you can use vanish/pet to detonate the bombs and cause area damage. But be careful, the bombs can also harm you. If the bombs eliminate all surviving players, it's a victory for the impostors.",
@@ -4390,7 +4412,7 @@
"HotPotato_Time": "The Holder of the Hot Potato is Killed Every",
"HotPotato_TimeLeftSuffix": "<#00ffa5>Kill in ",
// King Of The Zones - KOTZ
- "KingOfTheZones": "KING OF THE ZONES",
+ "KingOfTheZones": "KING OF THE ZONES",
"ModeKingOfTheZones": "Gamemode: King Of The Zones",
"ModeDescribe.KingOfTheZones": "In the King Of The Zones gamemode, players are split into teams. Some rooms on the map represent a zone. If a team has more players in a room than all other teams, they control the zone. Every second, each team gets 1 point for each zone controlled. Gain as many points as possible, since the team with the highest score wins!\\n\\nPlayers can tag others using the kill button. Tagged players are teleported outside of the map for a few seconds, then teleport back.\\n\\nDepending on the settings, zones may move during the game. If so, this will be indicated by a timer. When a zone moves, it may have a downtime. This is the case if the timer is gray.",
"KOTZ.EndScreen.Statistics": "Points: <#ffff44>{0}",
@@ -4510,7 +4532,7 @@
"Quiz.Tutorial.Basics": "The current game mode is <#CF2472>Quiz.\\nYou'll get questions, each with 5 choices: A, B, C, D, E.\\nYou must answer the questions correctly within the time limit\\nby entering the room corresponding to the correct answer.\\nThe rooms on this map are:\\n{0}",
"Quiz.Tutorial.OnCorrectAnswer": "If you answer <#00ff00>correctly, you get to survive.",
"Quiz.Tutorial.OnWrongAnswer": "If you answer <#ff0000>incorrectly, you will most likely die.",
- "Quiz.Tutorial.TestRound": "We'll play a test round to show you how it works.",
+ "Quiz.Tutorial.TestRound": "We'll play a test round to show you how it works.",
"Quiz.Questions.Test.0": "Which map are we on?",
"Quiz.Questions.Test.0.Answer.A": "The Skeld/dlekS ehT",
"Quiz.Questions.Test.0.Answer.B": "Mira HQ",
@@ -8481,7 +8503,7 @@
"AirshipAdditionalSpawn": "Additional Spawn Locations (Airship)",
"AirshipReactorTimeLimit": "Airship Reactor Time Limit",
"AirshipVariableElectrical": "Variable Electrical (Airship)",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"AllAliveMeeting": "Meeting When No One is Dead",
@@ -8490,20 +8512,20 @@
-/* ==============================
+ /* ==============================
General Settings
============================== */
"ArrowDelayMax": "Maximum Arrow show-up delay",
"ArrowDelayMin": "Minimum Arrow show-up delay",
-
+
/* ==============================
General Settings
============================== */
"AutoFactionMinMaxSettings.Applied": "[Auto Team Sizes] {0} players (>={1}) = {2} (<#ffff00>NNK: <#ffffff>{3}-{4})",
"AutoFactionMinMaxSettings.PlayerCap": "Minimum Player Threshold for These Settings to Apply (0 = unused)",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"AutoPlayAgainCountdown": "Delay before Auto Re-Entering Lobby",
@@ -8512,7 +8534,7 @@
"AutoStartTimer": "Initial Countdown for auto-starting",
"BKProtectDuration": "Protection Duration",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"BMAE.AfterMeeting": "After Meeting",
@@ -8527,30 +8549,30 @@
"BlackHolePlaceCooldown": "Black Hole Place Cooldown",
"BlackHoleRadius": "Black Hole Consuming Radius",
-/* ==============================
+ /* ==============================
Notifications and Messages
============================== */
"BlackScreenFixCompleteNotify": "<#00ff00>Black Screen Fix Code Executed",
"BlackmailedSuffix": "<#ffa500>BLACKMAILED",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"BlockDisturbancesToSwitches": "Block Switches When They Are Up",
"BlockVentMovement": "Block Movement Between Vents (while in a vent)",
-/* ==============================
+ /* ==============================
Cooldowns and Timers
============================== */
"BombCooldown": "Bomb Cooldown",
"BombExplodeCooldown": "Bomb explode cooldown",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"CL.Enabled": "Enabled",
-/* ==============================
+ /* ==============================
Custom Team Alliances
============================== */
"CustomTeamHelp": "You are in the {0}! ({1})\\nWork with your team members to win together!",
@@ -8580,7 +8602,7 @@
"CamerasAndAdmin": "Cameras & Admin",
"CamerasDisabledNotify": "Cameras are globally disabled by the host",
-/* ==============================
+ /* ==============================
Camouflage
============================== */
"CamouflageCooldown": "Camouflage Cooldown",
@@ -8591,12 +8613,12 @@
"CamouflageMode.Karpe": "KARPED1EM",
"CamouflageMode.TommyXL": "TommyXL",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"CanBeGuessed": "Can Be Guessed",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"CanBeInLove": "Can be in love",
@@ -8605,7 +8627,7 @@
"CanCountNeutralKiller": "When Crewmates win by killing a Neutral player, they can snatch the victory",
"CanGetImpostorOnlyAddons": "Can get <#ff1919>Impostor-only add-ons",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"CanGuess": "Can Guess in Guesser Mode",
@@ -8613,7 +8635,7 @@
"CanGuessDuringDiscussionTime": "Guessers Can Guess During Discussion Time",
"CanGuessTarget": "Can Guess their Target",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"CanHandcuffSheriff": "Can Handcuff Sheriff",
@@ -8629,28 +8651,28 @@
"CanNotTrialJailed": "You can not trial the target.",
"CanNotTrialProtected": "You can not trial protected players.",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"CanOnlyUseWhileAnyWatch": "Can Only Use Ability When There is a Device Usage Alert",
"CanPickPartnerRole": "Can Pick Roles that Already Exist in the Game",
-/* ==============================
+ /* ==============================
Sabotage Settings
============================== */
"CanSabotage": "Can Sabotage",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"CanShapeshift": "Can Shapeshift",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"CanSwapSelfVotes": "Swapper Can Swap Themselves",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"CanTargetCoven": "Can target Coven",
@@ -8660,24 +8682,24 @@
"CantGuessJailed": "You can not guess the target",
-/* ==============================
+ /* ==============================
Sabotage Settings
============================== */
"CanUseSabotage": "Can Sabotage",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"CanVent": "Can Vent",
"CanVentAfterNecronomicon": "Can Vent <#00ffff>After Receiving The <#7b3fbb>Necronomicon",
"CanVentBeforeNecronomicon": "Can Vent <#00a5ff>Before Receiving The <#7b3fbb>Necronomicon",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"CanVote": "Can Vote",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"CanWinAfterDeath": "Can win after death",
@@ -8685,12 +8707,12 @@
"CancelSwap1": "First Swap Target Cancelled",
"CancelSwap2": "Second Swap Target Cancelled",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"CannotCallEmergencyMeetingWhileSabotage": "Emergency meetings cannot be called during crisis",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"CannotCleanWhenKCDIsntUp": "Cannot Clean Bodies When Kill Cooldown Isn't Up",
@@ -8699,7 +8721,7 @@
-/* ==============================
+ /* ==============================
General Settings
============================== */
"CantSwapSelf": "You can't swap yourself",
@@ -8707,24 +8729,24 @@
"CantUse.lastresult": "Unable to use /lastresult during a game.",
"CantUse.lastroles": "Unable to use /lastroles during a game.",
-/* ==============================
+ /* ==============================
Teams / Alignments
============================== */
"ChanceOfSeeingAllAlignmentsOnStart": "Chance Of Seeing All Alignments On Game Start",
-/* ==============================
+ /* ==============================
Cooldowns and Timers
============================== */
"ChargeInterval": "Charge Percentage Gained Each Second When Kill Cooldown Is Up",
"ChargeLossInterval": "Charge Percentage Lost Each Second While Killing",
-/* ==============================
+ /* ==============================
EAC
============================== */
"CheatResponses": "When a cheating player is found",
-/* ==============================
+ /* ==============================
Combos
============================== */
"ComboAdd": "{0} and {1} will now always spawn together.",
@@ -9153,27 +9175,27 @@
"ConfirmEjectionsMode": "Confirm Ejections Mode",
"ConfirmLoversOnEject": "Confirm Lovers on ejection",
-/* ==============================
+ /* ==============================
Cooldowns and Timers
============================== */
"ControlCooldown": "Control Cooldown",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"ConvertedAddonCanBeGuessed": "{role} can be guessed",
-/* ==============================
+ /* ==============================
Cooldowns and Timers
============================== */
"CooldownsResetEachOther": "Ability Cooldown and Kill Cooldown Reset Each Other",
-/* ==============================
+ /* ==============================
Sabotage Settings
============================== */
"CopyCrewVarEvenIfDisabled": "Can copy the crew variant even if that role is disabled",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"CountdownText": "Re-Entering Lobby in {0}s",
@@ -9181,13 +9203,13 @@
"CovenCanBeRole": "Coven can become {role}",
"CovenCanFindMarshall": "Reveal to <#7b3fbb>Coven",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"CovenCanGuess": "Coven can guess",
"CovenReceiveNecronomiconAfterNumMeetings": "Number of Meetings after which the Coven will start receiving the Necronomicon",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"CrewCanBeEgoist": "Crewmates can become Egoist",
@@ -9199,17 +9221,17 @@
"CrewmatesCanGuess": "Crewmates can guess",
"CurrentActiveSettingsHelp": "Current Active Settings Help",
-/* ==============================
+ /* ==============================
Cooldowns and Timers
============================== */
"CurseCooldown": "Curse Cooldown",
-/* ==============================
+ /* ==============================
Sabotage Settings
============================== */
"CustomSabotage.GrabOxygenMask": "Grab Oxygen Mask",
"CustomSabotage.GrabOxygenMask.Done": "<#00ff00>Oxygen Mask Grabbed! You are safe.",
-/* ==============================
+ /* ==============================
Notifications and Messages
============================== */
"DCNotify.Auth": "You are not authenticated.\\n\\nYou may need to restart your game.",
@@ -9225,7 +9247,7 @@
"DCNotify.InvalidSettings": "Game settings have been detected to be invalid.\\n\\nEnter local play to reset them, then try again.",
"DCNotify.Kicked": "You were kicked from this lobby.\\n\\nYou may still rejoin.",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"DCanGuessAdt": "Can Guess Add-Ons",
@@ -9236,24 +9258,24 @@
"DGRM.OnMeeting": "On Meeting",
-
+
/* ==============================
Cooldowns and Timers
============================== */
"DGResetMode": "Skin Reset Mode",
"DGResetTimer": "If Resetting Skin by Timer, Reset Skin After",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"DIYGameSettings": "Enable only custom /n messages",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"DeactivationAfterMeeting": "After Meeting",
-/* ==============================
+ /* ==============================
Sabotage Settings
============================== */
"DeadCrewCantSabotage": "Crewmates can't sabotage after they've died",
@@ -9334,7 +9356,7 @@
"DebugMode": "Debug Mode",
-/* ==============================
+ /* ==============================
Maps
============================== */
"DecontaminationDoorOpenTimeOnMiraHQ": "Decontamination Door Open Time On MIRA HQ",
@@ -9342,29 +9364,29 @@
"DecontaminationTimeOnMiraHQ": "Decontamination Time On MIRA HQ",
"DecontaminationTimeOnPolus": "Decontamination Time On Polus",
-/* ==============================
+ /* ==============================
Cooldowns and Timers
============================== */
"DecreasedKillCooldown": "Decreased Kill Cooldown",
"DefaultShapeshiftCooldown": "Default Shapeshift Cooldown",
"DeliverCooldown": "Deliver Cooldown",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"DetectiveSuspectLimit": "Suspects Per Case",
-/* ==============================
+ /* ==============================
Cooldowns and Timers
============================== */
"DevourCooldown": "Devour Cooldown",
-/* ==============================
+ /* ==============================
Notifications and Messages
============================== */
"DiedR1Warning": "<#ffff00>(Died First in Last Game)",
-/* ==============================
+ /* ==============================
Task Settings
============================== */
"Disable8ballCommand": "Disable /8ball command",
@@ -9513,45 +9535,45 @@
"DisabledByProgram": "Public rooms have been disabled by the program",
"DisabledBySettings": "Disabled by Settings",
-/* ==============================
+ /* ==============================
Maps
============================== */
"DoesntSpawnOnFungle": "Doesn't Spawn When the Map is Fungle",
"DoorsResetMode": "Mode",
-/* ==============================
+ /* ==============================
Task Settings
============================== */
"DoYourTasksPlease": "Please do your tasks!",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"DualVotes": "Duplicate votes",
-/* ==============================
+ /* ==============================
Task Settings
============================== */
"DynamicTaskCountColor": "Dynamic Task Count Color",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"E2Block": "Block Erase",
-/* ==============================
+ /* ==============================
EAC
============================== */
"EAC.CheatDetected.EAC": "Cheating usage detected (Using AUM)",
"EAC.CheatDetected.HighLevel": "Warning: EAC detected High Level of cheats.",
"EAC.CheatDetected.LowLevel": "Warning: EAC detected Low Level of cheats. One of the players is hacking.",
-/* ==============================
+ /* ==============================
Teams / Alignments
============================== */
"ECMO.OriginalTeam": "Original Team",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"EGCanGuessAdt": "Can Guess Add-Ons",
@@ -9609,17 +9631,17 @@
"UnsupportedVersion": "Unsupported Among Us version.\\nPlease update Among Us.",
"downloadFailed": "Failed to upload file! \\nPlease try again later or restart the game...",
"updateFailed": "Update failed.",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"EVote": "Vote",
-/* ==============================
+ /* ==============================
Sabotage Settings
============================== */
"EightBallDisabled": "<#ff0000>X The /8ball command is disabled in this lobby.",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"EnableAFKDetector": "Enable AFK Detector (Also Used To Detect And Fix Black Screens)",
@@ -9638,25 +9660,25 @@
"EnableSpurtCharge": "Display The Charge",
"EnabledGMWarning": "You have enabled Game Master. This will make you a ghost at the start of every game.",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"EnterVentWinCountDown": "Enter vent within {0} seconds to win!",
"EnteredBlockedVent": "This vent is blocked by the Ventguard",
"EraseLimit": "Max Erases",
-
-
-/* ==============================
+
+
+ /* ==============================
Cooldowns and Timers
============================== */
"EvenKillCooldown": "Even-Numbered kill cooldown",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"EveryoneCanVent": "Everyone Can Vent",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"ExiledExeTarget": "{0} was {1}.\\nBut they were also the Executioner's target!\\nGG!",
@@ -9665,19 +9687,19 @@
"ExiledInnocentTargetInOneLine": "{0} was {1}.\\nBut looking back, there's the Innocent counting the money in their hands....\\nGG!",
"ExiledJester": "You're all fools!\\n{0} the {1} laughing out loud tricked you into ejecting them.\\nGG!",
-/* ==============================
+ /* ==============================
Maps
============================== */
"ExtraKillCooldownOnAirship": "Extra Kill Cooldown on Airship",
"ExtraKillCooldownOnFungle": "Extra Kill Cooldown on Fungle",
"ExtraKillCooldownOnPolus": "Extra Kill Cooldown on Polus",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"ExtraVotesPT": "<#00a5ff>(<#00ffff>+<#00ffa5>{0} votes)",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"FactionLimits.Coven.Max": "<#00a5ff>Maximum <#ffffff>amount of Coven Roles",
@@ -9687,39 +9709,39 @@
"FactionLimits.Neutral.Max": "<#00a5ff>Maximum <#ffffff>amount of Neutral Roles",
"FactionLimits.Neutral.Min": "<#00ffa5>Minimum <#ffffff>amount of Neutral Roles",
-/* ==============================
+ /* ==============================
Task Settings
============================== */
"FakeTask": "Fake Tasks:",
-/* ==============================
+ /* ==============================
AFK Detector
============================== */
"FixBlackScreenWaitForDead": "Everyone is alive, and the black screen fix requires a ghost, so it will wait until someone dies.",
-/* ==============================
+ /* ==============================
Cooldowns and Timers
============================== */
"FixFirstKillCooldown": "Reset First Kill Cooldown",
-/* ==============================
+ /* ==============================
Cooldowns and Timers
============================== */
"FreezeCooldown": "Freeze Cooldown",
"FreezeDuration": "Freeze Duration",
-/* ==============================
+ /* ==============================
Maps
============================== */
"FungleMushroomMixupDuration": "The Fungle Mushroom Mixup Duration",
-/* ==============================
+ /* ==============================
Sabotage Settings
============================== */
"FungleReactorTimeLimit": "The Fungle Reactor Time Limit",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"GCanGuessAdt": "Can guess Add-ons",
@@ -9730,7 +9752,7 @@
"GGCanGuessCrew": "Can Guess Crewmate Roles",
"GGGuessMax": "You've reached the limit of maximum guesses, you can't guess anymore!",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"GSInfo.ConvertedCount": "<#ffab1b>Converted Players (excluding <#ff1919>Madmates): {0}",
@@ -9738,29 +9760,29 @@
"GSInfo.CrewCount": "<#8cffff>Crewmates: {0}",
"GSInfo.ImpCount": "<#ff1919>Impostors: {0}",
-/* ==============================
+ /* ==============================
Lovers
============================== */
"GSInfo.LoversState": "Number of <#ff9ace>Lovers Alive: {0}",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"GSInfo.MadmateCount": "<#ff1919>Madmates: {0}",
"GSInfo.NKCount": "<#ffab1b>Neutral <#ff1919>Killers: {0}",
"GSInfo.NNKCount": "<#ffff00>Non-Killing <#ffab1b>Neutrals: {0}",
-/* ==============================
+ /* ==============================
Lovers
============================== */
"GSInfo.RomanticState": "{0}",
-/* ==============================
+ /* ==============================
Task Settings
============================== */
"GSInfo.Tasks": "<#00ffa5>Completed Tasks: {0}/{1}",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"GanInvestigatorCanBeMadmate": "Investigator can be converted",
@@ -9768,12 +9790,12 @@
"GanMarshallCanBeMadmate": "Marshall can be converted",
"GanMayorCanBeMadmate": "Mayor can be converted",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"GanNGuesserCanBeMadmate": "Nice Guesser can be converted",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"GanPresidentCanBeMadmate": "President can be converted",
@@ -9781,22 +9803,22 @@
"GhostCanSeeDeathReason": "Ghost Can See Cause Of Death",
"GhostCanSeeOtherRoles": "Ghosts Can See Other Roles",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"GhostCanSeeOtherVotes": "Ghosts Can See Vote Colors",
-/* ==============================
+ /* ==============================
Task Settings
============================== */
"GhostIgnoreTasks": "Ghosts Exempt From Tasks",
-/* ==============================
+ /* ==============================
Notifications and Messages
============================== */
"GotGhostRoleNotify": "<#ffff00>You were assigned a ghost role!",
-/* ==============================
+ /* ==============================
Guess Options
============================== */
"GuessAbility": "Guessers Can Guess Lovers",
@@ -9838,27 +9860,27 @@
"GuessTeamMate": "Sorry, you can't guess your teammates.",
"GuessVanillaCrewmate": "Host settings don't allow to guess someone as the vanilla Crewmate",
"GuessWorkaholic": "Sorry, you can't guess a revealed Workaholic as that would be unfair.",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"HideDualVotes": "Hide duplicated votes",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"HideGameSettings": "Hide Game Settings",
-/* ==============================
+ /* ==============================
Notifications and Messages
============================== */
"HnSUnloadWarning": "<#ffff00>WARNING:\\nEHR doesn't support vanilla Hide And Seek and will unload if you enable it.\\nYou can use EHR's Custom Hide And Seek game mode with unique roles instead.",
-/* ==============================
+ /* ==============================
Teams / Alignments
============================== */
"IfSelectedTeamIsDead": "If the selected team is dead, then the winning team is",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"ImpCanBeEgoist": "An Impostor can become Egoist",
@@ -9867,22 +9889,22 @@
"ImpCanBeRole": "Impostors can become {role}",
"ImpCanFindMarshall": "Reveal to <#ff1919>Impostors",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"ImpCanGuessImp": "Impostors Can Guess Impostor Roles",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"ImpCanKillMadmate": "Impostors can kill Madmates",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"ImpostorsCanGuess": "Impostors can guess",
-/* ==============================
+ /* ==============================
Teams / Alignments
============================== */
"InVentVisionForTeam": "Vision While In Vent For {team}",
@@ -9890,12 +9912,12 @@
"IncompatibleMod": "Incompatible Mod",
"IncompatibleNeutralMode": "If neutral is incompatible, turn into",
-/* ==============================
+ /* ==============================
Achievements
============================== */
"IncompleteAchievementsTitle": "<#ff0000>ACHIEVEMENTS TO BE UNLOCKED",
-/* ==============================
+ /* ==============================
Cooldowns and Timers
============================== */
"IncreasedSpeedDuration": "Increased Speed Duration",
@@ -9903,12 +9925,12 @@
-/* ==============================
+ /* ==============================
Cooldowns and Timers
============================== */
"KCD": "Kill Cooldown: {0}s",
-/* ==============================
+ /* ==============================
Moderator / Admin / VIP
============================== */
"KPDCamouflageMode": "Camouflage Appearance",
@@ -9917,13 +9939,13 @@
"KickBecauseDiffrentVersionOrMod": "{0} was kicked because they had a different version of the mod",
"KickBecauseLowLevel": "{0} was kicked because their level was too low",
-/* ==============================
+ /* ==============================
Sabotage Settings
============================== */
"KickCommandDisabled": "The kick command is currently disabled.",
-/* ==============================
+ /* ==============================
Moderator / Admin / VIP
============================== */
"KickLowLevelPlayer": "Kick players whose level is lower than",
@@ -9931,14 +9953,14 @@
"KickNotJoinedPlayersRegularly": "Kick players who haven't joined the game every 25s in lobby",
-/* ==============================
+ /* ==============================
Moderator / Admin / VIP
============================== */
"KickPlayStationPlayer": "{0} was kicked due to playing on PlayStation.",
"KickPlayerFriendCodeNotExist": "Kick players who are not logged in",
"KickSlowJoiningPlayers": "Kick Players Who Join Slowly To Prevent Disconnects (if they take more than 5 seconds to send their own data, they will be kicked automatically)",
"KickXboxPlayer": "{0} was kicked due to playing on Xbox.",
-
+
/* ==============================
Cooldowns and Timers
============================== */
@@ -9948,34 +9970,34 @@
"KillCooldownAfterStoneGazing": "Kill Cooldown On Stone Gaze",
"KillCooldownNormally": "Kill Cooldown Without Sabotage",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"KillCount": " Kills: {0}",
-/* ==============================
+ /* ==============================
Cooldowns and Timers
============================== */
"KillFlashDuration": "Kill-Flash Duration",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"LaughToWhoGuessSelf": "Tried to guess, who tried to self-guess! It's you! Ahah!",
"LaughToWhoMurderSelf": "Hahaha, who would've thought someone was stupid enough to murder themselves?\\n\\nGuess it happens to be... YOU!",
"LaughToWhoTrialSelf": "God, I didn't think the Judges would be so blind that they wouldn't even see that they had sentenced themselves.",
-/* ==============================
+ /* ==============================
Lovers
============================== */
"LegacyLovers": "Legacy Lovers",
-/* ==============================
+ /* ==============================
Sabotage Settings
============================== */
"LightsOutSpecialSettings": "Fix Lights Special Settings",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"LimitPerGame": "Limit Per Game",
@@ -10034,40 +10056,40 @@
"LoadingHint.44": "Did you know?\nThe Dev's favorite number is 44",
"LoadingHint.45": "Did you know that you can use the yield statement in an iterator to provide the next value or signal the end of an iteration in a loop since async doesn't work in BepInEx?\nYeah, me neither",
"LoadingWithPercentage": "{0}%\\n{1}\\n{2}",
-/* ==============================
+ /* ==============================
Cooldowns and Timers
============================== */
"LobbyCloseTimer": "Lobby Closing Timer: {0}",
"LobbyTimer": "Lobby closes in {0}m {1}s",
"LobbyUpdateInterval": "Always update the lobby info (player count, map, game mode, etc.) on the server at least every",
-/* ==============================
+ /* ==============================
Moderator / Admin / VIP
============================== */
"LowLoadMode": "Fix Lag",
-/* ==============================
+ /* ==============================
Task Settings
============================== */
"MadSnitchTasks": "Snitch Tasks",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"MadTimeManagerLimitMeetingTime": "Mad Time Manager - Minimum Voting Time",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"MadmateCanFindMarshall": "Reveal to <#ff1919>MadMates",
-/* ==============================
+ /* ==============================
Sabotage Settings
============================== */
"MadmateCanFixSabotage": "Madmates Can Fix Sabotages",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"MadmateCanKillImp": "Madmates can kill Impostors",
@@ -10076,14 +10098,14 @@
"MadmateCountMode.Imp": "Impostors",
"MadmateCountMode.None": "Nothing",
-/* ==============================
+ /* ==============================
Moderator / Admin / VIP
============================== */
"MadmateSpawnMode": "Madmate spawning mode",
"MadmateSpawnMode.Assign": "Assign",
"MadmateSpawnMode.FirstKill": "First Kill",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"MadmateSpawnMode.SelfVote": "Self Vote",
@@ -10091,17 +10113,17 @@
"MainMenu.ExitGameButton": "Quit",
"MainMenu.InventoryButton": "Inventory",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"MainMenu.SettingsButton": "Settings",
-/* ==============================
+ /* ==============================
Notifications and Messages
============================== */
"ManipulateNotify": "\\nYou were manipulated by the Mastermind!\\nYou must kill someone within {0}s or you die!",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"MaxAttemptsBlocked": "Maximum Distinct Guessing Attempts Blocked",
@@ -10111,18 +10133,18 @@
"MaxInspectorCheckLimit": "Max inspections per game",
"MaxMadmateRoles": "<#00a5ff>Maximum amount of <#ff1919>Madmate Roles",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"MaxNNKs": "<#00a5ff>Maximum amount of <#ffff00>Non-Killing <#ffab1b>Neutral Roles <#888888>(Benign, Evil, Pariah)",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"MaxWaitAutoStart": "Force start when Lobby Timer goes below (in minutes)",
"Maximum": "Max",
-/* ==============================
+ /* ==============================
Notifications and Messages
============================== */
"Message.AddedPlayerToBanList": "Added {0} to the ban list",
@@ -10153,12 +10175,12 @@
"Message.LobbyShareFailed": "EHR-Chan does not seem to be online (failed to share lobby)",
"Message.LobbyShared": "The lobby has successfully been shared!",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"Message.MadmateSelfVoteModeNotify": "Please note: The current Madness generation mode is {0}\\n Voting for yourself means you want to be Madmate. If you meet the conditions to become Madmate and there are still spaces left, you will immediately become Madmate",
-/* ==============================
+ /* ==============================
Notifications and Messages
============================== */
"Message.MessageWaitHelp": "Specify the first argument in seconds.",
@@ -10187,7 +10209,7 @@
"MessageRpcSizeLimit": "Message RPC Size Limit (Higher limit = increased risk of disconnects but fewer message splits - if you never disconnect randomly, up to 15000 can be safe)",
"MessageTooLong": "Failed to send chat message. The size of the RPC would've exceeded the limit specified in System Settings.",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"MinMadmateRoles": "<#00ffa5>Minimum amount of <#ff1919>Madmate Roles",
@@ -10197,33 +10219,33 @@
"MinPlayersForFungle": "Minimum Players for The Fungle",
"MinPlayersForGameStateCommand": "Minimum alive players to use this command",
-/* ==============================
+ /* ==============================
Task Settings
============================== */
"MinTasksToActivateAbility": "Minimum Number of Tasks Completed to Activate Ability",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"MinWaitAutoStart": "Minutes to wait before auto-starting",
"MinutesLeft": "{0} Minutes Left",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"MiraO2TimeLimit": "MIRA HQ O2 Time Limit",
-/* ==============================
+ /* ==============================
Sabotage Settings
============================== */
"MiraReactorTimeLimit": "MIRA HQ Reactor Time Limit",
-/* ==============================
+ /* ==============================
Notifications and Messages
============================== */
"ModBrokenMessage": "The MOD file is damaged.\\nPlease reinstall.",
-/* ==============================
+ /* ==============================
Moderator / Admin / VIP
============================== */
"ModLanguage": "Mod Language",
@@ -10231,13 +10253,13 @@
"ModeratorMuted": "Moderator {0} has muted {1} for <#00ffa5>{2} seconds.",
"ModeratorTag": "<#8000ff>Moderator",
-/* ==============================
+ /* ==============================
Moderator / Admin / VIP
============================== */
"Modifier": "\nModifier: ",
"Modifiers": "\nModifiers: ",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"MurderHelp": "Command: /cmd tl [player ID]\\nYou can see the players' IDs before the players' names.\\nOr use /cmd id to view the list of all player IDs.",
@@ -10247,76 +10269,76 @@
"MurderMaxGame": "You've reached your maximum murders limit for this game, so it was blocked.",
"MurderNull": "Please choose a living player to murder.",
-/* ==============================
+ /* ==============================
Notifications and Messages
============================== */
"MuteMessage": "<#ff0000>You're muted and cannot send messages. The mute will expire in <#ffff00>{0} seconds.",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"NGuesserCanBeMadmate": "Nice Guesser can become Madmate",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"NKCanFindMarshall": "Reveal to <#ffab1b>Neutral Killers",
-/* ==============================
+ /* ==============================
Sabotage Settings
============================== */
"NKWinsBySabotageIfNoImpAlive": "The team that wins by critical sabotage time limit if there are no <#ff1919>Impostors alive",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"NNKCanFindMarshall": "Reveal to <#ffff00>Neutral Non-Killers",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"NameDisplayAddonsOnlyInMeetings": "Display Add-Ons next to the role name only in meetings (if the above setting is off)",
-/* ==============================
+ /* ==============================
Cooldowns and Timers
============================== */
"NegativeEffectDuration": "Lower Vision/Speed Duration",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"NeutralCanBeInLove": "Neutrals can be in love",
"NeutralCanBeRole": "Neutrals can become {role}",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"NeutralKillersCanGuess": "Neutral Killers can guess",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"NoLimitAddonsNumMax": "Max Add-ons Per Player",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"NoMoreEmergencyMeetingsLeft": "You have no more emergency meetings left",
-/* ==============================
+ /* ==============================
Task Settings
============================== */
"NoPetActionMsgCrewTaskDone": "You are free",
"NoPetActionMsgCrewWithTasksLeft": "You realize you still have tasks to do",
-/* ==============================
+ /* ==============================
Moderator / Admin / VIP
============================== */
"NoWhisperAsRole": "<#ff0000>X You cannot use the 'whisper' command as this role.",
"NoWhisperDuringCourt": "<#ff0000>X The 'whisper' command is disabled during court.",
-/* ==============================
+ /* ==============================
Notifications and Messages
============================== */
"NoisemakerAlertDuration": "Alert Duration",
@@ -10324,12 +10346,12 @@
"NotifyGameEnding": "<#ff0000>GAME END NOTIFY\\n<#ffff00>This game has already ended. If it didn't end for you, please leave the game and rejoin the lobby. This is a vanilla bug. Sorry for the inconvenience.",
"NotifyGodAlive": "Inform players at meetings that God is still alive",
-/* ==============================
+ /* ==============================
Cooldowns and Timers
============================== */
"NukeCooldown": "Nuke Cooldown",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"NumGuessersOn.Coven.Max": "Maximum Number of Coven Guessers",
@@ -10341,56 +10363,56 @@
"NumGuessersOn.Neutral.Max": "Maximum Number of Neutral Guessers",
"NumGuessersOn.Neutral.Min": "Minimum Number of Neutral Guessers",
-/* ==============================
+ /* ==============================
Task Settings
============================== */
"NumOfTasks": "Number of Tasks to Finish",
-/* ==============================
+ /* ==============================
Lovers
============================== */
"NumberOfLovers": "Number of Lover Pairs (x2 members)",
-/* ==============================
+ /* ==============================
Cooldowns and Timers
============================== */
"OddKillCooldown": "Odd-Numbered kill cooldown",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"OnlyCancel": "Cancel Action Only",
"OnlyShowPart": "Shown only part",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"OverrideOtherCrewBasedRoles": "Override Other Crew Based Roles to Engineer (not just regular Crewmate)",
"OverrideSpeedForEachMap": "Override Speed For Each Map",
"OverrideVisionInVents": "Override Vision While In Vent",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"PassiveNeutralsCanGuess": "Passive Neutrals can guess",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"PetsForceEnabled": "The Speedrun game mode requires pets to be enabled, so they are forced on. You can disable it for future games under Game Modifiers.",
-/* ==============================
+ /* ==============================
Cooldowns and Timers
============================== */
"PoisonCooldown": "Poison Cooldown",
-/* ==============================
+ /* ==============================
Sabotage Settings
============================== */
"PolusReactorTimeLimit": "Polus Reactor Time Limit",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"PressF1ShowMainRoleDes": "F1: Show Full Role/Add-ons Info",
@@ -10399,7 +10421,7 @@
"Promt.EnableRole": "({0}/{1}) {2}\\nEnable {3}?\\n\\n{4}",
"Promt.ResetAllOptions": "Are you sure you want to reset all options? This action is irreversible and may take few minutes.",
-/* ==============================
+ /* ==============================
Maps
============================== */
"RandomMapsMode": "Random Maps Mode",
@@ -10410,7 +10432,7 @@
"AirshipChance": "Chance that the map is Airship",
"FungleChance": "Chance that the map is The Fungle",
-/* ==============================
+ /* ==============================
Rates and Percentages
============================== */
"Rate0": "<#662222>0%",
@@ -10434,12 +10456,12 @@
"Rate90": "<#00ffac>90%",
"Rate95": "<#00ffa6>95%",
"Rate100": "<#ffff44>100%",
-/* ==============================
+ /* ==============================
Notifications and Messages
============================== */
"ReadyCheckMessage": "The Host/a Staff is checking how many players are ready to start the game.\\nPlease type /ready to let the Host/Staff know you're not AFK.",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"RemainingText.AnonymousEvilCount.Plural": "Evil Players",
@@ -10485,7 +10507,7 @@
"RitualMaxCount": "Maximum Reveals",
-/* ==============================
+ /* ==============================
Sabotage Settings
============================== */
"Sabotage": "Sabotage",
@@ -10496,7 +10518,7 @@
"SabotageTimeLimitWinners.Coven": "<#7b3fbb>Coven",
"SabotageTimeLimitWinners.Imps": "<#ff1919>Impostors",
"SabotageTimeLimitWinners.NKs": "<#ffab1b>Neutral <#ff1919>Killers",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"SeeEjectedRolesInMeeting": "See ejected roles in meetings",
@@ -10504,33 +10526,33 @@
"SendRoleDescriptionFirstMeeting": "Show Role Descriptions to Unmodded Clients on First Meeting",
"ShowLongInfo": "Show Long Role Descriptions instead of Short ones",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"SettingsForRoleText": "Settings for",
-/* ==============================
+ /* ==============================
Cooldowns and Timers
============================== */
"ShapeshiftCooldown": "Shapeshift Cooldown",
"ShapeshiftDuration": "Shapeshift Duration",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"ShareLobbyMinPlayer": "Share Lobby Code When The Number Of Players Reaches",
-/* ==============================
+ /* ==============================
Cooldowns and Timers
============================== */
"ShieldDuration": "Shield Duration",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"ShipHasNoMoreMeetingsLeft": "The ship has no more emergency meetings left",
-/* ==============================
+ /* ==============================
Teams / Alignments
============================== */
"ShortTeamName.Coven": "Coven",
@@ -10538,50 +10560,50 @@
"ShortTeamName.Impostor": "Imp",
"ShortTeamName.Neutral": "Neut",
-/* ==============================
+ /* ==============================
Notifications and Messages
============================== */
"ShowAntiBlackoutWarning": "Show Anti-Blackout Warning When the Ejection Screen is Overridden",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"ShowArrows": "Has Arrows pointing toward bodies",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"ShowCovenRemainOnEject": "Show remaining Coven on ejects",
"ShowDifferentEjectionMessageForSomeRoles": "Show Different Ejection Message for Some Roles (<#ec62a5>Jester, <#611c3a>Executioner, <#8f815e>Innocent, etc.)",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"ShowImpRemainOnEject": "Show remaining Impostors on ejects",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"ShowNKRemainOnEject": "Show remaining Neutral Killers on ejects",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"ShowResults": "Show Results",
"ShowSpecificRole": "Know specific roles on Task Completion",
-/* ==============================
+ /* ==============================
Task Settings
============================== */
"ShowTaskCountWhenAlive": "Show Task Count When Alive",
"ShowTaskCountWhenDead": "Show Task Count When Dead",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"ShowTeamNextToRoleNameOnEject": "Show what team the ejected player's role is on",
-/* ==============================
+ /* ==============================
Maps
============================== */
"Skeld": "<#66a186>The Skeld",
@@ -10591,33 +10613,33 @@
"Airship": "<#ed0007>The Airship",
"Fungle": "<#ffa646>The Fungle",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"SkeldO2TimeLimit": "The Skeld O2 Time Limit",
-/* ==============================
+ /* ==============================
Sabotage Settings
============================== */
"SkeldReactorTimeLimit": "The Skeld Reactor Time Limit",
"SpawnAdditionalRenegadeMinAlivePlayers": "Minimum Number of Alive Players to Spawn",
-/* ==============================
+ /* ==============================
Sabotage Settings
============================== */
"SpectateDisabled": "<#ff0000>X The /spectate command is disabled in this lobby.",
-/* ==============================
+ /* ==============================
Maps
============================== */
"SpeedForMap": "Player Speed on {map}",
-/* ==============================
+ /* ==============================
Achievements
============================== */
"StoreCompletedAchievementsOnEHRDatabase": "Store completed achievements on the EHR database (to maintain progress in case of a reinstall or an update)",
-/* ==============================
+ /* ==============================
Submerged
============================== */
"Submerged": "<#3064ff>Submerged",
@@ -10630,23 +10652,23 @@
"SubmergedRoomName.134": "Lower Central",
"SubmergedRoomName.135": "Lower Lobby",
-/* ==============================
+ /* ==============================
Notifications and Messages
============================== */
"SupportsPetMessage": "\\n\\n<#00ff00>[✓] This role supports Pet button usage for ability triggers or other actions, maybe replacing venting, shapeshifting or killing.",
-/* ==============================
+ /* ==============================
Moderator / Admin / VIP
============================== */
"SyncButtonMode": "Sync Buttons Mode",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"SyncCustomSettingsRPC": "Synchronized RPC",
"SyncedButtonCount": "Max Number of Emergency Meetings Allowed",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"TabGroup.GameSettings": "Mod Settings",
@@ -10661,42 +10683,42 @@
"TabInfo.VanillaSettings": "Base game settings",
"TargetCannotBeTeleported": "Target cannot be teleported",
-/* ==============================
+ /* ==============================
Task Settings
============================== */
"TaskBasedCrewCanBeLazy": "Task based crewmates can be Lazy",
"TasklessCrewCanBeLazy": "Crewmates without tasks can be Lazy",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"TieMode.All": "Eject All",
"TieMode.Default": "No ejects",
"TieMode.Random": "Eject Random",
-/* ==============================
+ /* ==============================
General Settings
============================== */
"TrackerCanGetArrowColor": "Can See Colored Arrows",
-/* ==============================
+ /* ==============================
Cooldowns and Timers
============================== */
"TrackerCooldown": "Track Cooldown",
"TrackerDuration": "Track Duration",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"TrackerHideVote": "Hide Scout Votes",
-/* ==============================
+ /* ==============================
Notifications and Messages
============================== */
"TrackerLastRoomMessage": "The evaluation of your tracking showed that the last room in which your target was located was:{0}",
"TransformationAnnouncementMessage": "The ship has been infected with a powerful disease, turning the <#e5f6b4>Plaguebearer into Pestilence!",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"TrialHelp": "Command: /cmd tl [player ID]\\nYou can see the players' IDs before the players' names.\\nOr use /cmd id to view the list of all player IDs.",
@@ -10705,22 +10727,22 @@
"TrialLimitPerMeeting": "Max Trials per Meeting",
"TrialNull": "Please choose a living player for the trial",
-/* ==============================
+ /* ==============================
AFK Detector
============================== */
"TryFixBlackScreen": "Try Fixing Black Screen",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"UntilNextMeeting": "Until Next Meeting",
-/* ==============================
+ /* ==============================
Notifications and Messages
============================== */
"UpReplacedMessage": "/up was replaced by /setrole which allows you to set anyone's role for any game by typing '/setrole (ID) (ROLE)'. You can view ID's with /id.\nTo set your own role like with /up, you need to do '/setrole 0 (ROLE)'.",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"UseMeetingShapeshift": "Use Shapeshift Menu in Meetings to Select Targets Instead of Commands/Votes",
@@ -10730,12 +10752,12 @@
"UseVoteCancellingAfterVote": "Can Vote Normally After Using Ability (Vote)",
"UsesMeetingShapeshiftNotice": "<#ffff00>⚠ As this role, instead of commands and votes, you need to use the shapeshift menu in meetings to select your target!",
-/* ==============================
+ /* ==============================
Moderator / Admin / VIP
============================== */
"VIPTag": "<#ffff00>VIP",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"VanillaCrewmateCannotBeGuessed": "Crewmate role cannot be guessed",
@@ -10748,13 +10770,13 @@
"VentLimit": "Vent Entering Limit",
"VentPreventionMode": "Vent Prevention Mode",
-/* ==============================
+ /* ==============================
Cooldowns and Timers
============================== */
"VitalsCooldown": "Vitals Cooldown",
"VitalsDuration": "Vitals Duration",
-/* ==============================
+ /* ==============================
Meeting Settings
============================== */
"VoteMode": "Voting Mode",
@@ -10857,13 +10879,13 @@
"pet_poro": "Heimerdinger's Poro",
"pet_spaceCat": "Space Cat",
"pet_test": "Glitch Pet",
-/* ==============================
+ /* ==============================
Task Settings
============================== */
"roleLongTasksNum": "Amount of Long Tasks for %role%",
"roleShortTasksNum": "Amount of Short Tasks for %role%",
-/* ==============================
+ /* ==============================
Formats
============================== */
"Format.Health": "{0}",
@@ -10880,7 +10902,7 @@
"FormatNameModes.None": "Disable",
"FormatNameModes.Snacks": "Random",
-/* ==============================
+ /* ==============================
Remaining Text
============================== */
"RemainingText.CovenPlural": "Covens",
@@ -10893,7 +10915,7 @@
"RemainingText.Prefix.Single": "",
"RemainingText.Suffix": " left",
-/* ==============================
+ /* ==============================
Role Overview Titles
============================== */
"ROT.AddonType.Harmful": "★ Harmful Add-ons",
@@ -10921,7 +10943,7 @@
"AllCrewRolesHaveVanillaColor": "All <#8cffff>Crewmate roles have <#8cffff>the vanilla Crewmate color <#ffff00>(REQUIRES RESTART)",
"ColoredOff": "╳",
"ColoredOn": "✓",
- "IllegalColor": "Please enter the correct color",
+ "IllegalColor": "Please enter the correct color",
"AADelay": "Time to Leave Device",
"AADone": "The process has finished",
"AGMR.Explicit": "Specified Explicitly",
diff --git a/Resources/Lang/es_ES.json b/Resources/Lang/es_ES.jsonc
similarity index 100%
rename from Resources/Lang/es_ES.json
rename to Resources/Lang/es_ES.jsonc
diff --git a/Resources/Lang/fa_IR.json b/Resources/Lang/fa_IR.jsonc
similarity index 100%
rename from Resources/Lang/fa_IR.json
rename to Resources/Lang/fa_IR.jsonc
diff --git a/Resources/Lang/fr_FR.json b/Resources/Lang/fr_FR.jsonc
similarity index 100%
rename from Resources/Lang/fr_FR.json
rename to Resources/Lang/fr_FR.jsonc
diff --git a/Resources/Lang/hu_HU.json b/Resources/Lang/hu_HU.jsonc
similarity index 100%
rename from Resources/Lang/hu_HU.json
rename to Resources/Lang/hu_HU.jsonc
diff --git a/Resources/Lang/id_ID.json b/Resources/Lang/id_ID.jsonc
similarity index 100%
rename from Resources/Lang/id_ID.json
rename to Resources/Lang/id_ID.jsonc
diff --git a/Resources/Lang/ja_JP.json b/Resources/Lang/ja_JP.jsonc
similarity index 100%
rename from Resources/Lang/ja_JP.json
rename to Resources/Lang/ja_JP.jsonc
diff --git a/Resources/Lang/ko_KR.json b/Resources/Lang/ko_KR.jsonc
similarity index 100%
rename from Resources/Lang/ko_KR.json
rename to Resources/Lang/ko_KR.jsonc
diff --git a/Resources/Lang/pl_PL.json b/Resources/Lang/pl_PL.jsonc
similarity index 100%
rename from Resources/Lang/pl_PL.json
rename to Resources/Lang/pl_PL.jsonc
diff --git a/Resources/Lang/pt_BR.json b/Resources/Lang/pt_BR.jsonc
similarity index 100%
rename from Resources/Lang/pt_BR.json
rename to Resources/Lang/pt_BR.jsonc
diff --git a/Resources/Lang/ro_RO.json b/Resources/Lang/ro_RO.jsonc
similarity index 100%
rename from Resources/Lang/ro_RO.json
rename to Resources/Lang/ro_RO.jsonc
diff --git a/Resources/Lang/ru_RU.json b/Resources/Lang/ru_RU.jsonc
similarity index 100%
rename from Resources/Lang/ru_RU.json
rename to Resources/Lang/ru_RU.jsonc
diff --git a/Resources/Lang/sr_CS.json b/Resources/Lang/sr_CS.jsonc
similarity index 100%
rename from Resources/Lang/sr_CS.json
rename to Resources/Lang/sr_CS.jsonc
diff --git a/Resources/Lang/tr_TR.json b/Resources/Lang/tr_TR.jsonc
similarity index 100%
rename from Resources/Lang/tr_TR.json
rename to Resources/Lang/tr_TR.jsonc
diff --git a/Resources/Lang/vi_VN.json b/Resources/Lang/vi_VN.jsonc
similarity index 100%
rename from Resources/Lang/vi_VN.json
rename to Resources/Lang/vi_VN.jsonc
diff --git a/Resources/Lang/zh_CN.json b/Resources/Lang/zh_CN.jsonc
similarity index 100%
rename from Resources/Lang/zh_CN.json
rename to Resources/Lang/zh_CN.jsonc
diff --git a/Resources/Lang/zh_TW.json b/Resources/Lang/zh_TW.jsonc
similarity index 100%
rename from Resources/Lang/zh_TW.json
rename to Resources/Lang/zh_TW.jsonc
diff --git a/Roles/Standard/Crewmate/Investigate/Unshifter.cs b/Roles/Standard/Crewmate/Investigate/Unshifter.cs
new file mode 100644
index 000000000..a1deec9a0
--- /dev/null
+++ b/Roles/Standard/Crewmate/Investigate/Unshifter.cs
@@ -0,0 +1,77 @@
+using AmongUs.GameOptions;
+using Hazel;
+using InnerNet;
+using static EHR.Translator;
+
+namespace EHR.Roles;
+
+public class Unshifter : RoleBase
+{
+ private const int Id = 646900;
+ private static OptionItem Cooldown;
+ private static OptionItem UseLimit;
+ private static OptionItem TargetKnows;
+ private static bool On;
+
+ public override bool IsEnable => On;
+
+ public override void SetupCustomOption()
+ {
+ StartSetup(Id)
+ .AutoSetupOption(ref Cooldown, 25f, new FloatValueRule(0f, 60f, 0.5f), OptionFormat.Seconds, overrideName: "UnshifterCooldown")
+ .AutoSetupOption(ref UseLimit, 3, new IntegerValueRule(0, 20, 1), OptionFormat.Times, overrideName: "UnshifterUseLimit")
+ .AutoSetupOption(ref TargetKnows, true, overrideName: "UnshifterTargetKnows");
+ }
+
+ public override void Init()
+ {
+ On = false;
+ }
+
+ public override void Add(byte playerId)
+ {
+ On = true;
+ playerId.SetAbilityUseLimit(UseLimit.GetFloat());
+ }
+
+ public override void SetKillCooldown(byte playerId)
+ {
+ Main.AllPlayerKillCooldown[playerId] = Cooldown.GetFloat();
+ }
+
+ public override bool CanUseKillButton(PlayerControl pc)
+ {
+ return pc.GetAbilityUseLimit() >= 1;
+ }
+
+ public override void ApplyGameOptions(IGameOptions opt, byte playerId)
+ {
+ opt.SetVision(false);
+ }
+
+ public override bool OnCheckMurder(PlayerControl killer, PlayerControl target)
+ {
+ if (!IsEnable || killer == null || target == null || killer.GetAbilityUseLimit() <= 0)
+ return false;
+
+ if (!target.IsShifted())
+ {
+ killer.Notify(GetString("UnshifterTargetNotShifted"));
+ return false;
+ }
+
+ target.RpcShapeshift(target, true);
+ target.RpcResetAbilityCooldown();
+
+ killer.RpcRemoveAbilityUse();
+ killer.SetKillCooldown();
+
+ killer.Notify(GetString("UnshifterSuccess"));
+
+ if (TargetKnows.GetBool())
+ target.Notify(GetString("UnshifterTargetNotify"));
+
+ Logger.Info($"Unshifter: {killer.GetNameWithRole()} unshifted {target.GetNameWithRole()}", "Unshifter");
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/Roles/Standard/Crewmate/Support/Scanner.cs b/Roles/Standard/Crewmate/Support/Scanner.cs
new file mode 100644
index 000000000..a79005b01
--- /dev/null
+++ b/Roles/Standard/Crewmate/Support/Scanner.cs
@@ -0,0 +1,99 @@
+using AmongUs.GameOptions;
+using System.Collections.Generic;
+using UnityEngine;
+using static EHR.Translator;
+
+namespace EHR.Roles;
+
+public class Scanner : RoleBase
+{
+ private const int Id = 679900;
+
+ private static OptionItem Cooldown;
+ private static OptionItem Duration;
+ private static OptionItem Range;
+ private static OptionItem TimeLimit;
+ private static bool On;
+
+ public bool AbilityActive;
+ public static readonly Dictionary InRangeTimers = [];
+ public override bool IsEnable => On;
+
+ public override void SetupCustomOption()
+ {
+ StartSetup(Id)
+ .AutoSetupOption(ref Cooldown, 30f, new FloatValueRule(0f, 60f, 0.5f), OptionFormat.Seconds, overrideName: "ScannerCooldown")
+ .AutoSetupOption(ref Duration, 10f, new FloatValueRule(0f, 60f, 0.5f), OptionFormat.Seconds, overrideName: "ScannerDuration")
+ .AutoSetupOption(ref Range, 2.5f, new FloatValueRule(0.25f, 5f, 0.25f), OptionFormat.Multiplier, overrideName: "ScannerAbilityRange")
+ .AutoSetupOption(ref TimeLimit, 5f, new FloatValueRule(0f, 60f, 0.5f), OptionFormat.Seconds, overrideName: "ScannerTimeLimit");
+ }
+
+ public override void Init()
+ {
+ On = false;
+ }
+
+ public override void Add(byte playerId)
+ {
+ On = true;
+ AURoleOptions.PhantomCooldown = Cooldown.GetFloat();
+ }
+
+ public override bool CanUseKillButton(PlayerControl pc)
+ {
+ return false;
+ }
+
+ public override void ApplyGameOptions(IGameOptions opt, byte playerId)
+ {
+ opt.SetVision(false);
+ }
+
+ public override bool OnVanish(PlayerControl pc)
+ {
+ if (!IsEnable || pc == null)
+ return false;
+
+ if (!AbilityActive)
+ {
+ AbilityActive = true;
+ LateTask.New(() => AbilityActive = false, Duration.GetFloat());
+ }
+ return false;
+ }
+ public override void OnFixedUpdate(PlayerControl pc)
+ {
+ if (!AbilityActive || !AmongUsClient.Instance.AmHost) return;
+
+ foreach (var apc in Main.AllAlivePlayerControls)
+ {
+ if (apc == null || apc.PlayerId == pc.PlayerId) continue;
+ if (!Main.Invisible.Contains(apc.PlayerId)) continue;
+
+ float distance = Vector2.Distance(pc.GetTruePosition(), apc.GetTruePosition());
+
+ if (distance <= Range.GetFloat())
+ {
+ if (!InRangeTimers.ContainsKey(apc.PlayerId))
+ InRangeTimers[apc.PlayerId] = TimeLimit.GetFloat();
+
+ InRangeTimers[apc.PlayerId] -= Time.fixedDeltaTime / Time.timeScale;
+ apc.Notify(string.Format(GetString("ScannerWarningInRange"), Mathf.Round(InRangeTimers[apc.PlayerId])), time: 1f, overrideAll: true);
+
+ if (InRangeTimers[apc.PlayerId] <= 0f)
+ {
+ apc.RpcMakeVisible();
+ apc.Notify(GetString("ScannerNowVisible"), overrideAll: true);
+
+ InRangeTimers[apc.PlayerId] = TimeLimit.GetFloat();
+
+ return;
+ }
+ }
+ else
+ {
+ InRangeTimers[apc.PlayerId] = TimeLimit.GetFloat();
+ }
+ }
+ }
+}
diff --git a/Roles/Standard/Impostor/Concealing/Fakeshifter.cs b/Roles/Standard/Impostor/Concealing/Fakeshifter.cs
new file mode 100644
index 000000000..9a163e0e2
--- /dev/null
+++ b/Roles/Standard/Impostor/Concealing/Fakeshifter.cs
@@ -0,0 +1,68 @@
+using AmongUs.GameOptions;
+using System.Linq;
+
+namespace EHR.Roles;
+
+public class Fakeshifter : RoleBase
+{
+ public static bool On;
+ public int Id => 697000;
+
+ public override bool IsEnable => On;
+
+ private static OptionItem AbilityCooldown;
+ private static OptionItem AbilityDuration;
+ private static OptionItem AbilityUseLimit;
+ public byte MarkedId;
+
+ public override void SetupCustomOption()
+ {
+ StartSetup(Id)
+ .AutoSetupOption(ref AbilityCooldown, 30f, new FloatValueRule(1, 120, 1), OptionFormat.Seconds)
+ .AutoSetupOption(ref AbilityDuration, 10f, new FloatValueRule(1, 120, 1), OptionFormat.Seconds, overrideName: "FakeshifterAbilityDuration")
+ .AutoSetupOption(ref AbilityUseLimit, 3f, new FloatValueRule(0, 20, 0.05f), OptionFormat.Times);
+ }
+
+ public override void Init()
+ {
+ On = false;
+ }
+
+ public override void Add(byte playerId)
+ {
+ On = true;
+ MarkedId = byte.MaxValue;
+ playerId.SetAbilityUseLimit(AbilityUseLimit.GetFloat());
+ }
+
+ public override void ApplyGameOptions(IGameOptions opt, byte playerId)
+ {
+ AURoleOptions.ShapeshifterCooldown = AbilityCooldown.GetInt();
+ opt.SetVision(false);
+ }
+
+ public override bool OnShapeshift(PlayerControl shapeshifter, PlayerControl target, bool shapeshifting)
+ {
+ if (shapeshifter != null && target != null && MarkedId == byte.MaxValue && target.IsAlive())
+ {
+ MarkedId = target.PlayerId;
+ PlayerControl randomPlayer = Main.AllAlivePlayerControls.ToArray().Where(p => p.PlayerId != target.PlayerId).RandomElement();
+ foreach (var pc in Main.AllAlivePlayerControls)
+ {
+ if (pc.PlayerId == target.PlayerId) continue;
+ target.RpcShapeshiftDesync(randomPlayer, pc, false);
+ shapeshifter.RpcResetAbilityCooldown();
+ shapeshifter.RpcRemoveAbilityUse();
+ LateTask.New(() =>
+ {
+ if (shapeshifter != null && target != null && target.IsAlive())
+ {
+ target.RpcShapeshift(target, true);
+ MarkedId = byte.MaxValue;
+ }
+ }, AbilityDuration.GetFloat(), "Fakeshifter Ability Finish");
+ }
+ }
+ return false;
+ }
+}
\ No newline at end of file