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