diff --git a/EHR.csproj b/EHR.csproj index c8b480084..8293250d8 100644 --- a/EHR.csproj +++ b/EHR.csproj @@ -7,7 +7,7 @@ EHR Gurge44 preview - E:\Program Files\AmongUs + D:\Epic Games\AmongUs true True $(MSBuildProjectName) diff --git a/EHR.sln.DotSettings b/EHR.sln.DotSettings index e06d7de04..83fbb799c 100644 --- a/EHR.sln.DotSettings +++ b/EHR.sln.DotSettings @@ -29,4 +29,6 @@ EHR TP UI - VN \ No newline at end of file + VN + False \ No newline at end of file diff --git a/Modules/CustomNetObject.cs b/Modules/CustomNetObject.cs index 0ba2891c8..0b3775bec 100644 --- a/Modules/CustomNetObject.cs +++ b/Modules/CustomNetObject.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using EHR.Roles.Crewmate; using HarmonyLib; using Hazel; using InnerNet; @@ -13,7 +14,7 @@ namespace EHR public class CustomNetObject { private static readonly Dictionary AllObjects = []; - private readonly int Id = Enumerable.Range(0, int.MaxValue).First(id => !AllObjects.ContainsKey(id)); + protected readonly int Id = Enumerable.Range(0, int.MaxValue).First(id => !AllObjects.ContainsKey(id)); private PlayerControl PC; protected void RpcChangeSprite(string sprite) @@ -28,7 +29,7 @@ namespace EHR } */ - protected void Despawn() + public void Despawn() { PC.Despawn(); AllObjects.Remove(Id); @@ -199,7 +200,7 @@ namespace EHR WaitDuration = waitDuration; State = 0; CreateNetObject($"<#c7c7c769>●", position); - foreach (var pc in Main.AllPlayerControls) + foreach (var pc in Main.AllAlivePlayerControls) { if (!visibleList.Contains(pc.PlayerId)) Hide(pc); @@ -222,4 +223,41 @@ namespace EHR } } } + + public class TornadoObject : CustomNetObject + { + private readonly long SpawnTimeStamp; + + public TornadoObject(Vector2 position, List visibleList) + { + SpawnTimeStamp = Utils.TimeStamp; + CreateNetObject("\u2588\u2588<#bababa>\u2588<#bababa>\u2588<#bababa>\u2588<#bababa>\u2588\u2588\u2588
\u2588<#bababa>\u2588<#bababa>\u2588<#8c8c8c>\u2588<#8c8c8c>\u2588<#bababa>\u2588<#bababa>\u2588\u2588
<#bababa>\u2588<#bababa>\u2588<#8c8c8c>\u2588<#8c8c8c>\u2588<#8c8c8c>\u2588<#8c8c8c>\u2588<#bababa>\u2588<#bababa>\u2588
<#bababa>\u2588<#8c8c8c>\u2588<#8c8c8c>\u2588<#636363>\u2588<#636363>\u2588<#8c8c8c>\u2588<#8c8c8c>\u2588<#bababa>\u2588
<#bababa>\u2588<#8c8c8c>\u2588<#8c8c8c>\u2588<#636363>\u2588<#636363>\u2588<#8c8c8c>\u2588<#8c8c8c>\u2588<#bababa>\u2588
<#bababa>\u2588<#bababa>\u2588<#8c8c8c>\u2588<#8c8c8c>\u2588<#8c8c8c>\u2588<#8c8c8c>\u2588<#bababa>\u2588<#bababa>\u2588
\u2588<#bababa>\u2588<#bababa>\u2588<#8c8c8c>\u2588<#8c8c8c>\u2588<#bababa>\u2588<#bababa>\u2588\u2588
\u2588\u2588<#bababa>\u2588<#bababa>\u2588<#bababa>\u2588<#bababa>\u2588\u2588\u2588
", position); + foreach (var pc in Main.AllAlivePlayerControls) + { + if (!visibleList.Contains(pc.PlayerId)) + Hide(pc); + } + } + + protected override void OnFixedUpdate() + { + if (SpawnTimeStamp + Tornado.TornadoDuration.GetInt() < Utils.TimeStamp) + Despawn(); + } + } + + public class PlayerDetector : CustomNetObject + { + public PlayerDetector(Vector2 position, List visibleList, out int id) + { + CreateNetObject("\u2588\u2588<#33e6b0>\u2588\u2588\u2588<#33e6b0>\u2588\u2588\u2588
\u2588<#33e6b0>\u2588\u2588\u2588\u2588\u2588<#33e6b0>\u2588\u2588
<#33e6b0>\u2588\u2588\u2588<#33e6b0>\u2588<#33e6b0>\u2588\u2588\u2588<#33e6b0>\u2588
<#33e6b0>\u2588\u2588<#33e6b0>\u2588<#000000>\u2588<#000000>\u2588<#33e6b0>\u2588\u2588<#33e6b0>\u2588
<#33e6b0>\u2588\u2588<#33e6b0>\u2588<#000000>\u2588<#000000>\u2588<#33e6b0>\u2588\u2588<#33e6b0>\u2588
<#33e6b0>\u2588\u2588\u2588<#33e6b0>\u2588<#33e6b0>\u2588\u2588\u2588<#33e6b0>\u2588
\u2588<#33e6b0>\u2588\u2588\u2588\u2588\u2588<#33e6b0>\u2588\u2588
\u2588\u2588<#33e6b0>\u2588\u2588\u2588<#33e6b0>\u2588\u2588\u2588
", position); + foreach (var pc in Main.AllAlivePlayerControls) + { + if (!visibleList.Contains(pc.PlayerId)) + Hide(pc); + } + + id = Id; + } + } } \ No newline at end of file diff --git a/Modules/CustomRoleSelector.cs b/Modules/CustomRoleSelector.cs index 9e395c986..a49c9e665 100644 --- a/Modules/CustomRoleSelector.cs +++ b/Modules/CustomRoleSelector.cs @@ -119,7 +119,7 @@ internal static class CustomRoleSelector else Roles[RoleAssignType.Crewmate].Add(info); } - if (Roles[RoleAssignType.Impostor].Count == 0 && Roles[RoleAssignType.NeutralKilling].Count == 0 && !Main.SetRoles.Values.Any(x => x.IsImpostor() || x.IsNK())) + if (Roles[RoleAssignType.Impostor].Count == 0 && optNeutralKillingNum == 0 && optNonNeutralKillingNum == 0 && !Main.SetRoles.Values.Any(x => x.IsImpostor() || x.IsNK())) { Roles[RoleAssignType.Impostor].Add(new(CustomRoles.ImpostorEHR, 100, optImpNum)); Logger.Warn("Adding Vanilla Impostor", "CustomRoleSelector"); diff --git a/Modules/CustomRolesHelper.cs b/Modules/CustomRolesHelper.cs index b5d6522de..ad1cfd7ec 100644 --- a/Modules/CustomRolesHelper.cs +++ b/Modules/CustomRolesHelper.cs @@ -713,7 +713,6 @@ internal static class CustomRolesHelper CustomRoles.Refugee => true, CustomRoles.Necromancer => true, CustomRoles.Deathknight => true, - CustomRoles.Shifter => true, _ => false }; diff --git a/Patches/PlayerControlPatch.cs b/Patches/PlayerControlPatch.cs index e9dff9f02..2c3ddfc92 100644 --- a/Patches/PlayerControlPatch.cs +++ b/Patches/PlayerControlPatch.cs @@ -452,6 +452,7 @@ class MurderPlayerPatch public static void Postfix(PlayerControl __instance, [HarmonyArgument(0)] PlayerControl target) { + if (__instance == null || target == null || __instance.PlayerId == 255 || target.PlayerId == 255) return; if (target.AmOwner) RemoveDisableDevicesPatch.UpdateDisableDevices(); if (!target.Data.IsDead || !AmongUsClient.Instance.AmHost) return; @@ -1005,7 +1006,7 @@ class FixedUpdatePatch public static async void Postfix(PlayerControl __instance) { - if (__instance == null) return; + if (__instance == null || __instance.PlayerId == 255) return; if (!GameStates.IsModHost) return; byte id = __instance.PlayerId; diff --git a/Patches/RandomSpawnPatch.cs b/Patches/RandomSpawnPatch.cs index 2bf400038..8c11cbbfb 100644 --- a/Patches/RandomSpawnPatch.cs +++ b/Patches/RandomSpawnPatch.cs @@ -9,6 +9,16 @@ namespace EHR; class RandomSpawn { + public static void TP(CustomNetworkTransform nt, Vector2 location) + { + //if (AmongUsClient.Instance.AmHost) nt.SnapTo(location); + //MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(nt.NetId, (byte)RpcCalls.SnapTo, SendOption.None); + //NetHelpers.WriteVector2(location, writer); + //writer.Write(nt.lastSequenceId); + //AmongUsClient.Instance.FinishRpcImmediately(writer); + Utils.TP(nt, location); + } + [HarmonyPatch(typeof(CustomNetworkTransform), nameof(CustomNetworkTransform.SnapTo), typeof(Vector2), typeof(ushort))] public class CustomNetworkTransformPatch { @@ -17,7 +27,7 @@ class RandomSpawn public static void Postfix(CustomNetworkTransform __instance, [HarmonyArgument(0)] Vector2 position) { if (!AmongUsClient.Instance.AmHost) return; - if (position == new Vector2(-25f, 40f)) return; //最初の湧き地点ならreturn + if (position == new Vector2(-25f, 40f)) return; if (GameStates.IsInTask) { var player = Main.AllPlayerControls.FirstOrDefault(p => p.NetTransform == __instance); @@ -45,16 +55,6 @@ class RandomSpawn } } - public static void TP(CustomNetworkTransform nt, Vector2 location) - { - //if (AmongUsClient.Instance.AmHost) nt.SnapTo(location); - //MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(nt.NetId, (byte)RpcCalls.SnapTo, SendOption.None); - //NetHelpers.WriteVector2(location, writer); - //writer.Write(nt.lastSequenceId); - //AmongUsClient.Instance.FinishRpcImmediately(writer); - Utils.TP(nt, location); - } - public abstract class SpawnMap { public virtual void RandomTeleport(PlayerControl player) diff --git a/Patches/SabotageSystemPatch.cs b/Patches/SabotageSystemPatch.cs index 2133aa78d..bd02bad57 100644 --- a/Patches/SabotageSystemPatch.cs +++ b/Patches/SabotageSystemPatch.cs @@ -271,7 +271,7 @@ public static class SabotageSystemTypeRepairDamagePatch CustomRoles.Traitor when Traitor.CanSabotage.GetBool() => true, CustomRoles.Parasite when player.IsAlive() => true, CustomRoles.Refugee when player.IsAlive() => true, - _ => Main.PlayerStates[player.PlayerId].Role.OnSabotage(player) && Main.PlayerStates[player.PlayerId].Role.CanUseSabotage(player) + _ => Main.PlayerStates[player.PlayerId].Role.CanUseSabotage(player) && Main.PlayerStates[player.PlayerId].Role.OnSabotage(player) }; if (allow && QuizMaster.On) QuizMaster.Data.NumSabotages++; diff --git a/Roles/Crewmate/Adventurer.cs b/Roles/Crewmate/Adventurer.cs index b58e108d2..57d67442c 100644 --- a/Roles/Crewmate/Adventurer.cs +++ b/Roles/Crewmate/Adventurer.cs @@ -237,8 +237,8 @@ namespace EHR.Roles.Crewmate public override void OnGlobalFixedUpdate(PlayerControl pc, bool lowLoad) { - long now = Utils.TimeStamp; if (lowLoad) return; + long now = Utils.TimeStamp; if (!GameStates.IsInTask) { diff --git a/Roles/Crewmate/Druid.cs b/Roles/Crewmate/Druid.cs index 26585976b..951c85b8c 100644 --- a/Roles/Crewmate/Druid.cs +++ b/Roles/Crewmate/Druid.cs @@ -22,9 +22,11 @@ namespace EHR.Roles.Crewmate public static OptionItem DruidAbilityUseGainWithEachTaskCompleted; public static OptionItem AbilityChargesWhenFinishedTasks; - private static Dictionary TriggerDelays = []; - private static Dictionary> Triggers = []; - private static long lastUpdate; + private PlayerControl DruidPC; + private long lastUpdate; + private long TriggerDelay; + private Dictionary TriggerIds = []; + private Dictionary Triggers = []; public override bool IsEnable => playerIdList.Count > 0; @@ -51,7 +53,7 @@ namespace EHR.Roles.Crewmate public override void Init() { playerIdList = []; - TriggerDelays = []; + TriggerDelay = 0; Triggers = []; lastUpdate = TimeStamp; } @@ -59,8 +61,10 @@ namespace EHR.Roles.Crewmate public override void Add(byte playerId) { playerIdList.Add(playerId); + DruidPC = GetPlayerById(playerId); playerId.SetAbilityUseLimit(UseLimitOpt.GetInt()); lastUpdate = TimeStamp; + TriggerIds = []; } public override void ApplyGameOptions(IGameOptions opt, byte playerId) @@ -86,7 +90,7 @@ namespace EHR.Roles.Crewmate bool add = reader.ReadBoolean(); byte playerId = reader.ReadByte(); - if (Main.PlayerStates[playerId].Role is not Druid { IsEnable: true }) return; + if (Main.PlayerStates[playerId].Role is not Druid { IsEnable: true } di) return; float x = reader.ReadSingle(); float y = reader.ReadSingle(); @@ -97,13 +101,12 @@ namespace EHR.Roles.Crewmate { string roomName = reader.ReadString(); - TriggerDelays.Remove(playerId); - if (!Triggers.ContainsKey(playerId)) Triggers.Add(playerId, []); - Triggers[playerId].TryAdd(position, roomName); + di.TriggerDelay = 0; + di.Triggers.TryAdd(position, roomName); } else { - Triggers[playerId].Remove(position); + di.Triggers.Remove(position); } } @@ -128,13 +131,14 @@ namespace EHR.Roles.Crewmate if (isPet) { (Vector2 LOCATION, string ROOM_NAME) = pc.GetPositionInfo(); - if (!Triggers.ContainsKey(pc.PlayerId)) Triggers.Add(pc.PlayerId, []); - Triggers[pc.PlayerId].TryAdd(LOCATION, ROOM_NAME); + Triggers.TryAdd(LOCATION, ROOM_NAME); SendRPCAddTrigger(true, pc.PlayerId, LOCATION, ROOM_NAME); + _ = new PlayerDetector(LOCATION, [pc.PlayerId], out int id); + TriggerIds.TryAdd(LOCATION, id); } else { - TriggerDelays.TryAdd(pc.PlayerId, now); + TriggerDelay = now; } pc.RpcRemoveAbilityUse(); @@ -144,42 +148,36 @@ namespace EHR.Roles.Crewmate { if (!GameStates.IsInTask || Triggers.Count <= 0 || playerIdList.Contains(pc.PlayerId)) return; - foreach (var triggers in Triggers.ToArray()) // Check for all Druids' traps - Most likely just 1 loop + foreach (var trigger in Triggers.Where(trigger => Vector2.Distance(trigger.Key, pc.Pos()) <= 1.5f)) { - foreach (var trigger in triggers.Value.Where(trigger => Vector2.Distance(trigger.Key, pc.Pos()) <= 1.5f)) // Check for all traps of the current Druid - Most likely 0-3 loops - { - GetPlayerById(triggers.Key).Notify(string.Format(GetString("DruidTriggerTriggered"), GetFormattedRoomName(trigger.Value), GetFormattedVectorText(trigger.Key))); - Triggers[triggers.Key].Remove(trigger.Key); - SendRPCAddTrigger(false, triggers.Key, trigger.Key); - } + DruidPC.Notify(string.Format(GetString("DruidTriggerTriggered"), GetFormattedRoomName(trigger.Value), GetFormattedVectorText(trigger.Key))); + Triggers.Remove(trigger.Key); + SendRPCAddTrigger(false, DruidPC.PlayerId, trigger.Key); + CustomNetObject.Get(TriggerIds[trigger.Key])?.Despawn(); } } - public override void OnFixedUpdate(PlayerControl _) + public override void OnFixedUpdate(PlayerControl pc) { - if (!IsEnable || !GameStates.IsInTask || TriggerDelays.Count <= 0) return; + if (!IsEnable || !GameStates.IsInTask || TriggerDelay == 0 || pc == null) return; long now = TimeStamp; - foreach ((byte id, long ts) in TriggerDelays) + if (TriggerDelay + TriggerPlaceDelay.GetInt() < now) { - var pc = GetPlayerById(id); - if (pc == null) continue; - - if (ts + TriggerPlaceDelay.GetInt() < now) - { - TriggerDelays.Remove(id); - (Vector2 LOCATION, string ROOM_NAME) = pc.GetPositionInfo(); - if (!Triggers.ContainsKey(id)) Triggers.Add(id, []); - Triggers[id].TryAdd(LOCATION, ROOM_NAME); - SendRPCAddTrigger(true, id, LOCATION, ROOM_NAME); - continue; - } - - var timeLeft = TriggerPlaceDelay.GetInt() - (now - ts); - if (lastUpdate < now) pc.Notify(string.Format(GetString("DruidTimeLeft"), timeLeft, 2f)); + var id = pc.PlayerId; + TriggerDelay = 0; + (Vector2 LOCATION, string ROOM_NAME) = pc.GetPositionInfo(); + Triggers.TryAdd(LOCATION, ROOM_NAME); + SendRPCAddTrigger(true, id, LOCATION, ROOM_NAME); + _ = new PlayerDetector(LOCATION, [pc.PlayerId], out int oid); + TriggerIds.TryAdd(LOCATION, oid); + return; } + var timeLeft = TriggerPlaceDelay.GetInt() - (now - TriggerDelay); + if (lastUpdate < now) pc.Notify(string.Format(GetString("DruidTimeLeft"), timeLeft, 2f)); + lastUpdate = now; } @@ -188,26 +186,26 @@ namespace EHR.Roles.Crewmate if (hud) return GetHUDText(seer); if (seer == null || seer.IsModClient() || seer.PlayerId != target.PlayerId) return string.Empty; - if (!Triggers.TryGetValue(seer.PlayerId, out var triggers)) return string.Empty; + if (Triggers.Count == 0) return string.Empty; var sb = new StringBuilder(); sb.Append("\n"); - sb.AppendLine($"<#00ffa5>{triggers.Count} trigger{(triggers.Count == 1 ? string.Empty : 's')} active"); - sb.Append(string.Join(", ", triggers.Select(trigger => $"Trigger {GetFormattedRoomName(trigger.Value)} {GetFormattedVectorText(trigger.Key)}"))); + sb.AppendLine($"<#00ffa5>{Triggers.Count} trigger{(Triggers.Count == 1 ? string.Empty : 's')} active"); + sb.Append(string.Join(", ", Triggers.Select(trigger => $"Trigger {GetFormattedRoomName(trigger.Value)} {GetFormattedVectorText(trigger.Key)}"))); sb.Append(""); return sb.ToString(); } - static string GetHUDText(PlayerControl pc) + string GetHUDText(PlayerControl pc) { - if (pc == null || !Triggers.TryGetValue(pc.PlayerId, out var triggers)) return string.Empty; + if (pc == null || Triggers.Count == 0) return string.Empty; var sb = new StringBuilder(); - sb.AppendLine($"<#00ffa5>{triggers.Count} trigger{(triggers.Count == 1 ? string.Empty : 's')} active"); - sb.Append(string.Join('\n', triggers.Select(trigger => $"Trigger {GetFormattedRoomName(trigger.Value)} {GetFormattedVectorText(trigger.Key)}"))); + sb.AppendLine($"<#00ffa5>{Triggers.Count} trigger{(Triggers.Count == 1 ? string.Empty : 's')} active"); + sb.Append(string.Join('\n', Triggers.Select(trigger => $"Trigger {GetFormattedRoomName(trigger.Value)} {GetFormattedVectorText(trigger.Key)}"))); return sb.ToString(); } diff --git a/Roles/Crewmate/Tornado.cs b/Roles/Crewmate/Tornado.cs index 291beae42..ba5c0451f 100644 --- a/Roles/Crewmate/Tornado.cs +++ b/Roles/Crewmate/Tornado.cs @@ -15,7 +15,7 @@ namespace EHR.Roles.Crewmate private static readonly List PlayerIdList = []; public static OptionItem TornadoCooldown; - private static OptionItem TornadoDuration; + public static OptionItem TornadoDuration; private static OptionItem TornadoRange; private static readonly Dictionary ReplacementDict = new() { { "Tornado", ColorString(GetRoleColor(CustomRoles.Tornado), "Tornado") } }; @@ -101,7 +101,7 @@ namespace EHR.Roles.Crewmate if (add) { long timestamp = long.Parse(reader.ReadString()); - Tornados.Add((new(x, y), roomname), timestamp); + Tornados.TryAdd((new(x, y), roomname), timestamp); } else { @@ -119,8 +119,9 @@ namespace EHR.Roles.Crewmate if (pc == null) return; var info = pc.GetPositionInfo(); var now = TimeStamp; - Tornados.Add(info, now); + Tornados.TryAdd(info, now); SendRPCAddTornado(true, info.LOCATION, info.ROOM_NAME, now); + _ = new TornadoObject(info.LOCATION, [pc.PlayerId]); } public override void OnCheckPlayerPosition(PlayerControl pc) diff --git a/Roles/Neutral/Evolver.cs b/Roles/Neutral/Evolver.cs index da6fd1782..f404cd09d 100644 --- a/Roles/Neutral/Evolver.cs +++ b/Roles/Neutral/Evolver.cs @@ -134,9 +134,11 @@ namespace EHR.Neutral Utils.SendRPC(CustomRPC.SyncEvolver, EvolverPC.PlayerId, 3, ChooseTimer); if (ChooseTimer == 0) ApplySelectedUpgradeAndReset(); + + Utils.NotifyRoles(SpecifySeer: pc, SpecifyTarget: pc); } - private void ApplySelectedUpgradeAndReset() + void ApplySelectedUpgradeAndReset() { switch (Upgrades[SelectedUpgradeIndex]) { diff --git a/Roles/Neutral/Patroller.cs b/Roles/Neutral/Patroller.cs index 8ae961ab6..e78f7dbc4 100644 --- a/Roles/Neutral/Patroller.cs +++ b/Roles/Neutral/Patroller.cs @@ -80,13 +80,22 @@ namespace EHR.Neutral Count = 0; var room = pc.GetPlainShipRoom(); - if (LastRoom != null && room == LastRoom) return; + if ((LastRoom != null && room != null && room == LastRoom) || (LastRoom == null && room == null)) return; LastRoom = room; - var roomName = Translator.GetString(room.RoomId.ToString()); - pc.Notify(RoomBoosts.Any(x => x.Value == room) - ? string.Format(Translator.GetString("PatrollerNotify"), roomName, Translator.GetString($"PatrollerBoost.{RoomBoosts.First(x => x.Value == room).Key}")) - : string.Format(Translator.GetString("PatrollerNotifyNoBoost"), roomName), 300f); + if (room != null) + { + var roomName = Translator.GetString(room.RoomId.ToString()); + pc.Notify(RoomBoosts.Any(x => x.Value == room) + ? string.Format(Translator.GetString("PatrollerNotify"), roomName, Translator.GetString($"PatrollerBoost.{RoomBoosts.First(x => x.Value == room).Key}")) + : string.Format(Translator.GetString("PatrollerNotifyNoBoost"), roomName), 300f); + } + else + { + NameNotifyManager.Notice.Remove(pc.PlayerId); + Utils.NotifyRoles(SpecifySeer: pc, SpecifyTarget: pc); + } + pc.MarkDirtySettings(); if (pc.PlayerId == PlayerControl.LocalPlayer.PlayerId) diff --git a/Roles/Neutral/Shifter.cs b/Roles/Neutral/Shifter.cs index a2ab9eae7..677d7814c 100644 --- a/Roles/Neutral/Shifter.cs +++ b/Roles/Neutral/Shifter.cs @@ -2,6 +2,7 @@ using System.Linq; using AmongUs.GameOptions; using EHR.Modules; +using EHR.Patches; using HarmonyLib; namespace EHR.Neutral @@ -103,5 +104,10 @@ namespace EHR.Neutral return false; } + + public override void OnPet(PlayerControl pc) + { + OnCheckMurder(pc, ExternalRpcPetPatch.SelectKillButtonTarget(pc)); + } } } \ No newline at end of file diff --git a/Roles/Neutral/Tremor.cs b/Roles/Neutral/Tremor.cs index 3c62f183f..c36be3fb9 100644 --- a/Roles/Neutral/Tremor.cs +++ b/Roles/Neutral/Tremor.cs @@ -3,6 +3,7 @@ using System.Linq; using AmongUs.GameOptions; using EHR.Modules; using HarmonyLib; +using Hazel; using UnityEngine; namespace EHR.Roles.Neutral; @@ -18,7 +19,7 @@ public class Tremor : RoleBase private static OptionItem TimerStart; private static OptionItem TimerDecrease; private static OptionItem DoomTime; - int Count = 0; + int Count; int DoomTimer; long LastUpdate = Utils.TimeStamp; @@ -118,7 +119,7 @@ public class Tremor : RoleBase Utils.SendRPC(CustomRPC.SyncTremor, killer.PlayerId, Timer); } - public void ReceiveRPC(Hazel.MessageReader reader) + public void ReceiveRPC(MessageReader reader) { int value = reader.ReadPackedInt32(); if (IsDoom) DoomTimer = value; @@ -129,6 +130,8 @@ public class Tremor : RoleBase { if (seer.PlayerId != target.PlayerId || (seer.IsModClient() && !hud) || meeting) return string.Empty; var color = IsDoom ? Color.yellow : Color.cyan; - return Utils.ColorString(color, IsDoom ? DoomTimer.ToString() : Timer.ToString()); + var text = IsDoom ? DoomTimer.ToString() : Timer.ToString(); + if (hud) text = $"{text}"; + return Utils.ColorString(color, text); } } \ No newline at end of file