optimize CTF code

This commit is contained in:
Gurge44 committed 2026-03-09 15:58:55 +01:00
1 parent d15e0a4ba2
commit f121855345
3 files changed
+65 -21

No files matched your search

+61 -19
View File
@@ -193,32 +193,66 @@ public static class CaptureTheFlag
{
if (!ValidTag || seer.PlayerId != target.PlayerId) return string.Empty;
string arrows = TargetArrow.GetAllArrows(seer.PlayerId);
arrows = arrows.Length > 0 ? $"{arrows}\n" : string.Empty;
byte id = seer.PlayerId;
var str = $"{arrows}<size=1.4>{GetStatistics(target.PlayerId).Replace(" | ", "\n")}</size>\n";
var sb = new StringBuilder(128);
string arrows = TargetArrow.GetAllArrows(id);
if (arrows.Length > 0)
{
sb.Append(arrows);
sb.Append('\n');
}
(int carriedFor, int tags) = GetStatistics(target.PlayerId);
sb.Append("<size=1.4>");
sb.Append(string.Format(Translator.GetString("CTF_PlayerStats_CarriedFor"), carriedFor));
sb.Append('\n');
sb.Append(string.Format(Translator.GetString("CTF_PlayerStats_Tags"), tags));
sb.Append("</size>\n");
if (GameEndCriteria.GetValue() == 2)
{
long timeLeft = TimeLimit.GetInt() - (Utils.TimeStamp - GameStartTS) + 1;
if (timeLeft >= 0) str += $"<size=1.8><#ffffff>{timeLeft / 60:00}:{timeLeft % 60:00}</color></size>\n";
else str += $"<size=1.6><#ffffff>{Translator.GetString("CTF_TimeIsUp")}</color></size>\n";
if (timeLeft >= 0)
{
sb.Append("<size=1.8><#ffffff>");
long minutes = timeLeft / 60;
long seconds = timeLeft % 60;
if (minutes < 10) sb.Append('0');
sb.Append(minutes);
sb.Append(':');
if (seconds < 10) sb.Append('0');
sb.Append(seconds);
}
else
{
sb.Append("<size=1.6><#ffffff>");
sb.Append(Translator.GetString("CTF_TimeIsUp"));
}
sb.Append("</color></size>\n");
}
if (TemporarilyOutPlayers.TryGetValue(seer.PlayerId, out long backTS))
if (TemporarilyOutPlayers.TryGetValue(id, out long backTS))
{
long timeLeft = backTS - Utils.TimeStamp;
str += $"{string.Format(Translator.GetString("CTF_BackIn"), timeLeft)}\n";
sb.Append(string.Format(Translator.GetString("CTF_BackIn"), backTS - Utils.TimeStamp));
sb.Append('\n');
}
return str + string.Join("<#ffffff> | </color>", TeamData.Select(x => Utils.ColorString(x.Key.GetTeamColor(), x.Value.RoundsWon.ToString())));
sb.Append(Utils.ColorString(Color.blue, TeamData[CTFTeam.Blue].RoundsWon.ToString()));
sb.Append("<#ffffff> | </color>");
sb.Append(Utils.ColorString(Color.yellow, TeamData[CTFTeam.Yellow].RoundsWon.ToString()));
return sb.ToString();
}
public static string GetStatistics(byte id)
public static (int CarriedFor, int Tags) GetStatistics(byte id)
{
if (!PlayerData.TryGetValue(id, out CTFPlayerData stats)) return string.Empty;
return string.Format(Translator.GetString("CTF_PlayerStats"), Math.Round(stats.FlagTime, 1), stats.TagCount);
if (!PlayerData.TryGetValue(id, out CTFPlayerData stats)) return (0, 0);
return ((int)Math.Round(stats.FlagTime, 1), stats.TagCount);
}
public static int GetFlagTime(byte id)
@@ -713,17 +747,25 @@ public static class CaptureTheFlag
//[HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.FixedUpdate))]
public static class FixedUpdatePatch
{
private static long LastUpdate;
public static void Postfix(PlayerControl __instance)
{
if (!AmongUsClient.Instance.AmHost || !GameStates.IsInTask || ExileController.Instance || Options.CurrentGameMode != CustomGameMode.CaptureTheFlag || !Main.IntroDestroyed || __instance.PlayerId >= 254 || WinnerData.Team != "No one wins" || IntroCutsceneDestroyPatch.IntroDestroyTS + 5 > Utils.TimeStamp) return;
if (!AmongUsClient.Instance.AmHost || !GameStates.IsInTask || ExileController.Instance || Options.CurrentGameMode != CustomGameMode.CaptureTheFlag || !Main.IntroDestroyed || __instance.PlayerId >= 254 || WinnerData.Team != "No one wins") return;
long now = Utils.TimeStamp;
if (IntroCutsceneDestroyPatch.IntroDestroyTS + 5 > now) return;
bool notified = false;
if (__instance.AmOwner)
{
TeamData.Values.Do(x => x.Update());
if (GameEndCriteria.GetValue() == 2)
if (now != LastUpdate && GameEndCriteria.GetValue() == 2)
{
long timeLeft = TimeLimit.GetInt() - (Utils.TimeStamp - GameStartTS) + 1;
LastUpdate = now;
long timeLeft = TimeLimit.GetInt() - (now - GameStartTS) + 1;
switch (timeLeft)
{
@@ -736,6 +778,7 @@ public static class CaptureTheFlag
case >= -1:
{
Utils.NotifyRoles(SendOption: SendOption.None);
notified = true;
break;
}
}
@@ -760,16 +803,15 @@ public static class CaptureTheFlag
if (TemporarilyOutPlayers.TryGetValue(__instance.PlayerId, out long endTS))
{
if (Utils.TimeStamp >= endTS)
if (now >= endTS)
{
TemporarilyOutPlayers.Remove(__instance.PlayerId);
__instance.ReviveFromTemporaryExile();
__instance.TP(team.GetFlagBase().Position);
RPC.PlaySoundRPC(__instance.PlayerId, Sounds.SpawnSound);
Utils.NotifyRoles(SpecifySeer: __instance, SpecifyTarget: __instance, SendOption: SendOption.None);
}
else if (GameEndCriteria.GetValue() != 2)
Utils.NotifyRoles(SpecifySeer: __instance, SpecifyTarget: __instance, SendOption: SendOption.None);
if (!notified) Utils.NotifyRoles(SpecifySeer: __instance, SpecifyTarget: __instance, SendOption: SendOption.None);
}
}
}
+2 -1
View File
@@ -4221,7 +4221,8 @@ public static class Utils
summary = $"{ColorString(Main.PlayerColors[id], name)} - <#e8cd46>{rrSurvivedText}{vitalText}";
break;
case CustomGameMode.CaptureTheFlag:
summary = $"{ColorString(Main.PlayerColors[id], name)}: {CaptureTheFlag.GetStatistics(id)}";
(int carriedFor, int tags) = CaptureTheFlag.GetStatistics(id);
summary = $"{ColorString(Main.PlayerColors[id], name)}: {string.Format(GetString("CTF_PlayerStats_CarriedFor"), carriedFor)} | {string.Format(GetString("CTF_PlayerStats_Tags"), tags)}";
if (CaptureTheFlag.IsDeathPossible) summary += $" ({GetVitalText(id, true)})";
break;
case CustomGameMode.KingOfTheZones:
+2 -1
View File
@@ -4258,7 +4258,8 @@
"CTF_GameEndCriteria.PlayXRounds": "Play X Rounds",
"CTF_GameEndCriteria.TimeLimit": "Time Limit",
"CTF_Notify_EnemyTeamRoom": "The enemy team is in <#00ffa5>{0}</color>",
"CTF_PlayerStats": "<#00ffa5>Carried For: <#ffffff>{0}s</color> | Tags: <#ffffff>{1}</color></color>",
"CTF_PlayerStats_CarriedFor": "<#00a5ff>Carried For: <#ffffff>{0}s</color></color>",
"CTF_PlayerStats_Tags": "<#00a5ff>Tags: <#ffffff>{1}</color></color>",
"CTF_PointsToWin": "Points to Win",
"CTF_RoundsToPlay": "Rounds to Play",
"CTF_SpeedReductionForFlagCarrier": "Speed Reduction for Flag Carriers",