From 60482ace772374c3e8b6421acb1cc590408c8d38 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Fri, 15 Mar 2024 23:29:16 +0900 Subject: [PATCH 01/53] =?UTF-8?q?=E3=82=B2=E3=83=BC=E3=83=A0=E7=B5=82?= =?UTF-8?q?=E4=BA=86=E6=99=82=E3=81=AE=E5=B9=BD=E9=9C=8A=E5=8C=96=E3=81=AB?= =?UTF-8?q?IsDead=E3=82=92=E5=85=83=E3=81=AB=E6=88=BB=E3=81=99=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Patches/CheckGameEndPatch.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Patches/CheckGameEndPatch.cs b/Patches/CheckGameEndPatch.cs index 008870575..a5af251df 100644 --- a/Patches/CheckGameEndPatch.cs +++ b/Patches/CheckGameEndPatch.cs @@ -108,7 +108,8 @@ private static IEnumerator CoEndGame(AmongUsClient self, GameOverReason reason) void SetGhostRole(bool ToGhostImpostor) { - if (!pc.Data.IsDead) ReviveRequiredPlayerIds.Add(pc.PlayerId); + var isDead = pc.Data.IsDead; + if (!isDead) ReviveRequiredPlayerIds.Add(pc.PlayerId); if (ToGhostImpostor) { Logger.Info($"{pc.GetNameWithRole()}: ImpostorGhostに変更", "ResetRoleAndEndGame"); @@ -119,6 +120,8 @@ void SetGhostRole(bool ToGhostImpostor) Logger.Info($"{pc.GetNameWithRole()}: CrewmateGhostに変更", "ResetRoleAndEndGame"); pc.RpcSetRole(RoleTypes.CrewmateGhost); } + // 蘇生までの遅延の間にオートミュートをかけられないように元に戻しておく + pc.Data.IsDead = isDead; } } From 708e1ef66e4061d7fc7f0e33618681dd0b14cfea Mon Sep 17 00:00:00 2001 From: kou-hetare <96226646+kou-hetare@users.noreply.github.com> Date: Wed, 17 Apr 2024 18:15:32 +0900 Subject: [PATCH 02/53] =?UTF-8?q?RpcProtectedMurderPlayer=E6=99=82?= =?UTF-8?q?=E3=80=81=E4=BB=96=E8=A6=96=E7=82=B9=E3=81=B8=E5=AE=88=E8=AD=B7?= =?UTF-8?q?=E3=82=92=E9=80=9A=E7=9F=A5=E3=81=97=E3=81=AA=E3=81=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/ExtendedPlayerControl.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/ExtendedPlayerControl.cs b/Modules/ExtendedPlayerControl.cs index 8e5c7ae33..c9a338246 100644 --- a/Modules/ExtendedPlayerControl.cs +++ b/Modules/ExtendedPlayerControl.cs @@ -477,7 +477,7 @@ public static void RpcProtectedMurderPlayer(this PlayerControl killer, PlayerCon // Other Clients if (killer.PlayerId != 0) { - var writer = AmongUsClient.Instance.StartRpcImmediately(killer.NetId, (byte)RpcCalls.MurderPlayer, SendOption.Reliable); + var writer = AmongUsClient.Instance.StartRpcImmediately(killer.NetId, (byte)RpcCalls.MurderPlayer, SendOption.Reliable, killer.GetClientId()); writer.WriteNetObject(target); writer.Write((int)MurderResultFlags.FailedProtected); AmongUsClient.Instance.FinishRpcImmediately(writer); From 25c6b9955b7ea7ba1fea6efedc55ac34d308118f Mon Sep 17 00:00:00 2001 From: kou-hetare <96226646+kou-hetare@users.noreply.github.com> Date: Fri, 19 Apr 2024 19:32:08 +0900 Subject: [PATCH 03/53] =?UTF-8?q?Airship=E3=81=A7=E3=83=8E=E3=83=BC?= =?UTF-8?q?=E3=83=9E=E3=83=AB=E3=82=B9=E3=83=9D=E3=83=BC=E3=83=B3=E3=81=AE?= =?UTF-8?q?=E6=99=82SnapTo=E3=82=92=E5=AE=9F=E8=A1=8C=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Patches/RandomSpawnPatch.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Patches/RandomSpawnPatch.cs b/Patches/RandomSpawnPatch.cs index 118a25ea0..92daa19a5 100644 --- a/Patches/RandomSpawnPatch.cs +++ b/Patches/RandomSpawnPatch.cs @@ -101,7 +101,7 @@ public static bool Prefix(CustomNetworkTransform __instance, [HarmonyArgument(0) if (IsAirshipVanillaSpawnPosition(position)) { AirshipSpawn(player); - return false; + return !IsRandomSpawn(); } else { From 9b2812c94686bc230848cec70cc5517e520aa934 Mon Sep 17 00:00:00 2001 From: kou-hetare <96226646+kou-hetare@users.noreply.github.com> Date: Mon, 22 Apr 2024 18:35:00 +0900 Subject: [PATCH 04/53] =?UTF-8?q?Desync=E3=83=99=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=82=AD=E3=83=A3=E3=83=B3=E3=82=BB=E3=83=AB=E3=81=8C=E5=87=BA?= =?UTF-8?q?=E6=9D=A5=E3=81=AA=E3=81=8F=E3=81=AA=E3=81=A3=E3=81=A6=E3=81=84?= =?UTF-8?q?=E3=81=9F=E3=81=9F=E3=82=81=E3=80=81=E5=87=A6=E7=90=86=E5=A4=89?= =?UTF-8?q?=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Patches/PlayerContorolPatch.cs | 11 ++--------- Roles/Core/RoleBase.cs | 2 +- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/Patches/PlayerContorolPatch.cs b/Patches/PlayerContorolPatch.cs index b9783a9cc..9a5a58964 100644 --- a/Patches/PlayerContorolPatch.cs +++ b/Patches/PlayerContorolPatch.cs @@ -642,17 +642,10 @@ public static bool Prefix(PlayerPhysics __instance, [HarmonyArgument(0)] int id) !user.CanUseImpostorVentButton()) //インポスターベントも使えない ) { - MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(__instance.NetId, (byte)RpcCalls.BootFromVent, SendOption.Reliable, -1); - writer.WritePacked(127); - AmongUsClient.Instance.FinishRpcImmediately(writer); _ = new LateTask(() => { - int clientId = user.GetClientId(); - MessageWriter writer2 = AmongUsClient.Instance.StartRpcImmediately(__instance.NetId, (byte)RpcCalls.BootFromVent, SendOption.Reliable, clientId); - writer2.Write(id); - AmongUsClient.Instance.FinishRpcImmediately(writer2); - }, 0.5f, "Fix DesyncImpostor Stuck"); - return false; + __instance.RpcBootFromVent(id); + }, 0.5f, "Cancel Vent"); } } return true; diff --git a/Roles/Core/RoleBase.cs b/Roles/Core/RoleBase.cs index cbb72ff31..90a2badc7 100644 --- a/Roles/Core/RoleBase.cs +++ b/Roles/Core/RoleBase.cs @@ -192,7 +192,7 @@ public virtual void OnReportDeadBody(PlayerControl reporter, GameData.PlayerInfo /// /// /// - /// falseを返すとベントから追い出され、他人からアニメーションも見られません + /// falseを返すとベントから追い出されます public virtual bool OnEnterVent(PlayerPhysics physics, int ventId) => true; /// From a32a843932a58253b963d8e2d0f939e3baf5e11b Mon Sep 17 00:00:00 2001 From: kou-hetare <96226646+kou-hetare@users.noreply.github.com> Date: Sat, 11 May 2024 18:28:53 +0900 Subject: [PATCH 05/53] =?UTF-8?q?CanUseKillButton=E4=BE=8B=E5=A4=96?= =?UTF-8?q?=E3=81=AE=E6=8E=92=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Patches/HudPatch.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Patches/HudPatch.cs b/Patches/HudPatch.cs index 9ab983002..6968c3d20 100644 --- a/Patches/HudPatch.cs +++ b/Patches/HudPatch.cs @@ -194,6 +194,7 @@ public static void Postfix(HudManager __instance, [HarmonyArgument(2)] bool isAc __instance.ReportButton.ToggleVisible(!GameStates.IsLobby && isActive); if (!GameStates.IsModHost) return; IsActive = isActive; + if (GameStates.IsLobby) return; if (!isActive) return; var player = PlayerControl.LocalPlayer; From 74991f7a464a63cf9eeb8335c56f04ebad9a9a07 Mon Sep 17 00:00:00 2001 From: kou-hetare <96226646+kou-hetare@users.noreply.github.com> Date: Sat, 11 May 2024 18:29:38 +0900 Subject: [PATCH 06/53] =?UTF-8?q?TaskPanelBehaviour=E3=81=AEGetCustomRole?= =?UTF-8?q?=E5=A4=B1=E6=95=97=E6=8E=92=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Patches/HudPatch.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Patches/HudPatch.cs b/Patches/HudPatch.cs index 6968c3d20..8b2eb1a02 100644 --- a/Patches/HudPatch.cs +++ b/Patches/HudPatch.cs @@ -196,7 +196,6 @@ public static void Postfix(HudManager __instance, [HarmonyArgument(2)] bool isAc IsActive = isActive; if (GameStates.IsLobby) return; if (!isActive) return; - var player = PlayerControl.LocalPlayer; __instance.KillButton.ToggleVisible(player.CanUseKillButton()); __instance.ImpostorVentButton.ToggleVisible(player.CanUseImpostorVentButton()); @@ -226,6 +225,7 @@ class TaskPanelBehaviourPatch // タスク表示の文章が更新・適用された後に実行される public static void Postfix(TaskPanelBehaviour __instance) { + if (GameStates.IsLobby) return; if (!GameStates.IsModHost) return; PlayerControl player = PlayerControl.LocalPlayer; From 930d93219c6a56b4960fe0dde9b361a646bc9f45 Mon Sep 17 00:00:00 2001 From: kou-hetare <96226646+kou-hetare@users.noreply.github.com> Date: Sat, 11 May 2024 18:36:58 +0900 Subject: [PATCH 07/53] =?UTF-8?q?=E3=82=B7=E3=82=A7=E3=83=AA=E3=83=95?= =?UTF-8?q?=E8=AA=A4=E7=88=86=E5=89=8D=E3=81=AB=E6=AD=BB=E5=9B=A0=E3=82=92?= =?UTF-8?q?=E8=A8=AD=E5=AE=9A=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E5=A4=89?= =?UTF-8?q?=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Roles/Crewmate/Sheriff.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Roles/Crewmate/Sheriff.cs b/Roles/Crewmate/Sheriff.cs index fdedc02e2..ac696bbab 100644 --- a/Roles/Crewmate/Sheriff.cs +++ b/Roles/Crewmate/Sheriff.cs @@ -156,8 +156,8 @@ public void OnCheckMurderAsKiller(MurderInfo info) SendRPC(); if (!CanBeKilledBy(target)) { - killer.RpcMurderPlayer(killer); PlayerState.GetByPlayerId(killer.PlayerId).DeathReason = CustomDeathReason.Misfire; + killer.RpcMurderPlayer(killer); if (!MisfireKillsTarget.GetBool()) { info.DoKill = false; From 89956a6b8dc82c7daa4c2cf25494b5e79395cf15 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sun, 12 May 2024 23:12:39 +0900 Subject: [PATCH 08/53] =?UTF-8?q?=E9=80=80=E5=87=BA=E5=A4=B1=E6=95=97?= =?UTF-8?q?=E6=99=82=E7=94=A8=E3=81=AE=E6=96=B0=E8=A6=8F=E3=82=A8=E3=83=A9?= =?UTF-8?q?=E3=83=BC=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/ErrorText.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Modules/ErrorText.cs b/Modules/ErrorText.cs index 63895075c..39bb15790 100644 --- a/Modules/ErrorText.cs +++ b/Modules/ErrorText.cs @@ -155,6 +155,11 @@ public enum ErrorCode OptionIDDuplicate = 001_010_3, // 001-010-3 オプションIDが重複している(DEBUGビルド時のみ) // 002 サポート関連 UnsupportedVersion = 002_000_1, // 002-000-1 AmongUsのバージョンが古い + + // 010 参加/退出関連 + OnPlayerLeftPostfixFailedInGame = 010_000_2, // 010-000-2 OnPlayerLeftPatch.Postfixがゲーム中に失敗 + OnPlayerLeftPostfixFailedInLobby = 010_001_2, // 010-001-2 OnPlayerLeftPatch.Postfixがロビーで失敗 + // ========== // 000 Test NoError = 0000000, // 000-000-0 No Error From be32ead49d758c776c7febe1a1248f7bfe520d57 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sun, 12 May 2024 23:25:09 +0900 Subject: [PATCH 09/53] =?UTF-8?q?=E3=82=A8=E3=83=A9=E3=83=BC=E3=83=A1?= =?UTF-8?q?=E3=83=83=E3=82=BB=E3=83=BC=E3=82=B8=E3=81=AE=E7=BF=BB=E8=A8=B3?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Resources/string.csv | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Resources/string.csv b/Resources/string.csv index 6b6de901b..9a88bf466 100644 --- a/Resources/string.csv +++ b/Resources/string.csv @@ -618,6 +618,9 @@ "ERR-001-010-3","Duplicate Options ID","オプションIDが重複しています","选项ID重复","","Повторяющийся идентификатор настроек","","" "#### 002 Support" "ERR-002-000-1","Unsupported AmongUs version. Please update.","サポートされていないAmongUsバージョンです。ゲームをアップデートしてください。","不支持的 AmongUs 版本,请更新","","Неподдерживаемая версия AmongUs. Пожалуйста, обновите игру","Versão não suportada do Among Us. Por favor, atualize.","" +"#### 010 Session" +"ERR-010-000-2","An error occurred while processing disconnection. Please abort the game.","プレイヤーの切断処理中にエラーが発生しました。廃村してください。","","","","" +"ERR-010-001-2","An error occurred while processing disconnection. Please recreate the lobby.","プレイヤーの切断処理中にエラーが発生しました。ロビーを作り直してください。","","","","" "## その他" "DefaultSystemMessageTitle","【===== System Message =====】","【===== システムメッセージ ======】","【===== 系统信息 ======】","【===== 系統訊息 ======】","【=== Системное сообщение ===】","【===== Mensagem do Sistema ======】","" From 3d14a4c3d61ddf83bfbd88aa52a3d19cfff053ea Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sun, 12 May 2024 23:27:38 +0900 Subject: [PATCH 10/53] =?UTF-8?q?=E5=88=87=E6=96=AD=E3=81=AE=E3=82=A8?= =?UTF-8?q?=E3=83=A9=E3=83=BC=E5=87=A6=E7=90=86=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Patches/PlayerJoinAndLeftPatch.cs | 68 +++++++++++++++++++++++-------- 1 file changed, 51 insertions(+), 17 deletions(-) diff --git a/Patches/PlayerJoinAndLeftPatch.cs b/Patches/PlayerJoinAndLeftPatch.cs index 9359822f1..bb3635b35 100644 --- a/Patches/PlayerJoinAndLeftPatch.cs +++ b/Patches/PlayerJoinAndLeftPatch.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using AmongUs.Data; using AmongUs.GameOptions; @@ -82,28 +83,61 @@ static void Prefix([HarmonyArgument(0)] ClientData data) } public static void Postfix(AmongUsClient __instance, [HarmonyArgument(0)] ClientData data, [HarmonyArgument(1)] DisconnectReasons reason) { - // Logger.info($"RealNames[{data.Character.PlayerId}]を削除"); - // main.RealNames.Remove(data.Character.PlayerId); - if (GameStates.IsInGame) + var isFailure = false; + + try { - if (data.Character.Is(CustomRoles.Lovers) && !data.Character.Data.IsDead) - foreach (var lovers in Main.LoversPlayers.ToArray()) + if (data == null) + { + isFailure = true; + Logger.Warn("退出者のClientDataがnull", nameof(OnPlayerLeftPatch)); + } + else if (data.Character == null) + { + isFailure = true; + Logger.Warn("退出者のPlayerControlがnull", nameof(OnPlayerLeftPatch)); + } + else if (data.Character.Data == null) + { + isFailure = true; + Logger.Warn("退出者のPlayerInfoがnull", nameof(OnPlayerLeftPatch)); + } + else + { + if (GameStates.IsInGame) { - Main.isLoversDead = true; - Main.LoversPlayers.Remove(lovers); - PlayerState.GetByPlayerId(lovers.PlayerId).RemoveSubRole(CustomRoles.Lovers); + if (data.Character.Is(CustomRoles.Lovers) && !data.Character.Data.IsDead) + foreach (var lovers in Main.LoversPlayers.ToArray()) + { + Main.isLoversDead = true; + Main.LoversPlayers.Remove(lovers); + PlayerState.GetByPlayerId(lovers.PlayerId).RemoveSubRole(CustomRoles.Lovers); + } + var state = PlayerState.GetByPlayerId(data.Character.PlayerId); + if (state.DeathReason == CustomDeathReason.etc) //死因が設定されていなかったら + { + state.DeathReason = CustomDeathReason.Disconnected; + state.SetDead(); + } + AntiBlackout.OnDisconnect(data.Character.Data); + PlayerGameOptionsSender.RemoveSender(data.Character); } - var state = PlayerState.GetByPlayerId(data.Character.PlayerId); - if (state.DeathReason == CustomDeathReason.etc) //死因が設定されていなかったら - { - state.DeathReason = CustomDeathReason.Disconnected; - state.SetDead(); + Main.playerVersion.Remove(data.Character.PlayerId); + Logger.Info($"{data.PlayerName}(ClientID:{data.Id})が切断(理由:{reason}, ping:{AmongUsClient.Instance.Ping})", "Session"); } - AntiBlackout.OnDisconnect(data.Character.Data); - PlayerGameOptionsSender.RemoveSender(data.Character); } - Main.playerVersion.Remove(data.Character.PlayerId); - Logger.Info($"{data.PlayerName}(ClientID:{data.Id})が切断(理由:{reason}, ping:{AmongUsClient.Instance.Ping})", "Session"); + catch (Exception e) + { + Logger.Warn("切断処理中に例外が発生", nameof(OnPlayerLeftPatch)); + Logger.Exception(e, nameof(OnPlayerLeftPatch)); + isFailure = true; + } + + if (isFailure) + { + Logger.Warn($"正常に完了しなかった切断 - 名前:{(data == null || data.PlayerName == null ? "(不明)" : data.PlayerName)}, 理由:{reason}, ping:{AmongUsClient.Instance.Ping}", "Session"); + ErrorText.Instance.AddError(AmongUsClient.Instance.GameState is InnerNetClient.GameStates.Started ? ErrorCode.OnPlayerLeftPostfixFailedInGame : ErrorCode.OnPlayerLeftPostfixFailedInLobby); + } } } [HarmonyPatch(typeof(AmongUsClient), nameof(AmongUsClient.CreatePlayer))] From 14564dff79c2b0f76136753259718fbb133383d2 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Mon, 13 May 2024 02:54:35 +0900 Subject: [PATCH 11/53] =?UTF-8?q?ErrorText=E3=81=AB=E9=BB=92=E8=89=B2?= =?UTF-8?q?=E3=81=AE=E8=83=8C=E6=99=AF=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/ErrorText.cs | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/Modules/ErrorText.cs b/Modules/ErrorText.cs index 63895075c..91867c283 100644 --- a/Modules/ErrorText.cs +++ b/Modules/ErrorText.cs @@ -42,12 +42,32 @@ public static void Create(TMPro.TextMeshPro baseText) Text.color = Color.red; Text.outlineColor = Color.black; Text.alignment = TMPro.TextAlignmentOptions.Top; + + // 背景 + var bgObject = new GameObject("Background") { layer = LayerMask.NameToLayer("UI") }; + var bgRenderer = instance.background = bgObject.AddComponent(); + var bgTexture = new Texture2D(Screen.width, 150, TextureFormat.ARGB32, false); + for (var x = 0; x < bgTexture.width; x++) + { + for (var y = 0; y < bgTexture.height; y++) + { + bgTexture.SetPixel(x, y, new(0f, 0f, 0f, 0.6f)); + } + } + bgTexture.Apply(); + var bgSprite = Sprite.Create(bgTexture, new(0, 0, bgTexture.width, bgTexture.height), new(0.5f, 1f /* 上端の真ん中を中心とする */ )); + bgRenderer.sprite = bgSprite; + var bgTransform = bgObject.transform; + bgTransform.parent = instance.transform; + bgTransform.localPosition = new(0f, TextOffsetY, 1f); + bgObject.SetActive(false); } public TMPro.TextMeshPro Text; + private SpriteRenderer background; public Camera Camera; public List AllErrors = new(); - public Vector3 TextOffset = new(0, 0.3f, -1000f); + public Vector3 TextOffset = new(0, TextOffsetY, -1000f); public void Update() { AllErrors.ForEach(err => err.IncreaseTimer()); @@ -95,13 +115,13 @@ public void UpdateText() } if (maxLevel == 0) { - Text.enabled = false; + Hide(); } else { if (!HnSFlag) text += $"{GetString($"ErrorLevel{maxLevel}")}"; - Text.enabled = true; + Show(); } if (GameStates.IsInGame && maxLevel != 3) text += $"\n{GetString("TerminateCommand")}: Shift+L+Enter"; @@ -112,6 +132,16 @@ public void Clear() AllErrors.RemoveAll(err => err.ErrorLevel != 3); UpdateText(); } + private void Show() + { + Text.enabled = true; + background.gameObject.SetActive(true); + } + private void Hide() + { + Text.enabled = false; + background.gameObject.SetActive(false); + } public class ErrorData { @@ -138,6 +168,8 @@ public override string ToString() } public bool HnSFlag; + + const float TextOffsetY = 0.3f; } public enum ErrorCode { From 2437f77acf84798eb6a6bd422a408811005ff688 Mon Sep 17 00:00:00 2001 From: TommyXL <104814436+Tommy-XL@users.noreply.github.com> Date: Thu, 4 Apr 2024 12:03:52 +0800 Subject: [PATCH 12/53] Fix bug - April Fools mode not sync for clients --- Modules/GameOptionsSender/GameOptionsSender.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Modules/GameOptionsSender/GameOptionsSender.cs b/Modules/GameOptionsSender/GameOptionsSender.cs index ca24af682..a6010d335 100644 --- a/Modules/GameOptionsSender/GameOptionsSender.cs +++ b/Modules/GameOptionsSender/GameOptionsSender.cs @@ -30,12 +30,14 @@ public static void SendAllGameOptions() public virtual void SendGameOptions() { var opt = BuildGameOptions(); - + var currentGameMode = AprilFoolsMode.IsAprilFoolsModeToggledOn //April fools mode toggled on by host + ? opt.AprilFoolsOnMode : opt.GameMode; //Change game mode, same as well as in "RpcSyncSettings()" + // option => byte[] MessageWriter writer = MessageWriter.Get(SendOption.None); writer.Write(opt.Version); writer.StartMessage(0); - writer.Write((byte)opt.GameMode); + writer.Write((byte)currentGameMode); if (opt.TryCast(out var normalOpt)) NormalGameOptionsV07.Serialize(writer, normalOpt); else if (opt.TryCast(out var hnsOpt)) @@ -93,4 +95,4 @@ protected virtual void SendOptionsArray(Il2CppStructArray optionArray, byt public virtual bool AmValid() => true; } -} \ No newline at end of file +} From 6521efc0d8af22808f849feba1048ad2531befb3 Mon Sep 17 00:00:00 2001 From: kou-hetare <96226646+kou-hetare@users.noreply.github.com> Date: Wed, 19 Jun 2024 01:27:44 +0900 Subject: [PATCH 13/53] =?UTF-8?q?PlayerInfo=E5=A4=89=E6=9B=B4=E3=81=AE?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/AntiBlackout.cs | 2 +- Modules/Camouflague.cs | 10 +++++----- Modules/ExtendedPlayerControl.cs | 7 ++++--- Modules/GameState.cs | 2 +- Modules/MeetingVoteManager.cs | 2 +- Modules/Utils.cs | 4 ++-- Patches/ExilePatch.cs | 6 +++--- Patches/PlayerContorolPatch.cs | 4 ++-- Patches/ShipStatusPatch.cs | 2 +- Patches/TaskAssignPatch.cs | 2 +- Patches/UsablesPatch.cs | 4 ++-- Roles/Core/RoleBase.cs | 4 ++-- Roles/Crewmate/Mayor.cs | 2 +- Roles/Impostor/EvilHacker.cs | 2 +- Roles/Impostor/Penguin.cs | 2 +- Roles/Impostor/Puppeteer.cs | 2 +- Roles/Impostor/SerialKiller.cs | 2 +- Roles/Impostor/Sniper.cs | 2 +- Roles/Impostor/Vampire.cs | 2 +- Roles/Neutral/Arsonist.cs | 2 +- Roles/Neutral/Executioner.cs | 2 +- Roles/Neutral/Jester.cs | 2 +- Roles/Neutral/PlagueDoctor.cs | 2 +- Roles/Neutral/SchrodingerCat.cs | 2 +- Roles/Neutral/Terrorist.cs | 2 +- 25 files changed, 38 insertions(+), 37 deletions(-) diff --git a/Modules/AntiBlackout.cs b/Modules/AntiBlackout.cs index ff6419124..a54bd3595 100644 --- a/Modules/AntiBlackout.cs +++ b/Modules/AntiBlackout.cs @@ -77,7 +77,7 @@ public static void SendGameData([CallerMemberName] string callerMethodName = "") AmongUsClient.Instance.SendOrDisconnect(writer); writer.Recycle(); } - public static void OnDisconnect(GameData.PlayerInfo player) + public static void OnDisconnect(NetworkedPlayerInfo player) { // 実行条件: クライアントがホストである, IsDeadが上書きされている, playerが切断済み if (!AmongUsClient.Instance.AmHost || !IsCached || !player.Disconnected) return; diff --git a/Modules/Camouflague.cs b/Modules/Camouflague.cs index a7c24dd5b..36659a92f 100644 --- a/Modules/Camouflague.cs +++ b/Modules/Camouflague.cs @@ -5,7 +5,7 @@ namespace TownOfHost { static class PlayerOutfitExtension { - public static GameData.PlayerOutfit Set(this GameData.PlayerOutfit instance, string playerName, int colorId, string hatId, string skinId, string visorId, string petId) + public static NetworkedPlayerInfo.PlayerOutfit Set(this NetworkedPlayerInfo.PlayerOutfit instance, string playerName, int colorId, string hatId, string skinId, string visorId, string petId) { instance.PlayerName = playerName; instance.ColorId = colorId; @@ -15,7 +15,7 @@ public static GameData.PlayerOutfit Set(this GameData.PlayerOutfit instance, str instance.PetId = petId; return instance; } - public static bool Compare(this GameData.PlayerOutfit instance, GameData.PlayerOutfit targetOutfit) + public static bool Compare(this NetworkedPlayerInfo.PlayerOutfit instance, NetworkedPlayerInfo.PlayerOutfit targetOutfit) { return instance.ColorId == targetOutfit.ColorId && instance.HatId == targetOutfit.HatId && @@ -24,17 +24,17 @@ public static bool Compare(this GameData.PlayerOutfit instance, GameData.PlayerO instance.PetId == targetOutfit.PetId; } - public static string GetString(this GameData.PlayerOutfit instance) + public static string GetString(this NetworkedPlayerInfo.PlayerOutfit instance) { return $"{instance.PlayerName} Color:{instance.ColorId} {instance.HatId} {instance.SkinId} {instance.VisorId} {instance.PetId}"; } } public static class Camouflage { - static GameData.PlayerOutfit CamouflageOutfit = new GameData.PlayerOutfit().Set("", 15, "", "", "", ""); + static NetworkedPlayerInfo.PlayerOutfit CamouflageOutfit = new NetworkedPlayerInfo.PlayerOutfit().Set("", 15, "", "", "", ""); public static bool IsCamouflage; - public static Dictionary PlayerSkins = new(); + public static Dictionary PlayerSkins = new(); [GameModuleInitializer] public static void Init() diff --git a/Modules/ExtendedPlayerControl.cs b/Modules/ExtendedPlayerControl.cs index c9a338246..af8524efe 100644 --- a/Modules/ExtendedPlayerControl.cs +++ b/Modules/ExtendedPlayerControl.cs @@ -73,7 +73,7 @@ public static int GetClientId(this PlayerControl player) var client = player.GetClient(); return client == null ? -1 : client.Id; } - public static CustomRoles GetCustomRole(this GameData.PlayerInfo player) + public static CustomRoles GetCustomRole(this NetworkedPlayerInfo player) { return player == null || player.Object == null ? CustomRoles.Crewmate : player.Object.GetCustomRole(); } @@ -159,11 +159,12 @@ public static void RpcSetRoleDesync(this PlayerControl player, RoleTypes role, i if (player == null) return; if (AmongUsClient.Instance.ClientId == clientId) { - player.SetRole(role); + player.StartCoroutine(player.CoSetRole(role, false)); return; } MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(player.NetId, (byte)RpcCalls.SetRole, Hazel.SendOption.Reliable, clientId); writer.Write((ushort)role); + writer.Write(false); AmongUsClient.Instance.FinishRpcImmediately(writer); } @@ -483,7 +484,7 @@ public static void RpcProtectedMurderPlayer(this PlayerControl killer, PlayerCon AmongUsClient.Instance.FinishRpcImmediately(writer); } } - public static void NoCheckStartMeeting(this PlayerControl reporter, GameData.PlayerInfo target) + public static void NoCheckStartMeeting(this PlayerControl reporter, NetworkedPlayerInfo target) { /*サボタージュ中でも関係なしに会議を起こせるメソッド targetがnullの場合はボタンとなる*/ MeetingRoomManager.Instance.AssignSelf(reporter, target); diff --git a/Modules/GameState.cs b/Modules/GameState.cs index 223cbad59..57ebdc0c7 100644 --- a/Modules/GameState.cs +++ b/Modules/GameState.cs @@ -225,7 +225,7 @@ public static class GameStates public static class MeetingStates { public static DeadBody[] DeadBodies = null; - public static GameData.PlayerInfo ReportTarget = null; + public static NetworkedPlayerInfo ReportTarget = null; public static bool IsEmergencyMeeting => ReportTarget == null; public static bool IsExistDeadBody => DeadBodies.Length > 0; public static bool MeetingCalled = false; diff --git a/Modules/MeetingVoteManager.cs b/Modules/MeetingVoteManager.cs index 06e701ac1..027dbc6bc 100644 --- a/Modules/MeetingVoteManager.cs +++ b/Modules/MeetingVoteManager.cs @@ -277,7 +277,7 @@ public readonly struct VoteResult /// /// 追放されるプレイヤー /// - public readonly GameData.PlayerInfo Exiled; + public readonly NetworkedPlayerInfo Exiled; /// /// 同数投票かどうか /// diff --git a/Modules/Utils.cs b/Modules/Utils.cs index ee3462609..3bcfda84a 100644 --- a/Modules/Utils.cs +++ b/Modules/Utils.cs @@ -368,7 +368,7 @@ public static (string, Color) GetRoleTextHideAndSeek(RoleTypes oRole, CustomRole return (text, color); } - public static bool HasTasks(GameData.PlayerInfo p, bool ForRecompute = true) + public static bool HasTasks(NetworkedPlayerInfo p, bool ForRecompute = true) { if (GameStates.IsLobby) return false; //Tasksがnullの場合があるのでその場合タスク無しとする @@ -796,7 +796,7 @@ public static PlayerControl GetPlayerById(byte playerId) cachedPlayers[playerId] = player; return player; } - public static GameData.PlayerInfo GetPlayerInfoById(int PlayerId) => + public static NetworkedPlayerInfo GetPlayerInfoById(int PlayerId) => GameData.Instance.AllPlayers.ToArray().Where(info => info.PlayerId == PlayerId).FirstOrDefault(); private static StringBuilder SelfMark = new(20); private static StringBuilder SelfSuffix = new(20); diff --git a/Patches/ExilePatch.cs b/Patches/ExilePatch.cs index 38e29e423..e2614bc06 100644 --- a/Patches/ExilePatch.cs +++ b/Patches/ExilePatch.cs @@ -8,7 +8,7 @@ namespace TownOfHost { class ExileControllerWrapUpPatch { - public static GameData.PlayerInfo AntiBlackout_LastExiled; + public static NetworkedPlayerInfo AntiBlackout_LastExiled; [HarmonyPatch(typeof(ExileController), nameof(ExileController.WrapUp))] class BaseExileControllerPatch { @@ -40,7 +40,7 @@ public static void Postfix(AirshipExileController __instance) } } } - static void WrapUpPostfix(GameData.PlayerInfo exiled) + static void WrapUpPostfix(NetworkedPlayerInfo exiled) { if (AntiBlackout.OverrideExiledPlayer) { @@ -113,7 +113,7 @@ static void WrapUpPostfix(GameData.PlayerInfo exiled) Utils.NotifyRoles(); } - static void WrapUpFinalizer(GameData.PlayerInfo exiled) + static void WrapUpFinalizer(NetworkedPlayerInfo exiled) { //WrapUpPostfixで例外が発生しても、この部分だけは確実に実行されます。 if (AmongUsClient.Instance.AmHost) diff --git a/Patches/PlayerContorolPatch.cs b/Patches/PlayerContorolPatch.cs index 9a5a58964..b6d913562 100644 --- a/Patches/PlayerContorolPatch.cs +++ b/Patches/PlayerContorolPatch.cs @@ -334,8 +334,8 @@ public static void Prefix(PlayerControl __instance, [HarmonyArgument(0)] PlayerC class ReportDeadBodyPatch { public static Dictionary CanReport; - public static Dictionary> WaitReport = new(); - public static bool Prefix(PlayerControl __instance, [HarmonyArgument(0)] GameData.PlayerInfo target) + public static Dictionary> WaitReport = new(); + public static bool Prefix(PlayerControl __instance, [HarmonyArgument(0)] NetworkedPlayerInfo target) { if (GameStates.IsMeeting) return false; Logger.Info($"{__instance.GetNameWithRole()} => {target?.Object?.GetNameWithRole() ?? "null"}", "ReportDeadBody"); diff --git a/Patches/ShipStatusPatch.cs b/Patches/ShipStatusPatch.cs index 91893dc22..7e9c1c4fb 100644 --- a/Patches/ShipStatusPatch.cs +++ b/Patches/ShipStatusPatch.cs @@ -88,7 +88,7 @@ public static void Postfix() [HarmonyPatch(typeof(ShipStatus), nameof(ShipStatus.StartMeeting))] class StartMeetingPatch { - public static void Prefix(ShipStatus __instance, PlayerControl reporter, GameData.PlayerInfo target) + public static void Prefix(ShipStatus __instance, PlayerControl reporter, NetworkedPlayerInfo target) { MeetingStates.ReportTarget = target; MeetingStates.DeadBodies = UnityEngine.Object.FindObjectsOfType(); diff --git a/Patches/TaskAssignPatch.cs b/Patches/TaskAssignPatch.cs index 4f3035fb3..56d50d275 100644 --- a/Patches/TaskAssignPatch.cs +++ b/Patches/TaskAssignPatch.cs @@ -36,7 +36,7 @@ public static void Prefix(ShipStatus __instance, } } - [HarmonyPatch(typeof(GameData), nameof(GameData.RpcSetTasks))] + [HarmonyPatch(typeof(NetworkedPlayerInfo), nameof(NetworkedPlayerInfo.RpcSetTasks))] class RpcSetTasksPatch { //タスクを割り当ててRPCを送る処理が行われる直前にタスクを上書きするPatch diff --git a/Patches/UsablesPatch.cs b/Patches/UsablesPatch.cs index 0e3227d4c..d1d3ec165 100644 --- a/Patches/UsablesPatch.cs +++ b/Patches/UsablesPatch.cs @@ -9,7 +9,7 @@ namespace TownOfHost [HarmonyPatch(typeof(Console), nameof(Console.CanUse))] class CanUsePatch { - public static bool Prefix(ref float __result, Console __instance, [HarmonyArgument(0)] GameData.PlayerInfo pc, [HarmonyArgument(1)] out bool canUse, [HarmonyArgument(2)] out bool couldUse) + public static bool Prefix(ref float __result, Console __instance, [HarmonyArgument(0)] NetworkedPlayerInfo pc, [HarmonyArgument(1)] out bool canUse, [HarmonyArgument(2)] out bool couldUse) { canUse = couldUse = false; //こいつをfalseでreturnしても、タスク(サボ含む)以外の使用可能な物は使えるまま(ボタンなど) @@ -27,7 +27,7 @@ public static void Postfix(EmergencyMinigame __instance) [HarmonyPatch(typeof(Vent), nameof(Vent.CanUse))] class CanUseVentPatch { - public static bool Prefix(Vent __instance, [HarmonyArgument(0)] GameData.PlayerInfo pc, + public static bool Prefix(Vent __instance, [HarmonyArgument(0)] NetworkedPlayerInfo pc, [HarmonyArgument(1)] ref bool canUse, [HarmonyArgument(2)] ref bool couldUse, ref float __result) diff --git a/Roles/Core/RoleBase.cs b/Roles/Core/RoleBase.cs index 90a2badc7..f5e64916f 100644 --- a/Roles/Core/RoleBase.cs +++ b/Roles/Core/RoleBase.cs @@ -183,7 +183,7 @@ public virtual void OnFixedUpdate(PlayerControl player) /// /// 通報したプレイヤー /// 通報されたプレイヤー - public virtual void OnReportDeadBody(PlayerControl reporter, GameData.PlayerInfo target) + public virtual void OnReportDeadBody(PlayerControl reporter, NetworkedPlayerInfo target) { } /// @@ -224,7 +224,7 @@ public virtual void OnStartMeeting() /// /// 追放されるプレイヤー /// 勝者を確定させるか - public virtual void OnExileWrapUp(GameData.PlayerInfo exiled, ref bool DecidedWinner) + public virtual void OnExileWrapUp(NetworkedPlayerInfo exiled, ref bool DecidedWinner) { } /// diff --git a/Roles/Crewmate/Mayor.cs b/Roles/Crewmate/Mayor.cs index f4cfdf299..d4d0d37e7 100644 --- a/Roles/Crewmate/Mayor.cs +++ b/Roles/Crewmate/Mayor.cs @@ -61,7 +61,7 @@ public override void ApplyGameOptions(IGameOptions opt) : opt.GetInt(Int32OptionNames.EmergencyCooldown); AURoleOptions.EngineerInVentMaxTime = 1; } - public override void OnReportDeadBody(PlayerControl reporter, GameData.PlayerInfo target) + public override void OnReportDeadBody(PlayerControl reporter, NetworkedPlayerInfo target) { if (Is(reporter) && target == null) //ボタン LeftButtonCount--; diff --git a/Roles/Impostor/EvilHacker.cs b/Roles/Impostor/EvilHacker.cs index eaf92a522..f3817be52 100644 --- a/Roles/Impostor/EvilHacker.cs +++ b/Roles/Impostor/EvilHacker.cs @@ -82,7 +82,7 @@ private static void HandleMurderRoomNotify(MurderInfo info) } } - public override void OnReportDeadBody(PlayerControl reporter, GameData.PlayerInfo target) + public override void OnReportDeadBody(PlayerControl reporter, NetworkedPlayerInfo target) { if (!Player.IsAlive()) { diff --git a/Roles/Impostor/Penguin.cs b/Roles/Impostor/Penguin.cs index 4c6912c40..a855bce3e 100644 --- a/Roles/Impostor/Penguin.cs +++ b/Roles/Impostor/Penguin.cs @@ -144,7 +144,7 @@ public override bool CanUseAbilityButton() { return AbductVictim != null; } - public override void OnReportDeadBody(PlayerControl reporter, GameData.PlayerInfo target) + public override void OnReportDeadBody(PlayerControl reporter, NetworkedPlayerInfo target) { stopCount = true; // 時間切れ状態で会議を迎えたらはしご中でも構わずキルする diff --git a/Roles/Impostor/Puppeteer.cs b/Roles/Impostor/Puppeteer.cs index ad8349bb3..ee11abb36 100644 --- a/Roles/Impostor/Puppeteer.cs +++ b/Roles/Impostor/Puppeteer.cs @@ -75,7 +75,7 @@ public void OnCheckMurderAsKiller(MurderInfo info) Utils.NotifyRoles(SpecifySeer: puppeteer); info.DoKill = false; } - public override void OnReportDeadBody(PlayerControl _, GameData.PlayerInfo __) + public override void OnReportDeadBody(PlayerControl _, NetworkedPlayerInfo __) { Puppets.Clear(); SendRPC(byte.MaxValue, 0); diff --git a/Roles/Impostor/SerialKiller.cs b/Roles/Impostor/SerialKiller.cs index 21aa56667..5e75c7237 100644 --- a/Roles/Impostor/SerialKiller.cs +++ b/Roles/Impostor/SerialKiller.cs @@ -68,7 +68,7 @@ public void OnCheckMurderAsKiller(MurderInfo info) SuicideTimer = null; killer.MarkDirtySettings(); } - public override void OnReportDeadBody(PlayerControl reporter, GameData.PlayerInfo target) + public override void OnReportDeadBody(PlayerControl reporter, NetworkedPlayerInfo target) { SuicideTimer = null; } diff --git a/Roles/Impostor/Sniper.cs b/Roles/Impostor/Sniper.cs index 840fc33fa..aa98aac01 100644 --- a/Roles/Impostor/Sniper.cs +++ b/Roles/Impostor/Sniper.cs @@ -291,7 +291,7 @@ public override void OnFixedUpdate(PlayerControl player) Utils.NotifyRoles(SpecifySeer: Player); } } - public override void OnReportDeadBody(PlayerControl reporter, GameData.PlayerInfo target) + public override void OnReportDeadBody(PlayerControl reporter, NetworkedPlayerInfo target) { MeetingReset = true; } diff --git a/Roles/Impostor/Vampire.cs b/Roles/Impostor/Vampire.cs index 7ff5e3754..c01537bab 100644 --- a/Roles/Impostor/Vampire.cs +++ b/Roles/Impostor/Vampire.cs @@ -84,7 +84,7 @@ public override void OnFixedUpdate(PlayerControl _) } } } - public override void OnReportDeadBody(PlayerControl _, GameData.PlayerInfo __) + public override void OnReportDeadBody(PlayerControl _, NetworkedPlayerInfo __) { foreach (var targetId in BittenPlayers.Keys) { diff --git a/Roles/Neutral/Arsonist.cs b/Roles/Neutral/Arsonist.cs index e30f72156..9148fb7df 100644 --- a/Roles/Neutral/Arsonist.cs +++ b/Roles/Neutral/Arsonist.cs @@ -128,7 +128,7 @@ public void OnCheckMurderAsKiller(MurderInfo info) } info.DoKill = false; } - public override void OnReportDeadBody(PlayerControl reporter, GameData.PlayerInfo target) + public override void OnReportDeadBody(PlayerControl reporter, NetworkedPlayerInfo target) { TargetInfo = null; } diff --git a/Roles/Neutral/Executioner.cs b/Roles/Neutral/Executioner.cs index c16ae5dea..a52051b50 100644 --- a/Roles/Neutral/Executioner.cs +++ b/Roles/Neutral/Executioner.cs @@ -137,7 +137,7 @@ public override string GetMark(PlayerControl seer, PlayerControl seen, bool _ = return TargetId == seen.PlayerId ? Utils.ColorString(RoleInfo.RoleColor, "♦") : ""; } - public override void OnExileWrapUp(GameData.PlayerInfo exiled, ref bool DecidedWinner) + public override void OnExileWrapUp(NetworkedPlayerInfo exiled, ref bool DecidedWinner) { if (!AmongUsClient.Instance.AmHost) return; if (Player?.IsAlive() != true) return; diff --git a/Roles/Neutral/Jester.cs b/Roles/Neutral/Jester.cs index ff64fdf5e..b24e2709e 100644 --- a/Roles/Neutral/Jester.cs +++ b/Roles/Neutral/Jester.cs @@ -24,7 +24,7 @@ public Jester(PlayerControl player) ) { } - public override void OnExileWrapUp(GameData.PlayerInfo exiled, ref bool DecidedWinner) + public override void OnExileWrapUp(NetworkedPlayerInfo exiled, ref bool DecidedWinner) { if (!AmongUsClient.Instance.AmHost || Player.PlayerId != exiled.PlayerId) return; diff --git a/Roles/Neutral/PlagueDoctor.cs b/Roles/Neutral/PlagueDoctor.cs index a45a9d4c5..9a13293c8 100644 --- a/Roles/Neutral/PlagueDoctor.cs +++ b/Roles/Neutral/PlagueDoctor.cs @@ -173,7 +173,7 @@ public static void OnMurderPlayerOthers(MurderInfo info) //非感染者が死んだ場合勝利するかもしれない LateCheckWin = true; } - public override void OnReportDeadBody(PlayerControl reporter, GameData.PlayerInfo target) + public override void OnReportDeadBody(PlayerControl reporter, NetworkedPlayerInfo target) { InfectActive = false; } diff --git a/Roles/Neutral/SchrodingerCat.cs b/Roles/Neutral/SchrodingerCat.cs index 447bfd48d..93f40c41b 100644 --- a/Roles/Neutral/SchrodingerCat.cs +++ b/Roles/Neutral/SchrodingerCat.cs @@ -165,7 +165,7 @@ public override void OverrideTrueRoleName(ref Color roleColor, ref string roleTe } roleColor = DisplayRoleColor; } - public override void OnExileWrapUp(GameData.PlayerInfo exiled, ref bool DecidedWinner) + public override void OnExileWrapUp(NetworkedPlayerInfo exiled, ref bool DecidedWinner) { if (exiled.PlayerId != Player.PlayerId || Team != TeamType.None || !ChangeTeamWhenExile) { diff --git a/Roles/Neutral/Terrorist.cs b/Roles/Neutral/Terrorist.cs index 87c78b60e..3c7c47f21 100644 --- a/Roles/Neutral/Terrorist.cs +++ b/Roles/Neutral/Terrorist.cs @@ -58,7 +58,7 @@ public override void OnMurderPlayerAsTarget(MurderInfo info) Win(); } } - public override void OnExileWrapUp(GameData.PlayerInfo exiled, ref bool DecidedWinner) + public override void OnExileWrapUp(NetworkedPlayerInfo exiled, ref bool DecidedWinner) { if (exiled.PlayerId != Player.PlayerId) { From aeb6c8782a6635a296f3ecd8084dee45463795df Mon Sep 17 00:00:00 2001 From: kou-hetare <96226646+kou-hetare@users.noreply.github.com> Date: Wed, 19 Jun 2024 01:29:00 +0900 Subject: [PATCH 14/53] =?UTF-8?q?Map=E5=A4=89=E6=9B=B4=E3=81=AF=E3=83=87?= =?UTF-8?q?=E3=83=95=E3=82=A9=E3=83=AB=E3=83=88=E3=81=A7=E5=87=BA=E6=9D=A5?= =?UTF-8?q?=E3=82=8B=E3=81=AE=E3=81=A7=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Patches/GameOptionsMenuPatch.cs | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/Patches/GameOptionsMenuPatch.cs b/Patches/GameOptionsMenuPatch.cs index 1dc430bfd..b36198a6e 100644 --- a/Patches/GameOptionsMenuPatch.cs +++ b/Patches/GameOptionsMenuPatch.cs @@ -10,17 +10,6 @@ namespace TownOfHost { - [HarmonyPatch(typeof(GameSettingMenu), nameof(GameSettingMenu.InitializeOptions))] - public static class GameSettingMenuPatch - { - public static void Prefix(GameSettingMenu __instance) - { - // Unlocks map/impostor amount changing in online (for testing on your custom servers) - // オンラインモードで部屋を立て直さなくてもマップを変更できるように変更 - __instance.HideForOnline = new Il2CppReferenceArray(0); - } - } - [HarmonyPatch(typeof(GameOptionsMenu), nameof(GameOptionsMenu.Start))] [HarmonyPriority(Priority.First)] public static class GameOptionsMenuPatch From c8fa970a5adde000813d5dedcd9d9bdd039833f1 Mon Sep 17 00:00:00 2001 From: kou-hetare <96226646+kou-hetare@users.noreply.github.com> Date: Thu, 20 Jun 2024 01:02:30 +0900 Subject: [PATCH 15/53] =?UTF-8?q?=E3=82=B2=E3=83=BC=E3=83=A0=E5=86=85?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E3=81=AE=E9=80=81=E3=82=8A=E5=85=88=E3=82=92?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/Debugger.cs | 2 +- Patches/ControlPatch.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Debugger.cs b/Modules/Debugger.cs index 5699d1beb..2257d583d 100644 --- a/Modules/Debugger.cs +++ b/Modules/Debugger.cs @@ -45,7 +45,7 @@ public static void Enable(string tag, bool toGame = false) public static void SendInGame(string text, bool isAlways = false) { if (!isEnable) return; - if (DestroyableSingleton._instance) DestroyableSingleton.Instance.Notifier.AddItem(text); + if (DestroyableSingleton._instance) DestroyableSingleton.Instance.Notifier.AddDisconnectMessage(text); } private static void SendToFile(string text, LogLevel level = LogLevel.Info, string tag = "", bool escapeCRLF = true, int lineNumber = 0, string fileName = "") { diff --git a/Patches/ControlPatch.cs b/Patches/ControlPatch.cs index dfc9c266a..29ec27702 100644 --- a/Patches/ControlPatch.cs +++ b/Patches/ControlPatch.cs @@ -173,7 +173,7 @@ public static void Postfix(ControllerManager __instance) if (Input.GetKeyDown(KeyCode.Equals)) { Main.VisibleTasksCount = !Main.VisibleTasksCount; - DestroyableSingleton.Instance.Notifier.AddItem("VisibleTaskCountが" + Main.VisibleTasksCount.ToString() + "に変更されました。"); + DestroyableSingleton.Instance.Notifier.AddDisconnectMessage("VisibleTaskCountが" + Main.VisibleTasksCount.ToString() + "に変更されました。"); } //エアシップのトイレのドアを全て開ける if (Input.GetKeyDown(KeyCode.P)) From 2360f1e0bbd47433aeb2d819c206ac1db3c740de Mon Sep 17 00:00:00 2001 From: kou-hetare <96226646+kou-hetare@users.noreply.github.com> Date: Thu, 20 Jun 2024 01:04:20 +0900 Subject: [PATCH 16/53] =?UTF-8?q?GameSettings=E3=81=8C=E3=81=AA=E3=81=8F?= =?UTF-8?q?=E3=81=AA=E3=81=A3=E3=81=9F=E3=81=9F=E3=82=81=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Patches/HudPatch.cs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Patches/HudPatch.cs b/Patches/HudPatch.cs index 8b2eb1a02..823d06b40 100644 --- a/Patches/HudPatch.cs +++ b/Patches/HudPatch.cs @@ -42,12 +42,6 @@ public static void Postfix(HudManager __instance) player.Collider.offset = new Vector2(0f, -0.3636f); } } - if (GameStates.IsLobby) - { - __instance.GameSettings.text = OptionShower.GetText(); - __instance.GameSettings.fontSizeMin = - __instance.GameSettings.fontSizeMax = (TranslationController.Instance.currentLanguage.languageID == SupportedLangs.Japanese || Main.ForceJapanese.Value) ? 1.05f : 1.2f; - } //ゲーム中でなければ以下は実行されない if (!AmongUsClient.Instance.IsGameStarted) return; From 112c2c2ecaff60d5bad5b4abcdd4e97ec14d6e25 Mon Sep 17 00:00:00 2001 From: kou-hetare <96226646+kou-hetare@users.noreply.github.com> Date: Thu, 20 Jun 2024 01:05:10 +0900 Subject: [PATCH 17/53] =?UTF-8?q?GameOptions=E3=81=AEVer=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.cs b/main.cs index d842d1303..3980b78ec 100644 --- a/main.cs +++ b/main.cs @@ -63,8 +63,8 @@ public class Main : BasePlugin public static string ExceptionMessage; public static bool ExceptionMessageIsShown = false; public static string credentialsText; - public static NormalGameOptionsV07 NormalOptions => GameOptionsManager.Instance.currentNormalGameOptions; - public static HideNSeekGameOptionsV07 HideNSeekSOptions => GameOptionsManager.Instance.currentHideNSeekGameOptions; + public static NormalGameOptionsV08 NormalOptions => GameOptionsManager.Instance.currentNormalGameOptions; + public static HideNSeekGameOptionsV08 HideNSeekSOptions => GameOptionsManager.Instance.currentHideNSeekGameOptions; //Client Options public static ConfigEntry HideName { get; private set; } public static ConfigEntry HideColor { get; private set; } From 9bd9fef96e5ca9e964e1634d533301f16f229f77 Mon Sep 17 00:00:00 2001 From: kou-hetare <96226646+kou-hetare@users.noreply.github.com> Date: Thu, 20 Jun 2024 01:08:56 +0900 Subject: [PATCH 18/53] =?UTF-8?q?PlayerInfo=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/AntiBlackout.cs | 25 ++++++++++++++----------- Patches/CheckGameEndPatch.cs | 2 +- Roles/AddOns/Crewmate/Workhorse.cs | 2 +- Roles/Impostor/Penguin.cs | 2 +- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/Modules/AntiBlackout.cs b/Modules/AntiBlackout.cs index a54bd3595..f0f10aa3b 100644 --- a/Modules/AntiBlackout.cs +++ b/Modules/AntiBlackout.cs @@ -59,23 +59,26 @@ public static void RestoreIsDead(bool doSend = true, [CallerMemberName] string c public static void SendGameData([CallerMemberName] string callerMethodName = "") { logger.Info($"SendGameData is called from {callerMethodName}"); - MessageWriter writer = MessageWriter.Get(SendOption.Reliable); - // 書き込み {}は読みやすさのためです。 - writer.StartMessage(5); //0x05 GameData + foreach (var playerinfo in GameData.Instance.AllPlayers) { - writer.Write(AmongUsClient.Instance.GameId); - writer.StartMessage(1); //0x01 Data + MessageWriter writer = MessageWriter.Get(SendOption.Reliable); + // 書き込み {}は読みやすさのためです。 + writer.StartMessage(5); //0x05 GameData { - writer.WritePacked(GameData.Instance.NetId); - GameData.Instance.Serialize(writer, true); + writer.Write(AmongUsClient.Instance.GameId); + writer.StartMessage(1); //0x01 Data + { + writer.WritePacked(playerinfo.NetId); + playerinfo.Serialize(writer, true); + } + writer.EndMessage(); } writer.EndMessage(); - } - writer.EndMessage(); - AmongUsClient.Instance.SendOrDisconnect(writer); - writer.Recycle(); + AmongUsClient.Instance.SendOrDisconnect(writer); + writer.Recycle(); + } } public static void OnDisconnect(NetworkedPlayerInfo player) { diff --git a/Patches/CheckGameEndPatch.cs b/Patches/CheckGameEndPatch.cs index a5af251df..82bdb14ac 100644 --- a/Patches/CheckGameEndPatch.cs +++ b/Patches/CheckGameEndPatch.cs @@ -143,7 +143,7 @@ void SetGhostRole(bool ToGhostImpostor) // 蘇生 playerInfo.IsDead = false; // 送信 - GameData.Instance.SetDirtyBit(0b_1u << playerId); + playerInfo.MarkDirty(); AmongUsClient.Instance.SendAllStreamedObjects(); } // ゲーム終了を確実に最後に届けるための遅延 diff --git a/Roles/AddOns/Crewmate/Workhorse.cs b/Roles/AddOns/Crewmate/Workhorse.cs index 1fb22b978..fbd091be4 100644 --- a/Roles/AddOns/Crewmate/Workhorse.cs +++ b/Roles/AddOns/Crewmate/Workhorse.cs @@ -67,7 +67,7 @@ public static bool OnCompleteTask(PlayerControl pc) if (AmongUsClient.Instance.AmHost) { Add(pc.PlayerId); - GameData.Instance.RpcSetTasks(pc.PlayerId, Array.Empty()); //タスクを再配布 + pc.Data.RpcSetTasks(Array.Empty()); //タスクを再配布 pc.SyncSettings(); Utils.NotifyRoles(); } diff --git a/Roles/Impostor/Penguin.cs b/Roles/Impostor/Penguin.cs index a855bce3e..a1584f075 100644 --- a/Roles/Impostor/Penguin.cs +++ b/Roles/Impostor/Penguin.cs @@ -199,7 +199,7 @@ public override void OnFixedUpdate(PlayerControl player) { // 先にIsDeadをtrueにする(はしごチェイス封じ) AbductVictim.Data.IsDead = true; - GameData.Instance.SetDirty(); + AbductVictim.Data.MarkDirty(); // ペンギン自身がはしご上にいる場合,はしごを降りてからキルする if (!AbductVictim.MyPhysics.Animations.IsPlayingAnyLadderAnimation()) { From 929a17c07ea0bcc14ec7cfce6c4e91918a703a57 Mon Sep 17 00:00:00 2001 From: kou-hetare <96226646+kou-hetare@users.noreply.github.com> Date: Thu, 20 Jun 2024 01:09:32 +0900 Subject: [PATCH 19/53] =?UTF-8?q?TempData=E3=82=92EndGameResult=E3=81=AB?= =?UTF-8?q?=E7=BD=AE=E3=81=8D=E6=8F=9B=E3=81=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Patches/OutroPatch.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Patches/OutroPatch.cs b/Patches/OutroPatch.cs index 99f8ade37..fbf7f0372 100644 --- a/Patches/OutroPatch.cs +++ b/Patches/OutroPatch.cs @@ -45,7 +45,7 @@ public static void Postfix(AmongUsClient __instance, [HarmonyArgument(0)] ref En Main.NormalOptions.KillCooldown = Options.DefaultKillCooldown; //winnerListリセット - TempData.winners = new Il2CppSystem.Collections.Generic.List(); + EndGameResult.CachedWinners = new Il2CppSystem.Collections.Generic.List(); var winner = new List(); foreach (var pc in Main.AllPlayerControls) { @@ -95,7 +95,7 @@ public static void Postfix(AmongUsClient __instance, [HarmonyArgument(0)] ref En { if (CustomWinnerHolder.WinnerTeam is not CustomWinner.Draw && pc.Is(CustomRoles.GM)) continue; - TempData.winners.Add(new WinningPlayerData(pc.Data)); + EndGameResult.CachedWinners.Add(new CachedPlayerData(pc.Data)); Main.winnerList.Add(pc.PlayerId); } From ae72480de53d4913e0caefd3a05f15b88c839249 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Fri, 21 Jun 2024 03:24:24 +0900 Subject: [PATCH 20/53] =?UTF-8?q?SetNameRPC=E3=81=AB=E5=A2=97=E3=81=88?= =?UTF-8?q?=E3=81=9FNetworkedPlayerInfo=E3=81=AENetId=E3=81=AE=E6=9B=B8?= =?UTF-8?q?=E3=81=8D=E8=BE=BC=E3=81=BF=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/ExtendedPlayerControl.cs | 1 + Modules/RPC.cs | 1 + Patches/ChatCommandPatch.cs | 2 ++ 3 files changed, 4 insertions(+) diff --git a/Modules/ExtendedPlayerControl.cs b/Modules/ExtendedPlayerControl.cs index af8524efe..1159c7b22 100644 --- a/Modules/ExtendedPlayerControl.cs +++ b/Modules/ExtendedPlayerControl.cs @@ -148,6 +148,7 @@ public static void RpcSetNamePrivate(this PlayerControl player, string name, boo var clientId = seer.GetClientId(); MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(player.NetId, (byte)RpcCalls.SetName, Hazel.SendOption.Reliable, clientId); + writer.Write(player.Data.NetId); writer.Write(name); writer.Write(DontShowOnModdedClient); AmongUsClient.Instance.FinishRpcImmediately(writer); diff --git a/Modules/RPC.cs b/Modules/RPC.cs index d2208c4f8..fc240cd32 100644 --- a/Modules/RPC.cs +++ b/Modules/RPC.cs @@ -40,6 +40,7 @@ public static bool Prefix(PlayerControl __instance, [HarmonyArgument(0)] byte ca switch (rpcType) { case RpcCalls.SetName: //SetNameRPC + subReader.ReadUInt32(); string name = subReader.ReadString(); if (subReader.BytesRemaining > 0 && subReader.ReadBoolean()) return false; Logger.Info("名前変更:" + __instance.GetNameWithRole() + " => " + name, "SetName"); diff --git a/Patches/ChatCommandPatch.cs b/Patches/ChatCommandPatch.cs index f320701e4..4c6cb87d2 100644 --- a/Patches/ChatCommandPatch.cs +++ b/Patches/ChatCommandPatch.cs @@ -455,12 +455,14 @@ public static void Postfix(ChatController __instance) var writer = CustomRpcSender.Create("MessagesToSend", SendOption.None); writer.StartMessage(clientId); writer.StartRpc(player.NetId, (byte)RpcCalls.SetName) + .Write(player.Data.NetId) .Write(title) .EndRpc(); writer.StartRpc(player.NetId, (byte)RpcCalls.SendChat) .Write(msg) .EndRpc(); writer.StartRpc(player.NetId, (byte)RpcCalls.SetName) + .Write(player.Data.NetId) .Write(player.Data.PlayerName) .EndRpc(); writer.EndMessage(); From 201c188a0122fd2ca6a67da733317adefc234a90 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Fri, 21 Jun 2024 03:27:52 +0900 Subject: [PATCH 21/53] =?UTF-8?q?=E3=82=B2=E3=83=BC=E3=83=A0=E3=82=AA?= =?UTF-8?q?=E3=83=97=E3=82=B7=E3=83=A7=E3=83=B3=20V07=20->=20V08?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/Extensions/IGameManagerEx.cs | 20 +++++++++---------- .../GameOptionsSender/GameOptionsSender.cs | 10 +++++----- .../PlayerGameOptionsSender.cs | 2 +- Roles/Impostor/Puppeteer.cs | 2 +- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Modules/Extensions/IGameManagerEx.cs b/Modules/Extensions/IGameManagerEx.cs index 0aa2257b3..e64dedf01 100644 --- a/Modules/Extensions/IGameManagerEx.cs +++ b/Modules/Extensions/IGameManagerEx.cs @@ -5,23 +5,23 @@ namespace TownOfHost.Modules.Extensions public static class IGameManagerEx { public static void Set(this BoolOptionNames name, bool value, IGameOptions opt) => opt.SetBool(name, value); - public static void Set(this BoolOptionNames name, bool value, NormalGameOptionsV07 opt) => opt.SetBool(name, value); - public static void Set(this BoolOptionNames name, bool value, HideNSeekGameOptionsV07 opt) => opt.SetBool(name, value); + public static void Set(this BoolOptionNames name, bool value, NormalGameOptionsV08 opt) => opt.SetBool(name, value); + public static void Set(this BoolOptionNames name, bool value, HideNSeekGameOptionsV08 opt) => opt.SetBool(name, value); public static void Set(this Int32OptionNames name, int value, IGameOptions opt) => opt.SetInt(name, value); - public static void Set(this Int32OptionNames name, int value, NormalGameOptionsV07 opt) => opt.SetInt(name, value); - public static void Set(this Int32OptionNames name, int value, HideNSeekGameOptionsV07 opt) => opt.SetInt(name, value); + public static void Set(this Int32OptionNames name, int value, NormalGameOptionsV08 opt) => opt.SetInt(name, value); + public static void Set(this Int32OptionNames name, int value, HideNSeekGameOptionsV08 opt) => opt.SetInt(name, value); public static void Set(this FloatOptionNames name, float value, IGameOptions opt) => opt.SetFloat(name, value); - public static void Set(this FloatOptionNames name, float value, NormalGameOptionsV07 opt) => opt.SetFloat(name, value); - public static void Set(this FloatOptionNames name, float value, HideNSeekGameOptionsV07 opt) => opt.SetFloat(name, value); + public static void Set(this FloatOptionNames name, float value, NormalGameOptionsV08 opt) => opt.SetFloat(name, value); + public static void Set(this FloatOptionNames name, float value, HideNSeekGameOptionsV08 opt) => opt.SetFloat(name, value); public static void Set(this ByteOptionNames name, byte value, IGameOptions opt) => opt.SetByte(name, value); - public static void Set(this ByteOptionNames name, byte value, NormalGameOptionsV07 opt) => opt.SetByte(name, value); - public static void Set(this ByteOptionNames name, byte value, HideNSeekGameOptionsV07 opt) => opt.SetByte(name, value); + public static void Set(this ByteOptionNames name, byte value, NormalGameOptionsV08 opt) => opt.SetByte(name, value); + public static void Set(this ByteOptionNames name, byte value, HideNSeekGameOptionsV08 opt) => opt.SetByte(name, value); public static void Set(this UInt32OptionNames name, uint value, IGameOptions opt) => opt.SetUInt(name, value); - public static void Set(this UInt32OptionNames name, uint value, NormalGameOptionsV07 opt) => opt.SetUInt(name, value); - public static void Set(this UInt32OptionNames name, uint value, HideNSeekGameOptionsV07 opt) => opt.SetUInt(name, value); + public static void Set(this UInt32OptionNames name, uint value, NormalGameOptionsV08 opt) => opt.SetUInt(name, value); + public static void Set(this UInt32OptionNames name, uint value, HideNSeekGameOptionsV08 opt) => opt.SetUInt(name, value); } } \ No newline at end of file diff --git a/Modules/GameOptionsSender/GameOptionsSender.cs b/Modules/GameOptionsSender/GameOptionsSender.cs index a6010d335..507b98c94 100644 --- a/Modules/GameOptionsSender/GameOptionsSender.cs +++ b/Modules/GameOptionsSender/GameOptionsSender.cs @@ -32,16 +32,16 @@ public virtual void SendGameOptions() var opt = BuildGameOptions(); var currentGameMode = AprilFoolsMode.IsAprilFoolsModeToggledOn //April fools mode toggled on by host ? opt.AprilFoolsOnMode : opt.GameMode; //Change game mode, same as well as in "RpcSyncSettings()" - + // option => byte[] MessageWriter writer = MessageWriter.Get(SendOption.None); writer.Write(opt.Version); writer.StartMessage(0); writer.Write((byte)currentGameMode); - if (opt.TryCast(out var normalOpt)) - NormalGameOptionsV07.Serialize(writer, normalOpt); - else if (opt.TryCast(out var hnsOpt)) - HideNSeekGameOptionsV07.Serialize(writer, hnsOpt); + if (opt.TryCast(out var normalOpt)) + NormalGameOptionsV08.Serialize(writer, normalOpt); + else if (opt.TryCast(out var hnsOpt)) + HideNSeekGameOptionsV08.Serialize(writer, hnsOpt); else { writer.Recycle(); diff --git a/Modules/GameOptionsSender/PlayerGameOptionsSender.cs b/Modules/GameOptionsSender/PlayerGameOptionsSender.cs index 0f499ae88..adece0901 100644 --- a/Modules/GameOptionsSender/PlayerGameOptionsSender.cs +++ b/Modules/GameOptionsSender/PlayerGameOptionsSender.cs @@ -22,7 +22,7 @@ public static void SetDirtyToAll() => .ToList().ForEach(sender => sender.SetDirty()); public override IGameOptions BasedGameOptions => - Main.RealOptionsData.Restore(new NormalGameOptionsV07(new UnityLogger().Cast()).Cast()); + Main.RealOptionsData.Restore(new NormalGameOptionsV08(new UnityLogger().Cast()).Cast()); public override bool IsDirty { get; protected set; } public PlayerControl player; diff --git a/Roles/Impostor/Puppeteer.cs b/Roles/Impostor/Puppeteer.cs index ee11abb36..04cf4ed22 100644 --- a/Roles/Impostor/Puppeteer.cs +++ b/Roles/Impostor/Puppeteer.cs @@ -110,7 +110,7 @@ private void CheckPuppetKill(PlayerControl puppet) var min = targetDistance.OrderBy(c => c.Value).FirstOrDefault();//一番値が小さい var target = min.Key; - var KillRange = NormalGameOptionsV07.KillDistances[Mathf.Clamp(Main.NormalOptions.KillDistance, 0, 2)]; + var KillRange = NormalGameOptionsV08.KillDistances[Mathf.Clamp(Main.NormalOptions.KillDistance, 0, 2)]; if (min.Value <= KillRange && puppet.CanMove && target.CanMove) { RPC.PlaySoundRPC(Player.PlayerId, Sounds.KillSound); From 7ca8b89302b65200cbe7df796dcef33eee189192 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Fri, 21 Jun 2024 03:30:51 +0900 Subject: [PATCH 22/53] =?UTF-8?q?PlayerOutfit=E3=81=AE=E7=A7=BB=E5=8B=95?= =?UTF-8?q?=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Patches/onGameStartedPatch.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Patches/onGameStartedPatch.cs b/Patches/onGameStartedPatch.cs index 218807e7f..3621634f4 100644 --- a/Patches/onGameStartedPatch.cs +++ b/Patches/onGameStartedPatch.cs @@ -82,7 +82,7 @@ public static void Postfix(AmongUsClient __instance) pc.cosmetics.nameText.text = pc.name; var outfit = pc.Data.DefaultOutfit; - Camouflage.PlayerSkins[pc.PlayerId] = new GameData.PlayerOutfit().Set(outfit.PlayerName, outfit.ColorId, outfit.HatId, outfit.SkinId, outfit.VisorId, outfit.PetId); + Camouflage.PlayerSkins[pc.PlayerId] = new NetworkedPlayerInfo.PlayerOutfit().Set(outfit.PlayerName, outfit.ColorId, outfit.HatId, outfit.SkinId, outfit.VisorId, outfit.PetId); Main.clientIdList.Add(pc.GetClientId()); } Main.VisibleTasksCount = true; From cc93fb1bbf6f0e620a212e7c405facb1c21c7468 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Fri, 21 Jun 2024 03:32:16 +0900 Subject: [PATCH 23/53] =?UTF-8?q?=E6=97=A7SetRole=E3=81=8C=E3=82=B3?= =?UTF-8?q?=E3=83=AB=E3=83=BC=E3=83=81=E3=83=B3=E3=81=A8=E3=81=AA=E3=81=A3?= =?UTF-8?q?=E3=81=9FCoSetRole=E3=81=B8=E7=A7=BB=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Patches/onGameStartedPatch.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Patches/onGameStartedPatch.cs b/Patches/onGameStartedPatch.cs index 3621634f4..7b6b73ba8 100644 --- a/Patches/onGameStartedPatch.cs +++ b/Patches/onGameStartedPatch.cs @@ -359,7 +359,7 @@ private static void AssignDesyncRole(CustomRoles role, List AllPl } RpcSetRoleReplacer.OverriddenSenderList.Add(senders[player.PlayerId]); //ホスト視点はロール決定 - player.SetRole(othersRole); + player.StartCoroutine(player.CoSetRole(othersRole, false)); player.Data.IsDead = true; } } @@ -475,7 +475,7 @@ public static void Release() foreach (var pair in StoragedData) { - pair.Item1.SetRole(pair.Item2); + pair.Item1.StartCoroutine(pair.Item1.CoSetRole(pair.Item2, false)); sender.Value.AutoStartRpc(pair.Item1.NetId, (byte)RpcCalls.SetRole, Utils.GetPlayerById(sender.Key).GetClientId()) .Write((ushort)pair.Item2) .EndRpc(); From 22cbccbd621cada3f68f4b2d972951781093ac88 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Fri, 21 Jun 2024 03:33:58 +0900 Subject: [PATCH 24/53] =?UTF-8?q?RpcSetTasks=E3=81=AE=E3=83=91=E3=83=83?= =?UTF-8?q?=E3=83=81=E3=82=92=E4=BF=AE=E5=BE=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Patches/TaskAssignPatch.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Patches/TaskAssignPatch.cs b/Patches/TaskAssignPatch.cs index 56d50d275..4a4e6deff 100644 --- a/Patches/TaskAssignPatch.cs +++ b/Patches/TaskAssignPatch.cs @@ -41,9 +41,8 @@ class RpcSetTasksPatch { //タスクを割り当ててRPCを送る処理が行われる直前にタスクを上書きするPatch //バニラのタスク割り当て処理自体には干渉しない - public static void Prefix(GameData __instance, - [HarmonyArgument(0)] byte playerId, - [HarmonyArgument(1)] ref Il2CppStructArray taskTypeIds) + public static void Prefix(NetworkedPlayerInfo __instance, + [HarmonyArgument(0)] ref Il2CppStructArray taskTypeIds) { //null対策 if (Main.RealOptionsData == null) @@ -52,7 +51,7 @@ public static void Prefix(GameData __instance, return; } - var pc = Utils.GetPlayerById(playerId); + var pc = __instance.Object; CustomRoles? RoleNullable = pc?.GetCustomRole(); if (RoleNullable == null) return; CustomRoles role = RoleNullable.Value; From 76f7889c567370722c57cde5ea310f6505a7d14c Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Fri, 21 Jun 2024 03:39:17 +0900 Subject: [PATCH 25/53] =?UTF-8?q?=E5=90=8D=E5=89=8D=E5=A4=89=E6=9B=B4?= =?UTF-8?q?=E3=81=AB=E8=BF=BD=E5=BE=93=20RoleOptionSetting#TitleText=20->?= =?UTF-8?q?=20titleText?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 実際の表示では文字色が背景に同化してヤバいことになるけど一旦置いといて後で直す --- Patches/GameOptionsPatch.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Patches/GameOptionsPatch.cs b/Patches/GameOptionsPatch.cs index 2514b8ae9..d1d9bd572 100644 --- a/Patches/GameOptionsPatch.cs +++ b/Patches/GameOptionsPatch.cs @@ -14,11 +14,11 @@ public static void Postfix(RoleOptionSetting __instance) string DisableText = $" ({GetString("Disabled")})"; if (__instance.Role.Role == RoleTypes.Scientist) { - __instance.TitleText.color = Utils.GetRoleColor(CustomRoles.Scientist); + __instance.titleText.color = Utils.GetRoleColor(CustomRoles.Scientist); } if (__instance.Role.Role == RoleTypes.Engineer) { - __instance.TitleText.color = Utils.GetRoleColor(CustomRoles.Engineer); + __instance.titleText.color = Utils.GetRoleColor(CustomRoles.Engineer); } if (__instance.Role.Role == RoleTypes.GuardianAngel) { @@ -31,13 +31,13 @@ public static void Postfix(RoleOptionSetting __instance) = tf.Find("More Options").gameObject.active = false; - if (!__instance.TitleText.text.Contains(DisableText)) - __instance.TitleText.text += DisableText; - __instance.TitleText.color = Utils.GetRoleColor(CustomRoles.GuardianAngel); + if (!__instance.titleText.text.Contains(DisableText)) + __instance.titleText.text += DisableText; + __instance.titleText.color = Utils.GetRoleColor(CustomRoles.GuardianAngel); } if (__instance.Role.Role == RoleTypes.Shapeshifter) { - __instance.TitleText.color = Utils.GetRoleColor(CustomRoles.Shapeshifter); + __instance.titleText.color = Utils.GetRoleColor(CustomRoles.Shapeshifter); } } } From fa6525856bc1f4276188987cfb3b302a500113fc Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sat, 22 Jun 2024 23:54:05 +0900 Subject: [PATCH 26/53] =?UTF-8?q?=E3=83=90=E3=83=BC=E3=82=B8=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E8=A1=A8=E7=A4=BA=E3=82=92=E5=8F=B3=E4=B8=8A=E3=81=B8?= =?UTF-8?q?=E7=A7=BB=E5=8B=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Patches/CredentialsPatch.cs | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/Patches/CredentialsPatch.cs b/Patches/CredentialsPatch.cs index 2128c3f79..87944caa7 100644 --- a/Patches/CredentialsPatch.cs +++ b/Patches/CredentialsPatch.cs @@ -15,6 +15,8 @@ namespace TownOfHost public static class CredentialsPatch { public static SpriteRenderer TohLogo { get; private set; } + private static TextMeshPro pingTrackerCredential = null; + private static AspectPosition pingTrackerCredentialAspectPos = null; [HarmonyPatch(typeof(PingTracker), nameof(PingTracker.Update))] class PingTrackerUpdatePatch @@ -22,30 +24,39 @@ class PingTrackerUpdatePatch static StringBuilder sb = new(); static void Postfix(PingTracker __instance) { - __instance.text.alignment = TextAlignmentOptions.TopRight; + if (pingTrackerCredential == null) + { + var uselessPingTracker = Object.Instantiate(__instance, __instance.transform.parent); + pingTrackerCredential = uselessPingTracker.GetComponent(); + Object.Destroy(uselessPingTracker); + pingTrackerCredential.alignment = TextAlignmentOptions.TopRight; + pingTrackerCredential.color = new(1f, 1f, 1f, 0.7f); + pingTrackerCredential.rectTransform.pivot = new(1f, 1f); // 中心を右上角に設定 + pingTrackerCredentialAspectPos = pingTrackerCredential.GetComponent(); + pingTrackerCredentialAspectPos.Alignment = AspectPosition.EdgeAlignments.RightTop; + } + if (pingTrackerCredentialAspectPos) + { + pingTrackerCredentialAspectPos.DistanceFromEdge = DestroyableSingleton.InstanceExists && DestroyableSingleton.Instance.Chat.chatButton.gameObject.active + ? new(2.5f, 0f, -1000f) + : new(1.8f, 0f, -1000f); + } sb.Clear(); - - sb.Append("\r\n").Append(Main.credentialsText); - + sb.Append(Main.credentialsText); if (Options.NoGameEnd.GetBool()) sb.Append($"\r\n").Append(Utils.ColorString(Color.red, GetString("NoGameEnd"))); if (Options.IsStandardHAS) sb.Append($"\r\n").Append(Utils.ColorString(Color.yellow, GetString("StandardHAS"))); if (Options.CurrentGameMode == CustomGameMode.HideAndSeek) sb.Append($"\r\n").Append(Utils.ColorString(Color.red, GetString("HideAndSeek"))); if (!GameStates.IsModHost) sb.Append($"\r\n").Append(Utils.ColorString(Color.red, GetString("Warning.NoModHost"))); if (DebugModeManager.IsDebugMode) sb.Append("\r\n").Append(Utils.ColorString(Color.green, "デバッグモード")); - var offset_x = 1.2f; //右端からのオフセット - if (HudManager.InstanceExists && HudManager._instance.Chat.chatButton.active) offset_x += 0.8f; //チャットボタンがある場合の追加オフセット - if (FriendsListManager.InstanceExists && FriendsListManager._instance.FriendsListButton.Button.active) offset_x += 0.8f; //フレンドリストボタンがある場合の追加オフセット - __instance.GetComponent().DistanceFromEdge = new Vector3(offset_x, 0f, 0f); - if (GameStates.IsLobby) { if (Options.IsStandardHAS && !CustomRoles.Sheriff.IsEnable() && !CustomRoles.SerialKiller.IsEnable() && CustomRoles.Egoist.IsEnable()) sb.Append($"\r\n").Append(Utils.ColorString(Color.red, GetString("Warning.EgoistCannotWin"))); } - __instance.text.text += sb.ToString(); + pingTrackerCredential.text = sb.ToString(); } } [HarmonyPatch(typeof(VersionShower), nameof(VersionShower.Start))] From 027b8896a321b975df61f17cc7a1d1b0974405db Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sat, 22 Jun 2024 23:55:40 +0900 Subject: [PATCH 27/53] =?UTF-8?q?=E3=83=AD=E3=83=93=E3=83=BC=E3=81=AEUI?= =?UTF-8?q?=E3=82=92=E8=AA=BF=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Patches/GameStartManagerPatch.cs | 35 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/Patches/GameStartManagerPatch.cs b/Patches/GameStartManagerPatch.cs index 5a83ca876..d09bda5fa 100644 --- a/Patches/GameStartManagerPatch.cs +++ b/Patches/GameStartManagerPatch.cs @@ -20,7 +20,7 @@ public class GameStartManagerPatch private static TextMeshPro warningText; public static TextMeshPro HideName; private static TextMeshPro timerText; - private static SpriteRenderer cancelButton; + private static PassiveButton cancelButton; [HarmonyPatch(typeof(GameStartManager), nameof(GameStartManager.Start))] public class GameStartManagerStartPatch @@ -51,31 +51,32 @@ public static void Postfix(GameStartManager __instance) timerText.fontSize = 3.2f; timerText.name = "Timer"; timerText.DestroyChildren(); - timerText.transform.localPosition += Vector3.down * 0.2f; + timerText.transform.localPosition += new Vector3(0.3f, -3.4f, 0f); timerText.gameObject.SetActive(AmongUsClient.Instance.NetworkMode == NetworkModes.OnlineGame && AmongUsClient.Instance.AmHost); cancelButton = Object.Instantiate(__instance.StartButton, __instance.transform); cancelButton.name = "CancelButton"; - var cancelLabel = cancelButton.GetComponentInChildren(); + var cancelLabel = cancelButton.buttonText; cancelLabel.DestroyTranslator(); cancelLabel.text = GetString("Cancel"); - cancelButton.transform.localScale = new(0.4f, 0.4f, 1f); - cancelButton.color = Color.red; - cancelButton.transform.localPosition = new(0f, -0.37f, 0f); - var buttonComponent = cancelButton.GetComponent(); - buttonComponent.OnClick = new(); - buttonComponent.OnClick.AddListener((Action)(() => __instance.ResetStartState())); + cancelButton.transform.localScale = new(0.5f, 0.5f, 1f); + var cancelButtonInactiveRenderer = cancelButton.inactiveSprites.GetComponent(); + cancelButtonInactiveRenderer.color = new(0.8f, 0f, 0f, 1f); + var cancelButtonActiveRenderer = cancelButton.activeSprites.GetComponent(); + cancelButtonActiveRenderer.color = Color.red; + var cancelButtonInactiveShine = cancelButton.inactiveSprites.transform.Find("Shine"); + if (cancelButtonInactiveShine) + { + cancelButtonInactiveShine.gameObject.SetActive(false); + } + cancelButton.activeTextColor = cancelButton.inactiveTextColor = Color.white; + cancelButton.transform.localPosition = new(2f, 0.13f, 0f); + cancelButton.OnClick = new(); + cancelButton.OnClick.AddListener((Action)(() => __instance.ResetStartState())); cancelButton.gameObject.SetActive(false); if (!AmongUsClient.Instance.AmHost) return; - // Make Public Button - if (ModUpdater.isBroken || ModUpdater.hasUpdate || !Main.AllowPublicRoom || !VersionChecker.IsSupported || !Main.IsPublicAvailableOnThisVersion) - { - __instance.MakePublicButton.color = Palette.DisabledClear; - __instance.privatePublicText.color = Palette.DisabledClear; - } - if (Main.NormalOptions.KillCooldown == 0f) Main.NormalOptions.KillCooldown = Main.LastKillCooldown.Value; @@ -170,7 +171,7 @@ public static void Postfix(GameStartManager __instance) timer = Mathf.Max(0f, timer -= Time.deltaTime); int minutes = (int)timer / 60; int seconds = (int)timer % 60; - string countDown = $"({minutes:00}:{seconds:00})"; + string countDown = $"{minutes:00}:{seconds:00}"; if (timer <= 60) countDown = Utils.ColorString(Color.red, countDown); timerText.text = countDown; } From 1289ba127d45169ee180d6b5359bf25ea12c9e05 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sat, 22 Jun 2024 23:57:46 +0900 Subject: [PATCH 28/53] =?UTF-8?q?=E3=82=B2=E3=83=BC=E3=83=A0=E8=A8=AD?= =?UTF-8?q?=E5=AE=9AUI=E3=82=92=E6=96=B0UI=E3=81=AB=E8=BF=BD=E5=BE=93?= =?UTF-8?q?=E3=81=97=E3=81=A6=E8=AA=BF=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/OptionItem/OptionItem.cs | 21 +- Patches/GameOptionsMenuPatch.cs | 410 ++++++++++++++++++------------- Resources/string.csv | 4 + main.cs | 20 ++ 4 files changed, 288 insertions(+), 167 deletions(-) diff --git a/Modules/OptionItem/OptionItem.cs b/Modules/OptionItem/OptionItem.cs index dd5a604f6..8ff55920b 100644 --- a/Modules/OptionItem/OptionItem.cs +++ b/Modules/OptionItem/OptionItem.cs @@ -11,6 +11,16 @@ public abstract class OptionItem #region static public static IReadOnlyList AllOptions => _allOptions; private static List _allOptions = new(1024); + public static IReadOnlyList MainOptions => _mainOptions; + private static List _mainOptions = new(512); + public static IReadOnlyList ImpostorRoleOptions => _impostorRoleOptions; + private static List _impostorRoleOptions = new(512); + public static IReadOnlyList CrewmateRoleOptions => _crewmateRoleOptions; + private static List _crewmateRoleOptions = new(512); + public static IReadOnlyList NeutralRoleOptions => _neutralRoleOptions; + private static List _neutralRoleOptions = new(512); + public static IReadOnlyList AddOnOptions => _addOnOptions; + private static List _addOnOptions = new(512); public static IReadOnlyDictionary FastOptions => _fastOptions; private static Dictionary _fastOptions = new(1024); public static int CurrentPreset { get; set; } @@ -56,7 +66,7 @@ public int CurrentValue public OptionItem Parent { get; private set; } public List Children; - public OptionBehaviour OptionBehaviour; + public StringOption OptionBehaviour; // イベント // eventキーワードにより、クラス外からのこのフィールドに対する以下の操作は禁止されます。 @@ -105,6 +115,15 @@ public OptionItem(int id, string name, int defaultValue, TabGroup tab, bool isSi if (_fastOptions.TryAdd(id, this)) { _allOptions.Add(this); + switch (tab) + { + case TabGroup.MainSettings: _mainOptions.Add(this); break; + case TabGroup.ImpostorRoles: _impostorRoleOptions.Add(this); break; + case TabGroup.CrewmateRoles: _crewmateRoleOptions.Add(this); break; + case TabGroup.NeutralRoles: _neutralRoleOptions.Add(this); break; + case TabGroup.Addons: _addOnOptions.Add(this); break; + default: Logger.Warn($"Encountered unknown option category \"{tab}\" (ID: {id}, Name: {name})", nameof(OptionItem)); break; + } } else { diff --git a/Patches/GameOptionsMenuPatch.cs b/Patches/GameOptionsMenuPatch.cs index b36198a6e..a76ea35df 100644 --- a/Patches/GameOptionsMenuPatch.cs +++ b/Patches/GameOptionsMenuPatch.cs @@ -1,18 +1,173 @@ using System; -using System.Collections.Generic; using System.Linq; using AmongUs.GameOptions; using HarmonyLib; -using Il2CppInterop.Runtime.InteropTypes.Arrays; using UnityEngine; using static TownOfHost.Translator; using Object = UnityEngine.Object; namespace TownOfHost { - [HarmonyPatch(typeof(GameOptionsMenu), nameof(GameOptionsMenu.Start))] - [HarmonyPriority(Priority.First)] - public static class GameOptionsMenuPatch + [HarmonyPatch(typeof(GameSettingMenu))] + public static class GameSettingMenuPatch + { + private static GameOptionsMenu tohSettingsTab; + private static PassiveButton tohSettingsButton; + public static CategoryHeaderMasked MainCategoryHeader { get; private set; } + public static CategoryHeaderMasked ImpostorRoleCategoryHeader { get; private set; } + public static CategoryHeaderMasked CrewmateRoleCategoryHeader { get; private set; } + public static CategoryHeaderMasked NeutralRoleCategoryHeader { get; private set; } + public static CategoryHeaderMasked AddOnCategoryHeader { get; private set; } + + [HarmonyPatch(nameof(GameSettingMenu.Start)), HarmonyPostfix] + public static void StartPostfix(GameSettingMenu __instance) + { + tohSettingsTab = Object.Instantiate(__instance.GameSettingsTab, __instance.GameSettingsTab.transform.parent); + tohSettingsTab.name = TOHMenuName; + var vanillaOptions = tohSettingsTab.GetComponentsInChildren(); + foreach (var vanillaOption in vanillaOptions) + { + Object.Destroy(vanillaOption.gameObject); + } + + // TOH設定ボタンのスペースを作るため,左側の要素を上に詰める + var gameSettingsLabel = __instance.transform.Find("GameSettingsLabel"); + if (gameSettingsLabel) + { + gameSettingsLabel.localPosition += Vector3.up * 0.2f; + } + __instance.MenuDescriptionText.transform.parent.localPosition += Vector3.up * 0.4f; + __instance.GamePresetsButton.transform.parent.localPosition += Vector3.up * 0.5f; + + // TOH設定ボタン + tohSettingsButton = Object.Instantiate(__instance.GameSettingsButton, __instance.GameSettingsButton.transform.parent); + tohSettingsButton.name = "TOHSettingsButton"; + tohSettingsButton.transform.localPosition = __instance.RoleSettingsButton.transform.localPosition + (__instance.RoleSettingsButton.transform.localPosition - __instance.GameSettingsButton.transform.localPosition); + tohSettingsButton.buttonText.DestroyTranslator(); + tohSettingsButton.buttonText.text = GetString("TOHSettingsButtonLabel"); + var activeSprite = tohSettingsButton.activeSprites.GetComponent(); + var selectedSprite = tohSettingsButton.selectedSprites.GetComponent(); + activeSprite.color = selectedSprite.color = Main.UnityModColor; + tohSettingsButton.OnClick.AddListener((Action)(() => + { + __instance.ChangeTab(-1, false); // バニラタブを閉じる + tohSettingsTab.gameObject.SetActive(true); + __instance.MenuDescriptionText.text = GetString("TOHSettingsDescription"); + tohSettingsButton.SelectButton(true); + })); + + // 各カテゴリの見出しを作成 + MainCategoryHeader = CreateCategoryHeader(__instance, tohSettingsTab, "TabGroup.MainSettings"); + ImpostorRoleCategoryHeader = CreateCategoryHeader(__instance, tohSettingsTab, "TabGroup.ImpostorRoles"); + CrewmateRoleCategoryHeader = CreateCategoryHeader(__instance, tohSettingsTab, "TabGroup.CrewmateRoles"); + NeutralRoleCategoryHeader = CreateCategoryHeader(__instance, tohSettingsTab, "TabGroup.NeutralRoles"); + AddOnCategoryHeader = CreateCategoryHeader(__instance, tohSettingsTab, "TabGroup.Addons"); + + // 各設定スイッチを作成 + var template = __instance.GameSettingsTab.stringOptionOrigin; + var scOptions = new Il2CppSystem.Collections.Generic.List(); + foreach (var option in OptionItem.AllOptions) + { + if (option.OptionBehaviour == null) + { + var stringOption = Object.Instantiate(template, tohSettingsTab.settingsContainer); + scOptions.Add(stringOption); + stringOption.SetClickMask(__instance.GameSettingsButton.ClickMask); + stringOption.SetUpFromData(stringOption.data, GameOptionsMenu.MASK_LAYER); + stringOption.OnValueChanged = new Action((o) => { }); + stringOption.TitleText.text = option.Name; + stringOption.Value = stringOption.oldValue = option.CurrentValue; + stringOption.ValueText.text = option.GetString(); + stringOption.name = option.Name; + + // タイトルの枠をデカくする + var indent = 0f; // 親オプションがある場合枠の左を削ってインデントに見せる + var parent = option.Parent; + while (parent != null) + { + indent += 0.15f; + parent = parent.Parent; + } + stringOption.LabelBackground.size += new Vector2(2f - indent * 2, 0f); + stringOption.LabelBackground.transform.localPosition += new Vector3(-1f + indent, 0f, 0f); + stringOption.TitleText.rectTransform.sizeDelta += new Vector2(2f - indent * 2, 0f); + stringOption.TitleText.transform.localPosition += new Vector3(-1f + indent, 0f, 0f); + + option.OptionBehaviour = stringOption; + } + option.OptionBehaviour.gameObject.SetActive(true); + } + tohSettingsTab.Children = scOptions; + tohSettingsTab.gameObject.SetActive(false); + + // 各カテゴリまでスクロールするボタンを作成 + var jumpButtonY = -0.6f; + var jumpToMainButton = CreateJumpToCategoryButton(__instance, tohSettingsTab, "TownOfHost.Resources.TabIcon_MainSettings.png", ref jumpButtonY, MainCategoryHeader); + var jumpToImpButton = CreateJumpToCategoryButton(__instance, tohSettingsTab, "TownOfHost.Resources.TabIcon_ImpostorRoles.png", ref jumpButtonY, ImpostorRoleCategoryHeader); + var jumpToCrewButton = CreateJumpToCategoryButton(__instance, tohSettingsTab, "TownOfHost.Resources.TabIcon_CrewmateRoles.png", ref jumpButtonY, CrewmateRoleCategoryHeader); + var jumpToNeutralButton = CreateJumpToCategoryButton(__instance, tohSettingsTab, "TownOfHost.Resources.TabIcon_NeutralRoles.png", ref jumpButtonY, NeutralRoleCategoryHeader); + var jumpToAddOnButton = CreateJumpToCategoryButton(__instance, tohSettingsTab, "TownOfHost.Resources.TabIcon_Addons.png", ref jumpButtonY, AddOnCategoryHeader); + } + private static MapSelectButton CreateJumpToCategoryButton(GameSettingMenu __instance, GameOptionsMenu tohTab, string resourcePath, ref float localY, CategoryHeaderMasked jumpTo) + { + var image = Utils.LoadSprite(resourcePath, 100f); + var button = Object.Instantiate(__instance.GameSettingsTab.MapPicker.MapButtonOrigin, Vector3.zero, Quaternion.identity, tohTab.transform); + button.SetImage(image, GameOptionsMenu.MASK_LAYER); + button.transform.localPosition = new(7.1f, localY, -10f); + button.Button.ClickMask = tohTab.ButtonClickMask; + button.Button.OnClick.AddListener((Action)(() => + { + tohTab.scrollBar.velocity = Vector2.zero; // ドラッグの慣性によるスクロールを止める + var relativePosition = tohTab.scrollBar.transform.InverseTransformPoint(jumpTo.transform.position); // Scrollerのローカル空間における座標に変換 + var scrollAmount = CategoryJumpY - relativePosition.y; + tohTab.scrollBar.Inner.localPosition = tohTab.scrollBar.Inner.localPosition + Vector3.up * scrollAmount; // 強制スクロール + tohTab.scrollBar.ScrollRelative(Vector2.zero); // スクロール範囲内に収め,スクロールバーを更新する + })); + button.Button.activeSprites.transform.GetChild(0).gameObject.SetActive(false); // チェックボックスを消す + localY -= JumpButtonSpacing; + return button; + } + private const float JumpButtonSpacing = 0.6f; + // ジャンプしたカテゴリヘッダのScrollerとの相対Y座標がこの値になる + private const float CategoryJumpY = 2f; + private static CategoryHeaderMasked CreateCategoryHeader(GameSettingMenu __instance, GameOptionsMenu tohTab, string translationKey) + { + var categoryHeader = Object.Instantiate(__instance.GameSettingsTab.categoryHeaderOrigin, Vector3.zero, Quaternion.identity, tohTab.settingsContainer); + categoryHeader.name = translationKey; + categoryHeader.Title.text = GetString(translationKey); + var maskLayer = GameOptionsMenu.MASK_LAYER; + categoryHeader.Background.material.SetInt(PlayerMaterial.MaskLayer, maskLayer); + if (categoryHeader.Divider != null) + { + categoryHeader.Divider.material.SetInt(PlayerMaterial.MaskLayer, maskLayer); + } + categoryHeader.Title.fontMaterial.SetFloat("_StencilComp", 3f); + categoryHeader.Title.fontMaterial.SetFloat("_Stencil", (float)maskLayer); + categoryHeader.transform.localScale = Vector3.one * GameOptionsMenu.HEADER_SCALE; + return categoryHeader; + } + + [HarmonyPatch(nameof(GameSettingMenu.ChangeTab)), HarmonyPostfix] + public static void ChangeTabPostfix(bool previewOnly) + { + if (!previewOnly) + { + if (tohSettingsTab) + { + tohSettingsTab.gameObject.SetActive(false); + } + if (tohSettingsButton) + { + tohSettingsButton.SelectButton(false); + } + } + } + + public const string TOHMenuName = "TownOfHostTab"; + } + + [HarmonyPatch(typeof(GameOptionsMenu), nameof(GameOptionsMenu.Initialize))] + public static class GameOptionsMenuInitializePatch { public static void Postfix(GameOptionsMenu __instance) { @@ -38,96 +193,6 @@ public static void Postfix(GameOptionsMenu __instance) break; } } - var template = Object.FindObjectsOfType().FirstOrDefault(); - if (template == null) return; - - var gameSettings = GameObject.Find("Game Settings"); - if (gameSettings == null) return; - gameSettings.transform.FindChild("GameGroup").GetComponent().ScrollWheelSpeed = 1f; - - var gameSettingMenu = Object.FindObjectsOfType().FirstOrDefault(); - if (gameSettingMenu == null) return; - List menus = new() { gameSettingMenu.RegularGameSettings, gameSettingMenu.RolesSettings.gameObject }; - List highlights = new() { gameSettingMenu.GameSettingsHightlight, gameSettingMenu.RolesSettingsHightlight }; - - var roleTab = GameObject.Find("RoleTab"); - var gameTab = GameObject.Find("GameTab"); - List tabs = new() { gameTab, roleTab }; - - foreach (var tab in EnumHelper.GetAllValues()) - { - var obj = gameSettings.transform.parent.Find(tab + "Tab"); - if (obj != null) - { - obj.transform.FindChild("../../GameGroup/Text").GetComponent().SetText(GetString("TabGroup." + tab)); - continue; - } - - var tohSettings = Object.Instantiate(gameSettings, gameSettings.transform.parent); - tohSettings.name = tab + "Tab"; - tohSettings.transform.FindChild("BackPanel").transform.localScale = - tohSettings.transform.FindChild("Bottom Gradient").transform.localScale = new Vector3(1.2f, 1f, 1f); - tohSettings.transform.FindChild("Background").transform.localScale = new Vector3(1.3f, 1f, 1f); - tohSettings.transform.FindChild("UI_Scrollbar").transform.localPosition += new Vector3(0.35f, 0f, 0f); - tohSettings.transform.FindChild("UI_ScrollbarTrack").transform.localPosition += new Vector3(0.35f, 0f, 0f); - tohSettings.transform.FindChild("GameGroup/SliderInner").transform.localPosition += new Vector3(-0.15f, 0f, 0f); - var tohMenu = tohSettings.transform.FindChild("GameGroup/SliderInner").GetComponent(); - - //OptionBehaviourを破棄 - tohMenu.GetComponentsInChildren().Do(x => Object.Destroy(x.gameObject)); - - var scOptions = new List(); - foreach (var option in OptionItem.AllOptions) - { - if (option.Tab != (TabGroup)tab) continue; - if (option.OptionBehaviour == null) - { - var stringOption = Object.Instantiate(template, tohMenu.transform); - scOptions.Add(stringOption); - stringOption.OnValueChanged = new System.Action((o) => { }); - stringOption.TitleText.text = option.Name; - stringOption.Value = stringOption.oldValue = option.CurrentValue; - stringOption.ValueText.text = option.GetString(); - stringOption.name = option.Name; - stringOption.transform.FindChild("Background").localScale = new Vector3(1.2f, 1f, 1f); - stringOption.transform.FindChild("Plus_TMP").localPosition += new Vector3(0.3f, 0f, 0f); - stringOption.transform.FindChild("Minus_TMP").localPosition += new Vector3(0.3f, 0f, 0f); - stringOption.transform.FindChild("Value_TMP").localPosition += new Vector3(0.3f, 0f, 0f); - stringOption.transform.FindChild("Title_TMP").localPosition += new Vector3(0.15f, 0f, 0f); - stringOption.transform.FindChild("Title_TMP").GetComponent().sizeDelta = new Vector2(3.5f, 0.37f); - - option.OptionBehaviour = stringOption; - } - option.OptionBehaviour.gameObject.SetActive(true); - } - tohMenu.Children = scOptions.ToArray(); - tohSettings.gameObject.SetActive(false); - menus.Add(tohSettings.gameObject); - - var tohTab = Object.Instantiate(roleTab, roleTab.transform.parent); - tohTab.transform.FindChild("Hat Button").FindChild("Icon").GetComponent().sprite = Utils.LoadSprite($"TownOfHost.Resources.TabIcon_{tab}.png", 100f); - tabs.Add(tohTab); - var tohTabHighlight = tohTab.transform.FindChild("Hat Button").FindChild("Tab Background").GetComponent(); - highlights.Add(tohTabHighlight); - } - - for (var i = 0; i < tabs.Count; i++) - { - tabs[i].transform.localPosition = new(0.8f * (i - 1) - tabs.Count / 3f, tabs[i].transform.localPosition.y, tabs[i].transform.localPosition.z); - var button = tabs[i].GetComponentInChildren(); - if (button == null) continue; - var copiedIndex = i; - button.OnClick = new UnityEngine.UI.Button.ButtonClickedEvent(); - Action value = () => - { - for (var j = 0; j < menus.Count; j++) - { - menus[j].SetActive(j == copiedIndex); - highlights[j].enabled = j == copiedIndex; - } - }; - button.OnClick.AddListener(value); - } } } @@ -138,85 +203,90 @@ public class GameOptionsMenuUpdatePatch public static void Postfix(GameOptionsMenu __instance) { - if (__instance.transform.parent.parent.name == "Game Settings") return; - foreach (var tab in EnumHelper.GetAllValues()) - { - if (__instance.transform.parent.parent.name != tab + "Tab") continue; - __instance.transform.FindChild("../../GameGroup/Text").GetComponent().SetText(GetString("TabGroup." + tab)); + if (__instance.name != GameSettingMenuPatch.TOHMenuName) return; - _timer += Time.deltaTime; - if (_timer < 0.1f) return; - _timer = 0f; + _timer += Time.deltaTime; + if (_timer < 0.1f) return; + _timer = 0f; - float numItems = __instance.Children.Length; - var offset = 2.7f; + var offset = 2.7f; + var isOdd = true; - foreach (var option in OptionItem.AllOptions) - { - if ((TabGroup)tab != option.Tab) continue; - if (option?.OptionBehaviour == null || option.OptionBehaviour.gameObject == null) continue; + UpdateCategoryHeader(GameSettingMenuPatch.MainCategoryHeader, ref offset); + foreach (var option in OptionItem.MainOptions) + { + UpdateOption(ref isOdd, option, ref offset); + } + UpdateCategoryHeader(GameSettingMenuPatch.ImpostorRoleCategoryHeader, ref offset); + foreach (var option in OptionItem.ImpostorRoleOptions) + { + UpdateOption(ref isOdd, option, ref offset); + } + UpdateCategoryHeader(GameSettingMenuPatch.CrewmateRoleCategoryHeader, ref offset); + foreach (var option in OptionItem.CrewmateRoleOptions) + { + UpdateOption(ref isOdd, option, ref offset); + } + UpdateCategoryHeader(GameSettingMenuPatch.NeutralRoleCategoryHeader, ref offset); + foreach (var option in OptionItem.NeutralRoleOptions) + { + UpdateOption(ref isOdd, option, ref offset); + } + UpdateCategoryHeader(GameSettingMenuPatch.AddOnCategoryHeader, ref offset); + foreach (var option in OptionItem.AddOnOptions) + { + UpdateOption(ref isOdd, option, ref offset); + } - var enabled = true; - var parent = option.Parent; + __instance.scrollBar.ContentYBounds.max = (-offset) - 1.5f; + } + private static void UpdateCategoryHeader(CategoryHeaderMasked categoryHeader, ref float offset) + { + offset -= GameOptionsMenu.HEADER_HEIGHT; + categoryHeader.transform.localPosition = new(GameOptionsMenu.HEADER_X, offset, -2f); + } + private static void UpdateOption(ref bool isOdd, OptionItem item, ref float offset) + { + if (item?.OptionBehaviour == null || item.OptionBehaviour.gameObject == null) return; - enabled = AmongUsClient.Instance.AmHost && - !option.IsHiddenOn(Options.CurrentGameMode); + var enabled = true; + var parent = item.Parent; - var opt = option.OptionBehaviour.transform.Find("Background").GetComponent(); - opt.size = new(5.0f, 0.45f); - while (parent != null && enabled) - { - enabled = parent.GetBool(); - parent = parent.Parent; - opt.color = new(0f, 1f, 0f); - opt.size = new(4.8f, 0.45f); - opt.transform.localPosition = new Vector3(0.11f, 0f); - option.OptionBehaviour.transform.Find("Title_TMP").transform.localPosition = new Vector3(-0.95f, 0f); - option.OptionBehaviour.transform.FindChild("Title_TMP").GetComponent().sizeDelta = new Vector2(3.4f, 0.37f); - if (option.Parent?.Parent != null) - { - opt.color = new(0f, 0f, 1f); - opt.size = new(4.6f, 0.45f); - opt.transform.localPosition = new Vector3(0.24f, 0f); - option.OptionBehaviour.transform.Find("Title_TMP").transform.localPosition = new Vector3(-0.7f, 0f); - option.OptionBehaviour.transform.FindChild("Title_TMP").GetComponent().sizeDelta = new Vector2(3.3f, 0.37f); - if (option.Parent?.Parent?.Parent != null) - { - opt.color = new(1f, 0f, 0f); - opt.size = new(4.4f, 0.45f); - opt.transform.localPosition = new Vector3(0.37f, 0f); - option.OptionBehaviour.transform.Find("Title_TMP").transform.localPosition = new Vector3(-0.55f, 0f); - option.OptionBehaviour.transform.FindChild("Title_TMP").GetComponent().sizeDelta = new Vector2(3.2f, 0.37f); - } - } - } + // 親オプションの値を見て表示するか決める + enabled = AmongUsClient.Instance.AmHost && !item.IsHiddenOn(Options.CurrentGameMode); + var stringOption = item.OptionBehaviour; + while (parent != null && enabled) + { + enabled = parent.GetBool(); + parent = parent.Parent; + } - option.OptionBehaviour.gameObject.SetActive(enabled); - if (enabled) - { - offset -= option.IsHeader ? 0.7f : 0.5f; - option.OptionBehaviour.transform.localPosition = new Vector3( - option.OptionBehaviour.transform.localPosition.x, - offset, - option.OptionBehaviour.transform.localPosition.z); + item.OptionBehaviour.gameObject.SetActive(enabled); + if (enabled) + { + // 見やすさのため交互に色を変える + stringOption.LabelBackground.color = isOdd ? Color.cyan : Color.white; - if (option.IsHeader) - { - numItems += 0.5f; - } - } - else - { - numItems--; - } + offset -= GameOptionsMenu.SPACING_Y; + if (item.IsHeader) + { + // IsHeaderなら隙間を広くする + offset -= HeaderSpacingY; } - __instance.GetComponentInParent().ContentYBounds.max = (-offset) - 1.5f; + item.OptionBehaviour.transform.localPosition = new Vector3( + GameOptionsMenu.START_POS_X, + offset, + -2f); + + isOdd = !isOdd; } } + + private const float HeaderSpacingY = 0.2f; } - [HarmonyPatch(typeof(StringOption), nameof(StringOption.OnEnable))] - public class StringOptionEnablePatch + [HarmonyPatch(typeof(StringOption), nameof(StringOption.Initialize))] + public class StringOptionInitializePatch { public static bool Prefix(StringOption __instance) { @@ -271,7 +341,7 @@ public static class RolesSettingsMenuPatch { public static void Postfix(RolesSettingsMenu __instance) { - foreach (var ob in __instance.Children) + foreach (var ob in __instance.advancedSettingChildren) { switch (ob.Title) { @@ -287,10 +357,19 @@ public static void Postfix(RolesSettingsMenu __instance) } } } - [HarmonyPatch(typeof(NormalGameOptionsV07), nameof(NormalGameOptionsV07.SetRecommendations))] + [HarmonyPatch(typeof(NormalGameOptionsV08), nameof(NormalGameOptionsV08.SetRecommendations), [typeof(int), typeof(bool), typeof(RulesPresets)])] public static class SetRecommendationsPatch { - public static bool Prefix(NormalGameOptionsV07 __instance, int numPlayers, bool isOnline) + public static bool Prefix(NormalGameOptionsV08 __instance, int numPlayers, bool isOnline, RulesPresets rulesPresets) + { + switch (rulesPresets) + { + case RulesPresets.Standard: SetStandardRecommendations(__instance, numPlayers, isOnline); return false; + // スタンダード以外のプリセットは一旦そのままにしておく + default: return true; + } + } + private static void SetStandardRecommendations(NormalGameOptionsV08 __instance, int numPlayers, bool isOnline) { numPlayers = Mathf.Clamp(numPlayers, 4, 15); __instance.PlayerSpeedMod = __instance.MapId == 4 ? 1.25f : 1f; //AirShipなら1.25、それ以外は1 @@ -302,7 +381,7 @@ public static bool Prefix(NormalGameOptionsV07 __instance, int numPlayers, bool __instance.NumShortTasks = 6; __instance.NumEmergencyMeetings = 1; if (!isOnline) - __instance.NumImpostors = NormalGameOptionsV07.RecommendedImpostors[numPlayers]; + __instance.NumImpostors = NormalGameOptionsV08.RecommendedImpostors[numPlayers]; __instance.KillDistance = 0; __instance.DiscussionTime = 0; __instance.VotingTime = 150; @@ -341,7 +420,6 @@ public static bool Prefix(NormalGameOptionsV07 __instance, int numPlayers, bool __instance.NumShortTasks = 10; __instance.KillCooldown = 10f; } - return false; } } } diff --git a/Resources/string.csv b/Resources/string.csv index 9a88bf466..26e9f3912 100644 --- a/Resources/string.csv +++ b/Resources/string.csv @@ -538,6 +538,10 @@ "ModifySabotageCooldown","Sabotage Cooldown Control","サボタージュのクールダウン制御","修改破坏冷却时间","","Контролировать откат саботажа","Controle do Tepo de Recarga da Sabotagem","" "SabotageCooldown","Sabotage Cooldown","サボタージュのクールダウン","破坏冷却时间","","Откат саботажа","Tempo de Recarga da Sabotagem","" +"## ゲーム設定UI" +"TOHSettingsButtonLabel","TOH Settings","TOH設定","","","","","" +"TOHSettingsDescription","Edit mod settings for your game lobby.","Modの設定を編集する。","","","","","" + "## クライアント設定" "Close","Close","閉じる","关闭","","Закрыть","Fechar","" "TOHOptions","TOH Options","TOHの設定","TOH 选项","","Настройки TOH","TOH Opções","" diff --git a/main.cs b/main.cs index 3980b78ec..e5f0fe67a 100644 --- a/main.cs +++ b/main.cs @@ -58,6 +58,26 @@ public class Main : BasePlugin public static readonly bool IsPublicAvailableOnThisVersion = false; public Harmony Harmony { get; } = new Harmony(PluginGuid); public static Version version = Version.Parse(PluginVersion); + public static Color UnityModColor + { + get + { + if (!_unityModColor.HasValue) + { + if (ColorUtility.TryParseHtmlString(ModColor, out var unityColor)) + { + _unityModColor = unityColor; + } + else + { + // failure + return Color.gray; + } + } + return _unityModColor.Value; + } + } + private static Color? _unityModColor; public static BepInEx.Logging.ManualLogSource Logger; public static bool hasArgumentException = false; public static string ExceptionMessage; From f9316a672d1a5577977d21b1be3da6450052dbcf Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sun, 23 Jun 2024 23:10:45 +0900 Subject: [PATCH 29/53] =?UTF-8?q?=E5=AE=88=E8=AD=B7=E5=A4=A9=E4=BD=BF?= =?UTF-8?q?=E3=81=AE=E7=84=A1=E5=8A=B9=E5=8C=96=E3=82=92=E4=BF=AE=E5=BE=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Patches/GameOptionsPatch.cs | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/Patches/GameOptionsPatch.cs b/Patches/GameOptionsPatch.cs index d1d9bd572..09c338119 100644 --- a/Patches/GameOptionsPatch.cs +++ b/Patches/GameOptionsPatch.cs @@ -12,28 +12,24 @@ class ChanceChangePatch public static void Postfix(RoleOptionSetting __instance) { string DisableText = $" ({GetString("Disabled")})"; - if (__instance.Role.Role == RoleTypes.Scientist) - { - __instance.titleText.color = Utils.GetRoleColor(CustomRoles.Scientist); - } - if (__instance.Role.Role == RoleTypes.Engineer) - { - __instance.titleText.color = Utils.GetRoleColor(CustomRoles.Engineer); - } if (__instance.Role.Role == RoleTypes.GuardianAngel) { - //+-ボタン, 設定値, 詳細設定ボタンを非表示 + //+-ボタンを非表示 var tf = __instance.transform; - tf.Find("Count Plus_TMP").gameObject.active - = tf.Find("Chance Minus_TMP").gameObject.active - = tf.Find("Chance Value_TMP").gameObject.active - = tf.Find("Chance Plus_TMP").gameObject.active - = tf.Find("More Options").gameObject.active - = false; + foreach (var button in __instance.GetComponentsInChildren()) + { + button.gameObject.SetActive(false); + } if (!__instance.titleText.text.Contains(DisableText)) __instance.titleText.text += DisableText; __instance.titleText.color = Utils.GetRoleColor(CustomRoles.GuardianAngel); + if (__instance.roleChance != 0 || __instance.roleMaxCount != 0) + { + __instance.roleChance = 0; + __instance.roleMaxCount = 0; + __instance.OnValueChanged.Invoke(__instance); + } } if (__instance.Role.Role == RoleTypes.Shapeshifter) { From 35c877e278a3497b7a4964e75cd5948a26116263 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sun, 23 Jun 2024 23:19:09 +0900 Subject: [PATCH 30/53] =?UTF-8?q?ChangeTab=E3=81=A7TOH=E3=82=BF=E3=83=96?= =?UTF-8?q?=E3=82=92=E9=9A=A0=E3=81=99=E5=87=A6=E7=90=86=E3=82=92Prefix?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit バニラ例外の影響を回避するため --- Patches/GameOptionsMenuPatch.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Patches/GameOptionsMenuPatch.cs b/Patches/GameOptionsMenuPatch.cs index a76ea35df..25c9c38d4 100644 --- a/Patches/GameOptionsMenuPatch.cs +++ b/Patches/GameOptionsMenuPatch.cs @@ -147,8 +147,9 @@ private static CategoryHeaderMasked CreateCategoryHeader(GameSettingMenu __insta return categoryHeader; } - [HarmonyPatch(nameof(GameSettingMenu.ChangeTab)), HarmonyPostfix] - public static void ChangeTabPostfix(bool previewOnly) + // 初めてロール設定を表示したときに発生する例外(バニラバグ)の影響を回避するためPrefix + [HarmonyPatch(nameof(GameSettingMenu.ChangeTab)), HarmonyPrefix] + public static void ChangeTabPrefix(bool previewOnly) { if (!previewOnly) { From 5bec8a9bef1e5abb50af16e158e018136b4dcbe0 Mon Sep 17 00:00:00 2001 From: kou-hetare <96226646+kou-hetare@users.noreply.github.com> Date: Mon, 24 Jun 2024 12:40:58 +0900 Subject: [PATCH 31/53] =?UTF-8?q?SetRole=E3=81=AEcanOverride=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E6=BC=8F=E3=82=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/CustomRpcSender.cs | 1 + Patches/onGameStartedPatch.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/Modules/CustomRpcSender.cs b/Modules/CustomRpcSender.cs index f96808134..ac8e68bd3 100644 --- a/Modules/CustomRpcSender.cs +++ b/Modules/CustomRpcSender.cs @@ -257,6 +257,7 @@ public static void RpcSetRole(this CustomRpcSender sender, PlayerControl player, { sender.AutoStartRpc(player.NetId, (byte)RpcCalls.SetRole, targetClientId) .Write((ushort)role) + .Write(false) .EndRpc(); } public static void RpcMurderPlayer(this CustomRpcSender sender, PlayerControl player, PlayerControl target, int targetClientId = -1) diff --git a/Patches/onGameStartedPatch.cs b/Patches/onGameStartedPatch.cs index 7b6b73ba8..7d6726663 100644 --- a/Patches/onGameStartedPatch.cs +++ b/Patches/onGameStartedPatch.cs @@ -478,6 +478,7 @@ public static void Release() pair.Item1.StartCoroutine(pair.Item1.CoSetRole(pair.Item2, false)); sender.Value.AutoStartRpc(pair.Item1.NetId, (byte)RpcCalls.SetRole, Utils.GetPlayerById(sender.Key).GetClientId()) .Write((ushort)pair.Item2) + .Write(false) .EndRpc(); } sender.Value.EndMessage(); From 10ace447eedcc8ac3ea2084cb9d3f992b8eccb71 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Thu, 27 Jun 2024 21:02:48 +0900 Subject: [PATCH 32/53] =?UTF-8?q?=E5=BD=B9=E8=81=B7=E3=82=B9=E3=83=9D?= =?UTF-8?q?=E3=83=BC=E3=83=B3=E7=A2=BA=E7=8E=87=E3=82=AA=E3=83=97=E3=82=B7?= =?UTF-8?q?=E3=83=A7=E3=83=B3=E3=81=AE=E5=B0=82=E7=94=A8=E3=82=AF=E3=83=A9?= =?UTF-8?q?=E3=82=B9=E3=82=92=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OptionItem/Interfaces/IRoleOptionItem.cs | 10 +++++ .../OptionItem/RoleSpawnChanceOptionItem.cs | 43 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 Modules/OptionItem/Interfaces/IRoleOptionItem.cs create mode 100644 Modules/OptionItem/RoleSpawnChanceOptionItem.cs diff --git a/Modules/OptionItem/Interfaces/IRoleOptionItem.cs b/Modules/OptionItem/Interfaces/IRoleOptionItem.cs new file mode 100644 index 000000000..f15f03342 --- /dev/null +++ b/Modules/OptionItem/Interfaces/IRoleOptionItem.cs @@ -0,0 +1,10 @@ +using TownOfHost.Roles.Core; +using UnityEngine; + +namespace TownOfHost.Modules.OptionItems.Interfaces; + +public interface IRoleOptionItem +{ + public CustomRoles RoleId { get; } + public Color RoleColor { get; } +} diff --git a/Modules/OptionItem/RoleSpawnChanceOptionItem.cs b/Modules/OptionItem/RoleSpawnChanceOptionItem.cs new file mode 100644 index 000000000..4ba41e9e0 --- /dev/null +++ b/Modules/OptionItem/RoleSpawnChanceOptionItem.cs @@ -0,0 +1,43 @@ +using TownOfHost.Modules.OptionItems.Interfaces; +using TownOfHost.Roles.Core; +using UnityEngine; + +namespace TownOfHost.Modules.OptionItems; + +public sealed class RoleSpawnChanceOptionItem : IntegerOptionItem, IRoleOptionItem +{ + public RoleSpawnChanceOptionItem( + int id, + string name, + int defaultValue, + TabGroup tab, + bool isSingleValue, + IntegerValueRule rule, + CustomRoles roleId, + Color roleColor) : base(id, name, defaultValue, tab, isSingleValue, rule) + { + RoleId = roleId; + RoleColor = roleColor; + } + public RoleSpawnChanceOptionItem( + int id, + string name, + int defaultValue, + TabGroup tab, + bool isSingleValue, + IntegerValueRule rule, + SimpleRoleInfo roleInfo) : this(id, name, defaultValue, tab, isSingleValue, rule, roleInfo.RoleName, roleInfo.RoleColor) { } + + + public CustomRoles RoleId { get; } + public Color RoleColor { get; } + + public override void Refresh() + { + base.Refresh(); + if (OptionBehaviour != null && OptionBehaviour.TitleText != null) + { + OptionBehaviour.TitleText.text = GetName(true); + } + } +} From 5effb49af6b607d56d358a0c8dc97290c2d11d7f Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Thu, 27 Jun 2024 21:05:26 +0900 Subject: [PATCH 33/53] =?UTF-8?q?=E5=BD=B9=E8=81=B7=E5=87=BA=E7=8F=BE?= =?UTF-8?q?=E7=8E=87=E3=82=AA=E3=83=97=E3=82=B7=E3=83=A7=E3=83=B3=E3=81=AE?= =?UTF-8?q?=E4=BD=9C=E6=88=90=E3=82=92=E6=96=B0=E3=82=AF=E3=83=A9=E3=82=B9?= =?UTF-8?q?=E3=82=92=E4=BD=BF=E3=81=A3=E3=81=9F=E3=82=82=E3=81=AE=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/OptionHolder.cs | 17 +++++++++-------- Roles/AddOns/Common/Watcher.cs | 2 +- Roles/AddOns/Crewmate/Workhorse.cs | 2 +- Roles/AddOns/Impostor/LastImpostor.cs | 2 +- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/Modules/OptionHolder.cs b/Modules/OptionHolder.cs index ed89244c6..44fa7f46d 100644 --- a/Modules/OptionHolder.cs +++ b/Modules/OptionHolder.cs @@ -11,6 +11,7 @@ using TownOfHost.Roles.AddOns.Common; using TownOfHost.Roles.AddOns.Impostor; using TownOfHost.Roles.AddOns.Crewmate; +using TownOfHost.Modules.OptionItems; namespace TownOfHost { @@ -423,7 +424,7 @@ public static void Load() .SetValueFormat(OptionFormat.Seconds); // Add-Ons - SetupRoleOptions(50300, TabGroup.Addons, CustomRoles.Lovers, assignCountRule: new(2, 2, 2)); + SetupRoleOptions(50300, TabGroup.Addons, CustomRoles.Lovers, Utils.GetRoleColor(CustomRoles.Lovers), assignCountRule: new(2, 2, 2)); LastImpostor.SetupCustomOption(); Watcher.SetupCustomOption(); Workhorse.SetupCustomOption(); @@ -435,8 +436,8 @@ public static void Load() .SetGameMode(CustomGameMode.Standard); // HideAndSeek - SetupRoleOptions(100000, TabGroup.MainSettings, CustomRoles.HASFox, customGameMode: CustomGameMode.HideAndSeek); - SetupRoleOptions(100100, TabGroup.MainSettings, CustomRoles.HASTroll, customGameMode: CustomGameMode.HideAndSeek); + SetupRoleOptions(100000, TabGroup.MainSettings, CustomRoles.HASFox, Utils.GetRoleColor(CustomRoles.HASFox), customGameMode: CustomGameMode.HideAndSeek); + SetupRoleOptions(100100, TabGroup.MainSettings, CustomRoles.HASTroll, Utils.GetRoleColor(CustomRoles.HASTroll), customGameMode: CustomGameMode.HideAndSeek); AllowCloseDoors = BooleanOptionItem.Create(101000, "AllowCloseDoors", false, TabGroup.MainSettings, false) .SetHeader(true) .SetGameMode(CustomGameMode.HideAndSeek); @@ -690,17 +691,17 @@ public static void Load() } public static void SetupRoleOptions(SimpleRoleInfo info) => - SetupRoleOptions(info.ConfigId, info.Tab, info.RoleName, info.AssignInfo.AssignCountRule); - public static void SetupRoleOptions(int id, TabGroup tab, CustomRoles role, IntegerValueRule assignCountRule = null, CustomGameMode customGameMode = CustomGameMode.Standard) + SetupRoleOptions(info.ConfigId, info.Tab, info.RoleName, info.RoleColor, info.AssignInfo.AssignCountRule); + public static void SetupRoleOptions(int id, TabGroup tab, CustomRoles role, Color roleColor, IntegerValueRule assignCountRule = null, CustomGameMode customGameMode = CustomGameMode.Standard) { if (role.IsVanilla()) return; assignCountRule ??= new(1, 15, 1); - var spawnOption = IntegerOptionItem.Create(id, role.ToString(), new(0, 100, 10), 0, tab, false) - .SetColor(Utils.GetRoleColor(role)) + var spawnOption = new RoleSpawnChanceOptionItem(id, role.ToString(), 0, tab, false, new(0, 100, 10), role, roleColor); + spawnOption.SetColor(Utils.GetRoleColor(role)) .SetValueFormat(OptionFormat.Percent) .SetHeader(true) - .SetGameMode(customGameMode) as IntegerOptionItem; + .SetGameMode(customGameMode); var countOption = IntegerOptionItem.Create(id + 1, "Maximum", assignCountRule, assignCountRule.Step, tab, false) .SetParent(spawnOption) .SetValueFormat(OptionFormat.Players) diff --git a/Roles/AddOns/Common/Watcher.cs b/Roles/AddOns/Common/Watcher.cs index 2ad1e95f4..6400c137e 100644 --- a/Roles/AddOns/Common/Watcher.cs +++ b/Roles/AddOns/Common/Watcher.cs @@ -15,7 +15,7 @@ public static class Watcher public static void SetupCustomOption() { - SetupRoleOptions(Id, TabGroup.Addons, CustomRoles.Watcher); + SetupRoleOptions(Id, TabGroup.Addons, CustomRoles.Watcher, RoleColor); AddOnsAssignData.Create(Id + 10, CustomRoles.Watcher, true, true, true); } [GameModuleInitializer] diff --git a/Roles/AddOns/Crewmate/Workhorse.cs b/Roles/AddOns/Crewmate/Workhorse.cs index fbd091be4..464a51141 100644 --- a/Roles/AddOns/Crewmate/Workhorse.cs +++ b/Roles/AddOns/Crewmate/Workhorse.cs @@ -21,7 +21,7 @@ public static class Workhorse public static int NumShortTasks; public static void SetupCustomOption() { - SetupRoleOptions(Id, TabGroup.Addons, CustomRoles.Workhorse); + SetupRoleOptions(Id, TabGroup.Addons, CustomRoles.Workhorse, RoleColor); OptionAssignOnlyToCrewmate = BooleanOptionItem.Create(Id + 10, "AssignOnlyTo%role%", true, TabGroup.Addons, false).SetParent(CustomRoleSpawnChances[CustomRoles.Workhorse]); OptionAssignOnlyToCrewmate.ReplacementDictionary = new Dictionary { { "%role%", Utils.ColorString(Palette.CrewmateBlue, Utils.GetRoleName(CustomRoles.Crewmate)) } }; OptionNumLongTasks = IntegerOptionItem.Create(Id + 11, "WorkhorseNumLongTasks", new(0, 5, 1), 1, TabGroup.Addons, false).SetParent(CustomRoleSpawnChances[CustomRoles.Workhorse]) diff --git a/Roles/AddOns/Impostor/LastImpostor.cs b/Roles/AddOns/Impostor/LastImpostor.cs index 5d24e1072..88375b5a4 100644 --- a/Roles/AddOns/Impostor/LastImpostor.cs +++ b/Roles/AddOns/Impostor/LastImpostor.cs @@ -12,7 +12,7 @@ public static class LastImpostor public static OptionItem KillCooldown; public static void SetupCustomOption() { - SetupRoleOptions(Id, TabGroup.Addons, CustomRoles.LastImpostor, new(1, 1, 1)); + SetupRoleOptions(Id, TabGroup.Addons, CustomRoles.LastImpostor, Palette.ImpostorRed, new(1, 1, 1)); KillCooldown = FloatOptionItem.Create(Id + 10, "KillCooldown", new(0f, 180f, 1f), 15f, TabGroup.Addons, false).SetParent(CustomRoleSpawnChances[CustomRoles.LastImpostor]) .SetValueFormat(OptionFormat.Seconds); } From 2b1503aa5f11aecc8e9d93191af31284de384882 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Thu, 27 Jun 2024 21:12:31 +0900 Subject: [PATCH 34/53] =?UTF-8?q?=E3=83=AD=E3=83=BC=E3=83=AB=E3=82=AA?= =?UTF-8?q?=E3=83=97=E3=82=B7=E3=83=A7=E3=83=B3=E3=81=AE=E8=83=8C=E6=99=AF?= =?UTF-8?q?=E8=89=B2=E3=82=92=E3=83=AD=E3=83=BC=E3=83=AB=E8=89=B2=E3=81=AB?= =?UTF-8?q?=EF=BC=8C=E6=96=87=E5=AD=97=E8=89=B2=E3=82=92=E7=84=A1=E8=81=B7?= =?UTF-8?q?=E3=81=AB=E3=81=9D=E3=82=8C=E3=81=9E=E3=82=8C=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 文字色をロール色にするとメイヤーなどが潰れて読めないため --- Patches/GameOptionsMenuPatch.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Patches/GameOptionsMenuPatch.cs b/Patches/GameOptionsMenuPatch.cs index 25c9c38d4..2f79a2301 100644 --- a/Patches/GameOptionsMenuPatch.cs +++ b/Patches/GameOptionsMenuPatch.cs @@ -2,6 +2,8 @@ using System.Linq; using AmongUs.GameOptions; using HarmonyLib; +using TownOfHost.Modules.OptionItems; +using TownOfHost.Modules.OptionItems.Interfaces; using UnityEngine; using static TownOfHost.Translator; using Object = UnityEngine.Object; @@ -266,7 +268,7 @@ private static void UpdateOption(ref bool isOdd, OptionItem item, ref float offs if (enabled) { // 見やすさのため交互に色を変える - stringOption.LabelBackground.color = isOdd ? Color.cyan : Color.white; + stringOption.LabelBackground.color = item is IRoleOptionItem roleOption ? roleOption.RoleColor : (isOdd ? Color.cyan : Color.white); offset -= GameOptionsMenu.SPACING_Y; if (item.IsHeader) @@ -295,7 +297,7 @@ public static bool Prefix(StringOption __instance) if (option == null) return true; __instance.OnValueChanged = new Action((o) => { }); - __instance.TitleText.text = option.GetName(); + __instance.TitleText.text = option.GetName(option is RoleSpawnChanceOptionItem); __instance.Value = __instance.oldValue = option.CurrentValue; __instance.ValueText.text = option.GetString(); From 02d50f5dd93eae45223e3359da49f592ac5bbbc9 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Thu, 27 Jun 2024 21:17:05 +0900 Subject: [PATCH 35/53] =?UTF-8?q?=E5=90=8D=E5=89=8D=E3=81=AE=E8=A1=9D?= =?UTF-8?q?=E7=AA=81=E3=82=92=E9=81=BF=E3=81=91=E3=82=8B=E3=81=9F=E3=82=81?= =?UTF-8?q?OptionItem=E3=83=95=E3=82=A9=E3=83=AB=E3=83=80=E3=82=92OptionIt?= =?UTF-8?q?ems=E3=81=AB=E6=94=B9=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OptionItem名前空間とOptionItemクラスの名前が衝突するため --- Modules/{OptionItem => OptionItems}/BooleanOptionItem.cs | 0 Modules/{OptionItem => OptionItems}/FloatOptionItem.cs | 0 Modules/{OptionItem => OptionItems}/IntegerOptionItem.cs | 0 Modules/{OptionItem => OptionItems}/Interfaces/IRoleOptionItem.cs | 0 Modules/{OptionItem => OptionItems}/OptionItem.cs | 0 Modules/{OptionItem => OptionItems}/PresetOptionItem.cs | 0 Modules/{OptionItem => OptionItems}/RoleSpawnChanceOptionItem.cs | 0 Modules/{OptionItem => OptionItems}/StringOptionItem.cs | 0 Modules/{OptionItem => OptionItems}/ValueRule.cs | 0 9 files changed, 0 insertions(+), 0 deletions(-) rename Modules/{OptionItem => OptionItems}/BooleanOptionItem.cs (100%) rename Modules/{OptionItem => OptionItems}/FloatOptionItem.cs (100%) rename Modules/{OptionItem => OptionItems}/IntegerOptionItem.cs (100%) rename Modules/{OptionItem => OptionItems}/Interfaces/IRoleOptionItem.cs (100%) rename Modules/{OptionItem => OptionItems}/OptionItem.cs (100%) rename Modules/{OptionItem => OptionItems}/PresetOptionItem.cs (100%) rename Modules/{OptionItem => OptionItems}/RoleSpawnChanceOptionItem.cs (100%) rename Modules/{OptionItem => OptionItems}/StringOptionItem.cs (100%) rename Modules/{OptionItem => OptionItems}/ValueRule.cs (100%) diff --git a/Modules/OptionItem/BooleanOptionItem.cs b/Modules/OptionItems/BooleanOptionItem.cs similarity index 100% rename from Modules/OptionItem/BooleanOptionItem.cs rename to Modules/OptionItems/BooleanOptionItem.cs diff --git a/Modules/OptionItem/FloatOptionItem.cs b/Modules/OptionItems/FloatOptionItem.cs similarity index 100% rename from Modules/OptionItem/FloatOptionItem.cs rename to Modules/OptionItems/FloatOptionItem.cs diff --git a/Modules/OptionItem/IntegerOptionItem.cs b/Modules/OptionItems/IntegerOptionItem.cs similarity index 100% rename from Modules/OptionItem/IntegerOptionItem.cs rename to Modules/OptionItems/IntegerOptionItem.cs diff --git a/Modules/OptionItem/Interfaces/IRoleOptionItem.cs b/Modules/OptionItems/Interfaces/IRoleOptionItem.cs similarity index 100% rename from Modules/OptionItem/Interfaces/IRoleOptionItem.cs rename to Modules/OptionItems/Interfaces/IRoleOptionItem.cs diff --git a/Modules/OptionItem/OptionItem.cs b/Modules/OptionItems/OptionItem.cs similarity index 100% rename from Modules/OptionItem/OptionItem.cs rename to Modules/OptionItems/OptionItem.cs diff --git a/Modules/OptionItem/PresetOptionItem.cs b/Modules/OptionItems/PresetOptionItem.cs similarity index 100% rename from Modules/OptionItem/PresetOptionItem.cs rename to Modules/OptionItems/PresetOptionItem.cs diff --git a/Modules/OptionItem/RoleSpawnChanceOptionItem.cs b/Modules/OptionItems/RoleSpawnChanceOptionItem.cs similarity index 100% rename from Modules/OptionItem/RoleSpawnChanceOptionItem.cs rename to Modules/OptionItems/RoleSpawnChanceOptionItem.cs diff --git a/Modules/OptionItem/StringOptionItem.cs b/Modules/OptionItems/StringOptionItem.cs similarity index 100% rename from Modules/OptionItem/StringOptionItem.cs rename to Modules/OptionItems/StringOptionItem.cs diff --git a/Modules/OptionItem/ValueRule.cs b/Modules/OptionItems/ValueRule.cs similarity index 100% rename from Modules/OptionItem/ValueRule.cs rename to Modules/OptionItems/ValueRule.cs From 24f94af31e68bbe59d14c9ed5bbbaeef545647be Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Thu, 27 Jun 2024 21:23:18 +0900 Subject: [PATCH 36/53] =?UTF-8?q?=E4=BD=99=E8=A8=88=E3=81=AA=E7=A9=BA?= =?UTF-8?q?=E8=A1=8C=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/OptionItems/RoleSpawnChanceOptionItem.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Modules/OptionItems/RoleSpawnChanceOptionItem.cs b/Modules/OptionItems/RoleSpawnChanceOptionItem.cs index 4ba41e9e0..a4dca3ce5 100644 --- a/Modules/OptionItems/RoleSpawnChanceOptionItem.cs +++ b/Modules/OptionItems/RoleSpawnChanceOptionItem.cs @@ -28,7 +28,6 @@ public RoleSpawnChanceOptionItem( IntegerValueRule rule, SimpleRoleInfo roleInfo) : this(id, name, defaultValue, tab, isSingleValue, rule, roleInfo.RoleName, roleInfo.RoleColor) { } - public CustomRoles RoleId { get; } public Color RoleColor { get; } From ddf42e2b2b0b626be58db667231f9c1c9024ba44 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Thu, 27 Jun 2024 22:32:06 +0900 Subject: [PATCH 37/53] =?UTF-8?q?=E3=83=A1=E3=82=A4=E3=83=B3=E3=82=AA?= =?UTF-8?q?=E3=83=97=E3=82=B7=E3=83=A7=E3=83=B3=E3=82=AB=E3=83=86=E3=82=B4?= =?UTF-8?q?=E3=83=AA=E3=81=AE=E3=82=A2=E3=82=A4=E3=82=B3=E3=83=B3=E3=82=92?= =?UTF-8?q?=E5=86=86=E5=BD=A2=E3=81=AE=E3=83=9C=E3=82=BF=E3=83=B3=E3=81=AB?= =?UTF-8?q?=E5=90=88=E3=81=86=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Resources/TabIcon_MainSettings.png | Bin 9814 -> 1931 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Resources/TabIcon_MainSettings.png b/Resources/TabIcon_MainSettings.png index 26a5e42b4b2d223a8f4538d82bad0d964122ca4f..6efc0af8cdb038def66c0ca02e20b9d19274c13d 100644 GIT binary patch literal 1931 zcmb7FdpOez1OBnZW;VB6mdmFa8ELGJvKlg%36W1xZVOWyO|B6(cTp#l^;>YxR52K*AvMGP+_*uAqzW+N>bjSFfcII=Z!=VktTeGxr5C<@@{V zlYn?NZ>8wj0a)NcVwsVuPupOXa*lVc1(lsRz4Stc1=_@rzZus4meTHOIhMOJY97C0 z?^LBHw~S~O=W`P@4rWI6uS{^*x)&P!15wIwWm_eY5{C34Qv7iOX@w=uI8d|9SoyH4gkROa%ja4Ou~u2+T2iv*0K@-+}p4CRy%`f=u!d%<)} zX)H6(uvxX*JN!{K30Le7nMU_MxXj7OP<;5%z}ezx{?g~U=~rqrq+~Y=R>eT81nT{E zwteOl`p`}#DC2tYoZ(?$_b-oABBwqDv^9qpkJY?BLJwjD3bb|jxc7vX;Z<(Ls2hYkcDVHCyJ<|S8M`57DX$3bD`)GW4c=4N_JXwrhTKux+ zX;xM+uG3lfg7<9FHp5Zt7O1aJBp%uPhK(OM=1@t>*3z*+nXunw>3FxO;?~{-NOLuK zpPIB6oC9dImb_cTYp}#)4RmxI2rOAFool?l<0S(m?_egLf1;eL%kyQeo2z(FH8NFl zc`Uz48LXr6H91YcKZH`qVAM^uW>rHP0l`UD$h&*M4!0wDx^Yo9urnLE{&T4PK~RF; zh+OvC#ThgUTT0PdA5;szH8YMas{fwQ1niAC z*7uT1h~G>D6ZK|LVY3XhDpl3t*`xG3%)&Xsm6cKj7f5|T-I9$%Wx6qJ%On~|HYP%9 z8dR1M$)TaZYUlEqFr7T6Mbd;{)fXZduRz^VvUmgGlF+yCWaveoAO-He1ucVFuXrQR7gU z_g;@S^{hnNmi(x&le_0#L!Ofn`~S7ZbLlnmEZOASZ*iVf6L751nXrE@y=7-(;mFw% zv7f`LNuagh2FdMz%dXL%FL4CzWIw<9??srLPNB?%ZphOZUy7|#{>IoBXJy^h`{OrG zXdAjf%&cqdE?uO?zt($6Db(dx)qwA%BraI!hg3t=I)-$nP6i-7jgc;d?>`--(j|&i zX|t!FG5^%pe)Gwnid7#}J6xV}R;*mgBg#sxb}jI+4YD7*eKjM<-K-3kZ^JLmuD5Dh zS@k}E2CdckKBETtsF~ zYb)>LGb{5|tk12O89QSMI?Z=VNFIj_Rr5Y1MDeq|V7;YEO=_-tmPcho@OL-W>1{vI zzZBaZ_cIZAX58fJmefeEXA@f)L2%KzvQJt*$&;N18O|mCz*k-OQliS+)_wE4(-NXC z8p)Aew@i_G>u^=oCCU zZf>x{7;+RO)}SEY|N7(o`=K#r4WcJY|=ap0JkiKtUX7sv)Lo{njU)w_q$KGU?do8ifPKI!CA z26dL&S2ga}d;0~lT~ZF>?6lC?)REoXsncta+0E5QZzb{7XD*lcpZS;ng2%tPE0n>E WWjahmBL}vR6d>5U;aMjFQ~w5(Y=aH} literal 9814 zcmZ8nRa6uJv)-jsx+PXhdV!@IS8@pjrDN#^0qITwL8ZG>y1N^eSddQX4rvg${^!2j z|31t&4|C3(d7AjlOe|{Ep`SiG(5|ma{)msDE=PhFGLJ z-Rej<kMqd2_rQO^Akybk)5fG4iN!_f$VzSa6!#vpTG@ck`4b1|&x! z4|ZaSq$s@|wj)gp1@+tZ6qfe>a4x+F0RU_!?kj#DAhjO6m*vbHq}&5hMs3dR@-$N3 zgRxL>R)*~kwzoOtsJViXLt{F@t0}x=Ybwej()h9EbPC-{^Wz$dYY(1)Vcna;&?d(b zh`*RAWFfYzxX5Uv(@msQ~4flZOS*xhI#AqzmE8(e?h#NdP01^q2)G}34ZJM3&NY&MJobiv3otgl=;vDeST zLUwA-?fUNe%glYnzxP-WqAAZOKHao_%e)=7bX-ifXKD_^;-?arg=t@p1VAxK0PLP6 zxb%lP?-INfgIx%1%eubh;=mo~sUQ*zf>@uHn(QmF@fb%!`-%(SvkwJ)+0O|2wYVe~ zJ`E9%_5Sqm!haw-hEad?Krwl?kazk!yaStxZSnp?1HlEuS01a~V*4v61(X0FaCM7n zihbGTkm5O$+p6Agq)O0?tB5Ne*G!@Mx3?aW0S*;ih_$v|5!?|Tg}l?=L`-sCUuq9K z0Cs5l4HR^wlC-b~|y0 z2L=aun{tn47y}SwYvj(7jzn;qP?i7yqqKUsTm|$^NW>POC>N)Nb%3WuJrUsT9fFK| z=P><`V`T9#MOeA`O6+(%Ro?0CV5Oq}oQgO1Yt!%|CwT@1r}Hs_X9{#3{;q@^H$d1bH9Y(ll zbV0108!{TAu}Nz81#CMwrKV>_)d8=cpiBlcq^x5H)`9$7M<6#aqhDa{L-YNuxE@F+ zE_rf^JyyVmn~+k6`rjDY>&A)5cu;NV)Aaaj2!bUgC!`=m4x@3!_Kmj^M$7Bgq4hX z>U!v)+vn8w-GsyiL8;cn>0pU{B(Q!hp4Y4D+YUmMfMfw zS-QGlt5=NnL**i%#vui!#aU|c&=%}krzVucQ9v1xrvNbt+iD?%(T{VNKF+Rc7FRy2k=nwft$P}Ea$I+72UTQY3-wa zIm)dyBA^mG5_-Dn`KR>8j?pC(%dryo{NpRT#DU_2mlU>s6E1W>QmR>Vf*QS^+ zMis>6n9xzycKgnX{Vpq(I2OeHTRVk6=w$}x!z<21^rzoAH@R;Q@N}FGA(54K%_Yu1 zP6y~d8lh|Ig=_DL)QL=|*=zd_hEA8pq*WV$%PG-*%m&IXH{AyJTHZ)3w6aKCoO_x_ z;}@WIr=qf{6mCpm-N`yBQKE+DUOy7$nXXlIcRxOSEE@_#5wLoPU%CdsI@(i^~l9t8S0g3J^w8pp=kU#}d^n~D21IxZRj02q+K*urI!FY~*LArHF0 zE~L|@LCO3?v)@LlN7sfIfB11V zYY-9b&Yh4F72s*`nMx=eEr_`-jAn{>$KV`#;D)fk$pJ0v4eI9xRb8eyK&Pxh*5R8D zz8!QO+GqzAJvkwzmX>r-`X~6a%@iL`<>BF@CEg1OCEPhiu8nt7_~@CLG$^6HzATd{ z9~~vlIVaFfGaRmYj?Ff9lT=j1mCG1}Pi@~wGvp(bKDp?QH12=-Tx6|7cyYOwg0F&K z%TP=yM)s_K%lj~QePRaK1Pm;NhZ};WZw_;_FvK z6-iQvT+Ojd>K2z~e%A66v-GoIKJ2O6tJZVOip-!9HI_ZH#r_+gmw>^aw}x-(ErT=G!7CYPw-NXT2NK=lj%asvnsSj50DsuQD@_j03vuoAqt7cYm{b z4ZFkLK2LsO7NuD{6Cz08KN5cK>h=wu_@>`Md3^GutwfpIL;?p^DPZ;HsA9VZ0s%Ea zR!z)Lok#7BPkw6Sk41Wh9{a(S%hioP({^_FSsPWMn^}rt;}RmQ>_BW2d~TblW?x7O z8VX=ntmSF4?P4qo9bkmj1GMA(}SpP?8K8Sq(luMf;JPzA22nna5!k)ZUKOti=!=^3{_|aoTiza^(AA{ zwQZ;bH&mVBeS>|K>9%?Nyjnjm-Wzaj@gDzAL0eRV(WJR@4KX8+^CT_Tx=PxEgZo~6 z`9WV?BtI8U&*h@)AO(`b6{P5LNABbUvi#9HyKDTnmHRGG(B23 z)u5%x6mr>Bquq>@HfRvPNj}|)e8@4&uGhSGhN8=F0I#+~tZ+lX%5#5k9vGDU6UG}7 z4U?bJKwWlh3AOP`eG<=BP_{}BcNMP5HqE3T3ygH#l_#%UtnFa*||I)`=5$dg!*a=PQ;E zH4FX`mMckI6Qxuo8*)7#Ug3>tW@&-F{*IJ;YXInU1U#O;vmsjb&oH{7p(<5)K^*;c zOBU~p6<*}Ow##a%d`!L_Zt0^WsFYwvcspRSY}kJy%c1`FuPokxnDT@R$@7U{1YnNi>4h`fAncV4BavThNRC?=sx-Tdtyl_&&GsY~G zI%;shd!^;_@$$VKrPTMTqxw*EDU%?xou*SM$2S?wCbOxzY@q8cm>(l z(z4cEnPTJil>gjLGyPKfxL;;6=+CPZ$`_c}X^(1+_p9=YKF?aS1@GyNcA5!j%DVG` zR)o0F&*0hP0?AdP+s@YI&z1?c)dbiWpJd*s8pXAougt_!@j+Ue%f!s_yGpOMKj@R; zlPEHWFESha2?h07;p3DWo&=Gh`EB4#OU^eS(AQ6>B%gak+)l6SvA1lFYm{!St{B@(yGk`nFNrY5K4!3n;PhiO7Wq`p7@ z>p=dmd$}N>zrMWa#j^LGx+^dFLp9jKbw;;-TBJ_xCZ?qrCePzcsh%TsS=(RSqVY)= zTCPSW*hP0bM0Y2xs3+IOmYcuHlke`~TZK_tilgovO;pcj1<{elCI@RqCjIEbxI`_q zktgVna$}5U(W2<05ehgMY;FAodvsO6n!58lZ-tq>7!Wq3)KWEYLyz)r54jq!XH}bL zG@w0IOq-QQwLaD)bQ{C`Lq{M2n$57aeMF3uoHzDQX%NsFRbOlVCO0BRXF>$zmxC%0 zWFdgJQ{&0_CsEDaRZLhHI~uGec`>!7kz3&`jL622wJ`4VpsS7BEvCltajBCcrAcYpLAFv5D+hr|!mctE#r|+}e;Of&EoZ8< zw;;y;rdz-LP|{k7!k989?or`>_x#Rt&Xf5q1au^%)8K%7?+g5(8WP3f-{yO}G0`}v zR|8}^pc29Y2%)1o|NL1Ss>3r-uFcU328KBC`HQv3ANUb$<+f-vW?(#?xVqYs$MAchuLiyPh94l<(}a}PY%Opd ze^9r+$~37LXSfqcX(JBM;W<|0k$_}^1y4fb!C&cQXS&@#xq%58h<|x;UAWi(i@Zse z+{-Ck(Q8x8hJa_@OUHrngOV8(L&IZS#=g9|ntROi@v z4dx$TwoX~iK+#^A<#Ijec$?i;VZ}#GB_>VLM$5GbD0b&ZBpb6IH=v({&cg2D(^pe7 z1s|?<>`i##7u6)CqJsmSOz~6dN{s59K>=*)cmpj*_1L}q-eTmfeypwM*CT* zEv1mL2OfNy_Jt!Jk&eo2fj71%<2$N1<~5Gm^|fYpl+!n?_B)PH-{-@y_jw^cR<|fk zTbM(wrYK=@qI76$F_=$M?#%~wI=N*IuT z2q+PD0ibTM$IdsiAhW81VC7QQxGXA4+Q*|O^9%~5X^4wtno@0v08JUZDy#s-90Pyw zy*{5du^RD3|eco7}r!FNGQqw0Zu`Pc-hkr7glRTbp%}6h9MQPeja_eOM9`^ zPBAf^Zyu*k%*nT>%6vZaS?^HwboFAlKg2$GWcPEaY;9PcFO;?L7FjN2g!CB^3mcD2 z$7+9VlbMw)HL*w$at*^!!z(Lo^|_&y;v85Mt7J;6m6hpvL8?2A?dP#s*m9Ty>aokD zTq48ToU1LIN5GgUNw0!HVrdVXZ#W)0kXD64Dokz|LC-F;@nUGWz>hC)T=I@dH2m*3 zTJXR9@^YJ7^U+ziclUM8tvzP-0ohd;Ch`sHVHiv2FmKZ(&0@m^GCcD`GEA0+dKm^E?U=UvD=;pOpmR^a%S@(XZw2KDR)kv1U+P z%??+YJ#D6pTKTQ`TQl8EB*P)%XynkGd%SiFlK~p=p=9}&JAhLh?h~sH*T!Q{pD2qU zL|g#ujTBxJ1JHmk>2MWM9HMW7Te;g-ox3AXhWfu=iSW1RNBH!~{G8L`KB5!v%^tow zq)T>9fAS!Fi3#4dwrmaOu4r5DbMqE?9%Bn$1mupae4Ei8B&{&?l073uUT^a5_7X9A zxsIOoQ~X;C)02;>YVcmaavG)zN!XveZ=J2cD0G5rivD{v=mw*YVASIO+ovND~o#7B{dzk-?>*f0Ds*hm#!^cr6uP52RZ6lwv zs?rUttryX8lPo;LOEta#Ud+joVUJ(~3dzX)s;)AEcQG^cum9#93ML59@;?N1=k8py z;!Ef5@oVF)e=&hcW%n`W4Yi*IGyUPrZRsr*fKnDlHl#=2MhCDfRL z&Bgck!Lw(s!W6!sGFWtPYm&blKt`Z>HA$>LQj|8nry`H`?(O%u^wo&D3QlGEV56R+ zGe}%=`WAM_E2v`h=W;y1&Ad-m28+jg&8h5)giY@nC@mTG%2W25P2)Ot*WNNZ{GDua zJ~)vT?_xzGv0Cc`S_TMgS0KmecP9T1=PBBl)TE71*p8G1;4ltb{P7&idleoC9$^hf z)<6g98od{n$-mWGs4G%3dNiy|&|VcV%a9rBc@9<-U%vtlXNj1~OVJTVS{@Py%#Jep zzoA_*GVa#bWd$(Qv#1~vE89F~E5%+8=Yqbnrdvt#`G`fq^RW7WoaGx6H^U$z3H(g?7znsULF2QqixQcvX2)HJmAm?1BNm1_W^b`X@Kih#5+~9U z6!eALy~av(Cxjxyur-FJ>*b&7PTHJM2=T>N5)^$}G?0EuD&pQ2F{CEpF;b28X;(;1 z+rxwD>UqaPeBB9fL=?F+$i^{36D9t2Dm|7!_(p@iQypv4eVp5x)Uv4H(<6z?(5ht0 z(=;7fdaJQ^>i{G2+ZNtGf*n;xI_mDu7l#l4WC@%K!zM7PJRyJ>L14)`jhsd_DDRM6 zzhy&;%64EUqYob|{K_-Y48112HHI*6tW}EqgYa#Albv;*4QHLqEk62*MRv>9SBw5i zg84t`+0M<*OnxgfNI*I34;(%Zez)DZB(OExBaj0eeiGlj`G^M{p|R?gK&@<3ZjoHX zV31}Hy4=xX)eT+zX&f*cZf&|~9PKsyKC&W!1$3KML8Sj$fxHZkem^WX-9o2LNV9W) z?>YVr9Dlk@jsHjb<%>cA20`(QI^nwpcSv2`CtM=fhL?Zzr7zO8yzlz#xfVl%`mCDug73pEPze^(1S2eYWC{JtsP+=A;ho?3pw5 zSLp$i4&sAC7~~<~xtY)>>QW&Vd=^E;-qqwEJC6ORn@|p_&KK)TbAqgMn7GwE5tM|s z1Z~Ss(?53Q6b?o5IQ7*OLN3@s8)bLp%ay9OagcFwa{dFZ8*}{M=7_b#%U&oz(fU}^ zXK3h`1x0cIK|gs@w;vPl8cHIdEVIt3wB9=7RW0JNM6Xyf zPRE^l_P!~cP6)BG44{wh*AGp3vBTDRr30myT~a#rH!qUtX|#RoM_o7ZO9hCc_1sRI z?5|KfTeD~5WhH^#0p$2p8FN1`*hc?elwuez-OX=GEiFtVAMP9MpL-i~Z+M4@u`C_y z0w^2H0(nQNixZ6D>khW%-kcZjPc=8-00F^A9xR70xIj-Bg+6g?9XM169}Pxt?CLwH zeP#UIeyR#kxKvf4a~gV-F;e0OGvSo_Fi-ouXR?l56qj|j_xgS>Y z9!n4Tk{!`F5wF>#ehg@;rt8QQoYIivS^@wD!x8f0O97x

18=wNu<={f0KpJg}!f zCAth1{OChilg`3HEY}$jz+>>Z%!5a6$1e$zl9zGu?AR{4w&e6(yA@vUbd&11E1&4A zNs;=(A;nw%u6PS`+K;+GN_uY>T~1ooBA-Y_ch*@;{khdpOuG?v`f7m8mJ)^V>X9LF z>|Q-pM)VXU*qRGsc{N)W!XUIkX+0?DDk1-EnIYL@UB>-kJ10k9^ez^9tqRtfg?~EF z)&AGLBi|l>t%GI?003&KZpLDr?yfTnro! z5k4ppk=kVZkx7*<%fSP>mECMZ{AHD0jjSarn2);X<+G*o^;b}4Ysm$-pjImiqalt+ zM>G7xA|SimttQlD%C&(BZ@2JE4{1PweDVlfAP^M=KSQ_HOEqg=sm{E1H>J2j0ZV^u z!{|0}KYj5ep<{-+%j&6!yDa6UNG1-77Opi|CQLUWhs`Ivj`Rn|uq)ZJN3TuxdLS=> zrYQQ@r<*o2NK7f8(3IE4FVlsDM^u@z&!5?eJxf{5NzqjhTE~+WG%nihYi`BG008>m z|7Zbzoi|VzechL?#|*-I!|x0=gwRoW?(7%{+>j+~tgi~uqMRvn#73+Hetce6Z1%io zAA2rn9ndxlNx6Q_0n3^a$Mn*_F1cTNOpJQN!85;u$~H-d0UM@}_tar85e2FtzU!Zi9jfi%<@7(|y&vVy-E^#ap z!U-4O$APX55T5$}Q&^Yau+Z5XiORMX>wsS_Jjc!Tg-cxzH^)MT>ic@WtSulF%Hkq| zA)T` z;!y+G%f{Prv%eeY2$Qj33~D1E(V-+3uD!F2n62N>rI{>FQuqS9zBqisx6QECrHyY4 zgn*XO1`!B#gnpq%$Si|Z;hAi=C^J6X3qzEz>YnBEWaIvN2Y2sWHlIc4bwV8{p4_XY zny{I%P*MnLUv`f;-C+y<9)^?Yi_%K;7Ky7ezFvAciYhD%8&xr-XlVT+J={RBaVqn=FqSFCQ@WKSx+CB< z1~I9F0340!-lxAa)5iWGTfIMn@or}5??@Y*!Prz|wHg(MW)e2pm-t7X^P?hbM!7A& zPjJ(D*o@}9Z`1c==4P&vUs+sgYQ8tJwo77i$Mb`+i68X+;nMj>Ly@j)BV>1-qpTF3 z_XGQnlfUs}1xyT260U}~=m+`s-^d917P;xdd+)~I{=uwv`$|2wn?sseHb4;|{b1PaR4{oh7od?>H^=z;9e1rAZ_Sz3llr?t z^@hAmWQ&d}{WVIO;WqCyja(AC`sbOlXFW{i7%Z9Htjc%DytBAYHKi-5Qb*x)Q zqx=AXnEJz}%o*m^jzcP6IlWt`K2Uvl!yS8}=~C|*xsJobUT%c`CKQ50y6X(*k4i0S_|@0&vB;$3*^zfb!s_9P>=?#`#xU#2N3Q?S zvtbww^a=hgS$r#%G@0trah-}0d=Z*)@){cLMDH7M8A=X%avmA2x71y1@J!SOvUgYt zfLCJC!pLryAMQ)S7nABwh4?gv2d__3FA|PuJN`A}LU^b7#Tw#v>I(oR2)IPB+*D=QK6S}~th)R3eBL`6LgGlo z`6anKP$^o4SuV39YTGxAvBYXC!|}3vVUj`08 From 07c76740c50a5c185a59324c44d92e583bd8c1fe Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sat, 29 Jun 2024 20:51:06 +0900 Subject: [PATCH 38/53] =?UTF-8?q?=E3=82=AB=E3=82=B9=E3=82=BF=E3=83=A0?= =?UTF-8?q?=E3=83=AD=E3=83=BC=E3=83=AB=E3=81=AB=E6=96=B0=E3=83=90=E3=83=8B?= =?UTF-8?q?=E3=83=A9=E3=83=AD=E3=83=BC=E3=83=AB=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Roles/Core/CustomRoleManager.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Roles/Core/CustomRoleManager.cs b/Roles/Core/CustomRoleManager.cs index ac20737b3..4b58f7c5c 100644 --- a/Roles/Core/CustomRoleManager.cs +++ b/Roles/Core/CustomRoleManager.cs @@ -365,6 +365,7 @@ public enum CustomRoles //Impostor(Vanilla) Impostor, Shapeshifter, + Phantom, //Impostor BountyHunter, FireWorks, @@ -393,6 +394,8 @@ public enum CustomRoles Engineer, GuardianAngel, Scientist, + Tracker, + Noisemaker, //Crewmate Bait, Lighter, From 8a7ba9524489e61e4c05a49705f672d970eabe7a Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sat, 29 Jun 2024 20:53:24 +0900 Subject: [PATCH 39/53] =?UTF-8?q?=E6=96=B0=E3=83=90=E3=83=8B=E3=83=A9?= =?UTF-8?q?=E3=83=AD=E3=83=BC=E3=83=AB=E3=81=AE=E3=83=A9=E3=83=83=E3=83=91?= =?UTF-8?q?=E3=83=BC=E3=82=92=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Roles/Vanilla/Noisemaker.cs | 10 ++++++++++ Roles/Vanilla/Phantom.cs | 11 +++++++++++ Roles/Vanilla/Tracker.cs | 10 ++++++++++ 3 files changed, 31 insertions(+) create mode 100644 Roles/Vanilla/Noisemaker.cs create mode 100644 Roles/Vanilla/Phantom.cs create mode 100644 Roles/Vanilla/Tracker.cs diff --git a/Roles/Vanilla/Noisemaker.cs b/Roles/Vanilla/Noisemaker.cs new file mode 100644 index 000000000..a9fa36138 --- /dev/null +++ b/Roles/Vanilla/Noisemaker.cs @@ -0,0 +1,10 @@ +using AmongUs.GameOptions; +using TownOfHost.Roles.Core; + +namespace TownOfHost.Roles.Vanilla; + +public sealed class Noisemaker : RoleBase +{ + public Noisemaker(PlayerControl player) : base(RoleInfo, player) { } + public readonly static SimpleRoleInfo RoleInfo = SimpleRoleInfo.CreateForVanilla(typeof(Noisemaker), player => new Noisemaker(player), RoleTypes.Noisemaker, "#8cffff"); +} diff --git a/Roles/Vanilla/Phantom.cs b/Roles/Vanilla/Phantom.cs new file mode 100644 index 000000000..337dc236d --- /dev/null +++ b/Roles/Vanilla/Phantom.cs @@ -0,0 +1,11 @@ +using AmongUs.GameOptions; +using TownOfHost.Roles.Core; +using TownOfHost.Roles.Core.Interfaces; + +namespace TownOfHost.Roles.Vanilla; + +public sealed class Phantom : RoleBase, IImpostor +{ + public Phantom(PlayerControl player) : base(RoleInfo, player) { } + public static readonly SimpleRoleInfo RoleInfo = SimpleRoleInfo.CreateForVanilla(typeof(Phantom), player => new Phantom(player), RoleTypes.Phantom); +} diff --git a/Roles/Vanilla/Tracker.cs b/Roles/Vanilla/Tracker.cs new file mode 100644 index 000000000..46068392d --- /dev/null +++ b/Roles/Vanilla/Tracker.cs @@ -0,0 +1,10 @@ +using AmongUs.GameOptions; +using TownOfHost.Roles.Core; + +namespace TownOfHost.Roles.Vanilla; + +public sealed class Tracker : RoleBase +{ + public Tracker(PlayerControl player) : base(RoleInfo, player) { } + public readonly static SimpleRoleInfo RoleInfo = SimpleRoleInfo.CreateForVanilla(typeof(Tracker), player => new Tracker(player), RoleTypes.Tracker, "#8cffff"); +} From 8c2980209eb28a57351037264b625a8f0208fc53 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sat, 29 Jun 2024 20:56:12 +0900 Subject: [PATCH 40/53] =?UTF-8?q?=E5=BF=85=E8=A6=81=E3=81=AA=E7=AE=87?= =?UTF-8?q?=E6=89=80=E3=81=AB=E3=83=90=E3=83=8B=E3=83=A9=E3=83=AD=E3=83=BC?= =?UTF-8?q?=E3=83=AB=E3=81=AE=E5=88=86=E5=B2=90=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Helpers/CustomRolesHelper.cs | 11 ++++++++++- Modules/GameState.cs | 3 +++ Modules/OptionBackup/OptionBackupData.cs | 2 +- Patches/GameOptionsMenuPatch.cs | 6 ++++++ Patches/onGameStartedPatch.cs | 22 ++++++++++++++++++++-- Roles/Core/RoleBase.cs | 4 ++++ Roles/Core/SimpleRoleInfo.cs | 13 +++++++++++++ 7 files changed, 57 insertions(+), 4 deletions(-) diff --git a/Helpers/CustomRolesHelper.cs b/Helpers/CustomRolesHelper.cs index 98d4d18f7..b030b9c49 100644 --- a/Helpers/CustomRolesHelper.cs +++ b/Helpers/CustomRolesHelper.cs @@ -47,9 +47,12 @@ public static bool IsVanilla(this CustomRoles role) role is CustomRoles.Crewmate or CustomRoles.Engineer or CustomRoles.Scientist or + CustomRoles.Tracker or + CustomRoles.Noisemaker or CustomRoles.GuardianAngel or CustomRoles.Impostor or - CustomRoles.Shapeshifter; + CustomRoles.Shapeshifter or + CustomRoles.Phantom; } public static CustomRoleTypes GetCustomRoleTypes(this CustomRoles role) @@ -74,7 +77,10 @@ public static int GetCount(this CustomRoles role) { CustomRoles.Engineer => roleOpt.GetNumPerGame(RoleTypes.Engineer), CustomRoles.Scientist => roleOpt.GetNumPerGame(RoleTypes.Scientist), + CustomRoles.Tracker => roleOpt.GetNumPerGame(RoleTypes.Tracker), + CustomRoles.Noisemaker => roleOpt.GetNumPerGame(RoleTypes.Noisemaker), CustomRoles.Shapeshifter => roleOpt.GetNumPerGame(RoleTypes.Shapeshifter), + CustomRoles.Phantom => roleOpt.GetNumPerGame(RoleTypes.Phantom), CustomRoles.GuardianAngel => roleOpt.GetNumPerGame(RoleTypes.GuardianAngel), CustomRoles.Crewmate => roleOpt.GetNumPerGame(RoleTypes.Crewmate), _ => 0 @@ -94,7 +100,10 @@ public static int GetChance(this CustomRoles role) { CustomRoles.Engineer => roleOpt.GetChancePerGame(RoleTypes.Engineer), CustomRoles.Scientist => roleOpt.GetChancePerGame(RoleTypes.Scientist), + CustomRoles.Noisemaker => roleOpt.GetChancePerGame(RoleTypes.Noisemaker), + CustomRoles.Tracker => roleOpt.GetChancePerGame(RoleTypes.Tracker), CustomRoles.Shapeshifter => roleOpt.GetChancePerGame(RoleTypes.Shapeshifter), + CustomRoles.Phantom => roleOpt.GetChancePerGame(RoleTypes.Phantom), CustomRoles.GuardianAngel => roleOpt.GetChancePerGame(RoleTypes.GuardianAngel), CustomRoles.Crewmate => roleOpt.GetChancePerGame(RoleTypes.Crewmate), _ => 0 diff --git a/Modules/GameState.cs b/Modules/GameState.cs index 57ebdc0c7..ebce5cfc3 100644 --- a/Modules/GameState.cs +++ b/Modules/GameState.cs @@ -58,9 +58,12 @@ public CustomRoles GetCustomRole() RoleTypes.Crewmate => CustomRoles.Crewmate, RoleTypes.Engineer => CustomRoles.Engineer, RoleTypes.Scientist => CustomRoles.Scientist, + RoleTypes.Noisemaker => CustomRoles.Noisemaker, + RoleTypes.Tracker => CustomRoles.Tracker, RoleTypes.GuardianAngel => CustomRoles.GuardianAngel, RoleTypes.Impostor => CustomRoles.Impostor, RoleTypes.Shapeshifter => CustomRoles.Shapeshifter, + RoleTypes.Phantom => CustomRoles.Phantom, _ => CustomRoles.Crewmate, }; } diff --git a/Modules/OptionBackup/OptionBackupData.cs b/Modules/OptionBackup/OptionBackupData.cs index 10ca2f47e..2b99724f2 100644 --- a/Modules/OptionBackup/OptionBackupData.cs +++ b/Modules/OptionBackup/OptionBackupData.cs @@ -37,7 +37,7 @@ public OptionBackupData(IGameOptions option) // TryGetUIntが実装されていないため、別で取得する AllValues.Add(new UIntOptionBackupValue(UInt32OptionNames.Keywords, (uint)option.Keywords)); - foreach (RoleTypes role in new RoleTypes[] { RoleTypes.Scientist, RoleTypes.Engineer, RoleTypes.GuardianAngel, RoleTypes.Shapeshifter }) + foreach (RoleTypes role in new RoleTypes[] { RoleTypes.Scientist, RoleTypes.Engineer, RoleTypes.Noisemaker, RoleTypes.Tracker, RoleTypes.GuardianAngel, RoleTypes.Shapeshifter, RoleTypes.Phantom }) { AllValues.Add(new RoleRateBackupValue(role, option.RoleOptions.GetNumPerGame(role), option.RoleOptions.GetChancePerGame(role))); } diff --git a/Patches/GameOptionsMenuPatch.cs b/Patches/GameOptionsMenuPatch.cs index 25c9c38d4..37c81b2e3 100644 --- a/Patches/GameOptionsMenuPatch.cs +++ b/Patches/GameOptionsMenuPatch.cs @@ -391,13 +391,19 @@ private static void SetStandardRecommendations(NormalGameOptionsV08 __instance, __instance.VisualTasks = false; __instance.roleOptions.SetRoleRate(RoleTypes.Shapeshifter, 0, 0); + __instance.roleOptions.SetRoleRate(RoleTypes.Phantom, 0, 0); __instance.roleOptions.SetRoleRate(RoleTypes.Scientist, 0, 0); __instance.roleOptions.SetRoleRate(RoleTypes.GuardianAngel, 0, 0); __instance.roleOptions.SetRoleRate(RoleTypes.Engineer, 0, 0); + __instance.roleOptions.SetRoleRate(RoleTypes.Noisemaker, 0, 0); + __instance.roleOptions.SetRoleRate(RoleTypes.Tracker, 0, 0); __instance.roleOptions.SetRoleRecommended(RoleTypes.Shapeshifter); + __instance.roleOptions.SetRoleRecommended(RoleTypes.Phantom); __instance.roleOptions.SetRoleRecommended(RoleTypes.Scientist); __instance.roleOptions.SetRoleRecommended(RoleTypes.GuardianAngel); __instance.roleOptions.SetRoleRecommended(RoleTypes.Engineer); + __instance.roleOptions.SetRoleRecommended(RoleTypes.Noisemaker); + __instance.roleOptions.SetRoleRecommended(RoleTypes.Tracker); if (Options.CurrentGameMode == CustomGameMode.HideAndSeek) //HideAndSeek { diff --git a/Patches/onGameStartedPatch.cs b/Patches/onGameStartedPatch.cs index 7d6726663..860f63609 100644 --- a/Patches/onGameStartedPatch.cs +++ b/Patches/onGameStartedPatch.cs @@ -124,7 +124,7 @@ public static void Prefix() if (Options.CurrentGameMode != CustomGameMode.HideAndSeek) { - RoleTypes[] RoleTypesList = { RoleTypes.Scientist, RoleTypes.Engineer, RoleTypes.Shapeshifter }; + RoleTypes[] RoleTypesList = [RoleTypes.Scientist, RoleTypes.Engineer, RoleTypes.Noisemaker, RoleTypes.Tracker, RoleTypes.Shapeshifter, RoleTypes.Phantom]; foreach (var roleTypes in RoleTypesList) { var roleOpt = Main.NormalOptions.roleOptions; @@ -178,6 +178,9 @@ public static void Postfix() List Engineers = new(); List GuardianAngels = new(); List Shapeshifters = new(); + List trackers = []; + List noisemakers = []; + List phantoms = []; foreach (var pc in Main.AllPlayerControls) { @@ -211,6 +214,18 @@ public static void Postfix() Shapeshifters.Add(pc); role = CustomRoles.Shapeshifter; break; + case RoleTypes.Tracker: + trackers.Add(pc); + role = CustomRoles.Tracker; + break; + case RoleTypes.Noisemaker: + noisemakers.Add(pc); + role = CustomRoles.Noisemaker; + break; + case RoleTypes.Phantom: + phantoms.Add(pc); + role = CustomRoles.Phantom; + break; default: Logger.SendInGame(string.Format(GetString("Error.InvalidRoleAssignment"), pc?.Data?.PlayerName)); break; @@ -252,8 +267,11 @@ public static void Postfix() { RoleTypes.Impostor => Impostors, RoleTypes.Shapeshifter => Shapeshifters, + RoleTypes.Phantom => phantoms, RoleTypes.Scientist => Scientists, RoleTypes.Engineer => Engineers, + RoleTypes.Noisemaker => noisemakers, + RoleTypes.Tracker => trackers, RoleTypes.GuardianAngel => GuardianAngels, _ => Crewmates, }; @@ -288,7 +306,7 @@ public static void Postfix() } } - RoleTypes[] RoleTypesList = { RoleTypes.Scientist, RoleTypes.Engineer, RoleTypes.Shapeshifter }; + RoleTypes[] RoleTypesList = [RoleTypes.Scientist, RoleTypes.Engineer, RoleTypes.Noisemaker, RoleTypes.Tracker, RoleTypes.Shapeshifter, RoleTypes.Phantom]; foreach (var roleTypes in RoleTypesList) { var roleOpt = Main.NormalOptions.roleOptions; diff --git a/Roles/Core/RoleBase.cs b/Roles/Core/RoleBase.cs index f5e64916f..bbd27c56f 100644 --- a/Roles/Core/RoleBase.cs +++ b/Roles/Core/RoleBase.cs @@ -46,8 +46,10 @@ public RoleBase( this.hasTasks = hasTasks ?? (roleInfo.CustomRoleType == CustomRoleTypes.Crewmate ? () => HasTask.True : () => HasTask.False); HasAbility = hasAbility ?? roleInfo.BaseRoleType.Invoke() is RoleTypes.Shapeshifter or + RoleTypes.Phantom or RoleTypes.Engineer or RoleTypes.Scientist or + RoleTypes.Tracker or RoleTypes.GuardianAngel or RoleTypes.CrewmateGhost or RoleTypes.ImpostorGhost; @@ -343,6 +345,8 @@ public virtual string GetAbilityButtonText() { StringNames? str = Player.Data.Role.Role switch { + RoleTypes.Phantom => Player.Data.Role.TryCast(out var phantomRole) ? (phantomRole.IsInvisible ? StringNames.PhantomAbilityUndo : StringNames.PhantomAbility) : null, + RoleTypes.Tracker => Player.Data.Role.TryCast(out var trackerRole) ? (trackerRole.isTrackingActive ? StringNames.TrackerAbilityUndo : StringNames.TrackerAbility) : null, RoleTypes.Engineer => StringNames.VentAbility, RoleTypes.Scientist => StringNames.VitalsAbility, RoleTypes.Shapeshifter => StringNames.ShapeshiftAbility, diff --git a/Roles/Core/SimpleRoleInfo.cs b/Roles/Core/SimpleRoleInfo.cs index 4621ee7ce..86f51a815 100644 --- a/Roles/Core/SimpleRoleInfo.cs +++ b/Roles/Core/SimpleRoleInfo.cs @@ -154,6 +154,14 @@ public static SimpleRoleInfo CreateForVanilla( roleName = CustomRoles.Scientist; customRoleType = CustomRoleTypes.Crewmate; break; + case RoleTypes.Noisemaker: + roleName = CustomRoles.Noisemaker; + customRoleType = CustomRoleTypes.Crewmate; + break; + case RoleTypes.Tracker: + roleName = CustomRoles.Tracker; + customRoleType = CustomRoleTypes.Crewmate; + break; case RoleTypes.GuardianAngel: roleName = CustomRoles.GuardianAngel; customRoleType = CustomRoleTypes.Crewmate; @@ -168,6 +176,11 @@ public static SimpleRoleInfo CreateForVanilla( customRoleType = CustomRoleTypes.Impostor; countType = CountTypes.Impostor; break; + case RoleTypes.Phantom: + roleName = CustomRoles.Phantom; + customRoleType = CustomRoleTypes.Impostor; + countType = CountTypes.Impostor; + break; default: roleName = CustomRoles.Crewmate; customRoleType = CustomRoleTypes.Crewmate; From 497b611e3802b47b2b98d6781e9308bb53a76d60 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sat, 29 Jun 2024 20:56:48 +0900 Subject: [PATCH 41/53] =?UTF-8?q?=E3=83=90=E3=83=8B=E3=83=A9=E3=83=AD?= =?UTF-8?q?=E3=83=BC=E3=83=AB=E3=81=AE=E7=BF=BB=E8=A8=B3=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Resources/string.csv | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Resources/string.csv b/Resources/string.csv index 26e9f3912..683155c92 100644 --- a/Resources/string.csv +++ b/Resources/string.csv @@ -11,9 +11,12 @@ "Crewmate","Crewmate","クルーメイト","船员","船員","Член Экипажа","Tripulante","Tripulante" "Engineer","Engineer","エンジニア","工程师","工程師","Инженер","Engenheiro","Engenheiro" "Scientist","Scientist","科学者","科学家","科學家","Ученый","Cientista","Cientista" +"Noisemaker","Noisemaker","ノイズメーカー","","","","","" +"Tracker","Tracker","トラッカー","","","","","" "GuardianAngel","Guardian Angel","守護天使","守护天使","守護天使","Ангел-хранитель","Anjo da Guarda","Anjo da Guarda" "Impostor","Impostor","インポスター","内鬼","偽裝者","Предателей","Impostor","Impostor" "Shapeshifter","Shapeshifter","シェイプシフター","变形者","變形者","Оборотень","Metamorfo","Metamorfo" +"Phantom","Phantom","亡霊","","","","","" "# 特殊インポスター役職" "BountyHunter","Bounty Hunter","バウンティハンター","赏金猎人","賞金獵人","Охотник за головами","Caçador de Recompensas","Caçador de Recompensas" From 521cc838f9f9c378da35b649c2d71fac0c3fb320 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sat, 29 Jun 2024 21:07:37 +0900 Subject: [PATCH 42/53] =?UTF-8?q?=E5=BD=B9=E8=81=B7=E8=A8=AD=E5=AE=9A?= =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=88=E3=83=AB=E3=81=AE=E7=9D=80=E8=89=B2?= =?UTF-8?q?=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Patches/GameOptionsPatch.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Patches/GameOptionsPatch.cs b/Patches/GameOptionsPatch.cs index 09c338119..1675b4d13 100644 --- a/Patches/GameOptionsPatch.cs +++ b/Patches/GameOptionsPatch.cs @@ -23,7 +23,6 @@ public static void Postfix(RoleOptionSetting __instance) if (!__instance.titleText.text.Contains(DisableText)) __instance.titleText.text += DisableText; - __instance.titleText.color = Utils.GetRoleColor(CustomRoles.GuardianAngel); if (__instance.roleChance != 0 || __instance.roleMaxCount != 0) { __instance.roleChance = 0; @@ -31,10 +30,6 @@ public static void Postfix(RoleOptionSetting __instance) __instance.OnValueChanged.Invoke(__instance); } } - if (__instance.Role.Role == RoleTypes.Shapeshifter) - { - __instance.titleText.color = Utils.GetRoleColor(CustomRoles.Shapeshifter); - } } } From a95062106d482e7a99653bbce4cb74f9de5b3c34 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sat, 29 Jun 2024 21:29:26 +0900 Subject: [PATCH 43/53] =?UTF-8?q?=E3=83=87=E3=83=90=E3=83=83=E3=82=B0?= =?UTF-8?q?=E3=83=A2=E3=83=BC=E3=83=89=E6=99=82=E4=BB=A5=E5=A4=96=E3=81=AF?= =?UTF-8?q?=E3=83=95=E3=82=A1=E3=83=B3=E3=83=88=E3=83=A0=E3=82=92=E7=84=A1?= =?UTF-8?q?=E5=8A=B9=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Patches/GameOptionsPatch.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Patches/GameOptionsPatch.cs b/Patches/GameOptionsPatch.cs index 1675b4d13..00fa73b27 100644 --- a/Patches/GameOptionsPatch.cs +++ b/Patches/GameOptionsPatch.cs @@ -11,18 +11,19 @@ class ChanceChangePatch { public static void Postfix(RoleOptionSetting __instance) { - string DisableText = $" ({GetString("Disabled")})"; - if (__instance.Role.Role == RoleTypes.GuardianAngel) + // The Phantom does not work together with desynchronized impostor roles e.g. Sheriff so we need to disable it. + // This may be removed in the future when we have implemented changing vanilla role or some other stuff. + if (__instance.Role.Role is RoleTypes.GuardianAngel || (__instance.Role.Role is RoleTypes.Phantom && !DebugModeManager.IsDebugMode)) { + string disableText = $" ({GetString("Disabled")})"; //+-ボタンを非表示 - var tf = __instance.transform; foreach (var button in __instance.GetComponentsInChildren()) { button.gameObject.SetActive(false); } - if (!__instance.titleText.text.Contains(DisableText)) - __instance.titleText.text += DisableText; + if (!__instance.titleText.text.Contains(disableText)) + __instance.titleText.text += disableText; if (__instance.roleChance != 0 || __instance.roleMaxCount != 0) { __instance.roleChance = 0; From 65fb3f76330bb72d493cbbcb62f8cb151ac592d1 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sat, 29 Jun 2024 23:03:22 +0900 Subject: [PATCH 44/53] =?UTF-8?q?=E3=83=97=E3=83=AC=E3=83=AA=E3=83=AA?= =?UTF-8?q?=E3=83=BC=E3=82=B9=E3=81=8B=E3=81=A9=E3=81=86=E3=81=8B=E3=81=AE?= =?UTF-8?q?=E3=83=97=E3=83=AD=E3=83=91=E3=83=86=E3=82=A3=E3=82=92=E4=BD=9C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/main.cs b/main.cs index e5f0fe67a..ccae51e66 100644 --- a/main.cs +++ b/main.cs @@ -56,6 +56,8 @@ public class Main : BasePlugin public static readonly string LowestSupportedVersion = "2024.3.5"; // このバージョンのみで公開ルームを無効にする場合 public static readonly bool IsPublicAvailableOnThisVersion = false; + // プレリリースかどうか + public static bool IsPrerelease { get; } = true; public Harmony Harmony { get; } = new Harmony(PluginGuid); public static Version version = Version.Parse(PluginVersion); public static Color UnityModColor From e949fdf186f443492854891b60b81284876a668c Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sat, 29 Jun 2024 23:03:52 +0900 Subject: [PATCH 45/53] =?UTF-8?q?=E3=83=97=E3=83=AC=E3=83=AA=E3=83=AA?= =?UTF-8?q?=E3=83=BC=E3=82=B9=E3=81=A7=E3=81=82=E3=82=8B=E3=81=93=E3=81=A8?= =?UTF-8?q?=E3=82=92=E7=A4=BA=E3=81=99=E8=A1=A8=E7=A4=BA=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Patches/CredentialsPatch.cs | 4 ++++ Resources/string.csv | 1 + 2 files changed, 5 insertions(+) diff --git a/Patches/CredentialsPatch.cs b/Patches/CredentialsPatch.cs index 87944caa7..28db5c617 100644 --- a/Patches/CredentialsPatch.cs +++ b/Patches/CredentialsPatch.cs @@ -67,6 +67,10 @@ static void Postfix(VersionShower __instance) { TMPTemplate.SetBase(__instance.text); Main.credentialsText = $"{Main.ModName} v{Main.PluginVersion}"; + if (Main.IsPrerelease) + { + Main.credentialsText += $"\r\n<#F39C12>{GetString("Prerelease")}"; + } #if DEBUG Main.credentialsText += $"\r\n{ThisAssembly.Git.Branch}({ThisAssembly.Git.Commit})"; #endif diff --git a/Resources/string.csv b/Resources/string.csv index 26e9f3912..8ff707ae3 100644 --- a/Resources/string.csv +++ b/Resources/string.csv @@ -662,6 +662,7 @@ "FireworksReadyFirePhase","Fire!","打ち上げろ!","烟花来咯,大型烟花秀开始!","準備就緒,煙火秀開始!","Огонь!","Lançar!","" "StandardHAS","Hide And Seek with Roles","役職入りでかくれんぼ","在躲猫猫模式中加入职业","在躲貓貓中加入多職業模式中的職業","Прятки с Ролями","Esconde-Esconde com Classes","" "StandardHASWaitingTime","Standby","待機時間","躲猫猫猎人等待时间","躲貓貓偽裝者等待時間","Время ожидания","Tempo de Espera","" +"Prerelease","Pre-release","プレリリース","","","","","" "InvalidArgs","Invalid Args","無効な引数","无效参数","無效的參數","Недопустимые Аргументы","Argumento Inválido","" "On","ON","オン","开启","開啟","ВКЛ","Ativado","" "Off","OFF","オフ","关闭","關閉","ВЫКЛ","Desativado","" From 2e6df0b9479c5d9a72be1f3d6e627a0e1ccf687a Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sat, 29 Jun 2024 23:28:42 +0900 Subject: [PATCH 46/53] =?UTF-8?q?=E3=82=AB=E3=83=A2=E3=83=95=E3=83=A9?= =?UTF-8?q?=E3=83=BC=E3=82=B8=E3=83=A5=E3=81=AERPC=E3=81=AE=E5=A2=97?= =?UTF-8?q?=E3=81=88=E3=81=9F=E5=BC=95=E6=95=B0=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modules/Camouflague.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Modules/Camouflague.cs b/Modules/Camouflague.cs index 36659a92f..9b0e3baf0 100644 --- a/Modules/Camouflague.cs +++ b/Modules/Camouflague.cs @@ -104,27 +104,32 @@ public static void RpcSetSkin(PlayerControl target, bool ForceRevert = false, bo target.SetColor(newOutfit.ColorId); sender.AutoStartRpc(target.NetId, (byte)RpcCalls.SetColor) + .Write(target.Data.NetId) .Write(newOutfit.ColorId) .EndRpc(); target.SetHat(newOutfit.HatId, newOutfit.ColorId); sender.AutoStartRpc(target.NetId, (byte)RpcCalls.SetHatStr) .Write(newOutfit.HatId) + .Write(target.GetNextRpcSequenceId(RpcCalls.SetHatStr)) .EndRpc(); target.SetSkin(newOutfit.SkinId, newOutfit.ColorId); sender.AutoStartRpc(target.NetId, (byte)RpcCalls.SetSkinStr) .Write(newOutfit.SkinId) + .Write(target.GetNextRpcSequenceId(RpcCalls.SetSkinStr)) .EndRpc(); target.SetVisor(newOutfit.VisorId, newOutfit.ColorId); sender.AutoStartRpc(target.NetId, (byte)RpcCalls.SetVisorStr) .Write(newOutfit.VisorId) + .Write(target.GetNextRpcSequenceId(RpcCalls.SetVisorStr)) .EndRpc(); target.SetPet(newOutfit.PetId); sender.AutoStartRpc(target.NetId, (byte)RpcCalls.SetPetStr) .Write(newOutfit.PetId) + .Write(target.GetNextRpcSequenceId(RpcCalls.SetPetStr)) .EndRpc(); sender.SendMessage(); From 3eb722c02002ad83167695bd9be92df149b489e4 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sun, 30 Jun 2024 17:14:30 +0900 Subject: [PATCH 47/53] =?UTF-8?q?=E3=82=B5=E3=83=9D=E3=83=BC=E3=83=88?= =?UTF-8?q?=E3=82=A2=E3=83=A2=E3=82=A2=E3=82=B9=E3=83=90=E3=83=BC=E3=82=B8?= =?UTF-8?q?=E3=83=A7=E3=83=B3=E3=82=922024.6.18=E3=81=B8=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.cs b/main.cs index ccae51e66..659bee6d2 100644 --- a/main.cs +++ b/main.cs @@ -53,7 +53,7 @@ public class Main : BasePlugin public const string PluginGuid = "com.emptybottle.townofhost"; public const string PluginVersion = "5.1.6"; // サポートされている最低のAmongUsバージョン - public static readonly string LowestSupportedVersion = "2024.3.5"; + public static readonly string LowestSupportedVersion = "2024.6.18"; // このバージョンのみで公開ルームを無効にする場合 public static readonly bool IsPublicAvailableOnThisVersion = false; // プレリリースかどうか From b287d5fb01faedd0452a62fb37c66479fc2c9330 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sun, 30 Jun 2024 17:33:14 +0900 Subject: [PATCH 48/53] =?UTF-8?q?readme=E3=81=AE=E3=82=A2=E3=83=A2?= =?UTF-8?q?=E3=82=A2=E3=82=B9=E3=83=90=E3=83=BC=E3=82=B8=E3=83=A7=E3=83=B3?= =?UTF-8?q?=E3=82=922024.6.18=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README-EN.md | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README-EN.md b/README-EN.md index 35be9dfbb..3dff4a9da 100644 --- a/README-EN.md +++ b/README-EN.md @@ -15,7 +15,7 @@ This mod is not affiliated with Among Us or Innersloth LLC, and the content cont ## Releases -AmongUs Version: **2024.03.05** +AmongUs Version: **2024.6.18** **Latest Version: [Here](https://github.com/tukasa0001/TownOfHost/releases/latest)** diff --git a/README.md b/README.md index 31341871c..4bf706573 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ ## リリース -AmongUsバージョン : **2024.03.05** +AmongUsバージョン : **2024.6.18** **最新版は[こちら](https://github.com/tukasa0001/TownOfHost/releases/latest)** From 60c8511cef245c4b82c6462fe56e61742aefb0cf Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sun, 30 Jun 2024 21:09:44 +0900 Subject: [PATCH 49/53] =?UTF-8?q?=E3=82=A8=E3=83=A9=E3=83=BC=E3=83=A1?= =?UTF-8?q?=E3=83=83=E3=82=BB=E3=83=BC=E3=82=B8=E3=81=AE=E7=BF=BB=E8=A8=B3?= =?UTF-8?q?=E3=81=AE=E8=A1=A8=E7=8F=BE=E3=82=92=E8=AA=BF=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Resources/string.csv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/string.csv b/Resources/string.csv index e3d01aa89..9d2263416 100644 --- a/Resources/string.csv +++ b/Resources/string.csv @@ -609,8 +609,8 @@ "Error.InvalidColor","Error: Only default colors are available.","エラー:デフォルトカラー以外は使えません","错误: 仅默认颜色可用","錯誤: 無法使用遊戲自帶以外的顏色。","Ошибка: Нельзя использовать другие цвета, кроме цветов по умолчанию","Erro: Apenas as cores padrão estão disponíveis.","" "### ErrorText関連" -"ErrorLevel1","Bugs may occur.","何らかのバグが発生する可能性があります。","可能同时产生多个bug","可能同時產生多個Bug","Могут возникнуть некоторые ошибки.","Bugs podem acontecer.","" -"ErrorLevel2","This may be a bug.","バグが発生している可能性があります。","可能出现bug","可能出現Bug","Возможно вы столкнулись с ошибкой.","Talvez isso seja um bug.","" +"ErrorLevel1","Some failure may occur.","何らかの不具合が発生する可能性があります。","","","","","" +"ErrorLevel2","Some failure may have occurred.","不具合が発生している可能性があります。","","","","","" "ErrorLevel3","This version shouldn't have been released.","このバージョンはリリースされるべきではありません。","未发布版本","未發布版本","Эта версия никогда не должна быть выпущена.","Esta versão não deveria ter sido lançada.","" "TerminateCommand","Abort Command","廃村コマンド","强制结束游戏命令","強制結束遊戲指令","Команда устарела","Abortar Comando","" "#### 000 Test" From f733b3f1e3f82b000467bf0fd080407001ffbde4 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sun, 30 Jun 2024 21:20:28 +0900 Subject: [PATCH 50/53] =?UTF-8?q?=E5=8F=B3=E4=B8=8A=E3=81=AE=E3=83=86?= =?UTF-8?q?=E3=82=AD=E3=82=B9=E3=83=88=E3=81=AEz=E3=82=92=E8=AA=BF?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Patches/CredentialsPatch.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Patches/CredentialsPatch.cs b/Patches/CredentialsPatch.cs index 28db5c617..84e2b3735 100644 --- a/Patches/CredentialsPatch.cs +++ b/Patches/CredentialsPatch.cs @@ -38,8 +38,8 @@ static void Postfix(PingTracker __instance) if (pingTrackerCredentialAspectPos) { pingTrackerCredentialAspectPos.DistanceFromEdge = DestroyableSingleton.InstanceExists && DestroyableSingleton.Instance.Chat.chatButton.gameObject.active - ? new(2.5f, 0f, -1000f) - : new(1.8f, 0f, -1000f); + ? new(2.5f, 0f, -800f) + : new(1.8f, 0f, -800f); } sb.Clear(); From 5beb111030ae5969ce2d589bec3571185c3f8162 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sun, 30 Jun 2024 21:22:42 +0900 Subject: [PATCH 51/53] =?UTF-8?q?=E3=83=90=E3=83=BC=E3=82=B8=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E3=82=925.1.7=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.cs b/main.cs index 659bee6d2..e7bbe660c 100644 --- a/main.cs +++ b/main.cs @@ -51,7 +51,7 @@ public class Main : BasePlugin // ========== //Sorry for many Japanese comments. public const string PluginGuid = "com.emptybottle.townofhost"; - public const string PluginVersion = "5.1.6"; + public const string PluginVersion = "5.1.7"; // サポートされている最低のAmongUsバージョン public static readonly string LowestSupportedVersion = "2024.6.18"; // このバージョンのみで公開ルームを無効にする場合 From e375683021d21da609a2a686fa8332afaa8b8b60 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sun, 14 Jul 2024 20:24:43 +0900 Subject: [PATCH 52/53] version 2024.6.18.0 --- main.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.cs b/main.cs index 423cf8992..21dda5e17 100644 --- a/main.cs +++ b/main.cs @@ -55,7 +55,7 @@ public class Main : BasePlugin // ========== //Sorry for many Japanese comments. - public static readonly string ForkVersion = "2024.3.5.4"; + public static readonly string ForkVersion = "2024.6.18.0"; public static readonly Version ParsedForkVersion = Version.Parse(ForkVersion); public const string PluginGuid = "com.emptybottle.townofhost"; @@ -65,7 +65,7 @@ public class Main : BasePlugin // このバージョンのみで公開ルームを無効にする場合 public static readonly bool IsPublicAvailableOnThisVersion = false; // プレリリースかどうか - public static bool IsPrerelease { get; } = true; + public static bool IsPrerelease { get; } = false; public Harmony Harmony { get; } = new Harmony(PluginGuid); public static Version version = Version.Parse(PluginVersion); public static Color UnityModColor From 4677f0243e436353d9702a17319d9b4b0c5a18d9 Mon Sep 17 00:00:00 2001 From: Hyz-sui <86903430+Hyz-sui@users.noreply.github.com> Date: Sun, 14 Jul 2024 20:37:44 +0900 Subject: [PATCH 53/53] doc: readme sns link tw -> bsky --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5d45bd963..55b4cfa9b 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,8 @@ Static Badge - -Static Badge + +Static Badge