diff --git a/CustomRoles.cs b/CustomRoles.cs
index 4ac86ad6b..48575be4f 100644
--- a/CustomRoles.cs
+++ b/CustomRoles.cs
@@ -170,7 +170,6 @@ public enum CustomRoles
Dictator,
Doctor,
DonutDelivery,
- Doormaster,
DoubleAgent,
DovesOfNeace,
Drainer,
diff --git a/GameMode/CaptureTheFlag.cs b/GameMode/CaptureTheFlag.cs
index 98eedf8a7..f2eb0b581 100644
--- a/GameMode/CaptureTheFlag.cs
+++ b/GameMode/CaptureTheFlag.cs
@@ -182,11 +182,9 @@ public static class CaptureTheFlag
public static string GetSuffixText(PlayerControl seer, PlayerControl target)
{
- if (!ValidTag) return string.Empty;
+ if (!ValidTag || seer.PlayerId != target.PlayerId) return string.Empty;
- if (seer.PlayerId != target.PlayerId) return string.Empty;
-
- string arrows = TargetArrow.GetAllArrows(seer);
+ string arrows = TargetArrow.GetAllArrows(seer.PlayerId);
arrows = arrows.Length > 0 ? $"{arrows}\n" : string.Empty;
var str = $"{arrows}{GetStatistics(target.PlayerId).Replace(" | ", "\n")}\n";
diff --git a/GameMode/HotPotato.cs b/GameMode/HotPotato.cs
index a068c36ca..a4bf03f7a 100644
--- a/GameMode/HotPotato.cs
+++ b/GameMode/HotPotato.cs
@@ -106,7 +106,10 @@ internal static class HotPotato
public static string GetSuffixText(byte id)
{
if (!Main.PlayerStates.TryGetValue(id, out PlayerState state) || state.IsDead) return string.Empty;
- return $"{(HotPotatoState.HolderID == id ? $"{Translator.GetString("HotPotato_HoldingNotify")}\n" : string.Empty)}{Translator.GetString("HotPotato_TimeLeftSuffix")}{HotPotatoState.TimeLeft}s";
+ string holding = HotPotatoState.HolderID == id ? $"{Translator.GetString("HotPotato_HoldingNotify")}\n" : string.Empty;
+ string arrows = TargetArrow.GetAllArrows(id);
+ arrows = arrows.Length > 0 ? $"\n{arrows}" : string.Empty;
+ return $"{holding}{Translator.GetString("HotPotato_TimeLeftSuffix")}{HotPotatoState.TimeLeft}s{arrows}";
}
public static void ReceiveRPC(MessageReader reader)
@@ -126,9 +129,9 @@ internal static class HotPotato
{
if (Options.CurrentGameMode != CustomGameMode.HotPotato || !Main.IntroDestroyed || !AmongUsClient.Instance.AmHost || !GameStates.IsInTask || __instance.PlayerId >= 254 || Utils.GameStartTimeStamp + 15 > Utils.TimeStamp) return;
- PlayerControl Holder = Utils.GetPlayerById(HotPotatoState.HolderID);
+ PlayerControl holder = Utils.GetPlayerById(HotPotatoState.HolderID);
- if (Holder == null || Holder.Data.Disconnected || !Holder.IsAlive())
+ if (holder == null || holder.Data.Disconnected || !holder.IsAlive())
{
PassHotPotato();
return;
@@ -145,11 +148,11 @@ internal static class HotPotato
if (HotPotatoState.TimeLeft <= 0)
{
- Holder.Suicide();
+ holder.Suicide();
SurvivalTimes[HotPotatoState.HolderID] = Time.GetInt() * (HotPotatoState.RoundNum - 1);
PassHotPotato();
- if (Holder.IsLocalPlayer())
+ if (holder.IsLocalPlayer())
Achievements.Type.OutOfTime.Complete();
return;
@@ -158,7 +161,7 @@ internal static class HotPotato
if (Utils.GameStartTimeStamp + 30 > now && LastPassTS == now) return;
PlayerControl[] aapc = Main.AllAlivePlayerControls;
- Vector2 pos = Holder.Pos();
+ Vector2 pos = holder.Pos();
if (HotPotatoState.HolderID != __instance.PlayerId || !aapc.Any(x => x.PlayerId != HotPotatoState.HolderID && (x.PlayerId != HotPotatoState.LastHolderID || aapc.Length == 2) && Vector2.Distance(x.Pos(), pos) <= Range.GetFloat())) return;
float wait = aapc.Length <= 2 ? 0.4f : 0f;
@@ -167,10 +170,10 @@ internal static class HotPotato
UpdateDelay = 0;
- PlayerControl Target = aapc.OrderBy(x => Vector2.Distance(x.Pos(), pos)).FirstOrDefault(x => x.PlayerId != HotPotatoState.HolderID && (x.PlayerId != HotPotatoState.LastHolderID || aapc.Length == 2));
- if (Target == null) return;
+ PlayerControl target = aapc.OrderBy(x => Vector2.Distance(x.Pos(), pos)).FirstOrDefault(x => x.PlayerId != HotPotatoState.HolderID && (x.PlayerId != HotPotatoState.LastHolderID || aapc.Length == 2));
+ if (target == null) return;
- PassHotPotato(Target, false);
+ PassHotPotato(target, false);
}
public static void PassHotPotato(PlayerControl target = null, bool resetTime = true)
@@ -216,19 +219,19 @@ internal static class HotPotato
Main.AllPlayerSpeed[target.PlayerId] = HolderSpeed.GetFloat();
target.MarkDirtySettings();
- PlayerControl LastHolder = Utils.GetPlayerById(HotPotatoState.LastHolderID);
+ PlayerControl lastHolder = Utils.GetPlayerById(HotPotatoState.LastHolderID);
- if (LastHolder != null)
+ if (lastHolder != null)
{
- if (CanPassViaKillButton) LastHolder.RpcChangeRoleBasis(CustomRoles.Potato);
+ if (CanPassViaKillButton) lastHolder.RpcChangeRoleBasis(CustomRoles.Potato);
TargetArrow.RemoveAllTarget(HotPotatoState.LastHolderID);
Main.AllPlayerSpeed[HotPotatoState.LastHolderID] = DefaultSpeed;
- LastHolder.MarkDirtySettings();
- Utils.NotifyRoles(SpecifyTarget: LastHolder);
+ lastHolder.MarkDirtySettings();
+ Utils.NotifyRoles(SpecifyTarget: lastHolder);
- Logger.Info($"Hot Potato Passed: {LastHolder.GetRealName()} => {target.GetRealName()}", "HotPotato");
+ Logger.Info($"Hot Potato Passed: {lastHolder.GetRealName()} => {target.GetRealName()}", "HotPotato");
}
}
catch (Exception ex) { Logger.Exception(ex, "HotPotatoManager.FixedUpdatePatch.PassHotPotato"); }
diff --git a/GameMode/Speedrun.cs b/GameMode/Speedrun.cs
index 9de1e8251..606b5d303 100644
--- a/GameMode/Speedrun.cs
+++ b/GameMode/Speedrun.cs
@@ -103,7 +103,7 @@ public static class Speedrun
int apc = Main.AllPlayerControls.Length;
int killers = CanKill.Count;
- string arrows = TargetArrow.GetAllArrows(pc);
+ string arrows = TargetArrow.GetAllArrows(pc.PlayerId);
arrows = arrows.Length > 0 ? $"\n{arrows}" : string.Empty;
// ReSharper disable once ConvertIfStatementToReturnStatement
diff --git a/Main.cs b/Main.cs
index 6ff1ec076..23c546dd5 100644
--- a/Main.cs
+++ b/Main.cs
@@ -424,7 +424,6 @@ public class Main : BasePlugin
{ CustomRoles.Dealer, "#f57242" },
{ CustomRoles.Escort, "#ff94e6" },
{ CustomRoles.Spy, "#34495E" },
- { CustomRoles.Doormaster, "#7FB3D5" },
{ CustomRoles.Tether, "#138D75" },
{ CustomRoles.Ricochet, "#EDBB99" },
{ CustomRoles.SpeedBooster, "#00ffff" },
diff --git a/Modules/AntiBlackout.cs b/Modules/AntiBlackout.cs
index ac53cc1ea..781dfcb39 100644
--- a/Modules/AntiBlackout.cs
+++ b/Modules/AntiBlackout.cs
@@ -106,6 +106,7 @@ public static class AntiBlackout
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(pc.NetId, (byte)RpcCalls.Exiled, SendOption.Reliable);
AmongUsClient.Instance.FinishRpcImmediately(writer);
if (pc.HasDesyncRole()) pc.FixBlackScreen();
+ if (pc.HasGhostRole()) pc.RpcResetAbilityCooldown();
}
}
catch (Exception e) { Utils.ThrowException(e); }
diff --git a/Modules/CustomRoleSelector.cs b/Modules/CustomRoleSelector.cs
index dda911d18..77e9adf3a 100644
--- a/Modules/CustomRoleSelector.cs
+++ b/Modules/CustomRoleSelector.cs
@@ -105,7 +105,6 @@ internal static class CustomRoleSelector
case CustomRoles.Battery when Main.CurrentMap == MapNames.Fungle:
case CustomRoles.Beacon when Main.CurrentMap == MapNames.Fungle:
case CustomRoles.DarkHide when Main.CurrentMap == MapNames.Fungle:
- case CustomRoles.Doormaster when Main.CurrentMap == MapNames.MiraHQ:
case CustomRoles.Pelican when Roles[RoleAssignType.Impostor].Any(x => x.Role == CustomRoles.Duellist):
case CustomRoles.Duellist when Roles[RoleAssignType.NeutralKilling].Any(x => x.Role == CustomRoles.Pelican):
case CustomRoles.VengefulRomantic:
diff --git a/Modules/CustomRolesHelper.cs b/Modules/CustomRolesHelper.cs
index 5953d91fc..c51a8fb0e 100644
--- a/Modules/CustomRolesHelper.cs
+++ b/Modules/CustomRolesHelper.cs
@@ -111,7 +111,7 @@ internal static class CustomRolesHelper
CustomRoles.Sniper => UsePets ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
CustomRoles.Jester => Jester.JesterCanVent.GetBool() ? CustomRoles.Engineer : CustomRoles.Crewmate,
CustomRoles.Mayor => Mayor.MayorHasPortableButton.GetBool() ? CustomRoles.Engineer : CustomRoles.Crewmate,
- CustomRoles.Monitor => Monitor.CanVent.GetBool() ? CustomRoles.Engineer : CustomRoles.Crewmate,
+ CustomRoles.Monitor => Monitor.CanVent.GetBool() || !UsePets ? CustomRoles.Engineer : CustomRoles.Crewmate,
CustomRoles.Vulture => Vulture.CanVent.GetBool() ? CustomRoles.Engineer : CustomRoles.Crewmate,
CustomRoles.Opportunist => Opportunist.CanVent.GetBool() ? CustomRoles.Engineer : CustomRoles.Crewmate,
CustomRoles.Vindicator => CustomRoles.Impostor,
@@ -260,7 +260,6 @@ internal static class CustomRolesHelper
CustomRoles.Spy => CustomRoles.Crewmate,
CustomRoles.Ricochet => CustomRoles.Crewmate,
CustomRoles.Tether => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
- CustomRoles.Doormaster => UsePets ? CustomRoles.Crewmate : CustomRoles.Engineer,
CustomRoles.Aid => UsePets && Aid.UsePet.GetBool() ? CustomRoles.Crewmate : CustomRoles.Impostor,
CustomRoles.Socialite => UsePets && Socialite.UsePet.GetBool() ? CustomRoles.Crewmate : CustomRoles.Impostor,
CustomRoles.Escort => UsePets && Escort.UsePet.GetBool() ? CustomRoles.Crewmate : CustomRoles.Impostor,
@@ -460,7 +459,7 @@ internal static class CustomRolesHelper
CustomRoles.Gamer => RoleTypes.Impostor,
CustomRoles.HexMaster => RoleTypes.Impostor,
CustomRoles.Wraith => RoleTypes.Impostor,
- CustomRoles.Glitch => RoleTypes.Impostor,
+ CustomRoles.Glitch => RoleTypes.Shapeshifter,
CustomRoles.Jailor => UsePets && Jailor.UsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
CustomRoles.Juggernaut => RoleTypes.Impostor,
CustomRoles.Jinx => RoleTypes.Impostor,
@@ -1709,7 +1708,6 @@ internal static class CustomRolesHelper
CustomRoles.Crusader => RoleOptionType.Crewmate_Support,
CustomRoles.Deputy => RoleOptionType.Crewmate_Support,
CustomRoles.DonutDelivery => RoleOptionType.Crewmate_Support,
- CustomRoles.Doormaster => RoleOptionType.Crewmate_Support,
CustomRoles.DovesOfNeace => RoleOptionType.Crewmate_Support,
CustomRoles.Electric => RoleOptionType.Crewmate_Support,
CustomRoles.Escort => RoleOptionType.Crewmate_Support,
diff --git a/Modules/CustomRpcSender.cs b/Modules/CustomRpcSender.cs
index f37bfed4d..262762f92 100644
--- a/Modules/CustomRpcSender.cs
+++ b/Modules/CustomRpcSender.cs
@@ -596,8 +596,6 @@ public static class CustomRpcSenderExtensions
if (target.Is(CustomRoles.Glitch) && Main.PlayerStates[target.PlayerId].Role is Glitch gc)
{
gc.LastHack = Utils.TimeStamp;
- gc.LastMimic = Utils.TimeStamp;
- gc.MimicCDTimer = 10;
gc.HackCDTimer = 10;
return false;
diff --git a/Modules/ExtendedPlayerControl.cs b/Modules/ExtendedPlayerControl.cs
index 03e0d5151..82f39a462 100644
--- a/Modules/ExtendedPlayerControl.cs
+++ b/Modules/ExtendedPlayerControl.cs
@@ -661,7 +661,7 @@ internal static class ExtendedPlayerControl
public static void AddKCDAsAbilityCD(this PlayerControl pc)
{
- AddAbilityCD(pc, (int)Math.Round(Main.AllPlayerKillCooldown.TryGetValue(pc.PlayerId, out float kcd) ? kcd : Options.DefaultKillCooldown));
+ AddAbilityCD(pc, (int)Math.Round(Main.AllPlayerKillCooldown.TryGetValue(pc.PlayerId, out float kcd) ? kcd : Options.AdjustedDefaultKillCooldown));
}
public static void AddAbilityCD(this PlayerControl pc, bool includeDuration = true)
@@ -830,8 +830,6 @@ internal static class ExtendedPlayerControl
if (target.Is(CustomRoles.Glitch) && Main.PlayerStates[target.PlayerId].Role is Glitch gc)
{
gc.LastHack = TimeStamp;
- gc.LastMimic = TimeStamp;
- gc.MimicCDTimer = 10;
gc.HackCDTimer = 10;
}
else if (PlayerControl.LocalPlayer == target)
diff --git a/Modules/OptionHolder.cs b/Modules/OptionHolder.cs
index 07a3bdad9..5eab98b78 100644
--- a/Modules/OptionHolder.cs
+++ b/Modules/OptionHolder.cs
@@ -207,6 +207,16 @@ public static class Options
public static float DefaultKillCooldown = Main.NormalOptions == null ? 25f : Main.NormalOptions.KillCooldown;
+ public static float AdjustedDefaultKillCooldown => !GameStates.InGame
+ ? DefaultKillCooldown
+ : DefaultKillCooldown + Main.CurrentMap switch
+ {
+ MapNames.Polus => ExtraKillCooldownOnPolus?.GetFloat() ?? 0f,
+ MapNames.Airship => ExtraKillCooldownOnAirship?.GetFloat() ?? 0f,
+ MapNames.Fungle => ExtraKillCooldownOnFungle?.GetFloat() ?? 0f,
+ _ => 0f
+ };
+
public static OptionItem ModLanguage;
public static readonly Dictionary GameStateSettings = [];
@@ -434,6 +444,9 @@ public static class Options
public static OptionItem ChangeDecontaminationTime;
public static OptionItem DecontaminationTimeOnMiraHQ;
public static OptionItem DecontaminationTimeOnPolus;
+ public static OptionItem ExtraKillCooldownOnPolus;
+ public static OptionItem ExtraKillCooldownOnAirship;
+ public static OptionItem ExtraKillCooldownOnFungle;
public static OptionItem MafiaShapeshiftCD;
public static OptionItem MafiaShapeshiftDur;
@@ -1786,6 +1799,18 @@ public static class Options
.SetValueFormat(OptionFormat.Seconds)
.SetColor(new Color32(19, 188, 233, byte.MaxValue));
+ ExtraKillCooldownOnPolus = new FloatOptionItem(60506, "ExtraKillCooldownOnPolus", new(0f, 60f, 0.5f), 0f, TabGroup.GameSettings)
+ .SetValueFormat(OptionFormat.Seconds)
+ .SetColor(new Color32(19, 188, 233, byte.MaxValue));
+
+ ExtraKillCooldownOnAirship = new FloatOptionItem(60507, "ExtraKillCooldownOnAirship", new(0f, 60f, 0.5f), 0f, TabGroup.GameSettings)
+ .SetValueFormat(OptionFormat.Seconds)
+ .SetColor(new Color32(19, 188, 233, byte.MaxValue));
+
+ ExtraKillCooldownOnFungle = new FloatOptionItem(60508, "ExtraKillCooldownOnFungle", new(0f, 60f, 0.5f), 0f, TabGroup.GameSettings)
+ .SetValueFormat(OptionFormat.Seconds)
+ .SetColor(new Color32(19, 188, 233, byte.MaxValue));
+
LoadingPercentage = 70;
diff --git a/Modules/TargetArrow.cs b/Modules/TargetArrow.cs
index ee1b0a48f..be5244496 100644
--- a/Modules/TargetArrow.cs
+++ b/Modules/TargetArrow.cs
@@ -107,9 +107,9 @@ internal static class TargetArrow
///
///
///
- public static string GetAllArrows(PlayerControl seer)
+ public static string GetAllArrows(byte seer)
{
- return TargetArrows.Keys.Where(ai => ai.From == seer.PlayerId).Aggregate(string.Empty, (current, arrowInfo) => current + TargetArrows[arrowInfo]);
+ return TargetArrows.Keys.Where(ai => ai.From == seer).Aggregate(string.Empty, (current, arrowInfo) => current + TargetArrows[arrowInfo]);
}
///
diff --git a/Modules/Utils.cs b/Modules/Utils.cs
index 3e59c6797..47b1d5696 100644
--- a/Modules/Utils.cs
+++ b/Modules/Utils.cs
@@ -2820,7 +2820,8 @@ public static class Utils
if (MeetingStates.FirstMeeting && Main.ShieldPlayer == target.FriendCode && !string.IsNullOrEmpty(target.FriendCode) && Options.CurrentGameMode is CustomGameMode.Standard or CustomGameMode.FFA or CustomGameMode.Speedrun)
additionalSuffixes.Add(GetString("DiedR1Warning"));
- additionalSuffixes.Add(AFKDetector.GetSuffix(seer, target));
+ if (!forMeeting)
+ additionalSuffixes.Add(AFKDetector.GetSuffix(seer, target));
TargetSuffix.Append(BuildSuffix(seer, target, meeting: forMeeting));
@@ -3082,7 +3083,7 @@ public static class Utils
{
if (role.UsesPetInsteadOfKill())
{
- var kcd = (int)Math.Round(Main.AllPlayerKillCooldown.TryGetValue(playerId, out float killCd) ? killCd : Options.DefaultKillCooldown);
+ var kcd = (int)Math.Round(Main.AllPlayerKillCooldown.TryGetValue(playerId, out float killCd) ? killCd : Options.AdjustedDefaultKillCooldown);
Main.AbilityCD[playerId] = (TimeStamp, kcd);
SendRPC(CustomRPC.SyncAbilityCD, 1, playerId, kcd);
return;
@@ -3091,10 +3092,10 @@ public static class Utils
int cd = role switch
{
CustomRoles.Mole => Mole.CD.GetInt(),
- CustomRoles.Doormaster => Doormaster.VentCooldown.GetInt(),
+ CustomRoles.Monitor => Monitor.VentCooldown.GetInt(),
CustomRoles.Tether => Tether.VentCooldown.GetInt(),
- CustomRoles.Mayor when Mayor.MayorHasPortableButton.GetBool() => (int)Math.Round(Options.DefaultKillCooldown),
- CustomRoles.Paranoia => (int)Math.Round(Options.DefaultKillCooldown),
+ CustomRoles.Mayor when Mayor.MayorHasPortableButton.GetBool() => (int)Math.Round(Options.AdjustedDefaultKillCooldown),
+ CustomRoles.Paranoia => (int)Math.Round(Options.AdjustedDefaultKillCooldown),
CustomRoles.Grenadier => Options.GrenadierSkillCooldown.GetInt() + (includeDuration ? Options.GrenadierSkillDuration.GetInt() : 0),
CustomRoles.Lighter => Options.LighterSkillCooldown.GetInt() + (includeDuration ? Options.LighterSkillDuration.GetInt() : 0),
CustomRoles.SecurityGuard => Options.SecurityGuardSkillCooldown.GetInt() + (includeDuration ? Options.SecurityGuardSkillDuration.GetInt() : 0),
diff --git a/Patches/ChatCommandPatch.cs b/Patches/ChatCommandPatch.cs
index d727ab675..f06f22f58 100644
--- a/Patches/ChatCommandPatch.cs
+++ b/Patches/ChatCommandPatch.cs
@@ -1255,17 +1255,18 @@ internal static class ChatCommands
}
int splitIndex = Array.IndexOf(args, args.First(x => x.Contains('?'))) + 1;
- string[] answers = args.Skip(splitIndex).ToArray();
+ string[] answers = args[splitIndex..];
- string msg = string.Join(" ", args.Take(splitIndex).Skip(1)) + "\n";
+ string msg = string.Join(" ", args[1..splitIndex]) + "\n";
bool gmPoll = msg.Contains(GetString("GameModePoll.Question"));
PollTimer = gmPoll ? 60f : 45f;
+ Color[] gmPollColors = gmPoll ? Main.GameModeColors.Values.ToArray() : [];
for (var i = 0; i < Math.Max(answers.Length, 2); i++)
{
var choiceLetter = (char)(i + 65);
- msg += Utils.ColorString(RandomColor(), $"{char.ToUpper(choiceLetter)}) {answers[i]}\n");
+ msg += Utils.ColorString(gmPoll ? gmPollColors[i] : RandomColor(), $"{char.ToUpper(choiceLetter)}) {answers[i]}\n");
PollVotes[choiceLetter] = 0;
PollAnswers[choiceLetter] = $"〖 {answers[i]} 〗";
}
@@ -1324,7 +1325,7 @@ internal static class ChatCommands
if (winners.Length == 1 && gmPoll && GameStates.IsLobby)
{
int winnerIndex = winners[0].Key - 65;
- if (winnerIndex != 0) Options.GameMode.SetValue(winnerIndex);
+ Options.GameMode.SetValue(winnerIndex);
}
}
diff --git a/Patches/ExilePatch.cs b/Patches/ExilePatch.cs
index bd36a4dc6..e9f674988 100644
--- a/Patches/ExilePatch.cs
+++ b/Patches/ExilePatch.cs
@@ -73,7 +73,7 @@ internal static class ExileControllerWrapUpPatch
Main.PlayerStates[exiled.PlayerId].SetDead();
}
- if (AmongUsClient.Instance.AmHost && Main.IsFixedCooldown) Main.RefixCooldownDelay = Options.DefaultKillCooldown - 3f;
+ if (AmongUsClient.Instance.AmHost && Main.IsFixedCooldown) Main.RefixCooldownDelay = Options.AdjustedDefaultKillCooldown - 3f;
Witch.RemoveSpelledPlayer();
diff --git a/Patches/HudPatch.cs b/Patches/HudPatch.cs
index a6c1b7c6e..f1abd104e 100644
--- a/Patches/HudPatch.cs
+++ b/Patches/HudPatch.cs
@@ -161,32 +161,7 @@ internal static class HudManagerPatch
AutoGMRotationStatusText.fontSize = AutoGMRotationStatusText.fontSizeMax = AutoGMRotationStatusText.fontSizeMin = 2.5f;
}
- bool includesRandomChoice = Options.AutoGMRotationSlots.Exists(x => x.Slot.GetValue() == 2);
- int index = Options.AutoGMRotationIndex;
- List list = Options.AutoGMRotationCompiled;
-
- CustomGameMode previousGM = index == 0 ? list[^1] : list[index - 1];
- CustomGameMode currentGM = list[index];
- CustomGameMode nextGM = index == list.Count - 1 ? list[0] : list[index + 1];
- CustomGameMode nextNextGM = index >= list.Count - 2 ? list[1] : list[index + 2];
-
- var sb = new StringBuilder(GetString("AutoGMRotationStatusText"));
- sb.AppendLine();
- sb.AppendLine("....");
- if (!includesRandomChoice || index > 0) sb.AppendLine($"> {ToString(previousGM)}");
- sb.AppendLine($"{GetString("AutoGMRotationStatusText.NextGM")}: {ToString(currentGM)}");
- if (!includesRandomChoice || index < list.Count - 1) sb.AppendLine(ToString(nextGM));
- if (!includesRandomChoice || index < list.Count - 2) sb.AppendLine(ToString(nextNextGM));
- sb.AppendLine("....");
-
- string ToString(CustomGameMode gm) => gm == CustomGameMode.All
- ? GetString("AutoGMRotationStatusText.GMPoll")
- : Utils.ColorString(Main.GameModeColors[gm], GetString(gm.ToString()));
-
- long timerSecondsLeft = AutoGMRotationCooldownTimerEndTS - Utils.TimeStamp;
- if (timerSecondsLeft > 0) sb.AppendLine(string.Format(GetString("AutoGMRotationStatusText.CooldownTimer"), timerSecondsLeft));
-
- AutoGMRotationStatusText.text = sb.ToString().Trim();
+ AutoGMRotationStatusText.text = BuildAutoGMRotationStatusText(false);
AutoGMRotationStatusText.enabled = AutoGMRotationStatusText.text != string.Empty && GameStates.IsLobby;
}
else if (AutoGMRotationStatusText != null)
@@ -432,6 +407,39 @@ internal static class HudManagerPatch
}
catch (Exception e) { Utils.ThrowException(e); }
}
+
+ public static string BuildAutoGMRotationStatusText(bool chatMessage)
+ {
+ bool includesRandomChoice = Options.AutoGMRotationSlots.Exists(x => x.Slot.GetValue() == 2);
+ int index = Options.AutoGMRotationIndex;
+ List list = Options.AutoGMRotationCompiled;
+
+ CustomGameMode previousGM = index == 0 ? list[^1] : list[index - 1];
+ CustomGameMode currentGM = list[index];
+ CustomGameMode nextGM = index == list.Count - 1 ? list[0] : list[index + 1];
+ CustomGameMode nextNextGM = index >= list.Count - 2 ? list[1] : list[index + 2];
+
+ var sb = new StringBuilder();
+ if (!chatMessage) sb.AppendLine(GetString("AutoGMRotationStatusText"));
+ sb.AppendLine("....");
+ if (!includesRandomChoice || index > 0) sb.AppendLine($"> {ToString(previousGM)}");
+ sb.AppendLine($"{GetString("AutoGMRotationStatusText.NextGM")}: {ToString(currentGM)}");
+ if (!includesRandomChoice || index < list.Count - 1) sb.AppendLine(ToString(nextGM));
+ if (!includesRandomChoice || index < list.Count - 2) sb.AppendLine(ToString(nextNextGM));
+ sb.AppendLine("....");
+
+ if (!chatMessage)
+ {
+ long timerSecondsLeft = AutoGMRotationCooldownTimerEndTS - Utils.TimeStamp;
+ if (timerSecondsLeft > 0) sb.AppendLine(string.Format(GetString("AutoGMRotationStatusText.CooldownTimer"), timerSecondsLeft));
+ }
+
+ return sb.ToString().Trim();
+
+ string ToString(CustomGameMode gm) => gm == CustomGameMode.All
+ ? GetString("AutoGMRotationStatusText.GMPoll")
+ : Utils.ColorString(Main.GameModeColors[gm], GetString(gm.ToString()));
+ }
}
[HarmonyPatch(typeof(ActionButton), nameof(ActionButton.SetFillUp))]
diff --git a/Patches/OnGameStartedPatch.cs b/Patches/OnGameStartedPatch.cs
index 8e5b06906..e7a2c58dd 100644
--- a/Patches/OnGameStartedPatch.cs
+++ b/Patches/OnGameStartedPatch.cs
@@ -331,7 +331,13 @@ internal static class ChangeRoleSettings
Main.PlayerStates[pc.PlayerId] = new(pc.PlayerId);
Main.AllPlayerSpeed[pc.PlayerId] = Main.RealOptionsData.GetFloat(FloatOptionNames.PlayerSpeedMod);
- Main.AllPlayerKillCooldown[pc.PlayerId] = Options.DefaultKillCooldown;
+ Main.AllPlayerKillCooldown[pc.PlayerId] = Options.DefaultKillCooldown + Main.CurrentMap switch
+ {
+ MapNames.Polus => Options.ExtraKillCooldownOnPolus.GetFloat(),
+ MapNames.Airship => Options.ExtraKillCooldownOnAirship.GetFloat(),
+ MapNames.Fungle => Options.ExtraKillCooldownOnFungle.GetFloat(),
+ _ => 0f
+ };
ReportDeadBodyPatch.CanReport[pc.PlayerId] = true;
ReportDeadBodyPatch.WaitReport[pc.PlayerId] = [];
RoleResult[pc.PlayerId] = CustomRoles.NotAssigned;
diff --git a/Patches/PlayerControlPatch.cs b/Patches/PlayerControlPatch.cs
index 812b6d02f..cfd052117 100644
--- a/Patches/PlayerControlPatch.cs
+++ b/Patches/PlayerControlPatch.cs
@@ -1530,7 +1530,7 @@ internal static class FixedUpdatePatch
foreach (PlayerControl pc in Main.AllPlayerControls)
{
if (pc.Is(CustomRoles.Vampire) || pc.Is(CustomRoles.Warlock) || pc.Is(CustomRoles.Assassin) || pc.Is(CustomRoles.Undertaker) || pc.Is(CustomRoles.Poisoner))
- Main.AllPlayerKillCooldown[pc.PlayerId] = Options.DefaultKillCooldown * 2;
+ Main.AllPlayerKillCooldown[pc.PlayerId] = Options.AdjustedDefaultKillCooldown * 2;
}
}
diff --git a/Patches/PlayerJoinAndLeftPatch.cs b/Patches/PlayerJoinAndLeftPatch.cs
index e1a739d28..cf07712ef 100644
--- a/Patches/PlayerJoinAndLeftPatch.cs
+++ b/Patches/PlayerJoinAndLeftPatch.cs
@@ -135,8 +135,16 @@ internal static class OnGameJoinedPatch
IEnumerator CoRoutine()
{
+ yield return new WaitForSeconds(10f);
+
+ try { Utils.SendMessage(HudManagerPatch.BuildAutoGMRotationStatusText(true), title: GetString("AutoGMRotationStatusText")); }
+ catch (Exception e) { Utils.ThrowException(e); }
+
+ CustomGameMode nextGM = Options.AutoGMRotationCompiled[Options.AutoGMRotationIndex];
+
float timer;
- if (Options.AutoGMPollCommandAfterJoin.GetBool()) timer = Options.AutoGMPollCommandCooldown.GetInt();
+ if (nextGM != CustomGameMode.All) timer = 0f;
+ else if (Options.AutoGMPollCommandAfterJoin.GetBool()) timer = Options.AutoGMPollCommandCooldown.GetInt();
else if (Main.AutoStart.Value) timer = (Options.MinWaitAutoStart.GetFloat() * 60) - 65;
else timer = 30f;
@@ -153,8 +161,6 @@ internal static class OnGameJoinedPatch
if (Options.AutoGMRotationEnabled)
{
- CustomGameMode nextGM = Options.AutoGMRotationCompiled[Options.AutoGMRotationIndex];
-
if (nextGM == CustomGameMode.All) ChatCommands.GameModePollCommand(PlayerControl.LocalPlayer, "/gmpoll", ["/gmpoll"]);
else Options.GameMode.SetValue((int)nextGM - 1);
diff --git a/Resources/Lang/en_US.json b/Resources/Lang/en_US.json
index 5aa16b135..0e00d11cb 100644
--- a/Resources/Lang/en_US.json
+++ b/Resources/Lang/en_US.json
@@ -3494,7 +3494,7 @@
"DetourInfoLong": "(Crewmate):\\nAs the Detour, all kill button related actions on you will be blocked and instead happen on the closest player to you.",
"Monitor": "Telecommunication",
"MonitorInfo": "Track device usage",
- "MonitorInfoLong": "(Crewmates):\\nAs the Telecommunication, you are notified when anyone uses cameras, vitals, doorlogs, or admin.",
+ "MonitorInfoLong": "(Crewmates):\\nAs the Telecommunication, you are notified when someone uses cameras, vitals, doorlogs, or admin (you will know who specifically). If you have ability uses left, you can vent/pet to open all closed doors on the map.",
"Werewolf": "Werewolf",
"WerewolfInfo": "Vent to Rampage to kill quickly",
"WerewolfInfoLong": "(Neutrals):\\nAs the Werewolf, you can go on a rampage by entering a vent. While you're rampaging you have a very short kill cooldown. You cannot kill when you aren't rampaging. Rampaging has a cooldown and a limited duration.",
@@ -4570,9 +4570,6 @@
"CanKillBeforeRoleChange": "Can Kill Before Picking a Role",
"AvailableRoles": "Available Impostor-Teamed Role List to Choose From",
"ChangelingCurrentRole": "Selected Role: {0}",
- "Doormaster": "Door Master",
- "DoormasterInfo": "Open All Doors Anytime",
- "DoormasterInfoLong": "(Crewmates):\\nAs the Door Master, you can vent/pet to open all closed doors.",
"Ricochet": "Ricochet",
"RicochetInfo": "Protect yourself from someone specific",
"RicochetInfoLong": "(Crewmates):\\nAs the Ricochet, you may vote someone in a meeting to make them your target. In the next round, your target will not be able to kill you.",
diff --git a/Roles/Crewmate/CopyCat.cs b/Roles/Crewmate/CopyCat.cs
index 83ec47111..5d37b1934 100644
--- a/Roles/Crewmate/CopyCat.cs
+++ b/Roles/Crewmate/CopyCat.cs
@@ -17,7 +17,7 @@ public class CopyCat : RoleBase
public static OptionItem UsePet;
public PlayerControl CopyCatPC;
- private float CurrentKillCooldown = DefaultKillCooldown;
+ private float CurrentKillCooldown = AdjustedDefaultKillCooldown;
private float TempLimit;
public override bool IsEnable => Instances.Count > 0;
@@ -49,7 +49,7 @@ public class CopyCat : RoleBase
public override void Init()
{
Instances = [];
- CurrentKillCooldown = DefaultKillCooldown;
+ CurrentKillCooldown = AdjustedDefaultKillCooldown;
}
public override void Add(byte playerId)
diff --git a/Roles/Crewmate/Doormaster.cs b/Roles/Crewmate/Doormaster.cs
deleted file mode 100644
index 9c40540df..000000000
--- a/Roles/Crewmate/Doormaster.cs
+++ /dev/null
@@ -1,93 +0,0 @@
-using System.Collections.Generic;
-using AmongUs.GameOptions;
-using EHR.Modules;
-
-namespace EHR.Crewmate;
-
-using static Options;
-
-public class Doormaster : RoleBase
-{
- private const int Id = 640000;
- private static List PlayerIdList = [];
-
- public static OptionItem VentCooldown;
- public static OptionItem UseLimitOpt;
- public static OptionItem DoormasterAbilityUseGainWithEachTaskCompleted;
- public static OptionItem AbilityChargesWhenFinishedTasks;
-
- public override bool IsEnable => PlayerIdList.Count > 0;
-
- public override void SetupCustomOption()
- {
- SetupRoleOptions(Id, TabGroup.CrewmateRoles, CustomRoles.Doormaster);
-
- VentCooldown = new FloatOptionItem(Id + 10, "VentCooldown", new(0f, 70f, 1f), 15f, TabGroup.CrewmateRoles).SetParent(CustomRoleSpawnChances[CustomRoles.Doormaster])
- .SetValueFormat(OptionFormat.Seconds);
-
- UseLimitOpt = new IntegerOptionItem(Id + 11, "AbilityUseLimit", new(0, 20, 1), 1, TabGroup.CrewmateRoles).SetParent(CustomRoleSpawnChances[CustomRoles.Doormaster])
- .SetValueFormat(OptionFormat.Times);
-
- DoormasterAbilityUseGainWithEachTaskCompleted = new FloatOptionItem(Id + 12, "AbilityUseGainWithEachTaskCompleted", new(0f, 5f, 0.05f), 1f, TabGroup.CrewmateRoles)
- .SetParent(CustomRoleSpawnChances[CustomRoles.Doormaster])
- .SetValueFormat(OptionFormat.Times);
-
- AbilityChargesWhenFinishedTasks = new FloatOptionItem(Id + 13, "AbilityChargesWhenFinishedTasks", new(0f, 5f, 0.05f), 0.2f, TabGroup.CrewmateRoles)
- .SetParent(CustomRoleSpawnChances[CustomRoles.Doormaster])
- .SetValueFormat(OptionFormat.Times);
- }
-
- public override void Init()
- {
- PlayerIdList = [];
- }
-
- public override void Add(byte playerId)
- {
- PlayerIdList.Add(playerId);
- playerId.SetAbilityUseLimit(UseLimitOpt.GetFloat());
- }
-
- public override void Remove(byte playerId)
- {
- PlayerIdList.Remove(playerId);
- }
-
- public override void ApplyGameOptions(IGameOptions opt, byte playerId)
- {
- if (UsePets.GetBool()) return;
-
- AURoleOptions.EngineerCooldown = VentCooldown.GetFloat();
- AURoleOptions.EngineerInVentMaxTime = 1f;
- }
-
- public override void OnPet(PlayerControl pc)
- {
- OpenDoors(pc);
- }
-
- public override void OnEnterVent(PlayerControl pc, Vent vent)
- {
- OpenDoors(pc);
- }
-
- private static void OpenDoors(PlayerControl pc)
- {
- if (pc == null) return;
-
- if (!pc.Is(CustomRoles.Doormaster)) return;
-
- if (pc.GetAbilityUseLimit() >= 1)
- {
- pc.RpcRemoveAbilityUse();
- DoorsReset.OpenAllDoors();
- }
- else
- pc.Notify(Translator.GetString("OutOfAbilityUsesDoMoreTasks"));
- }
-
- public override bool CanUseVent(PlayerControl pc, int ventId)
- {
- return !IsThisRole(pc) || pc.Is(CustomRoles.Nimble) || pc.GetClosestVent()?.Id == ventId;
- }
-}
\ No newline at end of file
diff --git a/Roles/Crewmate/Monitor.cs b/Roles/Crewmate/Monitor.cs
index 488c1dd07..921757815 100644
--- a/Roles/Crewmate/Monitor.cs
+++ b/Roles/Crewmate/Monitor.cs
@@ -6,6 +6,11 @@ internal class Monitor : RoleBase
public static OptionItem CanCheckCamera;
public static OptionItem CanVent;
+ public static OptionItem VentCooldown;
+ public static OptionItem UseLimitOpt;
+ public static OptionItem AbilityUseGainWithEachTaskCompleted;
+ public static OptionItem AbilityChargesWhenFinishedTasks;
+
public static bool On;
public override bool IsEnable => On;
@@ -18,6 +23,7 @@ internal class Monitor : RoleBase
public override void Add(byte playerId)
{
On = true;
+ playerId.SetAbilityUseLimit(UseLimitOpt.GetFloat());
}
public override void SetupCustomOption()
@@ -27,7 +33,23 @@ internal class Monitor : RoleBase
CanCheckCamera = new BooleanOptionItem(Id + 10, "CanCheckCamera", true, TabGroup.CrewmateRoles)
.SetParent(Options.CustomRoleSpawnChances[CustomRoles.Monitor]);
- CanVent = new BooleanOptionItem(Id + 14, "CanVent", true, TabGroup.CrewmateRoles)
+ CanVent = new BooleanOptionItem(Id + 14, "CanVent", false, TabGroup.CrewmateRoles)
.SetParent(Options.CustomRoleSpawnChances[CustomRoles.Monitor]);
+
+ VentCooldown = new FloatOptionItem(Id + 15, "AbilityCooldown", new(0f, 70f, 1f), 15f, TabGroup.CrewmateRoles)
+ .SetParent(Options.CustomRoleSpawnChances[CustomRoles.Monitor])
+ .SetValueFormat(OptionFormat.Seconds);
+
+ UseLimitOpt = new IntegerOptionItem(Id + 11, "AbilityUseLimit", new(0, 20, 1), 1, TabGroup.CrewmateRoles)
+ .SetParent(Options.CustomRoleSpawnChances[CustomRoles.Monitor])
+ .SetValueFormat(OptionFormat.Times);
+
+ AbilityUseGainWithEachTaskCompleted = new FloatOptionItem(Id + 12, "AbilityUseGainWithEachTaskCompleted", new(0f, 5f, 0.05f), 1f, TabGroup.CrewmateRoles)
+ .SetParent(Options.CustomRoleSpawnChances[CustomRoles.Monitor])
+ .SetValueFormat(OptionFormat.Times);
+
+ AbilityChargesWhenFinishedTasks = new FloatOptionItem(Id + 13, "AbilityChargesWhenFinishedTasks", new(0f, 5f, 0.05f), 0.5f, TabGroup.CrewmateRoles)
+ .SetParent(Options.CustomRoleSpawnChances[CustomRoles.Monitor])
+ .SetValueFormat(OptionFormat.Times);
}
}
\ No newline at end of file
diff --git a/Roles/Crewmate/Randomizer.cs b/Roles/Crewmate/Randomizer.cs
index a72133501..17ad31da9 100644
--- a/Roles/Crewmate/Randomizer.cs
+++ b/Roles/Crewmate/Randomizer.cs
@@ -343,7 +343,7 @@ internal static class EffectExtenstions
}
break;
- case Effect.GhostPlayer when TimeSinceLastMeeting > Options.DefaultKillCooldown:
+ case Effect.GhostPlayer when TimeSinceLastMeeting > Options.AdjustedDefaultKillCooldown:
{
PlayerControl killer = PickRandomPlayer();
PlayerControl[] allPc = Main.AllAlivePlayerControls.Where(x => x.PlayerId != killer.PlayerId).ToArray();
diff --git a/Roles/Impostor/AntiAdminer.cs b/Roles/Impostor/AntiAdminer.cs
index add8b4a65..9a9b93f09 100644
--- a/Roles/Impostor/AntiAdminer.cs
+++ b/Roles/Impostor/AntiAdminer.cs
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using AmongUs.GameOptions;
+using EHR.Modules;
using Monitor = EHR.Crewmate.Monitor;
namespace EHR.Impostor;
@@ -109,8 +110,10 @@ internal class AntiAdminer : RoleBase
return;
}
- AURoleOptions.EngineerCooldown = 0f;
- AURoleOptions.EngineerInVentMaxTime = 0f;
+ bool canVent = Monitor.CanVent.GetBool();
+
+ AURoleOptions.EngineerCooldown = canVent ? 0f : Monitor.VentCooldown.GetFloat();
+ AURoleOptions.EngineerInVentMaxTime = canVent ? 0f : 1f;
}
public override void OnFixedUpdate(PlayerControl player)
@@ -146,7 +149,7 @@ internal class AntiAdminer : RoleBase
Dictionary> oldPlayersNearDevices = PlayersNearDevices.ToDictionary(x => x.Key, x => x.Value);
PlayersNearDevices = [];
- bool Admin = false, Camera = false, DoorLog = false, Vital = false;
+ bool admin = false, camera = false, doorLog = false, vital = false;
float usableDistance = DisableDevice.UsableDistance;
foreach (PlayerControl pc in Main.AllAlivePlayerControls)
@@ -155,108 +158,108 @@ internal class AntiAdminer : RoleBase
try
{
- Vector2 PlayerPos = pc.Pos();
+ Vector2 playerPos = pc.Pos();
switch (Main.NormalOptions.MapId)
{
case 0:
- if (!Options.DisableSkeldAdmin.GetBool() && Vector2.Distance(PlayerPos, DisableDevice.DevicePos["SkeldAdmin"]) <= usableDistance)
+ if (!Options.DisableSkeldAdmin.GetBool() && Vector2.Distance(playerPos, DisableDevice.DevicePos["SkeldAdmin"]) <= usableDistance)
{
- Admin = true;
+ admin = true;
AddDeviceUse(pc.PlayerId, Device.Admin);
}
- if (!Options.DisableSkeldCamera.GetBool() && Vector2.Distance(PlayerPos, DisableDevice.DevicePos["SkeldCamera"]) <= usableDistance)
+ if (!Options.DisableSkeldCamera.GetBool() && Vector2.Distance(playerPos, DisableDevice.DevicePos["SkeldCamera"]) <= usableDistance)
{
- Camera = true;
+ camera = true;
AddDeviceUse(pc.PlayerId, Device.Camera);
}
break;
case 1:
- if (!Options.DisableMiraHQAdmin.GetBool() && Vector2.Distance(PlayerPos, DisableDevice.DevicePos["MiraHQAdmin"]) <= usableDistance)
+ if (!Options.DisableMiraHQAdmin.GetBool() && Vector2.Distance(playerPos, DisableDevice.DevicePos["MiraHQAdmin"]) <= usableDistance)
{
- Admin = true;
+ admin = true;
AddDeviceUse(pc.PlayerId, Device.Admin);
}
- if (!Options.DisableMiraHQDoorLog.GetBool() && Vector2.Distance(PlayerPos, DisableDevice.DevicePos["MiraHQDoorLog"]) <= usableDistance)
+ if (!Options.DisableMiraHQDoorLog.GetBool() && Vector2.Distance(playerPos, DisableDevice.DevicePos["MiraHQDoorLog"]) <= usableDistance)
{
- DoorLog = true;
+ doorLog = true;
AddDeviceUse(pc.PlayerId, Device.DoorLog);
}
break;
case 2:
- if (!Options.DisablePolusAdmin.GetBool() && (Vector2.Distance(PlayerPos, DisableDevice.DevicePos["PolusLeftAdmin"]) <= usableDistance || Vector2.Distance(PlayerPos, DisableDevice.DevicePos["PolusRightAdmin"]) <= usableDistance))
+ if (!Options.DisablePolusAdmin.GetBool() && (Vector2.Distance(playerPos, DisableDevice.DevicePos["PolusLeftAdmin"]) <= usableDistance || Vector2.Distance(playerPos, DisableDevice.DevicePos["PolusRightAdmin"]) <= usableDistance))
{
- Admin = true;
+ admin = true;
AddDeviceUse(pc.PlayerId, Device.Admin);
}
- if (!Options.DisablePolusCamera.GetBool() && Vector2.Distance(PlayerPos, DisableDevice.DevicePos["PolusCamera"]) <= usableDistance)
+ if (!Options.DisablePolusCamera.GetBool() && Vector2.Distance(playerPos, DisableDevice.DevicePos["PolusCamera"]) <= usableDistance)
{
- Camera = true;
+ camera = true;
AddDeviceUse(pc.PlayerId, Device.Camera);
}
- if (!Options.DisablePolusVital.GetBool() && Vector2.Distance(PlayerPos, DisableDevice.DevicePos["PolusVital"]) <= usableDistance)
+ if (!Options.DisablePolusVital.GetBool() && Vector2.Distance(playerPos, DisableDevice.DevicePos["PolusVital"]) <= usableDistance)
{
- Vital = true;
+ vital = true;
AddDeviceUse(pc.PlayerId, Device.Vitals);
}
break;
case 3:
- if (!Options.DisableSkeldAdmin.GetBool() && Vector2.Distance(PlayerPos, DisableDevice.DevicePos["DleksAdmin"]) <= usableDistance)
+ if (!Options.DisableSkeldAdmin.GetBool() && Vector2.Distance(playerPos, DisableDevice.DevicePos["DleksAdmin"]) <= usableDistance)
{
- Admin = true;
+ admin = true;
AddDeviceUse(pc.PlayerId, Device.Admin);
}
- if (!Options.DisableSkeldCamera.GetBool() && Vector2.Distance(PlayerPos, DisableDevice.DevicePos["DleksCamera"]) <= usableDistance)
+ if (!Options.DisableSkeldCamera.GetBool() && Vector2.Distance(playerPos, DisableDevice.DevicePos["DleksCamera"]) <= usableDistance)
{
- Camera = true;
+ camera = true;
AddDeviceUse(pc.PlayerId, Device.Camera);
}
break;
case 4:
- if (!Options.DisableAirshipCockpitAdmin.GetBool() && Vector2.Distance(PlayerPos, DisableDevice.DevicePos["AirshipCockpitAdmin"]) <= usableDistance)
+ if (!Options.DisableAirshipCockpitAdmin.GetBool() && Vector2.Distance(playerPos, DisableDevice.DevicePos["AirshipCockpitAdmin"]) <= usableDistance)
{
- Admin = true;
+ admin = true;
AddDeviceUse(pc.PlayerId, Device.Admin);
}
- if (!Options.DisableAirshipRecordsAdmin.GetBool() && Vector2.Distance(PlayerPos, DisableDevice.DevicePos["AirshipRecordsAdmin"]) <= usableDistance)
+ if (!Options.DisableAirshipRecordsAdmin.GetBool() && Vector2.Distance(playerPos, DisableDevice.DevicePos["AirshipRecordsAdmin"]) <= usableDistance)
{
- Admin = true;
+ admin = true;
AddDeviceUse(pc.PlayerId, Device.Admin);
}
- if (!Options.DisableAirshipCamera.GetBool() && Vector2.Distance(PlayerPos, DisableDevice.DevicePos["AirshipCamera"]) <= usableDistance)
+ if (!Options.DisableAirshipCamera.GetBool() && Vector2.Distance(playerPos, DisableDevice.DevicePos["AirshipCamera"]) <= usableDistance)
{
- Camera = true;
+ camera = true;
AddDeviceUse(pc.PlayerId, Device.Camera);
}
- if (!Options.DisableAirshipVital.GetBool() && Vector2.Distance(PlayerPos, DisableDevice.DevicePos["AirshipVital"]) <= usableDistance)
+ if (!Options.DisableAirshipVital.GetBool() && Vector2.Distance(playerPos, DisableDevice.DevicePos["AirshipVital"]) <= usableDistance)
{
- Vital = true;
+ vital = true;
AddDeviceUse(pc.PlayerId, Device.Vitals);
}
break;
case 5:
- if (!Options.DisableFungleCamera.GetBool() && Vector2.Distance(PlayerPos, DisableDevice.DevicePos["FungleCamera"]) <= usableDistance)
+ if (!Options.DisableFungleCamera.GetBool() && Vector2.Distance(playerPos, DisableDevice.DevicePos["FungleCamera"]) <= usableDistance)
{
- Camera = true;
+ camera = true;
AddDeviceUse(pc.PlayerId, Device.Camera);
}
- if (!Options.DisableFungleVital.GetBool() && Vector2.Distance(PlayerPos, DisableDevice.DevicePos["FungleVital"]) <= usableDistance)
+ if (!Options.DisableFungleVital.GetBool() && Vector2.Distance(playerPos, DisableDevice.DevicePos["FungleVital"]) <= usableDistance)
{
- Vital = true;
+ vital = true;
AddDeviceUse(pc.PlayerId, Device.Vitals);
}
@@ -268,17 +271,17 @@ internal class AntiAdminer : RoleBase
var change = false;
- change |= IsAdminWatch != Admin;
- IsAdminWatch = Admin;
- change |= IsVitalWatch != Vital;
- IsVitalWatch = Vital;
- change |= IsDoorLogWatch != DoorLog;
- IsDoorLogWatch = DoorLog;
+ change |= IsAdminWatch != admin;
+ IsAdminWatch = admin;
+ change |= IsVitalWatch != vital;
+ IsVitalWatch = vital;
+ change |= IsDoorLogWatch != doorLog;
+ IsDoorLogWatch = doorLog;
if (IsMonitor ? Monitor.CanCheckCamera.GetBool() : CanCheckCamera.GetBool())
{
- change |= IsCameraWatch != Camera;
- IsCameraWatch = Camera;
+ change |= IsCameraWatch != camera;
+ IsCameraWatch = camera;
}
if (IsMonitor) notify |= oldPlayersNearDevices.Count != PlayersNearDevices.Count || oldPlayersNearDevices.Any(x => !PlayersNearDevices.TryGetValue(x.Key, out HashSet c) || !x.Value.SetEquals(c));
@@ -297,6 +300,37 @@ internal class AntiAdminer : RoleBase
}
}
+ public override void OnPet(PlayerControl pc)
+ {
+ if (!IsMonitor) return;
+ OpenDoors(pc);
+ }
+
+ public override void OnEnterVent(PlayerControl pc, Vent vent)
+ {
+ if (!IsMonitor) return;
+ OpenDoors(pc);
+ }
+
+ private void OpenDoors(PlayerControl pc)
+ {
+ if (!IsMonitor) return;
+ if (pc == null) return;
+
+ if (pc.GetAbilityUseLimit() >= 1)
+ {
+ pc.RpcRemoveAbilityUse();
+ DoorsReset.OpenAllDoors();
+ }
+ else
+ pc.Notify(Translator.GetString("OutOfAbilityUsesDoMoreTasks"));
+ }
+
+ public override bool CanUseVent(PlayerControl pc, int ventId)
+ {
+ return !pc.Is(CustomRoles.Monitor) || pc.Is(CustomRoles.Nimble) || Monitor.CanVent.GetBool() || pc.GetClosestVent()?.Id == ventId;
+ }
+
public override string GetSuffix(PlayerControl seer, PlayerControl target, bool hud = false, bool meeting = false)
{
if (Main.PlayerStates[seer.PlayerId].Role is AntiAdminer self && seer.PlayerId == target.PlayerId && self.AntiAdminerId == seer.PlayerId)
diff --git a/Roles/Impostor/Assassin.cs b/Roles/Impostor/Assassin.cs
index 1fbae7145..43954339d 100644
--- a/Roles/Impostor/Assassin.cs
+++ b/Roles/Impostor/Assassin.cs
@@ -95,7 +95,7 @@ internal class Assassin : RoleBase
public override void SetKillCooldown(byte id)
{
- Main.AllPlayerKillCooldown[id] = id.IsPlayerShifted() ? DefaultKillCooldown : MarkCooldown;
+ Main.AllPlayerKillCooldown[id] = id.IsPlayerShifted() ? AdjustedDefaultKillCooldown : MarkCooldown;
}
public override void ApplyGameOptions(IGameOptions opt, byte id)
@@ -173,7 +173,7 @@ internal class Assassin : RoleBase
SendRPC(pc.PlayerId);
pc.ResetKillCooldown();
pc.SyncSettings();
- pc.SetKillCooldown(DefaultKillCooldown);
+ pc.SetKillCooldown(AdjustedDefaultKillCooldown);
}
else if (!tpSuccess) pc.Notify(GetString("TargetCannotBeTeleported"));
}
diff --git a/Roles/Impostor/BountyHunter.cs b/Roles/Impostor/BountyHunter.cs
index 6a301ae99..7c752d8fc 100644
--- a/Roles/Impostor/BountyHunter.cs
+++ b/Roles/Impostor/BountyHunter.cs
@@ -207,7 +207,7 @@ public class BountyHunter : RoleBase
if (Utils.GetPlayerById(id).GetCustomRole() == CustomRoles.BountyHunter)
{
- Main.AllPlayerKillCooldown[id] = Options.DefaultKillCooldown;
+ Main.AllPlayerKillCooldown[id] = Options.AdjustedDefaultKillCooldown;
Utils.GetPlayerById(id).SyncSettings();
}
}
diff --git a/Roles/Impostor/CursedWolf.cs b/Roles/Impostor/CursedWolf.cs
index e5b197a79..121f2d3ef 100644
--- a/Roles/Impostor/CursedWolf.cs
+++ b/Roles/Impostor/CursedWolf.cs
@@ -41,7 +41,7 @@ internal class CursedWolf : RoleBase
}
else
{
- KillCooldown = Options.DefaultKillCooldown;
+ KillCooldown = Options.AdjustedDefaultKillCooldown;
CanVent = true;
HasImpostorVision = true;
KillAttacker = Options.killAttacker.GetBool();
diff --git a/Roles/Impostor/Gangster.cs b/Roles/Impostor/Gangster.cs
index 0449dfffc..159d359d3 100644
--- a/Roles/Impostor/Gangster.cs
+++ b/Roles/Impostor/Gangster.cs
@@ -60,7 +60,7 @@ public class Gangster : RoleBase
public override void SetKillCooldown(byte id)
{
- Main.AllPlayerKillCooldown[id] = CanRecruit(id) ? KillCooldown.GetFloat() : Options.DefaultKillCooldown;
+ Main.AllPlayerKillCooldown[id] = CanRecruit(id) ? KillCooldown.GetFloat() : Options.AdjustedDefaultKillCooldown;
}
public static bool CanRecruit(byte id)
diff --git a/Roles/Impostor/Mafioso.cs b/Roles/Impostor/Mafioso.cs
index 30be60756..4a44bd99d 100644
--- a/Roles/Impostor/Mafioso.cs
+++ b/Roles/Impostor/Mafioso.cs
@@ -108,9 +108,9 @@ public class Mafioso : RoleBase
{
Main.AllPlayerKillCooldown[playerId] = Tier switch
{
- 0 => (float)Math.Round(DefaultKillCooldown * 1.25, 2),
- 1 => DefaultKillCooldown,
- 2 => (float)Math.Round(DefaultKillCooldown * 0.85, 2),
+ 0 => (float)Math.Round(AdjustedDefaultKillCooldown * 1.25, 2),
+ 1 => AdjustedDefaultKillCooldown,
+ 2 => (float)Math.Round(AdjustedDefaultKillCooldown * 0.85, 2),
_ => 1f
};
}
@@ -206,7 +206,7 @@ public class Mafioso : RoleBase
if (Pistol1CD > 0 && Pistol2CD > 0) return false;
- int KCD = Tier >= 4 ? (int)Math.Round(DefaultKillCooldown) : (int)Math.Round(DefaultKillCooldown * 1.5);
+ int KCD = Tier >= 4 ? (int)Math.Round(AdjustedDefaultKillCooldown) : (int)Math.Round(AdjustedDefaultKillCooldown * 1.5);
KCD++;
if (Pistol1CD <= 0)
@@ -241,7 +241,7 @@ public class Mafioso : RoleBase
if (!IsEnable) return;
PreviouslyUsedVents.Clear();
- int KCD = Tier >= 4 ? (int)Math.Round(DefaultKillCooldown) : (int)Math.Round(DefaultKillCooldown * 1.5);
+ int KCD = Tier >= 4 ? (int)Math.Round(AdjustedDefaultKillCooldown) : (int)Math.Round(AdjustedDefaultKillCooldown * 1.5);
KCD++;
Pistol1CD = KCD;
Pistol2CD = KCD;
diff --git a/Roles/Impostor/Mastermind.cs b/Roles/Impostor/Mastermind.cs
index 6e3467502..218db008c 100644
--- a/Roles/Impostor/Mastermind.cs
+++ b/Roles/Impostor/Mastermind.cs
@@ -188,7 +188,7 @@ public class Mastermind : RoleBase
LateTask.New(() =>
{
- float kcd = TempKCDs.TryGetValue(killer.PlayerId, out float cd) ? cd : Main.AllPlayerKillCooldown.GetValueOrDefault(killer.PlayerId, DefaultKillCooldown);
+ float kcd = TempKCDs.TryGetValue(killer.PlayerId, out float cd) ? cd : Main.AllPlayerKillCooldown.GetValueOrDefault(killer.PlayerId, AdjustedDefaultKillCooldown);
killer.SetKillCooldown(kcd);
TempKCDs.Remove(killer.PlayerId);
}, 0.1f, "Set KCD for Manipulated Kill");
diff --git a/Roles/Impostor/Overheat.cs b/Roles/Impostor/Overheat.cs
index ca2c24369..2c37a8b9d 100644
--- a/Roles/Impostor/Overheat.cs
+++ b/Roles/Impostor/Overheat.cs
@@ -89,7 +89,7 @@ public class Overheat : RoleBase
public override void SetKillCooldown(byte id)
{
- float kcd = Options.DefaultKillCooldown;
+ float kcd = Options.AdjustedDefaultKillCooldown;
kcd -= KCDDecreasePerIncreasedTemperature.GetFloat() * (Temperature - StartingTemperature);
Main.AllPlayerKillCooldown[id] = kcd;
}
diff --git a/Roles/Impostor/Penguin.cs b/Roles/Impostor/Penguin.cs
index f94c2c30d..fdbbd5639 100644
--- a/Roles/Impostor/Penguin.cs
+++ b/Roles/Impostor/Penguin.cs
@@ -86,7 +86,7 @@ public class Penguin : RoleBase
MeetingKill = OptionMeetingKill.GetBool();
SpeedDuringDrag = OptionSpeedDuringDrag.GetFloat();
VictimCanUseAbilities = OptionVictimCanUseAbilities.GetBool();
- Cooldown = Options.DefaultKillCooldown;
+ Cooldown = Options.AdjustedDefaultKillCooldown;
}
else
{
diff --git a/Roles/Impostor/Sniper.cs b/Roles/Impostor/Sniper.cs
index f9ee8b7a8..029bc118a 100644
--- a/Roles/Impostor/Sniper.cs
+++ b/Roles/Impostor/Sniper.cs
@@ -279,7 +279,7 @@ public class Sniper : RoleBase
public override void ApplyGameOptions(IGameOptions opt, byte playerId)
{
if (Options.UsePhantomBasis.GetBool())
- AURoleOptions.PhantomCooldown = bulletCount > 0 ? Options.DefaultKillCooldown : 255f;
+ AURoleOptions.PhantomCooldown = bulletCount > 0 ? Options.AdjustedDefaultKillCooldown : 255f;
else
{
if (Options.UsePets.GetBool()) return;
diff --git a/Roles/Impostor/Wildling.cs b/Roles/Impostor/Wildling.cs
index c9badbaf2..e18d92c76 100644
--- a/Roles/Impostor/Wildling.cs
+++ b/Roles/Impostor/Wildling.cs
@@ -81,7 +81,7 @@ public class Wildling : RoleBase
ShapeshiftCD = ShapeshiftCDOpt.GetFloat();
ShapeshiftDur = ShapeshiftDurOpt.GetFloat();
HasImpostorVision = true;
- KillCooldown = DefaultKillCooldown;
+ KillCooldown = AdjustedDefaultKillCooldown;
break;
case CustomRoles.BloodKnight:
ProtectionDuration = BloodKnight.ProtectDuration.GetFloat();
diff --git a/Roles/Neutral/DarkHide.cs b/Roles/Neutral/DarkHide.cs
index 219ea9ec5..ef1ed1ea6 100644
--- a/Roles/Neutral/DarkHide.cs
+++ b/Roles/Neutral/DarkHide.cs
@@ -17,7 +17,7 @@ public class DarkHide : RoleBase
private static OptionItem CanVent;
public static OptionItem SnatchesWin;
- private float CurrentKillCooldown = Options.DefaultKillCooldown;
+ private float CurrentKillCooldown = Options.AdjustedDefaultKillCooldown;
public bool IsWinKill;
public override bool IsEnable => PlayerIdList.Count > 0;
diff --git a/Roles/Neutral/Gaslighter.cs b/Roles/Neutral/Gaslighter.cs
index 8022aae51..e13f53215 100644
--- a/Roles/Neutral/Gaslighter.cs
+++ b/Roles/Neutral/Gaslighter.cs
@@ -74,9 +74,9 @@ public class Gaslighter : RoleBase
{
Round.Kill => KillCooldown.GetFloat(),
Round.Knight => Monarch.KnightCooldown.GetFloat(),
- Round.Curse => Options.DefaultKillCooldown,
+ Round.Curse => Options.AdjustedDefaultKillCooldown,
Round.Shield => Medic.CD.GetFloat(),
- _ => Options.DefaultKillCooldown
+ _ => Options.AdjustedDefaultKillCooldown
};
}
diff --git a/Roles/Neutral/Glitch.cs b/Roles/Neutral/Glitch.cs
index cee3d2a4d..89cc80097 100644
--- a/Roles/Neutral/Glitch.cs
+++ b/Roles/Neutral/Glitch.cs
@@ -1,6 +1,4 @@
-using System;
using System.Collections.Generic;
-using System.Linq;
using AmongUs.GameOptions;
using EHR.Modules;
using Hazel;
@@ -25,15 +23,10 @@ public class Glitch : RoleBase
private byte GlitchId;
public int HackCDTimer;
- private bool HasMimiced;
- private bool IsShifted;
public int KCDTimer;
public long LastHack;
public long LastKill;
- public long LastMimic;
private long LastUpdate;
- public int MimicCDTimer;
- public int MimicDurTimer;
public override bool IsEnable => PlayerIdList.Count > 0;
@@ -41,24 +34,34 @@ public class Glitch : RoleBase
{
SetupRoleOptions(Id, TabGroup.NeutralRoles, CustomRoles.Glitch);
- KillCooldown = new IntegerOptionItem(Id + 10, "KillCooldown", new(0, 180, 1), 25, TabGroup.NeutralRoles).SetParent(CustomRoleSpawnChances[CustomRoles.Glitch])
+ KillCooldown = new IntegerOptionItem(Id + 10, "KillCooldown", new(0, 180, 1), 25, TabGroup.NeutralRoles)
+ .SetParent(CustomRoleSpawnChances[CustomRoles.Glitch])
.SetValueFormat(OptionFormat.Seconds);
- HackCooldown = new IntegerOptionItem(Id + 11, "HackCooldown", new(0, 180, 1), 20, TabGroup.NeutralRoles).SetParent(CustomRoleSpawnChances[CustomRoles.Glitch])
+ HackCooldown = new IntegerOptionItem(Id + 11, "HackCooldown", new(0, 180, 1), 20, TabGroup.NeutralRoles)
+ .SetParent(CustomRoleSpawnChances[CustomRoles.Glitch])
.SetValueFormat(OptionFormat.Seconds);
- HackDuration = new FloatOptionItem(Id + 14, "HackDuration", new(0f, 60f, 1f), 15f, TabGroup.NeutralRoles).SetParent(CustomRoleSpawnChances[CustomRoles.Glitch])
+ HackDuration = new FloatOptionItem(Id + 14, "HackDuration", new(0f, 60f, 1f), 15f, TabGroup.NeutralRoles)
+ .SetParent(CustomRoleSpawnChances[CustomRoles.Glitch])
.SetValueFormat(OptionFormat.Seconds);
- MimicCooldown = new IntegerOptionItem(Id + 15, "MimicCooldown", new(0, 180, 1), 30, TabGroup.NeutralRoles).SetParent(CustomRoleSpawnChances[CustomRoles.Glitch])
+ MimicCooldown = new IntegerOptionItem(Id + 15, "MimicCooldown", new(0, 180, 1), 30, TabGroup.NeutralRoles)
+ .SetParent(CustomRoleSpawnChances[CustomRoles.Glitch])
.SetValueFormat(OptionFormat.Seconds);
- MimicDuration = new FloatOptionItem(Id + 16, "MimicDuration", new(0f, 60f, 1f), 10f, TabGroup.NeutralRoles).SetParent(CustomRoleSpawnChances[CustomRoles.Glitch])
+ MimicDuration = new FloatOptionItem(Id + 16, "MimicDuration", new(0f, 60f, 1f), 10f, TabGroup.NeutralRoles)
+ .SetParent(CustomRoleSpawnChances[CustomRoles.Glitch])
.SetValueFormat(OptionFormat.Seconds);
- CanVent = new BooleanOptionItem(Id + 12, "CanVent", true, TabGroup.NeutralRoles).SetParent(CustomRoleSpawnChances[CustomRoles.Glitch]);
- CanVote = new BooleanOptionItem(Id + 17, "CanVote", true, TabGroup.NeutralRoles).SetParent(CustomRoleSpawnChances[CustomRoles.Glitch]);
- HasImpostorVision = new BooleanOptionItem(Id + 13, "ImpostorVision", true, TabGroup.NeutralRoles).SetParent(CustomRoleSpawnChances[CustomRoles.Glitch]);
+ CanVent = new BooleanOptionItem(Id + 12, "CanVent", true, TabGroup.NeutralRoles)
+ .SetParent(CustomRoleSpawnChances[CustomRoles.Glitch]);
+
+ CanVote = new BooleanOptionItem(Id + 17, "CanVote", true, TabGroup.NeutralRoles)
+ .SetParent(CustomRoleSpawnChances[CustomRoles.Glitch]);
+
+ HasImpostorVision = new BooleanOptionItem(Id + 13, "ImpostorVision", true, TabGroup.NeutralRoles)
+ .SetParent(CustomRoleSpawnChances[CustomRoles.Glitch]);
}
public override void Init()
@@ -74,20 +77,13 @@ public class Glitch : RoleBase
HackCDTimer = 10;
KCDTimer = 10;
- MimicCDTimer = 10;
- MimicDurTimer = 0;
-
- IsShifted = false;
long ts = Utils.TimeStamp;
LastKill = ts;
LastHack = ts;
- LastMimic = ts;
LastUpdate = ts;
-
- HasMimiced = false;
}
public override void Remove(byte playerId)
@@ -117,8 +113,6 @@ public class Glitch : RoleBase
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SyncGlitchTimers, SendOption.Reliable);
writer.Write(GlitchId);
- writer.Write(MimicCDTimer);
- writer.Write(MimicDurTimer);
writer.Write(HackCDTimer);
writer.Write(KCDTimer);
AmongUsClient.Instance.FinishRpcImmediately(writer);
@@ -129,8 +123,6 @@ public class Glitch : RoleBase
byte id = reader.ReadByte();
if (Main.PlayerStates[id].Role is not Glitch gc) return;
- gc.MimicCDTimer = reader.ReadInt32();
- gc.MimicDurTimer = reader.ReadInt32();
gc.HackCDTimer = reader.ReadInt32();
gc.KCDTimer = reader.ReadInt32();
}
@@ -143,37 +135,9 @@ public class Glitch : RoleBase
public override void ApplyGameOptions(IGameOptions opt, byte id)
{
opt.SetVision(HasImpostorVision.GetBool());
- }
- private void Mimic(PlayerControl pc)
- {
- if (pc == null || !pc.Is(CustomRoles.Glitch) || !pc.IsAlive() || MimicCDTimer > 0 || IsShifted) return;
-
- PlayerControl[] playerlist = Main.AllAlivePlayerControls.Where(a => a.PlayerId != pc.PlayerId).ToArray();
-
- try
- {
- pc.RpcShapeshift(playerlist.RandomElement(), false);
-
- IsShifted = true;
- HasMimiced = true;
- LastMimic = Utils.TimeStamp;
- MimicCDTimer = MimicCooldown.GetInt();
- MimicDurTimer = MimicDuration.GetInt();
- SendRPCSyncTimers();
- }
- catch (Exception ex) { Logger.Error(ex.ToString(), "Glitch.Mimic.RpcShapeshift"); }
- }
-
- public override void OnPet(PlayerControl pc)
- {
- Mimic(pc);
- }
-
- public override bool OnSabotage(PlayerControl pc)
- {
- Mimic(pc);
- return false;
+ AURoleOptions.ShapeshifterCooldown = MimicCooldown.GetInt();
+ AURoleOptions.ShapeshifterDuration = MimicDuration.GetInt();
}
public override bool OnCheckMurder(PlayerControl killer, PlayerControl target)
@@ -211,8 +175,6 @@ public class Glitch : RoleBase
if (HackCDTimer is > 180 or < 0) HackCDTimer = 0;
if (KCDTimer is > 180 or < 0) KCDTimer = 0;
- if (MimicCDTimer is > 180 or < 0) MimicCDTimer = 0;
- if (MimicDurTimer is > 180 or < 0) MimicDurTimer = 0;
if (player == null) return;
@@ -220,32 +182,10 @@ public class Glitch : RoleBase
{
HackCDTimer = 0;
KCDTimer = 0;
- MimicCDTimer = 0;
- MimicDurTimer = 0;
return;
}
- if (MimicDurTimer > 0)
- {
- try { MimicDurTimer = (int)(MimicDuration.GetInt() - (now - LastMimic)); }
- catch { MimicDurTimer = 0; }
-
- if (MimicDurTimer > 180) MimicDurTimer = 0;
- }
-
- if ((MimicDurTimer <= 0 || !GameStates.IsInTask) && IsShifted)
- {
- try
- {
- player.RpcShapeshift(player, false);
- IsShifted = false;
- }
- catch (Exception ex) { Logger.Error(ex.ToString(), "Glitch.Mimic.RpcRevertShapeshift"); }
-
- if (!GameStates.IsInTask) MimicDurTimer = 0;
- }
-
- if (HackCDTimer <= 0 && KCDTimer <= 0 && MimicCDTimer <= 0 && MimicDurTimer <= 0) return;
+ if (HackCDTimer <= 0 && KCDTimer <= 0) return;
try { HackCDTimer = (int)(HackCooldown.GetInt() - (now - LastHack)); }
catch { HackCDTimer = 0; }
@@ -257,11 +197,6 @@ public class Glitch : RoleBase
if (KCDTimer is > 180 or < 0) KCDTimer = 0;
- try { MimicCDTimer = (int)(MimicCooldown.GetInt() + (HasMimiced ? MimicDuration.GetInt() : 0) - (now - LastMimic)); }
- catch { MimicCDTimer = 0; }
-
- if (MimicCDTimer is > 180 or < 0) MimicCDTimer = 0;
-
if (player.IsNonHostModdedClient())
SendRPCSyncTimers();
@@ -276,8 +211,6 @@ public class Glitch : RoleBase
if (!hud) sb.Append("");
- if (MimicDurTimer > 0) sb.Append($"{string.Format(Translator.GetString("MimicDur"), MimicDurTimer)}\n");
- if (MimicCDTimer > 0 && MimicDurTimer <= 0) sb.Append($"{string.Format(Translator.GetString("MimicCD"), MimicCDTimer)}\n");
if (HackCDTimer > 0) sb.Append($"{string.Format(Translator.GetString("HackCD"), HackCDTimer)}\n");
if (KCDTimer > 0) sb.Append($"{string.Format(Translator.GetString("KCD"), KCDTimer)}\n");
@@ -293,15 +226,8 @@ public class Glitch : RoleBase
long timestamp = Utils.TimeStamp;
LastKill = timestamp;
LastHack = timestamp;
- LastMimic = timestamp;
KCDTimer = 10;
HackCDTimer = 10;
- MimicCDTimer = 10;
SendRPCSyncTimers();
}
-
- public override void OnReportDeadBody()
- {
- HasMimiced = false;
- }
}
\ No newline at end of file
diff --git a/Roles/Neutral/HeadHunter.cs b/Roles/Neutral/HeadHunter.cs
index a21a9e223..d324d089e 100644
--- a/Roles/Neutral/HeadHunter.cs
+++ b/Roles/Neutral/HeadHunter.cs
@@ -22,7 +22,7 @@ public class HeadHunter : RoleBase
private static OptionItem MinKCD;
private static OptionItem MaxKCD;
private byte HeadHunterId;
- public float KCD = DefaultKillCooldown;
+ public float KCD = AdjustedDefaultKillCooldown;
public List Targets = [];
diff --git a/Roles/Neutral/PlagueDoctor.cs b/Roles/Neutral/PlagueDoctor.cs
index e680b46f6..8d209ffd1 100644
--- a/Roles/Neutral/PlagueDoctor.cs
+++ b/Roles/Neutral/PlagueDoctor.cs
@@ -99,7 +99,7 @@ public class PlagueDoctor : RoleBase
public override void SetKillCooldown(byte id)
{
- Main.AllPlayerKillCooldown[id] = Options.DefaultKillCooldown;
+ Main.AllPlayerKillCooldown[id] = Options.AdjustedDefaultKillCooldown;
}
public override bool CanUseKillButton(PlayerControl pc)
diff --git a/Roles/Neutral/Provocateur.cs b/Roles/Neutral/Provocateur.cs
index 0c66fccb0..512c0a6c1 100644
--- a/Roles/Neutral/Provocateur.cs
+++ b/Roles/Neutral/Provocateur.cs
@@ -42,7 +42,7 @@ internal class Provocateur : RoleBase
public override void SetKillCooldown(byte id)
{
- Main.AllPlayerKillCooldown[id] = Options.DefaultKillCooldown;
+ Main.AllPlayerKillCooldown[id] = Options.AdjustedDefaultKillCooldown;
}
public override void ApplyGameOptions(IGameOptions opt, byte playerId)
diff --git a/Roles/Neutral/Rogue.cs b/Roles/Neutral/Rogue.cs
index d3236f286..70bbb39ff 100644
--- a/Roles/Neutral/Rogue.cs
+++ b/Roles/Neutral/Rogue.cs
@@ -95,7 +95,7 @@ public class Rogue : RoleBase
{
if (GotRewards.Contains(Reward.Morph) && MorphCooldown <= 0)
{
- MorphCooldown = 15 + (int)Options.DefaultKillCooldown;
+ MorphCooldown = 15 + (int)Options.AdjustedDefaultKillCooldown;
Utils.SendRPC(CustomRPC.SyncRoleData, pc.PlayerId, 2, MorphCooldown);
PlayerControl target = Main.AllAlivePlayerControls.Except([pc]).RandomElement();
pc.RpcShapeshift(target, !Options.DisableAllShapeshiftAnimations.GetBool());
@@ -167,7 +167,7 @@ public class Rogue : RoleBase
Utils.SendRPC(CustomRPC.SyncRoleData, pc.PlayerId, 2, MorphCooldown);
Utils.NotifyRoles(SpecifySeer: pc, SpecifyTarget: pc);
- if (pc.IsShifted() && MorphCooldown <= Options.DefaultKillCooldown)
+ if (pc.IsShifted() && MorphCooldown <= Options.AdjustedDefaultKillCooldown)
pc.RpcShapeshift(pc, !Options.DisableAllShapeshiftAnimations.GetBool());
}
}
@@ -319,7 +319,7 @@ public class Rogue : RoleBase
if (CurrentTask.IsCompleted) return Translator.GetString("Rogue.TaskCompleted");
- float d = Options.DefaultKillCooldown;
+ float d = Options.AdjustedDefaultKillCooldown;
string c = GotRewards.Contains(Reward.Morph) && MorphCooldown > 0
? MorphCooldown <= d
diff --git a/Roles/RoleBase.cs b/Roles/RoleBase.cs
index da5a5073a..f65e82dfc 100644
--- a/Roles/RoleBase.cs
+++ b/Roles/RoleBase.cs
@@ -46,7 +46,7 @@ public abstract class RoleBase : IComparable
// Some virtual methods that trigger actions, like venting, petting, CheckMurder, etc. These are not abstract because they have a default implementation. These should also have the same name as the methods in the derived classes.
public virtual void SetKillCooldown(byte id)
{
- Main.AllPlayerKillCooldown[id] = Options.DefaultKillCooldown;
+ Main.AllPlayerKillCooldown[id] = Options.AdjustedDefaultKillCooldown;
}
public virtual bool CanUseKillButton(PlayerControl pc)