From fba25c37a4ec781880c66dc4db2fdec3e8438180 Mon Sep 17 00:00:00 2001 From: Gurge44 Date: Thu, 18 Dec 2025 11:28:28 +0100 Subject: [PATCH] simplify Benefactor code --- Roles/Crewmate/Benefactor.cs | 70 ++++++++++++++---------------------- 1 file changed, 27 insertions(+), 43 deletions(-) diff --git a/Roles/Crewmate/Benefactor.cs b/Roles/Crewmate/Benefactor.cs index 22881a3f2..4e75f1ff6 100644 --- a/Roles/Crewmate/Benefactor.cs +++ b/Roles/Crewmate/Benefactor.cs @@ -13,7 +13,6 @@ internal class Benefactor : RoleBase private static List PlayerIdList = []; private static Dictionary> TaskIndex = []; - private static Dictionary TaskMarkPerRound = []; private static Dictionary ShieldedPlayers = []; private static int MaxTasksMarkedPerRound; @@ -41,7 +40,6 @@ internal class Benefactor : RoleBase { PlayerIdList = []; TaskIndex = []; - TaskMarkPerRound = []; ShieldedPlayers = []; MaxTasksMarkedPerRound = TaskMarkPerRoundOpt.GetInt(); } @@ -49,7 +47,7 @@ internal class Benefactor : RoleBase public override void Add(byte playerId) { PlayerIdList.Add(playerId); - TaskMarkPerRound[playerId] = 0; + playerId.SetAbilityUseLimit(MaxTasksMarkedPerRound); } public override void Remove(byte playerId) @@ -68,8 +66,6 @@ internal class Benefactor : RoleBase writer.Write(clearAll); writer.Write(shieldExpire); writer.Write(shieldedId); - if (!isShield) writer.Write(TaskMarkPerRound[benefactorId]); - AmongUsClient.Instance.FinishRpcImmediately(writer); } @@ -84,40 +80,30 @@ internal class Benefactor : RoleBase bool shieldExpire = reader.ReadBoolean(); byte shieldedId = reader.ReadByte(); + bool tryGetValue = TaskIndex.TryGetValue(benefactorID, out var list); + if (!IsShield) { - int uses = reader.ReadInt32(); - TaskMarkPerRound[benefactorID] = uses; - if (!clearAll && !shieldExpire) { - if (!TaskIndex.ContainsKey(benefactorID)) TaskIndex[benefactorID] = []; - - TaskIndex[benefactorID].Add(taskInd); + if (tryGetValue) list.Add(taskInd); + else TaskIndex[benefactorID] = [taskInd]; } } - else - { - if (TaskIndex.ContainsKey(benefactorID)) TaskIndex[benefactorID].Remove(taskInd); - } + else if (tryGetValue) + list.Remove(taskInd); - if (clearAll && TaskIndex.ContainsKey(benefactorID)) TaskIndex[benefactorID].Clear(); + if (clearAll && tryGetValue) + list.Clear(); - if (IsShield) ShieldedPlayers.TryAdd(shieldedId, Utils.TimeStamp); + if (IsShield) + ShieldedPlayers[shieldedId] = Utils.TimeStamp; + + if (shieldExpire) + ShieldedPlayers.Remove(shieldedId); - if (shieldExpire) ShieldedPlayers.Remove(shieldedId); - - if (clearAll && ShieldedPlayers.Count > 0) ShieldedPlayers.Clear(); - } - - public override string GetProgressText(byte playerId, bool comms) - { - if (!IsEnable) return string.Empty; - - TaskMarkPerRound.TryAdd(playerId, 0); - int markedTasks = TaskMarkPerRound[playerId]; - int x = Math.Max(MaxTasksMarkedPerRound - markedTasks, 0); - return Utils.ColorString(Utils.GetRoleColor(CustomRoles.Benefactor).ShadeColor(0.25f), $"({x})"); + if (clearAll && ShieldedPlayers.Count > 0) + ShieldedPlayers.Clear(); } public override void AfterMeetingTasks() @@ -126,12 +112,10 @@ internal class Benefactor : RoleBase ShieldedPlayers.Clear(); - foreach (byte playerId in TaskMarkPerRound.Keys.ToArray()) + foreach ((byte id, List list) in TaskIndex) { - TaskMarkPerRound[playerId] = 0; - if (TaskIndex.ContainsKey(playerId)) TaskIndex[playerId].Clear(); - - SendRPC(playerId, clearAll: true); + list.Clear(); + SendRPC(id, clearAll: true); } } @@ -139,7 +123,7 @@ internal class Benefactor : RoleBase { if (!IsEnable) return; - foreach (KeyValuePair x in ShieldedPlayers.Where(x => x.Value + ShieldDuration.GetInt() < Utils.TimeStamp)) + foreach (KeyValuePair x in ShieldedPlayers.Where(x => x.Value + ShieldDuration.GetInt() < Utils.TimeStamp).ToArray()) { ShieldedPlayers.Remove(x.Key); SendRPC(pc.PlayerId, shieldExpire: true, shieldedId: Utils.GetPlayerById(x.Key).PlayerId); @@ -154,19 +138,19 @@ internal class Benefactor : RoleBase if (player.Is(CustomRoles.Benefactor)) { - TaskMarkPerRound.TryAdd(playerId, 0); + float abilityUseLimit = playerId.GetAbilityUseLimit(); - if (TaskMarkPerRound[playerId] >= MaxTasksMarkedPerRound) + if (abilityUseLimit < 1) { - TaskMarkPerRound[playerId] = MaxTasksMarkedPerRound; - Logger.Info($"Max task per round ({TaskMarkPerRound[playerId]}) reached for {player.GetNameWithRole()}", "Benefactor"); + Logger.Info($"Max task per round ({abilityUseLimit}) reached for {player.GetNameWithRole()}", "Benefactor"); return; } - TaskMarkPerRound[playerId]++; - if (!TaskIndex.ContainsKey(playerId)) TaskIndex[playerId] = []; + playerId.SetAbilityUseLimit(abilityUseLimit - 1); - TaskIndex[playerId].Add(task.Index); + if (TaskIndex.TryGetValue(playerId, out var list)) list.Add(task.Index); + else TaskIndex[playerId] = [task.Index]; + SendRPC(playerId, task.Index); player.Notify(GetString("BenefactorTaskMarked")); }