From 41c018737cd26a5092965a0e2f2c608263ba77c8 Mon Sep 17 00:00:00 2001 From: Gurge44 Date: Tue, 26 Mar 2024 15:06:09 +0100 Subject: [PATCH] Fix Vulture CD and other things --- Modules/OptionHolder.cs | 34 ++++++++-------- Patches/ChatCommandPatch.cs | 62 +++++++++++++----------------- Patches/HudSpritePatch.cs | 3 -- Patches/TaskAssignPatch.cs | 16 ++++---- Resources/Lang/en_US.json | 2 + Roles/AddOns/GhostRoles/Specter.cs | 2 + Roles/Crewmate/Mathematician.cs | 42 +++++++++++++------- Roles/Impostor/Blackmailer.cs | 6 +-- Roles/Neutral/Vulture.cs | 21 +++------- 9 files changed, 94 insertions(+), 94 deletions(-) diff --git a/Modules/OptionHolder.cs b/Modules/OptionHolder.cs index 15fd50429..bd105ed8c 100644 --- a/Modules/OptionHolder.cs +++ b/Modules/OptionHolder.cs @@ -883,6 +883,8 @@ public static class Options public static OptionItem DIYGameSettings; public static OptionItem PlayerCanSetColor; + public static OptionItem PlayerCanSetName; + public static OptionItem PlayerCanTPInAndOut; //Add-Ons public static OptionItem NameDisplayAddons; @@ -1319,6 +1321,8 @@ public static class Options HideGameSettings = BooleanOptionItem.Create(19400, "HideGameSettings", false, TabGroup.SystemSettings, false); DIYGameSettings = BooleanOptionItem.Create(19401, "DIYGameSettings", false, TabGroup.SystemSettings, false); PlayerCanSetColor = BooleanOptionItem.Create(19402, "PlayerCanSetColor", false, TabGroup.SystemSettings, false); + PlayerCanSetName = BooleanOptionItem.Create(19410, "PlayerCanSetName", false, TabGroup.SystemSettings, false); + PlayerCanTPInAndOut = BooleanOptionItem.Create(19411, "PlayerCanTPInAndOut", false, TabGroup.SystemSettings, false); FormatNameMode = StringOptionItem.Create(19403, "FormatNameMode", formatNameModes, 0, TabGroup.SystemSettings, false); DisableEmojiName = BooleanOptionItem.Create(19404, "DisableEmojiName", true, TabGroup.SystemSettings, false); ChangeNameToRoleInfo = BooleanOptionItem.Create(19405, "ChangeNameToRoleInfo", true, TabGroup.SystemSettings, false); @@ -2260,32 +2264,32 @@ public static class Options public static Dictionary AllData = []; public CustomRoles Role { get; private set; } public int IdStart { get; private set; } - public OptionItem doOverride; - public OptionItem assignCommonTasks; - public OptionItem numLongTasks; - public OptionItem numShortTasks; + public OptionItem DoOverride; + public OptionItem AssignCommonTasks; + public OptionItem NumLongTasks; + public OptionItem NumShortTasks; public OverrideTasksData(int idStart, TabGroup tab, CustomRoles role) { IdStart = idStart; Role = role; Dictionary replacementDic = new() { { "%role%", Utils.ColorString(Utils.GetRoleColor(role), Utils.GetRoleName(role)) } }; - doOverride = BooleanOptionItem.Create(idStart++, "doOverride", false, tab, false) + DoOverride = BooleanOptionItem.Create(idStart++, "doOverride", false, tab, false) .SetParent(CustomRoleSpawnChances[role]) .SetValueFormat(OptionFormat.None); - doOverride.ReplacementDictionary = replacementDic; - assignCommonTasks = BooleanOptionItem.Create(idStart++, "assignCommonTasks", true, tab, false) - .SetParent(doOverride) + DoOverride.ReplacementDictionary = replacementDic; + AssignCommonTasks = BooleanOptionItem.Create(idStart++, "assignCommonTasks", true, tab, false) + .SetParent(DoOverride) .SetValueFormat(OptionFormat.None); - assignCommonTasks.ReplacementDictionary = replacementDic; - numLongTasks = IntegerOptionItem.Create(idStart++, "roleLongTasksNum", new(0, 99, 1), 3, tab, false) - .SetParent(doOverride) + AssignCommonTasks.ReplacementDictionary = replacementDic; + NumLongTasks = IntegerOptionItem.Create(idStart++, "roleLongTasksNum", new(0, 90, 1), 3, tab, false) + .SetParent(DoOverride) .SetValueFormat(OptionFormat.Pieces); - numLongTasks.ReplacementDictionary = replacementDic; - numShortTasks = IntegerOptionItem.Create(idStart++, "roleShortTasksNum", new(0, 99, 1), 3, tab, false) - .SetParent(doOverride) + NumLongTasks.ReplacementDictionary = replacementDic; + NumShortTasks = IntegerOptionItem.Create(idStart, "roleShortTasksNum", new(0, 90, 1), 3, tab, false) + .SetParent(DoOverride) .SetValueFormat(OptionFormat.Pieces); - numShortTasks.ReplacementDictionary = replacementDic; + NumShortTasks.ReplacementDictionary = replacementDic; if (!AllData.ContainsKey(role)) AllData.Add(role, this); else Logger.Warn("OverrideTasksData created for duplicate CustomRoles", "OverrideTasksData"); diff --git a/Patches/ChatCommandPatch.cs b/Patches/ChatCommandPatch.cs index 37ef76cf1..da64a87cf 100644 --- a/Patches/ChatCommandPatch.cs +++ b/Patches/ChatCommandPatch.cs @@ -1138,35 +1138,38 @@ internal class ChatCommands case "/tpout": canceled = true; - if (!GameStates.IsLobby) break; + if (!GameStates.IsLobby || !Options.PlayerCanTPInAndOut.GetBool()) break; player.TP(new Vector2(0.1f, 3.8f)); break; case "/tpin": canceled = true; - if (!GameStates.IsLobby) break; + if (!GameStates.IsLobby || !Options.PlayerCanTPInAndOut.GetBool()) break; player.TP(new Vector2(-0.2f, 1.3f)); break; - //case "/quit": - //case "/qt": - // subArgs = args.Length < 2 ? string.Empty : args[1]; - // var cid = player.PlayerId.ToString(); - // cid = cid.Length != 1 ? cid.Substring(1, 1) : cid; - // if (subArgs.Equals(cid)) - // { - // string name = player.GetRealName(); - // Utils.SendMessage(string.Format(GetString("Message.PlayerQuitForever"), name)); - // AmongUsClient.Instance.KickPlayer(player.GetClientId(), true); - // } - // else - // { - // Utils.SendMessage(string.Format(GetString("SureUse.quit"), cid), player.PlayerId); - // } - // break; + case "/rename": + case "/rn": + if (!Options.PlayerCanSetName.GetBool() || args.Length < 1) break; + if (GameStates.IsInGame) + { + Utils.SendMessage(GetString("Message.OnlyCanUseInLobby"), player.PlayerId); + break; + } + + var name = args.Skip(1).Join(delimiter: " "); + if (name.Length is > 10 or < 1) + { + Utils.SendMessage(GetString("Message.AllowNameLength"), player.PlayerId); + break; + } + + Main.AllPlayerNames[player.PlayerId] = name; + break; + case "/id": string msgText = GetString("PlayerIdList"); - msgText = Main.AllPlayerControls.Aggregate(msgText, (current, pc) => current + "\n" + pc.PlayerId + " → " + Main.AllPlayerNames[pc.PlayerId]); + msgText = Main.AllPlayerControls.Aggregate(msgText, (current, pc) => $"{current}\n{pc.PlayerId} \u2192 {Main.AllPlayerNames[pc.PlayerId]}"); Utils.SendMessage(msgText, player.PlayerId); break; @@ -1179,24 +1182,13 @@ internal class ChatCommands MeetingHud.Instance?.CastVote(player.PlayerId, voteId); break; case "/ask": - try - { - Mathematician.Ask(player, args[1], args[2]); - } - catch - { - } - + if (args.Length < 3) break; + Mathematician.Ask(player, args[1], args[2]); break; + case "/ans": case "/answer": - try - { - Mathematician.Reply(player, args[1]); - } - catch - { - } - + if (args.Length < 2) break; + Mathematician.Reply(player, args[1]); break; case "/ban": case "/kick": diff --git a/Patches/HudSpritePatch.cs b/Patches/HudSpritePatch.cs index 7fb98866f..ad3acf9da 100644 --- a/Patches/HudSpritePatch.cs +++ b/Patches/HudSpritePatch.cs @@ -56,9 +56,6 @@ public static class HudSpritePatch { switch (player.GetCustomRole()) { - case CustomRoles.Commander: - newAbilityButton = CustomButton.Get("Commander"); - break; case CustomRoles.Assassin: case CustomRoles.Undertaker: if (Main.PlayerStates[player.PlayerId].Role is not Assassin assassin) break; diff --git a/Patches/TaskAssignPatch.cs b/Patches/TaskAssignPatch.cs index 2c7340fa8..8ccb24751 100644 --- a/Patches/TaskAssignPatch.cs +++ b/Patches/TaskAssignPatch.cs @@ -121,27 +121,27 @@ class RpcSetTasksPatch // Null measures if (Main.RealOptionsData == null) { - Logger.Warn("警告:RealOptionsDataがnullです。", "RpcSetTasksPatch"); + Logger.Warn("Warning: RealOptionsData is null.", "RpcSetTasksPatch"); return; } var pc = Utils.GetPlayerById(playerId); - CustomRoles? RoleNullable = pc?.GetCustomRole(); - if (RoleNullable == null) return; - CustomRoles role = RoleNullable.Value; + if (pc == null) return; + CustomRoles role = pc.Is(CustomRoles.Specter) ? CustomRoles.Specter : pc.GetCustomRole(); // Default number of tasks bool hasCommonTasks = true; int NumLongTasks = Main.NormalOptions.NumLongTasks; int NumShortTasks = Main.NormalOptions.NumShortTasks; - if (Options.OverrideTasksData.AllData.TryGetValue(role, out var data) && data.doOverride.GetBool()) + if (Options.OverrideTasksData.AllData.TryGetValue(role, out var data) && data.DoOverride.GetBool()) { - hasCommonTasks = data.assignCommonTasks.GetBool(); // Whether to assign common tasks (regular tasks) + hasCommonTasks = data.AssignCommonTasks.GetBool(); // Whether to assign common tasks (regular tasks) // Even if assigned, it will not be reassigned and will be assigned the same common tasks as other crews. - NumLongTasks = data.numLongTasks.GetInt(); // Number of long tasks to allocate - NumShortTasks = data.numShortTasks.GetInt(); // Number of short tasks to allocate + NumLongTasks = data.NumLongTasks.GetInt(); // Number of long tasks to allocate + NumShortTasks = data.NumShortTasks.GetInt(); // Number of short tasks to allocate // Longs and shorts are constantly reallocated. + if (role == CustomRoles.Specter) Main.PlayerStates[pc.PlayerId].TaskState.AllTasksCount = NumLongTasks + NumShortTasks; } if (pc.Is(CustomRoles.Busy)) diff --git a/Resources/Lang/en_US.json b/Resources/Lang/en_US.json index a2fec861a..6296a2afa 100644 --- a/Resources/Lang/en_US.json +++ b/Resources/Lang/en_US.json @@ -972,6 +972,8 @@ "HideGameSettings": "Hide Game Settings", "DIYGameSettings": "Enable only custom /n messages", "PlayerCanSetColor": "Players can use the /color command", + "PlayerCanSetName": "Players can use the /rename command", + "PlayerCanTPInAndOut": "Players can use the /tpin & /tpout command", "KPDCamouflageMode": "Camouflage Appearance", "RoleOptions": "Role Options", "ModeOptions": "Mode Options", diff --git a/Roles/AddOns/GhostRoles/Specter.cs b/Roles/AddOns/GhostRoles/Specter.cs index c8c53452c..f9c28570f 100644 --- a/Roles/AddOns/GhostRoles/Specter.cs +++ b/Roles/AddOns/GhostRoles/Specter.cs @@ -9,6 +9,7 @@ namespace EHR.Roles.AddOns.GhostRoles public Team Team => Team.Neutral; private static OptionItem SnatchWin; + private static Options.OverrideTasksData Tasks; public bool IsWon; @@ -40,6 +41,7 @@ namespace EHR.Roles.AddOns.GhostRoles Options.SetupRoleOptions(649100, TabGroup.OtherRoles, CustomRoles.Specter); SnatchWin = BooleanOptionItem.Create(649102, "SnatchWin", false, TabGroup.OtherRoles, false) .SetParent(Options.CustomRoleSpawnChances[CustomRoles.Specter]); + Tasks = Options.OverrideTasksData.Create(649103, TabGroup.OtherRoles, CustomRoles.Specter); } public void OnFinishedTasks(PlayerControl pc) diff --git a/Roles/Crewmate/Mathematician.cs b/Roles/Crewmate/Mathematician.cs index 25240af60..e9b6fd733 100644 --- a/Roles/Crewmate/Mathematician.cs +++ b/Roles/Crewmate/Mathematician.cs @@ -1,4 +1,6 @@ -namespace EHR.Roles.Crewmate +using System; + +namespace EHR.Roles.Crewmate { internal class Mathematician : RoleBase { @@ -23,24 +25,38 @@ public static void Ask(PlayerControl pc, string num1Str, string num2Str) { - if (pc == null || !pc.IsAlive() || !GameStates.IsMeeting || State.AskedQuestion || !int.TryParse(num1Str, out var num1) || !int.TryParse(num2Str, out var num2)) return; + try + { + if (pc == null || !pc.IsAlive() || !GameStates.IsMeeting || State.AskedQuestion || !int.TryParse(num1Str, out var num1) || !int.TryParse(num2Str, out var num2)) return; - State.AskedQuestion = true; - State.Answer = num1 + num2; - State.MathematicianPlayerId = pc.PlayerId; + State.AskedQuestion = true; + State.Answer = num1 + num2; + State.MathematicianPlayerId = pc.PlayerId; - string question = string.Format(Translator.GetString("MathematicianQuestionString"), num1, num2); - Utils.SendMessage(question, title: Translator.GetString("Mathematician")); + string question = string.Format(Translator.GetString("MathematicianQuestionString"), num1, num2); + Utils.SendMessage(question, title: Translator.GetString("Mathematician")); + } + catch (Exception e) + { + Utils.ThrowException(e); + } } public static void Reply(PlayerControl pc, string answerStr) { - if (pc == null || !pc.IsAlive() || !GameStates.IsMeeting || !State.AskedQuestion || State.MathematicianPlayerId == pc.PlayerId || !int.TryParse(answerStr, out var answer)) return; - - if (answer == State.Answer) + try { - State.ProtectedPlayerId = pc.PlayerId; - Utils.SendMessage(string.Format(Translator.GetString("MathematicianAnsweredString"), pc.GetRealName(), answer), title: Translator.GetString("Mathematician")); - State.AskedQuestion = false; + if (pc == null || !pc.IsAlive() || !GameStates.IsMeeting || !State.AskedQuestion || State.MathematicianPlayerId == pc.PlayerId || !int.TryParse(answerStr, out var answer)) return; + + if (answer == State.Answer) + { + State.ProtectedPlayerId = pc.PlayerId; + Utils.SendMessage(string.Format(Translator.GetString("MathematicianAnsweredString"), pc.GetRealName(), answer), title: Translator.GetString("Mathematician")); + State.AskedQuestion = false; + } + } + catch (Exception e) + { + Utils.ThrowException(e); } } diff --git a/Roles/Impostor/Blackmailer.cs b/Roles/Impostor/Blackmailer.cs index fd062c7f6..7a7480088 100644 --- a/Roles/Impostor/Blackmailer.cs +++ b/Roles/Impostor/Blackmailer.cs @@ -1,9 +1,5 @@ -using System; -using System.Collections.Generic; +using HarmonyLib; using System.Linq; -using System.Text; -using System.Threading.Tasks; -using HarmonyLib; namespace EHR.Roles.Impostor { diff --git a/Roles/Neutral/Vulture.cs b/Roles/Neutral/Vulture.cs index 021997f55..fdc108924 100644 --- a/Roles/Neutral/Vulture.cs +++ b/Roles/Neutral/Vulture.cs @@ -58,7 +58,7 @@ public class Vulture : RoleBase { Utils.GetPlayerById(playerId).Notify(GetString("VultureCooldownUp")); } - }, VultureReportCD.GetFloat() + 8f, "Vulture CD"); //for some reason that idk vulture cd completes 8s faster when the game starts, so I added 8f for now + }, VultureReportCD.GetFloat() + 8f, "Vulture CD"); } public override bool IsEnable => playerIdList.Count > 0; @@ -118,7 +118,6 @@ public class Vulture : RoleBase { if (GameStates.IsInTask) { - //Utils.GetPlayerById(apc).RpcGuardAndKill(Utils.GetPlayerById(apc)); Utils.GetPlayerById(apc).Notify(GetString("VultureCooldownUp")); } }, VultureReportCD.GetFloat(), "Vulture CD"); @@ -131,29 +130,21 @@ public class Vulture : RoleBase { if (!ArrowsPointingToDeadBody.GetBool()) return; - var pos = target.Pos(); - float minDis = float.MaxValue; - foreach (PlayerControl pc in Main.AllAlivePlayerControls) - { - if (pc.PlayerId == target.PlayerId) continue; - var dis = Vector2.Distance(pc.Pos(), pos); - if (dis < minDis && dis < 1.5f) - { - minDis = dis; - } - } - foreach (byte pc in playerIdList) { var player = Utils.GetPlayerById(pc); if (player == null || !player.IsAlive()) continue; LocateArrow.Add(pc, target.transform.position); SendRPC(pc, true, target.transform.position); + Utils.NotifyRoles(SpecifySeer: player, SpecifyTarget: player); } } public override bool CheckReportDeadBody(PlayerControl pc, GameData.PlayerInfo target, PlayerControl killer) { + if (AbilityLeftInRound[pc.PlayerId] <= 0) return true; + if (Utils.TimeStamp - LastReport[pc.PlayerId] < VultureReportCD.GetFloat()) return true; + BodyReportCount[pc.PlayerId]++; AbilityLeftInRound[pc.PlayerId]--; Logger.Msg($"target.object {target.Object}, is null? {target.Object == null}", "VultureNull"); @@ -169,7 +160,7 @@ public class Vulture : RoleBase pc.Notify(GetString("VultureBodyReported")); UnreportablePlayers.Remove(target.PlayerId); UnreportablePlayers.Add(target.PlayerId); - //playerIdList.Remove(target.PlayerId); + return false; }