mirror of
https://github.com/Gurge44/EndlessHostRoles.git
synced 2026-10-20 01:46:25 +00:00
Add files via upload
Update Patches folder
This commit is contained in:
1 parent
e0f1b787ac
commit
a66e761cdf
22 files changed
+648
-491
No files matched your search
@@ -1,11 +1,11 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using AmongUs.Data;
|
||||
using AmongUs.Data;
|
||||
using AmongUs.Data.Player;
|
||||
using Assets.InnerNet;
|
||||
using HarmonyLib;
|
||||
using Il2CppInterop.Runtime.InteropTypes.Arrays;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace TOHE;
|
||||
|
||||
@@ -68,7 +68,7 @@ public class ModNewsHistory
|
||||
|
||||
};
|
||||
AllModNews.Add(news);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
// TOHE v2.4.2
|
||||
|
||||
+53
-54
@@ -2,17 +2,16 @@ using Assets.CoreScripts;
|
||||
using HarmonyLib;
|
||||
using Hazel;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using TOHE.Modules;
|
||||
using TOHE.Roles.Crewmate;
|
||||
using TOHE.Roles.Impostor;
|
||||
using UnityEngine;
|
||||
using static TOHE.Translator;
|
||||
using TOHE.Roles.Impostor;
|
||||
using TOHE.Roles.Neutral;
|
||||
|
||||
|
||||
namespace TOHE;
|
||||
@@ -192,7 +191,7 @@ internal class ChatCommands
|
||||
}
|
||||
SendRolesInfo(subArgs, PlayerControl.LocalPlayer.PlayerId, isUp: true);
|
||||
break;
|
||||
|
||||
|
||||
case "/h":
|
||||
case "/help":
|
||||
canceled = true;
|
||||
@@ -247,59 +246,59 @@ internal class ChatCommands
|
||||
Utils.SendMessage(args.Skip(1).Join(delimiter: " "), title: $"<color=#ff0000>{GetString("MessageFromTheHost")}</color>");
|
||||
break;
|
||||
|
||||
case "/kick":
|
||||
canceled = true;
|
||||
// Check if the kick command is enabled in the settings
|
||||
if (Options.ApplyModeratorList.GetValue() == 0)
|
||||
{
|
||||
Utils.SendMessage(GetString("KickCommandDisabled"), PlayerControl.LocalPlayer.PlayerId);
|
||||
break;
|
||||
}
|
||||
case "/kick":
|
||||
canceled = true;
|
||||
// Check if the kick command is enabled in the settings
|
||||
if (Options.ApplyModeratorList.GetValue() == 0)
|
||||
{
|
||||
Utils.SendMessage(GetString("KickCommandDisabled"), PlayerControl.LocalPlayer.PlayerId);
|
||||
break;
|
||||
}
|
||||
|
||||
// Check if the player has the necessary privileges to use the command
|
||||
if (!IsPlayerModerator(PlayerControl.LocalPlayer.FriendCode))
|
||||
{
|
||||
Utils.SendMessage(GetString("KickCommandNoAccess"), PlayerControl.LocalPlayer.PlayerId);
|
||||
break;
|
||||
}
|
||||
// Check if the player has the necessary privileges to use the command
|
||||
if (!IsPlayerModerator(PlayerControl.LocalPlayer.FriendCode))
|
||||
{
|
||||
Utils.SendMessage(GetString("KickCommandNoAccess"), PlayerControl.LocalPlayer.PlayerId);
|
||||
break;
|
||||
}
|
||||
|
||||
subArgs = args.Length < 2 ? "" : args[1];
|
||||
if (string.IsNullOrEmpty(subArgs) || !byte.TryParse(subArgs, out byte kickPlayerId))
|
||||
{
|
||||
Utils.SendMessage(GetString("KickCommandInvalidID"), PlayerControl.LocalPlayer.PlayerId);
|
||||
break;
|
||||
}
|
||||
subArgs = args.Length < 2 ? "" : args[1];
|
||||
if (string.IsNullOrEmpty(subArgs) || !byte.TryParse(subArgs, out byte kickPlayerId))
|
||||
{
|
||||
Utils.SendMessage(GetString("KickCommandInvalidID"), PlayerControl.LocalPlayer.PlayerId);
|
||||
break;
|
||||
}
|
||||
|
||||
if (kickPlayerId == 0)
|
||||
{
|
||||
Utils.SendMessage(GetString("KickCommandKickHost"), PlayerControl.LocalPlayer.PlayerId);
|
||||
break;
|
||||
}
|
||||
if (kickPlayerId == 0)
|
||||
{
|
||||
Utils.SendMessage(GetString("KickCommandKickHost"), PlayerControl.LocalPlayer.PlayerId);
|
||||
break;
|
||||
}
|
||||
|
||||
var kickedPlayer = Utils.GetPlayerById(kickPlayerId);
|
||||
if (kickedPlayer == null)
|
||||
{
|
||||
Utils.SendMessage(GetString("KickCommandInvalidID"), PlayerControl.LocalPlayer.PlayerId);
|
||||
break;
|
||||
}
|
||||
var kickedPlayer = Utils.GetPlayerById(kickPlayerId);
|
||||
if (kickedPlayer == null)
|
||||
{
|
||||
Utils.SendMessage(GetString("KickCommandInvalidID"), PlayerControl.LocalPlayer.PlayerId);
|
||||
break;
|
||||
}
|
||||
|
||||
// Prevent moderators from kicking other moderators
|
||||
if (IsPlayerModerator(kickedPlayer.FriendCode))
|
||||
{
|
||||
Utils.SendMessage(GetString("KickCommandKickMod"), PlayerControl.LocalPlayer.PlayerId);
|
||||
break;
|
||||
}
|
||||
// Prevent moderators from kicking other moderators
|
||||
if (IsPlayerModerator(kickedPlayer.FriendCode))
|
||||
{
|
||||
Utils.SendMessage(GetString("KickCommandKickMod"), PlayerControl.LocalPlayer.PlayerId);
|
||||
break;
|
||||
}
|
||||
|
||||
// Kick the specified player
|
||||
AmongUsClient.Instance.KickPlayer(kickedPlayer.GetClientId(), true);
|
||||
string kickedPlayerName = kickedPlayer.GetRealName();
|
||||
string textToSend = $"{kickedPlayerName} {GetString("KickCommandKicked")}";
|
||||
if (GameStates.IsInGame)
|
||||
{
|
||||
textToSend += $"{GetString("KickCommandKickedRole")} {GetString(kickedPlayer.GetCustomRole().ToString())}";
|
||||
}
|
||||
Utils.SendMessage(textToSend);
|
||||
break;
|
||||
// Kick the specified player
|
||||
AmongUsClient.Instance.KickPlayer(kickedPlayer.GetClientId(), true);
|
||||
string kickedPlayerName = kickedPlayer.GetRealName();
|
||||
string textToSend = $"{kickedPlayerName} {GetString("KickCommandKicked")}";
|
||||
if (GameStates.IsInGame)
|
||||
{
|
||||
textToSend += $"{GetString("KickCommandKickedRole")} {GetString(kickedPlayer.GetCustomRole().ToString())}";
|
||||
}
|
||||
Utils.SendMessage(textToSend);
|
||||
break;
|
||||
case "/exe":
|
||||
canceled = true;
|
||||
if (GameStates.IsLobby)
|
||||
@@ -696,7 +695,7 @@ internal class ChatCommands
|
||||
string[] args = text.Split(' ');
|
||||
string subArgs = "";
|
||||
//if (text.Length >= 3) if (text[..2] == "/r" && text[..3] != "/rn") args[0] = "/r";
|
||||
// if (SpamManager.CheckSpam(player, text)) return;
|
||||
// if (SpamManager.CheckSpam(player, text)) return;
|
||||
if (GuessManager.GuesserMsg(player, text)) { canceled = true; return; }
|
||||
if (Judge.TrialMsg(player, text)) { canceled = true; return; }
|
||||
if (ParityCop.ParityCheckMsg(player, text)) { canceled = true; return; }
|
||||
@@ -794,7 +793,7 @@ internal class ChatCommands
|
||||
Utils.SendMessage(GetString("DisableUseCommand"), player.PlayerId);
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case "/quit":
|
||||
case "/qt":
|
||||
subArgs = args.Length < 2 ? "" : args[1];
|
||||
@@ -900,7 +899,7 @@ internal class ChatCommands
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (SpamManager.CheckSpam(player, text)) return;
|
||||
if (SpamManager.CheckSpam(player, text)) return;
|
||||
}
|
||||
}
|
||||
[HarmonyPatch(typeof(ChatController), nameof(ChatController.Update))]
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using AmongUs.Data;
|
||||
using HarmonyLib;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
namespace TOHE;
|
||||
@@ -25,12 +26,12 @@ class ChatControllerUpdatePatch
|
||||
ClipboardHelper.PutClipboardString(__instance.freeChatField.textArea.text);
|
||||
__instance.freeChatField.textArea.SetText("");
|
||||
}
|
||||
if (Input.GetKeyDown(KeyCode.UpArrow) && ChatCommands.ChatHistory.Count > 0)
|
||||
if (Input.GetKeyDown(KeyCode.UpArrow) && ChatCommands.ChatHistory.Any())
|
||||
{
|
||||
CurrentHistorySelection = Mathf.Clamp(--CurrentHistorySelection, 0, ChatCommands.ChatHistory.Count - 1);
|
||||
__instance.freeChatField.textArea.SetText(ChatCommands.ChatHistory[CurrentHistorySelection]);
|
||||
}
|
||||
if (Input.GetKeyDown(KeyCode.DownArrow) && ChatCommands.ChatHistory.Count > 0)
|
||||
if (Input.GetKeyDown(KeyCode.DownArrow) && ChatCommands.ChatHistory.Any())
|
||||
{
|
||||
CurrentHistorySelection++;
|
||||
if (CurrentHistorySelection < ChatCommands.ChatHistory.Count)
|
||||
|
||||
@@ -31,7 +31,7 @@ class GameEndChecker
|
||||
// SoloKombat
|
||||
if (Options.CurrentGameMode == CustomGameMode.SoloKombat)
|
||||
{
|
||||
if (CustomWinnerHolder.WinnerIds.Count > 0 || CustomWinnerHolder.WinnerTeam != CustomWinner.Default)
|
||||
if (CustomWinnerHolder.WinnerIds.Any() || CustomWinnerHolder.WinnerTeam != CustomWinner.Default)
|
||||
{
|
||||
ShipStatus.Instance.enabled = false;
|
||||
StartEndGame(reason);
|
||||
@@ -103,7 +103,7 @@ class GameEndChecker
|
||||
{
|
||||
CustomWinnerHolder.WinnerIds.Add(Romantic.BetPlayer[pc.PlayerId]);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
//Main.AllPlayerControls
|
||||
// .Where(pc => (pc.Is(CustomRoles.RuthlessRomantic) || (Romantic.BetPlayer.TryGetValue(pc.PlayerId, out var RomanticPartner)) && pc.PlayerId == RomanticPartner))
|
||||
@@ -127,7 +127,7 @@ class GameEndChecker
|
||||
foreach (var pc in Main.AllPlayerControls)
|
||||
{
|
||||
if (pc.Is(CustomRoles.Phantom) && pc.GetPlayerTaskState().IsTaskFinished && pc.Data.IsDead
|
||||
&& (((CustomWinnerHolder.WinnerTeam == CustomWinner.Impostor || CustomWinnerHolder.WinnerTeam == CustomWinner.Crewmate || CustomWinnerHolder.WinnerTeam == CustomWinner.Jackal || CustomWinnerHolder.WinnerTeam == CustomWinner.BloodKnight || CustomWinnerHolder.WinnerTeam == CustomWinner.SerialKiller || CustomWinnerHolder.WinnerTeam == CustomWinner.Juggernaut || CustomWinnerHolder.WinnerTeam == CustomWinner.Ritualist || CustomWinnerHolder.WinnerTeam == CustomWinner.Poisoner || CustomWinnerHolder.WinnerTeam == CustomWinner.Succubus || CustomWinnerHolder.WinnerTeam == CustomWinner.Infectious || CustomWinnerHolder.WinnerTeam == CustomWinner.Jinx || CustomWinnerHolder.WinnerTeam == CustomWinner.Virus || CustomWinnerHolder.WinnerTeam == CustomWinner.Arsonist || CustomWinnerHolder.WinnerTeam == CustomWinner.Pelican || CustomWinnerHolder.WinnerTeam == CustomWinner.HexMaster || CustomWinnerHolder.WinnerTeam == CustomWinner.Wraith || CustomWinnerHolder.WinnerTeam == CustomWinner.Pestilence || CustomWinnerHolder.WinnerTeam == CustomWinner.Rogue || CustomWinnerHolder.WinnerTeam == CustomWinner.Spiritcaller) && (Options.PhantomSnatchesWin.GetBool()))))
|
||||
&& (((CustomWinnerHolder.WinnerTeam == CustomWinner.Impostor || CustomWinnerHolder.WinnerTeam == CustomWinner.Crewmate || CustomWinnerHolder.WinnerTeam == CustomWinner.Jackal || CustomWinnerHolder.WinnerTeam == CustomWinner.BloodKnight || CustomWinnerHolder.WinnerTeam == CustomWinner.SerialKiller || CustomWinnerHolder.WinnerTeam == CustomWinner.Juggernaut || CustomWinnerHolder.WinnerTeam == CustomWinner.Ritualist || CustomWinnerHolder.WinnerTeam == CustomWinner.Poisoner || CustomWinnerHolder.WinnerTeam == CustomWinner.Succubus || CustomWinnerHolder.WinnerTeam == CustomWinner.Infectious || CustomWinnerHolder.WinnerTeam == CustomWinner.Jinx || CustomWinnerHolder.WinnerTeam == CustomWinner.Virus || CustomWinnerHolder.WinnerTeam == CustomWinner.Arsonist || CustomWinnerHolder.WinnerTeam == CustomWinner.Pelican || CustomWinnerHolder.WinnerTeam == CustomWinner.HexMaster || CustomWinnerHolder.WinnerTeam == CustomWinner.Wraith || CustomWinnerHolder.WinnerTeam == CustomWinner.Pestilence || CustomWinnerHolder.WinnerTeam == CustomWinner.Rogue || CustomWinnerHolder.WinnerTeam == CustomWinner.Spiritcaller) && (Options.PhantomSnatchesWin.GetBool()))))
|
||||
{
|
||||
reason = GameOverReason.ImpostorByKill;
|
||||
CustomWinnerHolder.ResetAndSetWinner(CustomWinner.Phantom);
|
||||
@@ -137,7 +137,7 @@ class GameEndChecker
|
||||
foreach (var pc in Main.AllPlayerControls)
|
||||
{
|
||||
if (pc.Is(CustomRoles.Famine) && !pc.Data.IsDead
|
||||
&& (((CustomWinnerHolder.WinnerTeam == CustomWinner.Impostor || CustomWinnerHolder.WinnerTeam == CustomWinner.Crewmate || CustomWinnerHolder.WinnerTeam == CustomWinner.Jackal || CustomWinnerHolder.WinnerTeam == CustomWinner.BloodKnight || CustomWinnerHolder.WinnerTeam == CustomWinner.SerialKiller || CustomWinnerHolder.WinnerTeam == CustomWinner.Juggernaut || CustomWinnerHolder.WinnerTeam == CustomWinner.Ritualist || CustomWinnerHolder.WinnerTeam == CustomWinner.Poisoner || CustomWinnerHolder.WinnerTeam == CustomWinner.Succubus || CustomWinnerHolder.WinnerTeam == CustomWinner.Infectious || CustomWinnerHolder.WinnerTeam == CustomWinner.Jinx || CustomWinnerHolder.WinnerTeam == CustomWinner.Virus || CustomWinnerHolder.WinnerTeam == CustomWinner.Arsonist || CustomWinnerHolder.WinnerTeam == CustomWinner.Pelican || CustomWinnerHolder.WinnerTeam == CustomWinner.HexMaster || CustomWinnerHolder.WinnerTeam == CustomWinner.Wraith || CustomWinnerHolder.WinnerTeam == CustomWinner.Pestilence || CustomWinnerHolder.WinnerTeam == CustomWinner.Rogue))))
|
||||
&& (((CustomWinnerHolder.WinnerTeam == CustomWinner.Impostor || CustomWinnerHolder.WinnerTeam == CustomWinner.Crewmate || CustomWinnerHolder.WinnerTeam == CustomWinner.Jackal || CustomWinnerHolder.WinnerTeam == CustomWinner.BloodKnight || CustomWinnerHolder.WinnerTeam == CustomWinner.SerialKiller || CustomWinnerHolder.WinnerTeam == CustomWinner.Juggernaut || CustomWinnerHolder.WinnerTeam == CustomWinner.Ritualist || CustomWinnerHolder.WinnerTeam == CustomWinner.Poisoner || CustomWinnerHolder.WinnerTeam == CustomWinner.Succubus || CustomWinnerHolder.WinnerTeam == CustomWinner.Infectious || CustomWinnerHolder.WinnerTeam == CustomWinner.Jinx || CustomWinnerHolder.WinnerTeam == CustomWinner.Virus || CustomWinnerHolder.WinnerTeam == CustomWinner.Arsonist || CustomWinnerHolder.WinnerTeam == CustomWinner.Pelican || CustomWinnerHolder.WinnerTeam == CustomWinner.HexMaster || CustomWinnerHolder.WinnerTeam == CustomWinner.Wraith || CustomWinnerHolder.WinnerTeam == CustomWinner.Pestilence || CustomWinnerHolder.WinnerTeam == CustomWinner.Rogue))))
|
||||
{
|
||||
reason = GameOverReason.ImpostorByKill;
|
||||
CustomWinnerHolder.ResetAndSetWinner(CustomWinner.Famine);
|
||||
@@ -147,7 +147,7 @@ class GameEndChecker
|
||||
foreach (var pc in Main.AllPlayerControls)
|
||||
{
|
||||
if (pc.Is(CustomRoles.CursedSoul) && !pc.Data.IsDead
|
||||
&& (((CustomWinnerHolder.WinnerTeam == CustomWinner.Impostor || CustomWinnerHolder.WinnerTeam == CustomWinner.Crewmate || CustomWinnerHolder.WinnerTeam == CustomWinner.Jackal || CustomWinnerHolder.WinnerTeam == CustomWinner.BloodKnight || CustomWinnerHolder.WinnerTeam == CustomWinner.SerialKiller || CustomWinnerHolder.WinnerTeam == CustomWinner.Juggernaut || CustomWinnerHolder.WinnerTeam == CustomWinner.Ritualist || CustomWinnerHolder.WinnerTeam == CustomWinner.Poisoner || CustomWinnerHolder.WinnerTeam == CustomWinner.Succubus || CustomWinnerHolder.WinnerTeam == CustomWinner.Infectious || CustomWinnerHolder.WinnerTeam == CustomWinner.Jinx || CustomWinnerHolder.WinnerTeam == CustomWinner.Virus || CustomWinnerHolder.WinnerTeam == CustomWinner.Arsonist || CustomWinnerHolder.WinnerTeam == CustomWinner.Pelican || CustomWinnerHolder.WinnerTeam == CustomWinner.HexMaster || CustomWinnerHolder.WinnerTeam == CustomWinner.Wraith || CustomWinnerHolder.WinnerTeam == CustomWinner.Pestilence || CustomWinnerHolder.WinnerTeam == CustomWinner.Rogue || CustomWinnerHolder.WinnerTeam == CustomWinner.Jester || CustomWinnerHolder.WinnerTeam == CustomWinner.Executioner))))
|
||||
&& (((CustomWinnerHolder.WinnerTeam == CustomWinner.Impostor || CustomWinnerHolder.WinnerTeam == CustomWinner.Crewmate || CustomWinnerHolder.WinnerTeam == CustomWinner.Jackal || CustomWinnerHolder.WinnerTeam == CustomWinner.BloodKnight || CustomWinnerHolder.WinnerTeam == CustomWinner.SerialKiller || CustomWinnerHolder.WinnerTeam == CustomWinner.Juggernaut || CustomWinnerHolder.WinnerTeam == CustomWinner.Ritualist || CustomWinnerHolder.WinnerTeam == CustomWinner.Poisoner || CustomWinnerHolder.WinnerTeam == CustomWinner.Succubus || CustomWinnerHolder.WinnerTeam == CustomWinner.Infectious || CustomWinnerHolder.WinnerTeam == CustomWinner.Jinx || CustomWinnerHolder.WinnerTeam == CustomWinner.Virus || CustomWinnerHolder.WinnerTeam == CustomWinner.Arsonist || CustomWinnerHolder.WinnerTeam == CustomWinner.Pelican || CustomWinnerHolder.WinnerTeam == CustomWinner.HexMaster || CustomWinnerHolder.WinnerTeam == CustomWinner.Wraith || CustomWinnerHolder.WinnerTeam == CustomWinner.Pestilence || CustomWinnerHolder.WinnerTeam == CustomWinner.Rogue || CustomWinnerHolder.WinnerTeam == CustomWinner.Jester || CustomWinnerHolder.WinnerTeam == CustomWinner.Executioner))))
|
||||
{
|
||||
reason = GameOverReason.ImpostorByKill;
|
||||
CustomWinnerHolder.ResetAndSetWinner(CustomWinner.CursedSoul);
|
||||
@@ -266,7 +266,7 @@ class GameEndChecker
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//FFF
|
||||
if (CustomWinnerHolder.WinnerTeam != CustomWinner.Lovers && !CustomWinnerHolder.AdditionalWinnerTeams.Contains(AdditionalWinners.Lovers) && !CustomRolesHelper.RoleExist(CustomRoles.Lovers) && !CustomRolesHelper.RoleExist(CustomRoles.Ntr))
|
||||
@@ -304,6 +304,18 @@ class GameEndChecker
|
||||
CustomWinnerHolder.AdditionalWinnerTeams.Add(AdditionalWinners.Romantic);
|
||||
}
|
||||
}
|
||||
//Ruthless Romantic
|
||||
foreach (var pc in Main.AllPlayerControls.Where(x => x.Is(CustomRoles.RuthlessRomantic)))
|
||||
{
|
||||
if (Romantic.BetPlayer.TryGetValue(pc.PlayerId, out var betTarget) && (
|
||||
CustomWinnerHolder.WinnerIds.Contains(betTarget) ||
|
||||
(Main.PlayerStates.TryGetValue(betTarget, out var ps) && CustomWinnerHolder.WinnerRoles.Contains(ps.MainRole)
|
||||
)))
|
||||
{
|
||||
CustomWinnerHolder.WinnerIds.Add(pc.PlayerId);
|
||||
CustomWinnerHolder.AdditionalWinnerTeams.Add(AdditionalWinners.RuthlessRomantic);
|
||||
}
|
||||
}
|
||||
//Vengeful Romantic win condition
|
||||
foreach (var pc in Main.AllPlayerControls.Where(x => x.Is(CustomRoles.VengefulRomantic)))
|
||||
{
|
||||
@@ -354,7 +366,7 @@ class GameEndChecker
|
||||
.Where(p => p.Is(CustomRoles.Lovers) && !CustomWinnerHolder.WinnerIds.Contains(p.PlayerId))
|
||||
.Do(p => CustomWinnerHolder.WinnerIds.Add(p.PlayerId));
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
ShipStatus.Instance.enabled = false;
|
||||
@@ -462,7 +474,7 @@ class GameEndChecker
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool CheckGameEndByLivingPlayers(out GameOverReason reason)
|
||||
public static bool CheckGameEndByLivingPlayers(out GameOverReason reason)
|
||||
{
|
||||
reason = GameOverReason.ImpostorByKill;
|
||||
|
||||
@@ -678,9 +690,9 @@ class GameEndChecker
|
||||
{
|
||||
reason = GameOverReason.HumansByVote;
|
||||
CustomWinnerHolder.ResetAndSetWinner(CustomWinner.Crewmate);
|
||||
// CustomWinnerHolder.WinnerRoles.Add(CustomRoles.Admired);
|
||||
// CustomWinnerHolder.WinnerRoles.Add(CustomRoles.Admired);
|
||||
}
|
||||
|
||||
|
||||
else return false; //胜利条件未达成
|
||||
|
||||
return true;
|
||||
@@ -693,12 +705,12 @@ class GameEndChecker
|
||||
public override bool CheckForEndGame(out GameOverReason reason)
|
||||
{
|
||||
reason = GameOverReason.ImpostorByKill;
|
||||
if (CustomWinnerHolder.WinnerIds.Count > 0) return false;
|
||||
if (CustomWinnerHolder.WinnerIds.Any()) return false;
|
||||
if (CheckGameEndByLivingPlayers(out reason)) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool CheckGameEndByLivingPlayers(out GameOverReason reason)
|
||||
public static bool CheckGameEndByLivingPlayers(out GameOverReason reason)
|
||||
{
|
||||
reason = GameOverReason.ImpostorByKill;
|
||||
|
||||
|
||||
@@ -88,7 +88,7 @@ internal class BanMenuSetVisiblePatch
|
||||
return false;
|
||||
}
|
||||
}
|
||||
[HarmonyPatch(typeof(InnerNetClient), nameof(InnerNet.InnerNetClient.CanBan))]
|
||||
[HarmonyPatch(typeof(InnerNetClient), nameof(InnerNetClient.CanBan))]
|
||||
internal class InnerNetClientCanBanPatch
|
||||
{
|
||||
public static bool Prefix(InnerNet.InnerNetClient __instance, ref bool __result)
|
||||
@@ -97,7 +97,7 @@ internal class InnerNetClientCanBanPatch
|
||||
return false;
|
||||
}
|
||||
}
|
||||
[HarmonyPatch(typeof(InnerNet.InnerNetClient), nameof(InnerNet.InnerNetClient.KickPlayer))]
|
||||
[HarmonyPatch(typeof(InnerNet.InnerNetClient), nameof(InnerNetClient.KickPlayer))]
|
||||
internal class KickPlayerPatch
|
||||
{
|
||||
public static void Prefix(InnerNet.InnerNetClient __instance, int clientId, bool ban)
|
||||
|
||||
@@ -6,7 +6,6 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using UnityEngine;
|
||||
using static TOHE.Translator;
|
||||
using Object = UnityEngine.Object;
|
||||
|
||||
namespace TOHE;
|
||||
|
||||
@@ -95,13 +94,13 @@ internal class ControllerManagerUpdatePatch
|
||||
if (GetKeysDown(KeyCode.F5, KeyCode.T))
|
||||
{
|
||||
Logger.Info("加载自定义翻译文件", "KeyCommand");
|
||||
Translator.LoadLangs();
|
||||
LoadLangs();
|
||||
Logger.SendInGame("Reloaded Custom Translation File");
|
||||
}
|
||||
if (GetKeysDown(KeyCode.F5, KeyCode.X))
|
||||
{
|
||||
Logger.Info("导出自定义翻译文件", "KeyCommand");
|
||||
Translator.ExportCustomTranslation();
|
||||
ExportCustomTranslation();
|
||||
Logger.SendInGame("Exported Custom Translation File");
|
||||
}
|
||||
//日志文件转储
|
||||
@@ -118,7 +117,7 @@ internal class ControllerManagerUpdatePatch
|
||||
//打开游戏目录
|
||||
if (GetKeysDown(KeyCode.F10))
|
||||
{
|
||||
System.Diagnostics.Process.Start(System.Environment.CurrentDirectory);
|
||||
System.Diagnostics.Process.Start(Environment.CurrentDirectory);
|
||||
}
|
||||
|
||||
//-- 下面是主机专用的命令--//
|
||||
@@ -146,13 +145,13 @@ internal class ControllerManagerUpdatePatch
|
||||
Logger.Info("倒计时修改为0", "KeyCommand");
|
||||
GameStartManager.Instance.countDownTimer = 0;
|
||||
}
|
||||
|
||||
|
||||
//倒计时取消
|
||||
if (Input.GetKeyDown(KeyCode.C) && GameStates.IsCountDown)
|
||||
{
|
||||
Logger.Info("重置倒计时", "KeyCommand");
|
||||
GameStartManager.Instance.ResetStartState();
|
||||
Logger.SendInGame(Translator.GetString("CancelStartCountDown"));
|
||||
Logger.SendInGame(GetString("CancelStartCountDown"));
|
||||
}
|
||||
//显示当前有效设置的说明
|
||||
if (GetKeysDown(KeyCode.N, KeyCode.LeftShift, KeyCode.LeftControl))
|
||||
@@ -170,7 +169,7 @@ internal class ControllerManagerUpdatePatch
|
||||
if (GetKeysDown(KeyCode.Delete, KeyCode.LeftControl))
|
||||
{
|
||||
OptionItem.AllOptions.ToArray().Where(x => x.Id > 0).Do(x => x.SetValueNoRpc(x.DefaultValue));
|
||||
Logger.SendInGame(Translator.GetString("RestTOHESetting"));
|
||||
Logger.SendInGame(GetString("RestTOHESetting"));
|
||||
if (!(!AmongUsClient.Instance.AmHost || PlayerControl.AllPlayerControls.Count <= 1 || (AmongUsClient.Instance.AmHost == false && PlayerControl.LocalPlayer == null)))
|
||||
{
|
||||
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.RestTOHESetting, SendOption.Reliable, -1);
|
||||
@@ -185,7 +184,7 @@ internal class ControllerManagerUpdatePatch
|
||||
Main.PlayerStates[PlayerControl.LocalPlayer.PlayerId].deathReason = PlayerState.DeathReason.etc;
|
||||
PlayerControl.LocalPlayer.RpcExileV2();
|
||||
Main.PlayerStates[PlayerControl.LocalPlayer.PlayerId].SetDead();
|
||||
Utils.SendMessage(Translator.GetString("HostKillSelfByCommand"), title: $"<color=#ff0000>{Translator.GetString("DefaultSystemMessageTitle")}</color>");
|
||||
Utils.SendMessage(GetString("HostKillSelfByCommand"), title: $"<color=#ff0000>{GetString("DefaultSystemMessageTitle")}</color>");
|
||||
}
|
||||
//切换日志是否也在游戏中输出
|
||||
if (GetKeysDown(KeyCode.F2, KeyCode.LeftControl))
|
||||
@@ -236,7 +235,7 @@ internal class ControllerManagerUpdatePatch
|
||||
if (Input.GetKeyDown(KeyCode.Y))
|
||||
{
|
||||
RPC.SyncCustomSettingsRPC();
|
||||
Logger.SendInGame(Translator.GetString("SyncCustomSettingsRPC"));
|
||||
Logger.SendInGame(GetString("SyncCustomSettingsRPC"));
|
||||
}
|
||||
|
||||
//入门测试
|
||||
|
||||
+72
-74
@@ -1,9 +1,7 @@
|
||||
using HarmonyLib;
|
||||
using Il2CppMono.Security;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
|
||||
using static TOHE.Translator;
|
||||
@@ -55,12 +53,12 @@ internal class VersionShowerStartPatch
|
||||
|
||||
private static void Postfix(VersionShower __instance)
|
||||
{
|
||||
Main.credentialsText = $"\r<size=2><color={Main.ModColor}>{Main.ModName}</color> v{Main.PluginDisplayVersion} by <color=#ffff00>Gurge44</color>";
|
||||
// Main.credentialsText = $"\r\n<color=#de56fd>TOHE SolarLoonieEdit</color> v{Main.PluginDisplayVersion}";
|
||||
Main.credentialsText = $"\r<size=1.5><color={Main.ModColor}>{Main.ModName}</color> v{Main.PluginDisplayVersion} by <color=#ffff00>Gurge44</color>";
|
||||
// Main.credentialsText = $"\r\n<color=#de56fd>TOHE SolarLoonieEdit</color> v{Main.PluginDisplayVersion}";
|
||||
if (Main.IsAprilFools) Main.credentialsText = $"\r\n<color=#00bfff>Town Of Host</color> v11.45.14";
|
||||
#if DEBUG
|
||||
// Main.credentialsText += $"\r\n<color=#a54aff>Modified by </color><color=#ff3b6f>Loonie</color>";
|
||||
Main.credentialsText += $"\r\n<color=#a54aff>By <color=#ffc0cb>KARPED1EM</color> & </color><color=#f34c50>Loonie</color>";
|
||||
// Main.credentialsText += $"\r\n<color=#a54aff>Modified by </color><color=#ff3b6f>Loonie</color>";
|
||||
//Main.credentialsText += $"\r\n<color=#a54aff>By <color=#ffc0cb>KARPED1EM</color> & </color><color=#f34c50>Loonie</color>";
|
||||
#endif
|
||||
|
||||
#if RELEASE
|
||||
@@ -95,33 +93,33 @@ internal class VersionShowerStartPatch
|
||||
// ColorUtility.TryParseHtmlString(Main.ModColor, out var col);
|
||||
// SpecialEventText.color = col;
|
||||
//}
|
||||
/*else if (!Main.IsAprilFools)
|
||||
{
|
||||
SpecialEventText.text = $"{Main.MainMenuText}";
|
||||
SpecialEventText.fontSize = 0.9f;
|
||||
SpecialEventText.color = Color.white;
|
||||
SpecialEventText.alignment = TextAlignmentOptions.TopRight;
|
||||
SpecialEventText.transform.position = new Vector3(4.6f, 2.725f, 0);
|
||||
}
|
||||
/*else if (!Main.IsAprilFools)
|
||||
{
|
||||
SpecialEventText.text = $"{Main.MainMenuText}";
|
||||
SpecialEventText.fontSize = 0.9f;
|
||||
SpecialEventText.color = Color.white;
|
||||
SpecialEventText.alignment = TextAlignmentOptions.TopRight;
|
||||
SpecialEventText.transform.position = new Vector3(4.6f, 2.725f, 0);
|
||||
}
|
||||
|
||||
if ((OVersionShower = GameObject.Find("VersionShower")) != null && !Main.IsAprilFools)
|
||||
{
|
||||
OVersionShower.transform.localScale = new Vector3(0.6f, 0.6f, 1f);
|
||||
OVersionShower.transform.position = new Vector3(-7.3f, 3.9f, 0f);
|
||||
if (TitleLogoPatch.amongUsLogo != null)
|
||||
{
|
||||
if (VisitText == null && ModUpdater.visit > 0)
|
||||
{
|
||||
VisitText = Object.Instantiate(__instance.text);
|
||||
VisitText.text = string.Format(GetString("TOHEVisitorCount"), Main.ModColor, ModUpdater.visit);
|
||||
VisitText.color = Color.white;
|
||||
VisitText.fontSize = 1.2f;
|
||||
//VisitText.alignment = TMPro.TextAlignmentOptions.Top;
|
||||
OVersionShower.transform.localScale = new Vector3(0.6f, 0.6f, 1f);
|
||||
VisitText.transform.position = new Vector3(-5.3f, 2.75f, 0f);
|
||||
}
|
||||
}
|
||||
}*/
|
||||
if ((OVersionShower = GameObject.Find("VersionShower")) != null && !Main.IsAprilFools)
|
||||
{
|
||||
OVersionShower.transform.localScale = new Vector3(0.6f, 0.6f, 1f);
|
||||
OVersionShower.transform.position = new Vector3(-7.3f, 3.9f, 0f);
|
||||
if (TitleLogoPatch.amongUsLogo != null)
|
||||
{
|
||||
if (VisitText == null && ModUpdater.visit > 0)
|
||||
{
|
||||
VisitText = Object.Instantiate(__instance.text);
|
||||
VisitText.text = string.Format(GetString("TOHEVisitorCount"), Main.ModColor, ModUpdater.visit);
|
||||
VisitText.color = Color.white;
|
||||
VisitText.fontSize = 1.2f;
|
||||
//VisitText.alignment = TMPro.TextAlignmentOptions.Top;
|
||||
OVersionShower.transform.localScale = new Vector3(0.6f, 0.6f, 1f);
|
||||
VisitText.transform.position = new Vector3(-5.3f, 2.75f, 0f);
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
@@ -138,22 +136,22 @@ internal class TitleLogoPatch
|
||||
|
||||
private static void Postfix(MainMenuManager __instance)
|
||||
{
|
||||
/*if (Main.IsAprilFools)
|
||||
{
|
||||
if ((amongUsLogo = GameObject.Find("bannerLogo_AmongUs")) != null)
|
||||
{
|
||||
amongUsLogo.transform.localScale *= 0.4f;
|
||||
amongUsLogo.transform.position += Vector3.up * 0.25f;
|
||||
}
|
||||
/*if (Main.IsAprilFools)
|
||||
{
|
||||
if ((amongUsLogo = GameObject.Find("bannerLogo_AmongUs")) != null)
|
||||
{
|
||||
amongUsLogo.transform.localScale *= 0.4f;
|
||||
amongUsLogo.transform.position += Vector3.up * 0.25f;
|
||||
}
|
||||
|
||||
var tohLogo = new GameObject("titleLogo_TOH");
|
||||
tohLogo.transform.position = Vector3.up;
|
||||
tohLogo.transform.localScale *= 1.2f;
|
||||
var renderer = tohLogo.AddComponent<SpriteRenderer>();
|
||||
renderer.sprite = Utils.LoadSprite("TOHE.Resources.Images.TownOfHost-Logo.png", 300f);
|
||||
var tohLogo = new GameObject("titleLogo_TOH");
|
||||
tohLogo.transform.position = Vector3.up;
|
||||
tohLogo.transform.localScale *= 1.2f;
|
||||
var renderer = tohLogo.AddComponent<SpriteRenderer>();
|
||||
renderer.sprite = Utils.LoadSprite("TOHE.Resources.Images.TownOfHost-Logo.png", 300f);
|
||||
|
||||
return;
|
||||
}*/
|
||||
return;
|
||||
}*/
|
||||
|
||||
//if ((amongUsLogo = GameObject.Find("bannerLogo_AmongUs")) != null)
|
||||
//{
|
||||
@@ -191,60 +189,60 @@ internal class TitleLogoPatch
|
||||
BottomButtons.transform.position = new Vector3(0f, -2.71f, 0f);
|
||||
}*/
|
||||
|
||||
/* if ((Ambience = GameObject.Find("Ambience")) != null)
|
||||
{
|
||||
Ambience.SetActive(false);
|
||||
var CustomBG = new GameObject("CustomBG");
|
||||
CustomBG.transform.position = new Vector3(2.095f, -0.25f, 520f);
|
||||
var bgRenderer = CustomBG.AddComponent<SpriteRenderer>();
|
||||
bgRenderer.sprite = Utils.LoadSprite("TOHE.Resources.Images.TOHE-BG.jpg", 245f);
|
||||
} */
|
||||
/* if ((Ambience = GameObject.Find("Ambience")) != null)
|
||||
{
|
||||
Ambience.SetActive(false);
|
||||
var CustomBG = new GameObject("CustomBG");
|
||||
CustomBG.transform.position = new Vector3(2.095f, -0.25f, 520f);
|
||||
var bgRenderer = CustomBG.AddComponent<SpriteRenderer>();
|
||||
bgRenderer.sprite = Utils.LoadSprite("TOHE.Resources.Images.TOHE-BG.jpg", 245f);
|
||||
} */
|
||||
if ((Ambience = GameObject.Find("Ambience")) != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
SpriteRenderer activeSpriteRender = __instance.playButton.activeSprites.GetComponent<SpriteRenderer>();
|
||||
activeSpriteRender.color = new Color(1f, 0f, 0.62f);
|
||||
activeSpriteRender.color = new Color(0.99f, 0.55f, 0.56f);
|
||||
|
||||
SpriteRenderer inactiveSpriteRender = __instance.playButton.inactiveSprites.GetComponent<SpriteRenderer>();
|
||||
inactiveSpriteRender.color = new Color(1f, 0f, 0.35f);
|
||||
inactiveSpriteRender.color = new Color(1f, 0.31f, 0.09f);
|
||||
inactiveSpriteRender.sprite = activeSpriteRender.sprite;
|
||||
|
||||
__instance.playButton.activeTextColor = Color.white;
|
||||
__instance.playButton.inactiveTextColor = Color.white;
|
||||
__instance.playButton.activeTextColor = new Color(0.08f, 0.03f, 0.12f);
|
||||
__instance.playButton.inactiveTextColor = new Color(0.08f, 0.03f, 0.12f);
|
||||
|
||||
__instance.inventoryButton.inactiveSprites.GetComponent<SpriteRenderer>().color = new Color(0.95f, 0f, 1f);
|
||||
__instance.inventoryButton.activeSprites.GetComponent<SpriteRenderer>().color = new Color(1f, 0f, 0.85f);
|
||||
__instance.inventoryButton.inactiveSprites.GetComponent<SpriteRenderer>().color = new Color(0.11f, 0.13f, 0.59f);
|
||||
__instance.inventoryButton.activeSprites.GetComponent<SpriteRenderer>().color = new Color(0.63f, 0.53f, 0.89f);
|
||||
__instance.inventoryButton.activeTextColor = Color.white;
|
||||
__instance.inventoryButton.inactiveTextColor = Color.white;
|
||||
|
||||
__instance.shopButton.inactiveSprites.GetComponent<SpriteRenderer>().color = new Color(1f, 0f, 0.85f);
|
||||
__instance.shopButton.activeSprites.GetComponent<SpriteRenderer>().color = new Color(1f, 0f, 0.85f);
|
||||
__instance.shopButton.inactiveSprites.GetComponent<SpriteRenderer>().color = new Color(0.11f, 0.13f, 0.59f);
|
||||
__instance.shopButton.activeSprites.GetComponent<SpriteRenderer>().color = new Color(0.63f, 0.53f, 0.89f);
|
||||
__instance.shopButton.activeTextColor = Color.white;
|
||||
__instance.shopButton.inactiveTextColor = Color.white;
|
||||
|
||||
__instance.newsButton.inactiveSprites.GetComponent<SpriteRenderer>().color = new Color(0.82f, 0f, 1f);
|
||||
__instance.newsButton.activeSprites.GetComponent<SpriteRenderer>().color = new Color(1f, 0f, 0.85f);
|
||||
__instance.newsButton.inactiveSprites.GetComponent<SpriteRenderer>().color = new Color(0.69f, 0.2f, 0.65f);
|
||||
__instance.newsButton.activeSprites.GetComponent<SpriteRenderer>().color = new Color(0.97f, 0.41f, 0.61f);
|
||||
__instance.newsButton.activeTextColor = Color.white;
|
||||
__instance.newsButton.inactiveTextColor = Color.white;
|
||||
|
||||
__instance.myAccountButton.inactiveSprites.GetComponent<SpriteRenderer>().color = new Color(0.95f, 0f, 1f);
|
||||
__instance.myAccountButton.activeSprites.GetComponent<SpriteRenderer>().color = new Color(1f, 0f, 0.85f);
|
||||
__instance.myAccountButton.inactiveSprites.GetComponent<SpriteRenderer>().color = new Color(0.69f, 0.2f, 0.65f);
|
||||
__instance.myAccountButton.activeSprites.GetComponent<SpriteRenderer>().color = new Color(0.97f, 0.41f, 0.61f);
|
||||
__instance.myAccountButton.activeTextColor = Color.white;
|
||||
__instance.myAccountButton.inactiveTextColor = Color.white;
|
||||
|
||||
__instance.settingsButton.inactiveSprites.GetComponent<SpriteRenderer>().color = new Color(1f, 0f, 0.85f);
|
||||
__instance.settingsButton.activeSprites.GetComponent<SpriteRenderer>().color = new Color(1f, 0f, 0.85f);
|
||||
__instance.settingsButton.inactiveSprites.GetComponent<SpriteRenderer>().color = new Color(0.69f, 0.2f, 0.65f);
|
||||
__instance.settingsButton.activeSprites.GetComponent<SpriteRenderer>().color = new Color(0.97f, 0.41f, 0.61f);
|
||||
__instance.settingsButton.activeTextColor = Color.white;
|
||||
__instance.settingsButton.inactiveTextColor = Color.white;
|
||||
|
||||
__instance.quitButton.inactiveSprites.GetComponent<SpriteRenderer>().color = new Color(1f, 0f, 0.35f);
|
||||
__instance.quitButton.activeSprites.GetComponent<SpriteRenderer>().color = new Color(1f, 0f, 0.62f);
|
||||
__instance.quitButton.inactiveSprites.GetComponent<SpriteRenderer>().color = new Color(0.27f, 0.21f, 0.7f);
|
||||
__instance.quitButton.activeSprites.GetComponent<SpriteRenderer>().color = new Color(0.42f, 0.3f, 0.8f);
|
||||
__instance.quitButton.activeTextColor = Color.white;
|
||||
__instance.quitButton.inactiveTextColor = Color.white;
|
||||
|
||||
__instance.creditsButton.inactiveSprites.GetComponent<SpriteRenderer>().color = new Color(0.5f, 0f, 0.85f);
|
||||
__instance.creditsButton.activeSprites.GetComponent<SpriteRenderer>().color = new Color(1f, 0f, 0.85f);
|
||||
__instance.creditsButton.inactiveSprites.GetComponent<SpriteRenderer>().color = new Color(0.18f, 0.2f, 0.59f);
|
||||
__instance.creditsButton.activeSprites.GetComponent<SpriteRenderer>().color = new Color(0.96f, 0.88f, 0.86f);
|
||||
__instance.creditsButton.activeTextColor = Color.white;
|
||||
__instance.creditsButton.inactiveTextColor = Color.white;
|
||||
|
||||
@@ -256,7 +254,7 @@ internal class TitleLogoPatch
|
||||
var CustomBG = new GameObject("CustomBG");
|
||||
CustomBG.transform.position = new Vector3(0f, 0f, 520f);
|
||||
var bgRenderer = CustomBG.AddComponent<SpriteRenderer>();
|
||||
bgRenderer.sprite = Utils.LoadSprite("TOHE.Resources.Images.PL.png", 245f);
|
||||
bgRenderer.sprite = Utils.LoadSprite("TOHE.Resources.Images.bg.png", 180f);
|
||||
|
||||
__instance.screenTint.gameObject.transform.localPosition += new Vector3(1000f, 0f);
|
||||
__instance.screenTint.enabled = false;
|
||||
@@ -272,7 +270,7 @@ internal class TitleLogoPatch
|
||||
|
||||
GameObject.Find("Shine").transform.gameObject.SetActive(false);
|
||||
|
||||
leftPanel.GetComponentsInChildren<SpriteRenderer>(true).Where(r => r.name == "Shine").Do(r => r.color = new Color(1f, 0f, 0.35f, 0.2f));
|
||||
leftPanel.GetComponentsInChildren<SpriteRenderer>(true).Where(r => r.name == "Shine").Do(r => r.color = new Color(0f, 0f, 1f, 0.1f));
|
||||
//leftPanel.GetComponents<SpriteRenderer>().Where(r => r.name == "Shine").Do(r => r.color = new Color(1f, 0f, 0f));
|
||||
|
||||
leftPanel.gameObject.GetComponent<SpriteRenderer>().enabled = false;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using HarmonyLib;
|
||||
using static TOHE.Translator;
|
||||
|
||||
namespace TOHE;
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@ class ExileControllerWrapUpPatch
|
||||
|
||||
exiled.IsDead = true;
|
||||
Main.PlayerStates[exiled.PlayerId].deathReason = PlayerState.DeathReason.Vote;
|
||||
var role = exiled.GetCustomRole();
|
||||
var role = exiled.GetCustomRole();
|
||||
|
||||
//判断冤罪师胜利
|
||||
if (Main.AllPlayerControls.Any(x => x.Is(CustomRoles.Innocent) && !x.IsAlive() && x.GetRealKiller()?.PlayerId == exiled.PlayerId))
|
||||
@@ -121,6 +121,7 @@ class ExileControllerWrapUpPatch
|
||||
CustomRoles.DovesOfNeace or
|
||||
CustomRoles.QuickShooter or
|
||||
CustomRoles.Addict or
|
||||
CustomRoles.Alchemist or
|
||||
CustomRoles.ShapeshifterTOHE or
|
||||
CustomRoles.Wildling or
|
||||
CustomRoles.Twister or
|
||||
@@ -129,6 +130,7 @@ class ExileControllerWrapUpPatch
|
||||
CustomRoles.Devourer or
|
||||
CustomRoles.Nuker or
|
||||
CustomRoles.Assassin or
|
||||
CustomRoles.Undertaker or
|
||||
CustomRoles.Camouflager or
|
||||
CustomRoles.Disperser or
|
||||
CustomRoles.Escapee or
|
||||
|
||||
@@ -167,7 +167,7 @@ public class GameOptionsMenuUpdatePatch
|
||||
TabGroup.NeutralRoles => "#7f8c8d",
|
||||
TabGroup.Addons => "#ff9ace",
|
||||
TabGroup.OtherRoles => "#76b8e0",
|
||||
// TabGroup.CovenRoles => "#8e44ad",
|
||||
// TabGroup.CovenRoles => "#8e44ad",
|
||||
_ => "#ffffff",
|
||||
};
|
||||
if (__instance.transform.parent.parent.name != tab + "Tab") continue;
|
||||
|
||||
@@ -6,10 +6,10 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using TOHE.Roles.Neutral;
|
||||
using Object = UnityEngine.Object;
|
||||
using UnityEngine;
|
||||
using static TOHE.Translator;
|
||||
using Object = UnityEngine.Object;
|
||||
|
||||
namespace TOHE;
|
||||
|
||||
@@ -36,7 +36,7 @@ public class GameStartManagerPatch
|
||||
// Reset lobby countdown timer
|
||||
timer = 600f;
|
||||
|
||||
HideName = UnityEngine.Object.Instantiate(__instance.GameRoomNameCode, __instance.GameRoomNameCode.transform);
|
||||
HideName = Object.Instantiate(__instance.GameRoomNameCode, __instance.GameRoomNameCode.transform);
|
||||
HideName.text = ColorUtility.TryParseHtmlString(Main.HideColor.Value, out _)
|
||||
? $"<color={Main.HideColor.Value}>{Main.HideName.Value}</color>"
|
||||
: $"<color={Main.ModColor}>{Main.HideName.Value}</color>";
|
||||
@@ -217,7 +217,7 @@ public class GameStartRandomMap
|
||||
Utils.SendMessage(msg);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Options.DefaultKillCooldown = Main.NormalOptions.KillCooldown;
|
||||
Main.LastKillCooldown.Value = Main.NormalOptions.KillCooldown;
|
||||
|
||||
+27
-12
@@ -73,9 +73,9 @@ class HudManagerPatch
|
||||
else
|
||||
__instance.AbilityButton.OverrideText(GetString("FireWorksInstallAtionButtonText"));
|
||||
break;
|
||||
case CustomRoles.SerialKiller:
|
||||
SerialKiller.GetAbilityButtonText(__instance, player);
|
||||
break;
|
||||
//case CustomRoles.SerialKiller:
|
||||
// SerialKiller.GetAbilityButtonText(__instance, player);
|
||||
// break;
|
||||
case CustomRoles.Warlock:
|
||||
bool curse = Main.isCurseAndKill.TryGetValue(player.PlayerId, out bool wcs) && wcs;
|
||||
if (!shapeshifting && !curse)
|
||||
@@ -187,6 +187,7 @@ class HudManagerPatch
|
||||
break;
|
||||
case CustomRoles.Twister:
|
||||
__instance.AbilityButton.OverrideText(GetString("TwisterButtonText"));
|
||||
__instance.AbilityButton.SetUsesRemaining((int)Twister.TwistLimit[player.PlayerId]);
|
||||
break;
|
||||
case CustomRoles.ImperiusCurse:
|
||||
__instance.AbilityButton.OverrideText(GetString("ImperiusCurseButtonText"));
|
||||
@@ -200,6 +201,7 @@ class HudManagerPatch
|
||||
break;
|
||||
case CustomRoles.Camouflager:
|
||||
__instance.AbilityButton.OverrideText(GetString("CamouflagerShapeshiftText"));
|
||||
if (Camouflager.CamoLimit.TryGetValue(PlayerControl.LocalPlayer.PlayerId, out var x)) __instance.AbilityButton.SetUsesRemaining((int)x);
|
||||
break;
|
||||
case CustomRoles.OverKiller:
|
||||
__instance.KillButton.OverrideText(GetString("OverKillerButtonText"));
|
||||
@@ -208,6 +210,10 @@ class HudManagerPatch
|
||||
Assassin.SetKillButtonText(player.PlayerId);
|
||||
Assassin.GetAbilityButtonText(__instance, player.PlayerId);
|
||||
break;
|
||||
case CustomRoles.Undertaker:
|
||||
Undertaker.SetKillButtonText(player.PlayerId);
|
||||
Undertaker.GetAbilityButtonText(__instance, player.PlayerId);
|
||||
break;
|
||||
case CustomRoles.Hacker:
|
||||
Hacker.GetAbilityButtonText(__instance, player.PlayerId);
|
||||
break;
|
||||
@@ -226,6 +232,7 @@ class HudManagerPatch
|
||||
break;
|
||||
case CustomRoles.Disperser:
|
||||
__instance.AbilityButton.OverrideText(GetString("DisperserVentButtonText"));
|
||||
__instance.AbilityButton.SetUsesRemaining((int)Disperser.DisperserLimit[player.PlayerId]);
|
||||
break;
|
||||
case CustomRoles.Swooper:
|
||||
__instance.ImpostorVentButton.OverrideText(GetString(Swooper.IsInvis(PlayerControl.LocalPlayer.PlayerId) ? "SwooperRevertVentButtonText" : "SwooperVentButtonText"));
|
||||
@@ -300,6 +307,10 @@ class HudManagerPatch
|
||||
case CustomRoles.Deputy:
|
||||
__instance.KillButton.OverrideText(GetString("DeputyHandcuffText"));
|
||||
break;
|
||||
case CustomRoles.Hangman:
|
||||
if (shapeshifting) __instance.KillButton.OverrideText(GetString("HangmanKillButtonTextDuringSS"));
|
||||
__instance.AbilityButton.SetUsesRemaining((int)Hangman.HangLimit[player.PlayerId]);
|
||||
break;
|
||||
case CustomRoles.Sidekick:
|
||||
__instance.KillButton.OverrideText(GetString("KillButtonText"));
|
||||
__instance.ImpostorVentButton.OverrideText(GetString("ReportButtonText"));
|
||||
@@ -308,8 +319,12 @@ class HudManagerPatch
|
||||
case CustomRoles.Addict:
|
||||
__instance.AbilityButton.OverrideText(GetString("AddictVentButtonText"));
|
||||
break;
|
||||
case CustomRoles.Alchemist:
|
||||
__instance.AbilityButton.OverrideText(GetString("AlchemistVentButtonText"));
|
||||
break;
|
||||
case CustomRoles.Dazzler:
|
||||
__instance.AbilityButton.OverrideText(GetString("DazzleButtonText"));
|
||||
if (Dazzler.DazzleLimit.TryGetValue(PlayerControl.LocalPlayer.PlayerId, out var y)) __instance.AbilityButton.SetUsesRemaining((int)y);
|
||||
break;
|
||||
case CustomRoles.Deathpact:
|
||||
__instance.AbilityButton.OverrideText(GetString("DeathpactButtonText"));
|
||||
@@ -536,7 +551,7 @@ class SetHudActivePatch
|
||||
case CustomRoles.Glitch:
|
||||
Glitch.SetHudActive(__instance, isActive);
|
||||
break;
|
||||
|
||||
|
||||
}
|
||||
|
||||
foreach (var subRole in Main.PlayerStates[player.PlayerId].SubRoles)
|
||||
@@ -546,10 +561,10 @@ class SetHudActivePatch
|
||||
case CustomRoles.Oblivious:
|
||||
__instance.ReportButton.ToggleVisible(false);
|
||||
break;
|
||||
case CustomRoles.Mare:
|
||||
if (!Utils.IsActive(SystemTypes.Electrical))
|
||||
__instance.KillButton.ToggleVisible(false);
|
||||
break;
|
||||
//case CustomRoles.Mare:
|
||||
// if (!Utils.IsActive(SystemTypes.Electrical))
|
||||
// __instance.KillButton.ToggleVisible(false);
|
||||
// break;
|
||||
}
|
||||
}
|
||||
__instance.KillButton.ToggleVisible(player.CanUseKillButton());
|
||||
@@ -622,14 +637,14 @@ class TaskPanelBehaviourPatch
|
||||
{
|
||||
var text = sb.ToString().TrimEnd('\n').TrimEnd('\r');
|
||||
if (!Utils.HasTasks(player.Data, false) && sb.ToString().Count(s => (s == '\n')) >= 2)
|
||||
text = $"{ Utils.ColorString(Utils.GetRoleColor(player.GetCustomRole()).ShadeColor(0.2f), GetString("FakeTask"))}\r\n{text}";
|
||||
AllText += $"\r\n\r\n<size=85%>{text}</size>";
|
||||
text = $"{Utils.ColorString(Utils.GetRoleColor(player.GetCustomRole()).ShadeColor(0.2f), GetString("FakeTask"))}\r\n{text}";
|
||||
AllText += $"\r\n\r\n<size=70%>{text}</size>";
|
||||
}
|
||||
|
||||
if (MeetingStates.FirstMeeting)
|
||||
{
|
||||
AllText += $"\r\n\r\n</color><size=70%>{GetString("PressF1ShowMainRoleDes")}";
|
||||
if (Main.PlayerStates.TryGetValue(PlayerControl.LocalPlayer.PlayerId, out var ps) && ps.SubRoles.Count >= 1)
|
||||
AllText += $"\r\n\r\n</color><size=60%>{GetString("PressF1ShowMainRoleDes")}";
|
||||
if (Main.PlayerStates.TryGetValue(PlayerControl.LocalPlayer.PlayerId, out var ps) && ps.SubRoles.Any())
|
||||
AllText += $"\r\n{GetString("PressF2ShowAddRoleDes")}";
|
||||
AllText += "</size>";
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using HarmonyLib;
|
||||
using TOHE.Modules;
|
||||
using TOHE.Roles.Impostor;
|
||||
using UnityEngine;
|
||||
|
||||
@@ -52,6 +51,14 @@ public static class HudSpritePatch
|
||||
newAbilityButton = CustomButton.Get("Assassinate");
|
||||
}
|
||||
break;
|
||||
case CustomRoles.Undertaker:
|
||||
if (!shapeshifting)
|
||||
{
|
||||
newKillButton = CustomButton.Get("Mark");
|
||||
if (Assassin.MarkedPlayer.ContainsKey(player.PlayerId))
|
||||
newAbilityButton = CustomButton.Get("Assassinate");
|
||||
}
|
||||
break;
|
||||
case CustomRoles.Disperser:
|
||||
if (!shapeshifting)
|
||||
{
|
||||
@@ -136,6 +143,30 @@ public static class HudSpritePatch
|
||||
case CustomRoles.CursedSoul:
|
||||
newKillButton = CustomButton.Get("Soul");
|
||||
break;
|
||||
case CustomRoles.TimeMaster:
|
||||
newAbilityButton = CustomButton.Get("Time Master");
|
||||
break;
|
||||
case CustomRoles.Mario:
|
||||
newAbilityButton = CustomButton.Get("Happy");
|
||||
break;
|
||||
case CustomRoles.Sheriff:
|
||||
newKillButton = CustomButton.Get("Kill");
|
||||
break;
|
||||
case CustomRoles.Swooper:
|
||||
newAbilityButton = CustomButton.Get("invisible");
|
||||
break;
|
||||
case CustomRoles.Chameleon:
|
||||
newAbilityButton = CustomButton.Get("invisible");
|
||||
break;
|
||||
case CustomRoles.Wraith:
|
||||
newAbilityButton = CustomButton.Get("invisible");
|
||||
break;
|
||||
case CustomRoles.Escapee:
|
||||
newAbilityButton = CustomButton.Get("abscond");
|
||||
break;
|
||||
case CustomRoles.Farseer:
|
||||
newKillButton = CustomButton.Get("prophecies");
|
||||
break;
|
||||
case CustomRoles.Warlock:
|
||||
if (!shapeshifting)
|
||||
{
|
||||
|
||||
+20
-13
@@ -3,7 +3,6 @@ using HarmonyLib;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using TOHE.Modules;
|
||||
using UnityEngine;
|
||||
using static TOHE.Translator;
|
||||
|
||||
@@ -122,7 +121,7 @@ class BeginCrewmatePatch
|
||||
__instance.overlayHandle.color = Palette.ImpostorRed;
|
||||
return false;
|
||||
}
|
||||
else if (PlayerControl.LocalPlayer.Is(CustomRoles.Crewpostor))
|
||||
else if (PlayerControl.LocalPlayer.Is(CustomRoles.Crewpostor))
|
||||
{
|
||||
teamToDisplay = new Il2CppSystem.Collections.Generic.List<PlayerControl>();
|
||||
teamToDisplay.Add(PlayerControl.LocalPlayer);
|
||||
@@ -130,7 +129,7 @@ class BeginCrewmatePatch
|
||||
__instance.overlayHandle.color = Palette.ImpostorRed;
|
||||
return false;
|
||||
}
|
||||
else if (PlayerControl.LocalPlayer.GetCustomRole().IsMadmate())
|
||||
else if (PlayerControl.LocalPlayer.GetCustomRole().IsMadmate())
|
||||
{
|
||||
teamToDisplay = new Il2CppSystem.Collections.Generic.List<PlayerControl>();
|
||||
teamToDisplay.Add(PlayerControl.LocalPlayer);
|
||||
@@ -138,7 +137,7 @@ class BeginCrewmatePatch
|
||||
__instance.overlayHandle.color = Palette.ImpostorRed;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
public static void Postfix(IntroCutscene __instance, ref Il2CppSystem.Collections.Generic.List<PlayerControl> teamToDisplay)
|
||||
@@ -180,6 +179,7 @@ class BeginCrewmatePatch
|
||||
break;
|
||||
|
||||
case CustomRoles.Workaholic:
|
||||
case CustomRoles.Speedrunner:
|
||||
case CustomRoles.Snitch:
|
||||
case CustomRoles.TaskManager:
|
||||
PlayerControl.LocalPlayer.Data.Role.IntroSound = DestroyableSingleton<HudManager>.Instance.TaskCompleteSound;
|
||||
@@ -211,6 +211,7 @@ class BeginCrewmatePatch
|
||||
case CustomRoles.Sheriff:
|
||||
case CustomRoles.Veteran:
|
||||
case CustomRoles.SwordsMan:
|
||||
case CustomRoles.Minimalism:
|
||||
case CustomRoles.Reverie:
|
||||
case CustomRoles.NiceGuesser:
|
||||
PlayerControl.LocalPlayer.Data.Role.IntroSound = PlayerControl.LocalPlayer.KillSfx;
|
||||
@@ -230,9 +231,6 @@ class BeginCrewmatePatch
|
||||
case CustomRoles.Dictator:
|
||||
PlayerControl.LocalPlayer.Data.Role.IntroSound = HudManager.Instance.Chat.messageSound;
|
||||
break;
|
||||
case CustomRoles.Minimalism:
|
||||
PlayerControl.LocalPlayer.Data.Role.IntroSound = PlayerControl.LocalPlayer.KillSfx;
|
||||
break;
|
||||
}
|
||||
|
||||
if (PlayerControl.LocalPlayer.Is(CustomRoles.Madmate))
|
||||
@@ -240,8 +238,8 @@ class BeginCrewmatePatch
|
||||
__instance.TeamTitle.text = GetString("TeamMadmate");
|
||||
__instance.TeamTitle.color = __instance.BackgroundBar.material.color = new Color32(255, 25, 25, byte.MaxValue);
|
||||
PlayerControl.LocalPlayer.Data.Role.IntroSound = GetIntroSound(RoleTypes.Impostor);
|
||||
__instance.ImpostorText.gameObject.SetActive(true);
|
||||
__instance.ImpostorText.text = GetString("SubText.Madmate");
|
||||
__instance.ImpostorText.gameObject.SetActive(true);
|
||||
__instance.ImpostorText.text = GetString("SubText.Madmate");
|
||||
}
|
||||
|
||||
if (PlayerControl.LocalPlayer.Is(CustomRoles.Parasite))
|
||||
@@ -249,8 +247,8 @@ class BeginCrewmatePatch
|
||||
__instance.TeamTitle.text = GetString("TeamMadmate");
|
||||
__instance.TeamTitle.color = __instance.BackgroundBar.material.color = new Color32(255, 25, 25, byte.MaxValue);
|
||||
PlayerControl.LocalPlayer.Data.Role.IntroSound = GetIntroSound(RoleTypes.Impostor);
|
||||
__instance.ImpostorText.gameObject.SetActive(true);
|
||||
__instance.ImpostorText.text = GetString("SubText.Madmate");
|
||||
__instance.ImpostorText.gameObject.SetActive(true);
|
||||
__instance.ImpostorText.text = GetString("SubText.Madmate");
|
||||
}
|
||||
|
||||
if (PlayerControl.LocalPlayer.Is(CustomRoles.Crewpostor))
|
||||
@@ -258,8 +256,8 @@ class BeginCrewmatePatch
|
||||
__instance.TeamTitle.text = GetString("TeamMadmate");
|
||||
__instance.TeamTitle.color = __instance.BackgroundBar.material.color = new Color32(255, 25, 25, byte.MaxValue);
|
||||
PlayerControl.LocalPlayer.Data.Role.IntroSound = GetIntroSound(RoleTypes.Impostor);
|
||||
__instance.ImpostorText.gameObject.SetActive(true);
|
||||
__instance.ImpostorText.text = GetString("SubText.Madmate");
|
||||
__instance.ImpostorText.gameObject.SetActive(true);
|
||||
__instance.ImpostorText.text = GetString("SubText.Madmate");
|
||||
}
|
||||
|
||||
if (Options.CurrentGameMode == CustomGameMode.SoloKombat)
|
||||
@@ -356,6 +354,15 @@ class BeginImpostorPatch
|
||||
__instance.overlayHandle.color = Palette.CrewmateBlue;
|
||||
return false;
|
||||
}
|
||||
else if (role is CustomRoles.Romantic or CustomRoles.RuthlessRomantic or CustomRoles.VengefulRomantic or CustomRoles.NSerialKiller or CustomRoles.Jackal or CustomRoles.CursedSoul or CustomRoles.Amnesiac or CustomRoles.Arsonist or CustomRoles.Sidekick or CustomRoles.Innocent or CustomRoles.Pelican or CustomRoles.Pursuer or CustomRoles.Revolutionist or CustomRoles.FFF or CustomRoles.Gamer or CustomRoles.Glitch or CustomRoles.Juggernaut or CustomRoles.DarkHide or CustomRoles.Provocateur or CustomRoles.BloodKnight or CustomRoles.NSerialKiller or CustomRoles.Maverick or CustomRoles.NWitch or CustomRoles.Totocalcio or CustomRoles.Succubus or CustomRoles.Pelican or CustomRoles.Infectious or CustomRoles.Virus or CustomRoles.Pickpocket or CustomRoles.Traitor or CustomRoles.PlagueBearer or CustomRoles.Pestilence or CustomRoles.Spiritcaller)
|
||||
{
|
||||
yourTeam = new Il2CppSystem.Collections.Generic.List<PlayerControl>();
|
||||
yourTeam.Add(PlayerControl.LocalPlayer);
|
||||
foreach (var pc in Main.AllPlayerControls.Where(x => !x.AmOwner)) yourTeam.Add(pc);
|
||||
__instance.BeginCrewmate(yourTeam);
|
||||
__instance.overlayHandle.color = new Color32(127, 140, 141, byte.MaxValue);
|
||||
return false;
|
||||
}
|
||||
BeginCrewmatePatch.Prefix(__instance, ref yourTeam);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
using HarmonyLib;
|
||||
using Il2CppSystem;
|
||||
using Il2CppSystem.Collections.Generic;
|
||||
using InnerNet;
|
||||
//using UnityEngine;
|
||||
//using UnityEngine;
|
||||
|
||||
namespace TOHE;
|
||||
|
||||
|
||||
+86
-68
@@ -1,4 +1,3 @@
|
||||
using AmongUs.GameOptions;
|
||||
using HarmonyLib;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@@ -21,7 +20,7 @@ class CheckForEndVotingPatch
|
||||
if (Medic.IsEnable) Medic.OnCheckMark();
|
||||
//Meeting Skip with vote counting on keystroke (m + delete)
|
||||
var shouldSkip = false;
|
||||
if (Input.GetKeyDown(KeyCode.F6))
|
||||
if (Input.GetKeyDown(KeyCode.F6))
|
||||
{
|
||||
shouldSkip = true;
|
||||
}
|
||||
@@ -51,7 +50,7 @@ class CheckForEndVotingPatch
|
||||
}
|
||||
}
|
||||
|
||||
//催眠师催眠
|
||||
//催眠师催眠
|
||||
|
||||
if (pc.Is(CustomRoles.Dictator) && pva.DidVote && pc.PlayerId != pva.VotedFor && pva.VotedFor < 253 && !pc.Data.IsDead)
|
||||
{
|
||||
@@ -177,6 +176,7 @@ class CheckForEndVotingPatch
|
||||
if (CheckRole(ps.TargetPlayerId, CustomRoles.Divinator) && Divinator.HideVote.GetBool()) continue;
|
||||
//隐藏抹除者的票
|
||||
if (CheckRole(ps.TargetPlayerId, CustomRoles.Eraser) && Eraser.HideVote.GetBool()) continue;
|
||||
if (CheckRole(ps.TargetPlayerId, CustomRoles.NiceEraser) && NiceEraser.HideVote.GetBool()) continue;
|
||||
|
||||
if (CheckRole(ps.TargetPlayerId, CustomRoles.Tracker) && Tracker.HideVote.GetBool()) continue;
|
||||
|
||||
@@ -190,7 +190,7 @@ class CheckForEndVotingPatch
|
||||
VoterId = ps.TargetPlayerId,
|
||||
VotedForId = ps.VotedFor
|
||||
});
|
||||
|
||||
|
||||
if (CheckRole(ps.TargetPlayerId, CustomRoles.Mayor) && !Options.MayorHideVote.GetBool()) //Mayorの投票数
|
||||
{
|
||||
for (var i2 = 0; i2 < Options.MayorAdditionalVote.GetFloat(); i2++)
|
||||
@@ -331,8 +331,8 @@ class CheckForEndVotingPatch
|
||||
var coloredRole = Utils.GetDisplayRoleName(exileId, true);
|
||||
if (Options.ConfirmEgoistOnEject.GetBool() && player.Is(CustomRoles.Egoist))
|
||||
coloredRole = Utils.ColorString(Utils.GetRoleColor(CustomRoles.Egoist), GetRoleString("Temp.Blank") + coloredRole.RemoveHtmlTags());
|
||||
// if (Options.ConfirmSidekickOnEject.GetBool() && player.Is(CustomRoles.Sidekick))
|
||||
// coloredRole = Utils.ColorString(Utils.GetRoleColor(CustomRoles.Sidekick), GetRoleString("Temp.Blank") + coloredRole.RemoveHtmlTags());
|
||||
// if (Options.ConfirmSidekickOnEject.GetBool() && player.Is(CustomRoles.Sidekick))
|
||||
// coloredRole = Utils.ColorString(Utils.GetRoleColor(CustomRoles.Sidekick), GetRoleString("Temp.Blank") + coloredRole.RemoveHtmlTags());
|
||||
if (Options.ConfirmLoversOnEject.GetBool() && player.Is(CustomRoles.Lovers))
|
||||
coloredRole = Utils.ColorString(Utils.GetRoleColor(CustomRoles.Lovers), GetRoleString("Temp.Blank") + coloredRole.RemoveHtmlTags());
|
||||
if (Options.RascalAppearAsMadmate.GetBool() && player.Is(CustomRoles.Rascal))
|
||||
@@ -386,20 +386,19 @@ class CheckForEndVotingPatch
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
var DecidedWinner = false;
|
||||
//小丑胜利
|
||||
/* if (crole == CustomRoles.Jester)
|
||||
|
||||
if (crole == CustomRoles.Jester)
|
||||
{
|
||||
name = string.Format(GetString("ExiledJester"), realName, coloredRole);
|
||||
DecidedWinner = true;
|
||||
}
|
||||
//处刑人胜利
|
||||
if (Executioner.CheckExileTarget(exiledPlayer, DecidedWinner, true))
|
||||
{
|
||||
name = string.Format(GetString("ExiledExeTarget"), realName, coloredRole);
|
||||
DecidedWinner = true;
|
||||
}
|
||||
//冤罪师胜利
|
||||
if (Main.AllPlayerControls.Any(x => x.Is(CustomRoles.Innocent) && !x.IsAlive() && x.GetRealKiller()?.PlayerId == exileId))
|
||||
{
|
||||
if (!(!Options.InnocentCanWinByImp.GetBool() && crole.IsImpostor()))
|
||||
@@ -408,19 +407,20 @@ class CheckForEndVotingPatch
|
||||
else name = string.Format(GetString("ExiledInnocentTargetInOneLine"), realName, coloredRole);
|
||||
DecidedWinner = true;
|
||||
}
|
||||
} */
|
||||
}
|
||||
|
||||
if (DecidedWinner) name += "<size=0>";
|
||||
if (Options.ShowImpRemainOnEject.GetBool() && !DecidedWinner)
|
||||
else if (Options.ShowImpRemainOnEject.GetBool() && !DecidedWinner)
|
||||
{
|
||||
name += "\n";
|
||||
string comma = neutralnum > 0 ? "," : "";
|
||||
if (impnum == 0) name += GetString("NoImpRemain") + comma;
|
||||
if (impnum == 1) name += GetString("OneImpRemain") + comma;
|
||||
if (impnum == 2) name += GetString("TwoImpRemain") + comma;
|
||||
if (impnum == 3) name += GetString("ThreeImpRemain") + comma;
|
||||
// else name += string.Format(GetString("ImpRemain"), impnum) + comma;
|
||||
if (Options.ShowNKRemainOnEject.GetBool() && neutralnum > 0)
|
||||
if (impnum == 0 && neutralnum == 0) name += GetString("GG");
|
||||
else if (impnum == 0) name += GetString("NoImpRemain") + comma;
|
||||
else if (impnum == 1) name += GetString("OneImpRemain") + comma;
|
||||
else if (impnum == 2) name += GetString("TwoImpRemain") + comma;
|
||||
else if (impnum == 3) name += GetString("ThreeImpRemain") + comma;
|
||||
// else name += string.Format(GetString("ImpRemain"), impnum) + comma;
|
||||
else if (Options.ShowNKRemainOnEject.GetBool() && neutralnum > 0)
|
||||
name += string.Format(GetString("NeutralRemain"), neutralnum);
|
||||
}
|
||||
|
||||
@@ -462,8 +462,8 @@ class CheckForEndVotingPatch
|
||||
Virus.OnCheckForEndVoting(deathReason, playerIds);
|
||||
foreach (var playerId in playerIds)
|
||||
{
|
||||
// Baker.OnCheckForEndVoting(playerId);
|
||||
|
||||
// Baker.OnCheckForEndVoting(playerId);
|
||||
|
||||
//Loversの後追い
|
||||
if (CustomRoles.Lovers.IsEnable() && !Main.isLoversDead && Main.LoversPlayers.Find(lp => lp.PlayerId == playerId) != null)
|
||||
FixedUpdatePatch.LoversSuicide(playerId, true);
|
||||
@@ -541,10 +541,10 @@ static class ExtendedMeetingHud
|
||||
&& ps.TargetPlayerId != ps.VotedFor
|
||||
) VoteNum += Options.VindicatorAdditionalVote.GetInt();
|
||||
if (Options.DualVotes.GetBool())
|
||||
{
|
||||
if (CheckForEndVotingPatch.CheckRole(ps.TargetPlayerId, CustomRoles.DualPersonality)
|
||||
&& ps.TargetPlayerId != ps.VotedFor
|
||||
) VoteNum += VoteNum;
|
||||
{
|
||||
if (CheckForEndVotingPatch.CheckRole(ps.TargetPlayerId, CustomRoles.DualPersonality)
|
||||
&& ps.TargetPlayerId != ps.VotedFor
|
||||
) VoteNum += VoteNum;
|
||||
}
|
||||
//窃票者附加票数
|
||||
if (CheckForEndVotingPatch.CheckRole(ps.TargetPlayerId, CustomRoles.TicketsStealer))
|
||||
@@ -591,7 +591,7 @@ class MeetingHudStartPatch
|
||||
sb.Append($"\n\n" + GetString($"Lovers") + Utils.GetRoleMode(CustomRoles.Lovers) + GetString($"LoversInfoLong"));
|
||||
AddMsg(sb.ToString(), pc.PlayerId);
|
||||
}
|
||||
if (msgToSend.Count >= 1)
|
||||
if (msgToSend.Any())
|
||||
{
|
||||
var msgTemp = msgToSend.ToList();
|
||||
new LateTask(() => { msgTemp.Do(x => Utils.SendMessage(x.Item1, x.Item2, x.Item3)); }, 3f, "Skill Description First Meeting");
|
||||
@@ -760,7 +760,7 @@ class MeetingHudStartPatch
|
||||
roleTextMeeting.text = Farseer.RandomRole[PlayerControl.LocalPlayer.PlayerId];
|
||||
roleTextMeeting.text += Farseer.GetTaskState();
|
||||
}
|
||||
|
||||
|
||||
if (EvilTracker.IsTrackTarget(PlayerControl.LocalPlayer, pc) && EvilTracker.CanSeeLastRoomInMeeting)
|
||||
{
|
||||
roleTextMeeting.text = EvilTracker.GetArrowAndLastRoom(PlayerControl.LocalPlayer, pc);
|
||||
@@ -816,12 +816,12 @@ class MeetingHudStartPatch
|
||||
//自分自身の名前の色を変更
|
||||
//NameColorManager準拠の処理
|
||||
pva.NameText.text = pva.NameText.text.ApplyNameColorData(seer, target, true);
|
||||
|
||||
|
||||
|
||||
// Guesser Mode //
|
||||
if (Options.GuesserMode.GetBool())
|
||||
{
|
||||
if (Options.CrewmatesCanGuess.GetBool() && seer.GetCustomRole().IsCrewmate() && !seer.Is(CustomRoles.Judge) && !seer.Is(CustomRoles.ParityCop))
|
||||
if (Options.CrewmatesCanGuess.GetBool() && seer.GetCustomRole().IsCrewmate() && !seer.Is(CustomRoles.Judge) && !seer.Is(CustomRoles.Lookout) && !seer.Is(CustomRoles.ParityCop))
|
||||
if (!seer.Data.IsDead && !target.Data.IsDead)
|
||||
pva.NameText.text = Utils.ColorString(Utils.GetRoleColor(seer.GetCustomRole()), target.PlayerId.ToString()) + " " + pva.NameText.text;
|
||||
if (Options.ImpostorsCanGuess.GetBool() && seer.GetCustomRole().IsImpostor() && !seer.Is(CustomRoles.Councillor))
|
||||
@@ -839,34 +839,34 @@ class MeetingHudStartPatch
|
||||
|
||||
if (seer.KnowDeathReason(target))
|
||||
sb.Append($"({Utils.ColorString(Utils.GetRoleColor(CustomRoles.Doctor), Utils.GetVitalText(target.PlayerId))})");
|
||||
/* if (seer.KnowDeadTeam(target))
|
||||
{
|
||||
if (target.Is(CustomRoleTypes.Crewmate) && !(target.Is(CustomRoles.Madmate) || target.Is(CustomRoles.Egoist) || target.Is(CustomRoles.Charmed) || target.Is(CustomRoles.Recruit) || target.Is(CustomRoles.Infected) || target.Is(CustomRoles.Contagious) || target.Is(CustomRoles.Rogue) || target.Is(CustomRoles.Rascal) || target.Is(CustomRoles.Soulless) || !target.Is(CustomRoles.Admired)))
|
||||
sb.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Bait), "★"));
|
||||
/* if (seer.KnowDeadTeam(target))
|
||||
{
|
||||
if (target.Is(CustomRoleTypes.Crewmate) && !(target.Is(CustomRoles.Madmate) || target.Is(CustomRoles.Egoist) || target.Is(CustomRoles.Charmed) || target.Is(CustomRoles.Recruit) || target.Is(CustomRoles.Infected) || target.Is(CustomRoles.Contagious) || target.Is(CustomRoles.Rogue) || target.Is(CustomRoles.Rascal) || target.Is(CustomRoles.Soulless) || !target.Is(CustomRoles.Admired)))
|
||||
sb.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Bait), "★"));
|
||||
|
||||
if (target.Is(CustomRoleTypes.Impostor) || target.Is(CustomRoles.Madmate) || target.Is(CustomRoles.Rascal) || target.Is(CustomRoles.Parasite) || target.Is(CustomRoles.Refugee) || target.Is(CustomRoles.Crewpostor) || target.Is(CustomRoles.Convict) || !target.Is(CustomRoles.Admired))
|
||||
sb.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Impostor), "★"));
|
||||
if (target.Is(CustomRoleTypes.Impostor) || target.Is(CustomRoles.Madmate) || target.Is(CustomRoles.Rascal) || target.Is(CustomRoles.Parasite) || target.Is(CustomRoles.Refugee) || target.Is(CustomRoles.Crewpostor) || target.Is(CustomRoles.Convict) || !target.Is(CustomRoles.Admired))
|
||||
sb.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Impostor), "★"));
|
||||
|
||||
if (target.Is(CustomRoleTypes.Neutral) || target.Is(CustomRoles.Rogue) || target.Is(CustomRoles.Contagious) || target.Is(CustomRoles.Charmed) || target.Is(CustomRoles.Recruit) || target.Is(CustomRoles.Infected) || target.Is(CustomRoles.Egoist) || target.Is(CustomRoles.Soulless) || !target.Is(CustomRoles.Admired) || !target.Is(CustomRoles.Parasite) || !target.Is(CustomRoles.Refugee) || !target.Is(CustomRoles.Crewpostor) || !target.Is(CustomRoles.Convict))
|
||||
sb.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Executioner), "★"));
|
||||
if (target.Is(CustomRoleTypes.Neutral) || target.Is(CustomRoles.Rogue) || target.Is(CustomRoles.Contagious) || target.Is(CustomRoles.Charmed) || target.Is(CustomRoles.Recruit) || target.Is(CustomRoles.Infected) || target.Is(CustomRoles.Egoist) || target.Is(CustomRoles.Soulless) || !target.Is(CustomRoles.Admired) || !target.Is(CustomRoles.Parasite) || !target.Is(CustomRoles.Refugee) || !target.Is(CustomRoles.Crewpostor) || !target.Is(CustomRoles.Convict))
|
||||
sb.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Executioner), "★"));
|
||||
|
||||
|
||||
|
||||
}
|
||||
if (seer.KnowLivingTeam(target))
|
||||
{
|
||||
if (target.Is(CustomRoleTypes.Crewmate) && !(target.Is(CustomRoles.Madmate) || target.Is(CustomRoles.Egoist) || target.Is(CustomRoles.Charmed) || target.Is(CustomRoles.Recruit) || target.Is(CustomRoles.Infected) || target.Is(CustomRoles.Contagious) || target.Is(CustomRoles.Rogue) || target.Is(CustomRoles.Rascal) || target.Is(CustomRoles.Admired)))
|
||||
sb.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Bait), "★"));
|
||||
}
|
||||
if (seer.KnowLivingTeam(target))
|
||||
{
|
||||
if (target.Is(CustomRoleTypes.Crewmate) && !(target.Is(CustomRoles.Madmate) || target.Is(CustomRoles.Egoist) || target.Is(CustomRoles.Charmed) || target.Is(CustomRoles.Recruit) || target.Is(CustomRoles.Infected) || target.Is(CustomRoles.Contagious) || target.Is(CustomRoles.Rogue) || target.Is(CustomRoles.Rascal) || target.Is(CustomRoles.Admired)))
|
||||
sb.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Bait), "★"));
|
||||
|
||||
if (target.Is(CustomRoleTypes.Impostor) || target.Is(CustomRoles.Madmate) || target.Is(CustomRoles.Rascal) || target.Is(CustomRoles.Parasite) || target.Is(CustomRoles.Refugee) || target.Is(CustomRoles.Crewpostor) || target.Is(CustomRoles.Convict) || !target.Is(CustomRoles.Admired))
|
||||
sb.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Impostor), "★"));
|
||||
if (target.Is(CustomRoleTypes.Impostor) || target.Is(CustomRoles.Madmate) || target.Is(CustomRoles.Rascal) || target.Is(CustomRoles.Parasite) || target.Is(CustomRoles.Refugee) || target.Is(CustomRoles.Crewpostor) || target.Is(CustomRoles.Convict) || !target.Is(CustomRoles.Admired))
|
||||
sb.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Impostor), "★"));
|
||||
|
||||
if (target.Is(CustomRoleTypes.Neutral) || target.Is(CustomRoles.Rogue) || target.Is(CustomRoles.Contagious) || target.Is(CustomRoles.Charmed) || target.Is(CustomRoles.Recruit) || target.Is(CustomRoles.Infected) || target.Is(CustomRoles.Egoist) || target.Is(CustomRoles.Soulless) || !target.Is(CustomRoles.Admired) || !target.Is(CustomRoles.Parasite) || !target.Is(CustomRoles.Refugee) || !target.Is(CustomRoles.Crewpostor) || !target.Is(CustomRoles.Convict))
|
||||
sb.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Executioner), "★"));
|
||||
if (target.Is(CustomRoleTypes.Neutral) || target.Is(CustomRoles.Rogue) || target.Is(CustomRoles.Contagious) || target.Is(CustomRoles.Charmed) || target.Is(CustomRoles.Recruit) || target.Is(CustomRoles.Infected) || target.Is(CustomRoles.Egoist) || target.Is(CustomRoles.Soulless) || !target.Is(CustomRoles.Admired) || !target.Is(CustomRoles.Parasite) || !target.Is(CustomRoles.Refugee) || !target.Is(CustomRoles.Crewpostor) || !target.Is(CustomRoles.Convict))
|
||||
sb.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Executioner), "★"));
|
||||
|
||||
|
||||
|
||||
} */
|
||||
} */
|
||||
//インポスター表示
|
||||
switch (seer.GetCustomRole().GetCustomRoleTypes())
|
||||
{
|
||||
@@ -891,10 +891,10 @@ class MeetingHudStartPatch
|
||||
sb.Append(Executioner.TargetMark(seer, target));
|
||||
break;
|
||||
case CustomRoles.Lawyer:
|
||||
// sb.Append(Lawyer.TargetMark(seer, target));
|
||||
// sb.Append(Lawyer.TargetMark(seer, target));
|
||||
break;
|
||||
// case CustomRoles.Jackal:
|
||||
// case CustomRoles.Sidekick:
|
||||
// case CustomRoles.Jackal:
|
||||
// case CustomRoles.Sidekick:
|
||||
case CustomRoles.Poisoner:
|
||||
case CustomRoles.NSerialKiller:
|
||||
case CustomRoles.RuthlessRomantic:
|
||||
@@ -913,14 +913,14 @@ class MeetingHudStartPatch
|
||||
break;
|
||||
case CustomRoles.Jackal:
|
||||
case CustomRoles.Sidekick:
|
||||
// if (target.Is(CustomRoles.Sidekick))
|
||||
// sb.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Jackal), " ♥")); //変更対象にSnitchマークをつける
|
||||
// if (target.Is(CustomRoles.Sidekick))
|
||||
// sb.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Jackal), " ♥")); //変更対象にSnitchマークをつける
|
||||
sb.Append(Snitch.GetWarningMark(seer, target));
|
||||
break;
|
||||
/* case CustomRoles.Monarch:
|
||||
if (target.Is(CustomRoles.Knighted))
|
||||
sb.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Knighted), " 亗")); //変更対象にSnitchマークをつける
|
||||
break; */
|
||||
/* case CustomRoles.Monarch:
|
||||
if (target.Is(CustomRoles.Knighted))
|
||||
sb.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Knighted), " 亗")); //変更対象にSnitchマークをつける
|
||||
break; */
|
||||
case CustomRoles.EvilTracker:
|
||||
sb.Append(EvilTracker.GetTargetMark(seer, target));
|
||||
break;
|
||||
@@ -945,11 +945,18 @@ class MeetingHudStartPatch
|
||||
if (!seer.Data.IsDead && !target.Data.IsDead)
|
||||
pva.NameText.text = Utils.ColorString(Utils.GetRoleColor(seer.Is(CustomRoles.NiceGuesser) ? CustomRoles.NiceGuesser : CustomRoles.EvilGuesser), target.PlayerId.ToString()) + " " + pva.NameText.text;
|
||||
break;
|
||||
// case CustomRoles.Guesser:
|
||||
case CustomRoles.Guesser:
|
||||
if (!seer.Data.IsDead && !target.Data.IsDead)
|
||||
pva.NameText.text = Utils.ColorString(Utils.GetRoleColor(CustomRoles.Guesser), target.PlayerId.ToString()) + " " + pva.NameText.text;
|
||||
break;
|
||||
case CustomRoles.Judge:
|
||||
if (!seer.Data.IsDead && !target.Data.IsDead)
|
||||
pva.NameText.text = Utils.ColorString(Utils.GetRoleColor(CustomRoles.Judge), target.PlayerId.ToString()) + " " + pva.NameText.text;
|
||||
break;
|
||||
case CustomRoles.Lookout:
|
||||
if (!seer.Data.IsDead && !target.Data.IsDead)
|
||||
pva.NameText.text = Utils.ColorString(Utils.GetRoleColor(CustomRoles.Lookout), target.PlayerId.ToString()) + " " + pva.NameText.text;
|
||||
break;
|
||||
case CustomRoles.Doomsayer:
|
||||
if (!seer.Data.IsDead && !target.Data.IsDead)
|
||||
pva.NameText.text = Utils.ColorString(Utils.GetRoleColor(CustomRoles.Doomsayer), target.PlayerId.ToString()) + " " + pva.NameText.text;
|
||||
@@ -958,7 +965,7 @@ class MeetingHudStartPatch
|
||||
if (!seer.Data.IsDead && !target.Data.IsDead)
|
||||
pva.NameText.text = Utils.ColorString(Utils.GetRoleColor(CustomRoles.ParityCop), target.PlayerId.ToString()) + " " + pva.NameText.text;
|
||||
break;
|
||||
|
||||
|
||||
case CustomRoles.Councillor:
|
||||
if (!seer.Data.IsDead && !target.Data.IsDead)
|
||||
pva.NameText.text = Utils.ColorString(Utils.GetRoleColor(CustomRoles.Councillor), target.PlayerId.ToString()) + " " + pva.NameText.text;
|
||||
@@ -974,6 +981,17 @@ class MeetingHudStartPatch
|
||||
break;
|
||||
}
|
||||
|
||||
foreach (var SeerSubRole in seer.GetCustomSubRoles())
|
||||
{
|
||||
switch (SeerSubRole)
|
||||
{
|
||||
case CustomRoles.Guesser:
|
||||
if (!seer.Data.IsDead && !target.Data.IsDead)
|
||||
pva.NameText.text = Utils.ColorString(Utils.GetRoleColor(CustomRoles.Guesser), target.PlayerId.ToString()) + " " + pva.NameText.text;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool isLover = false;
|
||||
foreach (var subRole in target.GetCustomSubRoles())
|
||||
{
|
||||
@@ -986,18 +1004,18 @@ class MeetingHudStartPatch
|
||||
isLover = true;
|
||||
}
|
||||
break;
|
||||
/* case CustomRoles.Sidekick:
|
||||
if (seer.Is(CustomRoles.Sidekick) && target.Is(CustomRoles.Sidekick) && Options.SidekickKnowOtherSidekick.GetBool())
|
||||
{
|
||||
sb.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Jackal), " ♥")); //変更対象にSnitchマークをつける
|
||||
sb.Append(Snitch.GetWarningMark(seer, target));
|
||||
}
|
||||
break; */
|
||||
// case CustomRoles.Guesser:
|
||||
// if (!seer.Data.IsDead && !target.Data.IsDead)
|
||||
// pva.NameText.text = Utils.ColorString(Utils.GetRoleColor(seer.GetCustomRole()), target.PlayerId.ToString()) + " " + pva.NameText.text;
|
||||
/* case CustomRoles.Sidekick:
|
||||
if (seer.Is(CustomRoles.Sidekick) && target.Is(CustomRoles.Sidekick) && Options.SidekickKnowOtherSidekick.GetBool())
|
||||
{
|
||||
sb.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Jackal), " ♥")); //変更対象にSnitchマークをつける
|
||||
sb.Append(Snitch.GetWarningMark(seer, target));
|
||||
}
|
||||
break; */
|
||||
// case CustomRoles.Guesser:
|
||||
// if (!seer.Data.IsDead && !target.Data.IsDead)
|
||||
// pva.NameText.text = Utils.ColorString(Utils.GetRoleColor(seer.GetCustomRole()), target.PlayerId.ToString()) + " " + pva.NameText.text;
|
||||
|
||||
// break;
|
||||
// break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -121,7 +121,7 @@ class SetEverythingUpPatch
|
||||
{
|
||||
CustomWinnerText = GetWinnerRoleName(winnerRole);
|
||||
CustomWinnerColor = Utils.GetRoleColorCode(winnerRole);
|
||||
// __instance.WinText.color = Utils.GetRoleColor(winnerRole);
|
||||
// __instance.WinText.color = Utils.GetRoleColor(winnerRole);
|
||||
__instance.BackgroundBar.material.color = Utils.GetRoleColor(winnerRole);
|
||||
if (winnerRole.IsNeutral())
|
||||
{
|
||||
@@ -132,7 +132,7 @@ class SetEverythingUpPatch
|
||||
{
|
||||
__instance.WinText.text = GetString("GameOver");
|
||||
__instance.WinText.color = Utils.GetRoleColor(CustomRoles.GM);
|
||||
__instance.BackgroundBar.material.color = Utils.GetRoleColor(winnerRole);
|
||||
__instance.BackgroundBar.material.color = Utils.GetRoleColor(winnerRole);
|
||||
}
|
||||
switch (CustomWinnerHolder.WinnerTeam)
|
||||
{
|
||||
|
||||
+195
-142
@@ -1,12 +1,12 @@
|
||||
using AmongUs.GameOptions;
|
||||
using HarmonyLib;
|
||||
using Hazel;
|
||||
using InnerNet;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using AmongUs.GameOptions;
|
||||
using HarmonyLib;
|
||||
using Hazel;
|
||||
using InnerNet;
|
||||
using TOHE.Modules;
|
||||
using TOHE.Roles.AddOns.Crewmate;
|
||||
using TOHE.Roles.Crewmate;
|
||||
@@ -167,6 +167,7 @@ class CheckMurderPatch
|
||||
if (Counterfeiter.OnClientMurder(killer)) return false;
|
||||
if (Pursuer.OnClientMurder(killer)) return false;
|
||||
if (Addict.IsImmortal(target)) return false;
|
||||
if (Alchemist.IsProtected) return false;
|
||||
|
||||
//判定凶手技能
|
||||
if (killer.PlayerId != target.PlayerId)
|
||||
@@ -209,13 +210,17 @@ class CheckMurderPatch
|
||||
if (Main.isCurseAndKill[killer.PlayerId]) killer.RpcGuardAndKill(target);
|
||||
return false;
|
||||
case CustomRoles.Witness:
|
||||
if (Main.AllKillers.TryGetValue(target.PlayerId, out var killerId) && target.PlayerId == killerId)
|
||||
killer.SetKillCooldown();
|
||||
if (Main.AllKillers.ContainsKey(target.PlayerId))
|
||||
killer.Notify(GetString("WitnessFoundKiller"));
|
||||
else killer.Notify(GetString("WitnessFoundInnocent"));
|
||||
return false;
|
||||
case CustomRoles.Assassin:
|
||||
if (!Assassin.OnCheckMurder(killer, target)) return false;
|
||||
break;
|
||||
case CustomRoles.Undertaker:
|
||||
if (!Undertaker.OnCheckMurder(killer, target)) return false;
|
||||
break;
|
||||
case CustomRoles.Famine:
|
||||
Baker.FamineKilledTasks(target.PlayerId);
|
||||
break;
|
||||
@@ -240,18 +245,20 @@ class CheckMurderPatch
|
||||
Utils.NotifyRoles(SpecifySeer: killer);
|
||||
return false;
|
||||
case CustomRoles.Capitalism:
|
||||
if (!Main.CapitalismAddTask.ContainsKey(target.PlayerId))
|
||||
Main.CapitalismAddTask.Add(target.PlayerId, 0);
|
||||
Main.CapitalismAddTask[target.PlayerId]++;
|
||||
if (!Main.CapitalismAssignTask.ContainsKey(target.PlayerId))
|
||||
Main.CapitalismAssignTask.Add(target.PlayerId, 0);
|
||||
Main.CapitalismAssignTask[target.PlayerId]++;
|
||||
Logger.Info($"资本主义 {killer.GetRealName()} 又开始祸害人了:{target.GetRealName()}", "Capitalism Add Task");
|
||||
//killer.RpcGuardAndKill(killer);
|
||||
killer.SetKillCooldown();
|
||||
return false;
|
||||
/* case CustomRoles.Bomber:
|
||||
return false; */
|
||||
return killer.CheckDoubleTrigger(target, () =>
|
||||
{
|
||||
if (!Main.CapitalismAddTask.ContainsKey(target.PlayerId))
|
||||
Main.CapitalismAddTask.Add(target.PlayerId, 0);
|
||||
Main.CapitalismAddTask[target.PlayerId]++;
|
||||
if (!Main.CapitalismAssignTask.ContainsKey(target.PlayerId))
|
||||
Main.CapitalismAssignTask.Add(target.PlayerId, 0);
|
||||
Main.CapitalismAssignTask[target.PlayerId]++;
|
||||
Logger.Info($"资本主义 {killer.GetRealName()} 又开始祸害人了:{target.GetRealName()}", "Capitalism Add Task");
|
||||
//killer.RpcGuardAndKill(killer);
|
||||
killer.SetKillCooldown(Options.CapitalismSkillCooldown.GetFloat());
|
||||
});
|
||||
/* case CustomRoles.Bomber:
|
||||
return false; */
|
||||
case CustomRoles.Gangster:
|
||||
if (Gangster.OnCheckMurder(killer, target))
|
||||
return false;
|
||||
@@ -405,7 +412,7 @@ class CheckMurderPatch
|
||||
if (!Sheriff.OnCheckMurder(killer, target))
|
||||
return false;
|
||||
break;
|
||||
case CustomRoles.CopyCat:
|
||||
case CustomRoles.CopyCat:
|
||||
if (!CopyCat.OnCheckMurder(killer, target))
|
||||
return false;
|
||||
break;
|
||||
@@ -440,7 +447,7 @@ class CheckMurderPatch
|
||||
// Consigliere
|
||||
if (killer.Is(CustomRoles.EvilDiviner))
|
||||
{
|
||||
|
||||
|
||||
if (!EvilDiviner.OnCheckMurder(killer, target))
|
||||
return false;
|
||||
}
|
||||
@@ -460,24 +467,25 @@ class CheckMurderPatch
|
||||
{
|
||||
target.RpcMurderPlayerV3(target);
|
||||
//killer.RpcGuardAndKill(killer);
|
||||
// target.RpcGuardAndKill(target);
|
||||
// target.RpcGuardAndKill(target);
|
||||
target.SetRealKiller(killer);
|
||||
killer.SetKillCooldown();
|
||||
RPC.PlaySoundRPC(killer.PlayerId, Sounds.KillSound);
|
||||
return false;
|
||||
}
|
||||
if (killer.Is(CustomRoles.Mare) && !Utils.IsActive(SystemTypes.Electrical))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
/* if (killer.Is(CustomRoles.Minimalism))
|
||||
if (killer.Is(CustomRoles.Mare))
|
||||
{
|
||||
killer.ResetKillCooldown();
|
||||
return true;
|
||||
} */
|
||||
}
|
||||
/* if (killer.Is(CustomRoles.Minimalism))
|
||||
{
|
||||
return true;
|
||||
} */
|
||||
|
||||
if (killer.Is(CustomRoles.Ritualist))
|
||||
{
|
||||
|
||||
|
||||
if (!Ritualist.OnCheckMurder(killer, target))
|
||||
return false;
|
||||
}
|
||||
@@ -487,14 +495,14 @@ class CheckMurderPatch
|
||||
{
|
||||
if (!target.Is(CustomRoles.Pestilence))
|
||||
{
|
||||
Utils.TP(target.NetTransform, Pelican.GetBlackRoomPS());
|
||||
target.SetRealKiller(killer);
|
||||
Main.PlayerStates[target.PlayerId].SetDead();
|
||||
target.RpcMurderPlayerV3(target);
|
||||
killer.SetKillCooldown();
|
||||
RPC.PlaySoundRPC(killer.PlayerId, Sounds.KillSound);
|
||||
NameNotifyManager.Notify(target, Utils.ColorString(Utils.GetRoleColor(CustomRoles.Scavenger), GetString("KilledByScavenger")));
|
||||
return false;
|
||||
Utils.TP(target.NetTransform, Pelican.GetBlackRoomPS());
|
||||
target.SetRealKiller(killer);
|
||||
Main.PlayerStates[target.PlayerId].SetDead();
|
||||
target.RpcMurderPlayerV3(target);
|
||||
killer.SetKillCooldown();
|
||||
RPC.PlaySoundRPC(killer.PlayerId, Sounds.KillSound);
|
||||
NameNotifyManager.Notify(target, Utils.ColorString(Utils.GetRoleColor(CustomRoles.Scavenger), GetString("KilledByScavenger")));
|
||||
return false;
|
||||
}
|
||||
if (target.Is(CustomRoles.Pestilence))
|
||||
{
|
||||
@@ -582,7 +590,7 @@ class CheckMurderPatch
|
||||
if (Options.OppoImmuneToAttacksWhenTasksDone.GetBool())
|
||||
{
|
||||
if (target.Is(CustomRoles.Opportunist) && target.AllTasksCompleted())
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Monarch immune to kills when a living player is knighted
|
||||
@@ -649,14 +657,14 @@ class CheckMurderPatch
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// if (target.Is(CustomRoles.Diseased))
|
||||
// {
|
||||
|
||||
//// killer.RpcGuardAndKill(killer);
|
||||
// // killer.SetKillCooldownV3(Main.AllPlayerKillCooldown[killer.PlayerId] *= Options.DiseasedMultiplier.GetFloat());
|
||||
// // killer.ResetKillCooldown();
|
||||
// // killer.SyncSettings();
|
||||
// }
|
||||
// if (target.Is(CustomRoles.Diseased))
|
||||
// {
|
||||
|
||||
//// killer.RpcGuardAndKill(killer);
|
||||
// // killer.SetKillCooldownV3(Main.AllPlayerKillCooldown[killer.PlayerId] *= Options.DiseasedMultiplier.GetFloat());
|
||||
// // killer.ResetKillCooldown();
|
||||
// // killer.SyncSettings();
|
||||
// }
|
||||
if (Main.ForCrusade.Contains(target.PlayerId))
|
||||
{
|
||||
foreach (var player in Main.AllPlayerControls)
|
||||
@@ -728,17 +736,17 @@ class CheckMurderPatch
|
||||
{
|
||||
if (!killer.Is(CustomRoles.Pestilence))
|
||||
{
|
||||
killer.SetRealKiller(target);
|
||||
target.RpcMurderPlayerV3(killer);
|
||||
Logger.Info($"{target.GetRealName()} 老兵反弹击杀:{killer.GetRealName()}", "Veteran Kill");
|
||||
return false;
|
||||
killer.SetRealKiller(target);
|
||||
target.RpcMurderPlayerV3(killer);
|
||||
Logger.Info($"{target.GetRealName()} 老兵反弹击杀:{killer.GetRealName()}", "Veteran Kill");
|
||||
return false;
|
||||
}
|
||||
if (killer.Is(CustomRoles.Pestilence))
|
||||
{
|
||||
target.SetRealKiller(killer);
|
||||
killer.RpcMurderPlayerV3(target);
|
||||
Logger.Info($"{target.GetRealName()} 老兵反弹击杀:{target.GetRealName()}", "Pestilence Reflect");
|
||||
return false;
|
||||
target.SetRealKiller(killer);
|
||||
killer.RpcMurderPlayerV3(target);
|
||||
Logger.Info($"{target.GetRealName()} 老兵反弹击杀:{target.GetRealName()}", "Pestilence Reflect");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -749,44 +757,44 @@ class CheckMurderPatch
|
||||
foreach (var player in Main.AllPlayerControls)
|
||||
{
|
||||
if (!killer.Is(CustomRoles.Pestilence))
|
||||
{
|
||||
if (Main.TimeMasterBackTrack.ContainsKey(player.PlayerId))
|
||||
{
|
||||
var position = Main.TimeMasterBackTrack[player.PlayerId];
|
||||
Utils.TP(player.NetTransform, position);
|
||||
if (Main.TimeMasterBackTrack.ContainsKey(player.PlayerId))
|
||||
{
|
||||
var position = Main.TimeMasterBackTrack[player.PlayerId];
|
||||
Utils.TP(player.NetTransform, position);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
killer.SetKillCooldown(target: target, forceAnime: true);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case CustomRoles.Masochist:
|
||||
|
||||
killer.SetKillCooldown(target: target, forceAnime: true);
|
||||
Main.MasochistKillMax[target.PlayerId]++;
|
||||
// killer.RPCPlayCustomSound("DM");
|
||||
|
||||
killer.SetKillCooldown(target: target, forceAnime: true);
|
||||
Main.MasochistKillMax[target.PlayerId]++;
|
||||
// killer.RPCPlayCustomSound("DM");
|
||||
target.Notify(string.Format(GetString("MasochistKill"), Main.MasochistKillMax[target.PlayerId]));
|
||||
if (Main.MasochistKillMax[target.PlayerId] >= Options.MasochistKillMax.GetInt())
|
||||
{
|
||||
CustomWinnerHolder.ResetAndSetWinner(CustomWinner.Masochist);
|
||||
CustomWinnerHolder.WinnerIds.Add(target.PlayerId);
|
||||
}
|
||||
if (Main.MasochistKillMax[target.PlayerId] >= Options.MasochistKillMax.GetInt())
|
||||
{
|
||||
CustomWinnerHolder.ResetAndSetWinner(CustomWinner.Masochist);
|
||||
CustomWinnerHolder.WinnerIds.Add(target.PlayerId);
|
||||
}
|
||||
return false;
|
||||
case CustomRoles.Glitch:
|
||||
if (killer.Is(CustomRoles.Pestilence)) break;
|
||||
killer.SetRealKiller(target);
|
||||
target.RpcMurderPlayerV3(killer);
|
||||
Logger.Info($"{target.GetRealName()} 老兵反弹击杀:{killer.GetRealName()}", "Glitch Kill");
|
||||
Main.PlayerStates[killer.PlayerId].deathReason = PlayerState.DeathReason.Hack;
|
||||
return false;
|
||||
if (killer.Is(CustomRoles.Pestilence)) break;
|
||||
killer.SetRealKiller(target);
|
||||
target.RpcMurderPlayerV3(killer);
|
||||
Logger.Info($"{target.GetRealName()} 老兵反弹击杀:{killer.GetRealName()}", "Glitch Kill");
|
||||
Main.PlayerStates[killer.PlayerId].deathReason = PlayerState.DeathReason.Hack;
|
||||
return false;
|
||||
//检查明星附近是否有人
|
||||
case CustomRoles.SuperStar:
|
||||
if (Main.AllAlivePlayerControls.Where(x =>
|
||||
x.PlayerId != killer.PlayerId &&
|
||||
x.PlayerId != target.PlayerId &&
|
||||
Vector2.Distance(x.GetTruePosition(), target.GetTruePosition()) < 2f
|
||||
).ToList().Count >= 1) return false;
|
||||
).ToList().Any()) return false;
|
||||
break;
|
||||
//玩家被击杀事件
|
||||
case CustomRoles.Gamer:
|
||||
@@ -951,8 +959,8 @@ class MurderPlayerPatch
|
||||
//if ((Romantic.BetPlayer.TryGetValue(target.PlayerId, out var RomanticPartner) && target.PlayerId == RomanticPartner) && target.PlayerId != killer.PlayerId)
|
||||
// VengefulRomantic.PartnerKiller.Add(killer.PlayerId, 1);
|
||||
|
||||
Main.AllKillers.Add(killer.PlayerId, 1);
|
||||
new LateTask(() => { Main.AllKillers.Remove(killer.PlayerId); }, Options.WitnessTime.GetInt());
|
||||
Main.AllKillers.Remove(killer.PlayerId);
|
||||
Main.AllKillers.Add(killer.PlayerId, Utils.GetTimeStamp());
|
||||
|
||||
switch (target.GetCustomRole())
|
||||
{
|
||||
@@ -991,11 +999,35 @@ class MurderPlayerPatch
|
||||
case CustomRoles.Hacker:
|
||||
Hacker.HackLimit[killer.PlayerId] += Hacker.HackerAbilityUseGainWithEachKill.GetFloat();
|
||||
break;
|
||||
case CustomRoles.Camouflager:
|
||||
Camouflager.CamoLimit[killer.PlayerId] += Camouflager.CamoAbilityUseGainWithEachKill.GetFloat();
|
||||
break;
|
||||
case CustomRoles.Councillor:
|
||||
Councillor.MurderLimit[killer.PlayerId] += Councillor.CouncillorAbilityUseGainWithEachKill.GetFloat();
|
||||
break;
|
||||
case CustomRoles.Dazzler:
|
||||
Dazzler.DazzleLimit[killer.PlayerId] += Dazzler.DazzlerAbilityUseGainWithEachKill.GetFloat();
|
||||
break;
|
||||
case CustomRoles.Disperser:
|
||||
Disperser.DisperserLimit[killer.PlayerId] += Disperser.DisperserAbilityUseGainWithEachKill.GetFloat();
|
||||
break;
|
||||
case CustomRoles.EvilDiviner:
|
||||
EvilDiviner.DivinationCount[killer.PlayerId] += EvilDiviner.EDAbilityUseGainWithEachKill.GetFloat();
|
||||
break;
|
||||
case CustomRoles.Swooper:
|
||||
Swooper.SwoopLimit[killer.PlayerId] += Swooper.SwooperAbilityUseGainWithEachKill.GetFloat();
|
||||
break;
|
||||
case CustomRoles.Hangman:
|
||||
Hangman.HangLimit[killer.PlayerId] += Hangman.HangmanAbilityUseGainWithEachKill.GetFloat();
|
||||
break;
|
||||
case CustomRoles.Twister:
|
||||
Twister.TwistLimit[killer.PlayerId] += Twister.TwisterAbilityUseGainWithEachKill.GetFloat();
|
||||
break;
|
||||
}
|
||||
|
||||
if (killer.Is(CustomRoles.TicketsStealer) && killer.PlayerId != target.PlayerId)
|
||||
killer.Notify(string.Format(GetString("TicketsStealerGetTicket"), ((Main.AllPlayerControls.Count(x => x.GetRealKiller()?.PlayerId == killer.PlayerId) + 1) * Options.TicketsPerKill.GetFloat()).ToString("0.0#####")));
|
||||
|
||||
|
||||
if (killer.Is(CustomRoles.Pickpocket) && killer.PlayerId != target.PlayerId)
|
||||
killer.Notify(string.Format(GetString("PickpocketGetVote"), ((Main.AllPlayerControls.Count(x => x.GetRealKiller()?.PlayerId == killer.PlayerId) + 1) * Pickpocket.VotesPerKill.GetFloat()).ToString("0.0#####")));
|
||||
|
||||
@@ -1005,9 +1037,9 @@ class MurderPlayerPatch
|
||||
var rp = pcList[IRandom.Instance.Next(0, pcList.Count)];
|
||||
if (!rp.Is(CustomRoles.Pestilence))
|
||||
{
|
||||
Main.PlayerStates[rp.PlayerId].deathReason = PlayerState.DeathReason.Revenge;
|
||||
rp.SetRealKiller(target);
|
||||
rp.RpcMurderPlayerV3(rp);
|
||||
Main.PlayerStates[rp.PlayerId].deathReason = PlayerState.DeathReason.Revenge;
|
||||
rp.SetRealKiller(target);
|
||||
rp.RpcMurderPlayerV3(rp);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1103,7 +1135,7 @@ class ShapeshiftPatch
|
||||
cpdistance.Add(p, dis);
|
||||
Logger.Info($"{p?.Data?.PlayerName}の位置{dis}", "Warlock");
|
||||
}
|
||||
if (cpdistance.Count >= 1)
|
||||
if (cpdistance.Any())
|
||||
{
|
||||
var min = cpdistance.OrderBy(c => c.Value).FirstOrDefault();//一番小さい値を取り出す
|
||||
PlayerControl targetw = min.Key;
|
||||
@@ -1179,7 +1211,7 @@ class ShapeshiftPatch
|
||||
//自分が最後の生き残りの場合は勝利のために死なない
|
||||
if (Options.BomberDiesInExplosion.GetBool())
|
||||
{
|
||||
if (totalAlive > 0 && !GameStates.IsEnded)
|
||||
if (totalAlive > 0 && !GameStates.IsEnded)
|
||||
{
|
||||
Main.PlayerStates[shapeshifter.PlayerId].deathReason = PlayerState.DeathReason.Bombed;
|
||||
shapeshifter.RpcMurderPlayerV3(shapeshifter);
|
||||
@@ -1213,9 +1245,9 @@ class ShapeshiftPatch
|
||||
{
|
||||
var totalAlive = Main.AllAlivePlayerControls.Count();
|
||||
//自分が最後の生き残りの場合は勝利のために死なない
|
||||
// if (Options.BomberDiesInExplosion.GetBool())
|
||||
// if (Options.BomberDiesInExplosion.GetBool())
|
||||
{
|
||||
if (totalAlive > 0 && !GameStates.IsEnded)
|
||||
if (totalAlive > 0 && !GameStates.IsEnded)
|
||||
{
|
||||
Main.PlayerStates[shapeshifter.PlayerId].deathReason = PlayerState.DeathReason.Bombed;
|
||||
shapeshifter.RpcMurderPlayerV3(shapeshifter);
|
||||
@@ -1228,6 +1260,9 @@ class ShapeshiftPatch
|
||||
case CustomRoles.Assassin:
|
||||
Assassin.OnShapeshift(shapeshifter, shapeshifting);
|
||||
break;
|
||||
case CustomRoles.Undertaker:
|
||||
Undertaker.OnShapeshift(shapeshifter, shapeshifting);
|
||||
break;
|
||||
case CustomRoles.ImperiusCurse:
|
||||
if (shapeshifting)
|
||||
{
|
||||
@@ -1247,10 +1282,13 @@ class ShapeshiftPatch
|
||||
break;
|
||||
case CustomRoles.Camouflager:
|
||||
if (shapeshifting)
|
||||
Camouflager.OnShapeshift();
|
||||
Camouflager.OnShapeshift(shapeshifter, shapeshifting);
|
||||
if (!shapeshifting)
|
||||
Camouflager.OnReportDeadBody();
|
||||
break;
|
||||
case CustomRoles.Hangman:
|
||||
if (Hangman.HangLimit[shapeshifter.PlayerId] < 1 && shapeshifting) shapeshifter.SetKillCooldown(Hangman.ShapeshiftDuration.GetFloat() + 1f);
|
||||
break;
|
||||
case CustomRoles.Hacker:
|
||||
Hacker.OnShapeshift(shapeshifter, shapeshifting, target);
|
||||
break;
|
||||
@@ -1263,15 +1301,15 @@ class ShapeshiftPatch
|
||||
Dazzler.OnShapeshift(shapeshifter, target);
|
||||
break;
|
||||
case CustomRoles.Deathpact:
|
||||
if (shapeshifting)
|
||||
if (shapeshifting)
|
||||
Deathpact.OnShapeshift(shapeshifter, target);
|
||||
break;
|
||||
case CustomRoles.Devourer:
|
||||
if (shapeshifting)
|
||||
if (shapeshifting)
|
||||
Devourer.OnShapeshift(shapeshifter, target);
|
||||
break;
|
||||
case CustomRoles.Twister:
|
||||
Twister.TwistPlayers(shapeshifter);
|
||||
Twister.TwistPlayers(shapeshifter, shapeshifting);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1328,7 +1366,7 @@ class ReportDeadBodyPatch
|
||||
var killerRole = killer?.GetCustomRole();
|
||||
|
||||
//杀戮机器无法报告或拍灯
|
||||
// if (__instance.Is(CustomRoles.Minimalism)) return false;
|
||||
// if (__instance.Is(CustomRoles.Minimalism)) return false;
|
||||
//禁止小黑人报告
|
||||
if (((Utils.IsActive(SystemTypes.Comms) && Options.CommsCamouflage.GetBool()) || Camouflager.IsActive) && Options.DisableReportWhenCC.GetBool()) return false;
|
||||
|
||||
@@ -1350,7 +1388,7 @@ class ReportDeadBodyPatch
|
||||
{
|
||||
__instance.Notify(GetString("BloodhoundNoTrack"));
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
if (Vulture.UnreportablePlayers.Contains(target.PlayerId)) return false;
|
||||
@@ -1369,8 +1407,8 @@ class ReportDeadBodyPatch
|
||||
{
|
||||
new LateTask(() =>
|
||||
{
|
||||
if (GameStates.IsInTask)
|
||||
{
|
||||
if (GameStates.IsInTask)
|
||||
{
|
||||
//__instance.RpcGuardAndKill(__instance);
|
||||
__instance.Notify(GetString("VultureCooldownUp"));
|
||||
}
|
||||
@@ -1386,22 +1424,24 @@ class ReportDeadBodyPatch
|
||||
// 清洁工来扫大街咯
|
||||
if (__instance.Is(CustomRoles.Cleaner))
|
||||
{
|
||||
if (__instance.killTimer > 0) return true;
|
||||
Main.CleanerBodies.Remove(target.PlayerId);
|
||||
Main.CleanerBodies.Add(target.PlayerId);
|
||||
//__instance.RpcGuardAndKill(__instance);
|
||||
__instance.Notify(GetString("CleanerCleanBody"));
|
||||
// __instance.ResetKillCooldown();
|
||||
// __instance.ResetKillCooldown();
|
||||
__instance.SetKillCooldown(Options.KillCooldownAfterCleaning.GetFloat());
|
||||
Logger.Info($"{__instance.GetRealName()} 清理了 {target.PlayerName} 的尸体", "Cleaner");
|
||||
return false;
|
||||
}
|
||||
if (__instance.Is(CustomRoles.Medusa))
|
||||
{
|
||||
if (__instance.killTimer > 0) return true;
|
||||
Main.MedusaBodies.Remove(target.PlayerId);
|
||||
Main.MedusaBodies.Add(target.PlayerId);
|
||||
__instance.RpcGuardAndKill(__instance);
|
||||
__instance.Notify(GetString("MedusaStoneBody"));
|
||||
// __instance.ResetKillCooldown();
|
||||
// __instance.ResetKillCooldown();
|
||||
__instance.SetKillCooldown(Medusa.KillCooldownAfterStoneGazing.GetFloat());
|
||||
Logger.Info($"{__instance.GetRealName()} stoned {target.PlayerName} body", "Medusa");
|
||||
return false;
|
||||
@@ -1425,7 +1465,7 @@ class ReportDeadBodyPatch
|
||||
if (!tpc.Is(CustomRoles.Bait) || (tpc.Is(CustomRoles.Bait) && Options.ObliviousBaitImmune.GetBool())) /* && (target?.Object != null)*/
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (__instance.Is(CustomRoles.Unlucky) && (target?.Object == null || !target.Object.Is(CustomRoles.Bait)))
|
||||
@@ -1465,7 +1505,7 @@ class ReportDeadBodyPatch
|
||||
__instance.RpcMurderPlayerV3(__instance);
|
||||
RPC.PlaySoundRPC(killerID2, Sounds.KillSound);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (target.Object.Is(CustomRoles.Unreportable)) return false;
|
||||
@@ -1563,7 +1603,7 @@ class ReportDeadBodyPatch
|
||||
NiceEraser.OnReportDeadBody();
|
||||
Hacker.OnReportDeadBody();
|
||||
Judge.OnReportDeadBody();
|
||||
// Councillor.OnReportDeadBody();
|
||||
// Councillor.OnReportDeadBody();
|
||||
Greedier.OnReportDeadBody();
|
||||
Tracker.OnReportDeadBody();
|
||||
Addict.OnReportDeadBody();
|
||||
@@ -1577,7 +1617,7 @@ class ReportDeadBodyPatch
|
||||
Tracefinder.OnReportDeadBody(player, target);
|
||||
Mediumshiper.OnReportDeadBody(target);
|
||||
Spiritualist.OnReportDeadBody(target);
|
||||
|
||||
|
||||
foreach (var x in Main.RevolutionistStart)
|
||||
{
|
||||
var tar = Utils.GetPlayerById(x.Key);
|
||||
@@ -1648,7 +1688,7 @@ class FixedUpdatePatch
|
||||
if (GameStates.IsLobby && ((ModUpdater.hasUpdate && ModUpdater.forceUpdate) || ModUpdater.isBroken || !Main.AllowPublicRoom) && AmongUsClient.Instance.IsGamePublic)
|
||||
AmongUsClient.Instance.ChangeGamePublic(false);
|
||||
|
||||
if (GameStates.IsInTask && ReportDeadBodyPatch.CanReport[__instance.PlayerId] && ReportDeadBodyPatch.WaitReport[__instance.PlayerId].Count > 0)
|
||||
if (GameStates.IsInTask && ReportDeadBodyPatch.CanReport[__instance.PlayerId] && ReportDeadBodyPatch.WaitReport[__instance.PlayerId].Any())
|
||||
{
|
||||
var info = ReportDeadBodyPatch.WaitReport[__instance.PlayerId][0];
|
||||
ReportDeadBodyPatch.WaitReport[__instance.PlayerId].Clear();
|
||||
@@ -1922,13 +1962,15 @@ class FixedUpdatePatch
|
||||
CustomWinnerHolder.ResetAndSetWinner(CustomWinner.Vulture);
|
||||
CustomWinnerHolder.WinnerIds.Add(player.PlayerId);
|
||||
}
|
||||
|
||||
|
||||
if (Main.AllKillers.TryGetValue(player.PlayerId, out var ktime) && ktime + Options.WitnessTime.GetInt() < Utils.GetTimeStamp()) Main.AllKillers.Remove(player.PlayerId);
|
||||
|
||||
Pelican.OnFixedUpdate();
|
||||
BallLightning.OnFixedUpdate();
|
||||
Swooper.OnFixedUpdate(player);
|
||||
Wraith.OnFixedUpdate(player);
|
||||
Chameleon.OnFixedUpdate(player);
|
||||
Alchemist.OnFixedUpdate(player);
|
||||
BloodKnight.OnFixedUpdate(player);
|
||||
Spiritcaller.OnFixedUpdate(player);
|
||||
|
||||
@@ -1958,7 +2000,7 @@ class FixedUpdatePatch
|
||||
}
|
||||
}
|
||||
}
|
||||
if (targetDistance.Count() != 0)
|
||||
if (targetDistance.Count != 0)
|
||||
{
|
||||
var min = targetDistance.OrderBy(c => c.Value).FirstOrDefault();//一番値が小さい
|
||||
PlayerControl target = Utils.GetPlayerById(min.Key);
|
||||
@@ -1992,7 +2034,7 @@ class FixedUpdatePatch
|
||||
float dis;
|
||||
foreach (var target in Main.AllAlivePlayerControls)
|
||||
{
|
||||
|
||||
|
||||
{
|
||||
if (target.PlayerId != player.PlayerId && !target.Is(CustomRoles.NWitch) && !target.Is(CustomRoles.Glitch) && !target.Is(CustomRoles.Pestilence))
|
||||
{
|
||||
@@ -2001,7 +2043,7 @@ class FixedUpdatePatch
|
||||
}
|
||||
}
|
||||
}
|
||||
if (targetDistance.Count() != 0)
|
||||
if (targetDistance.Count != 0)
|
||||
{
|
||||
var min = targetDistance.OrderBy(c => c.Value).FirstOrDefault();//一番値が小さい
|
||||
PlayerControl target = Utils.GetPlayerById(min.Key);
|
||||
@@ -2032,7 +2074,7 @@ class FixedUpdatePatch
|
||||
if (GameStates.IsInGame && Main.RefixCooldownDelay <= 0)
|
||||
foreach (var pc in Main.AllPlayerControls)
|
||||
{
|
||||
if (pc.Is(CustomRoles.Vampire) || pc.Is(CustomRoles.Warlock) || pc.Is(CustomRoles.Assassin))
|
||||
if (pc.Is(CustomRoles.Vampire) || pc.Is(CustomRoles.Warlock) || pc.Is(CustomRoles.Assassin) || pc.Is(CustomRoles.Undertaker))
|
||||
Main.AllPlayerKillCooldown[pc.PlayerId] = Options.DefaultKillCooldown * 2;
|
||||
if (pc.Is(CustomRoles.Poisoner))
|
||||
Main.AllPlayerKillCooldown[pc.PlayerId] = Options.DefaultKillCooldown * 2;
|
||||
@@ -2130,7 +2172,7 @@ class FixedUpdatePatch
|
||||
else if (Main.GodMode.Value) RoleText.enabled = true;
|
||||
else RoleText.enabled = false; //そうでなければロールを非表示
|
||||
if (!PlayerControl.LocalPlayer.Data.IsDead && PlayerControl.LocalPlayer.IsRevealedPlayer(__instance) && __instance.Is(CustomRoles.Trickster))
|
||||
{
|
||||
{
|
||||
RoleText.text = Farseer.RandomRole[PlayerControl.LocalPlayer.PlayerId];
|
||||
RoleText.text += Farseer.GetTaskState();
|
||||
}
|
||||
@@ -2189,27 +2231,34 @@ class FixedUpdatePatch
|
||||
if (target.Is(CustomRoles.Marshall) && target.GetPlayerTaskState().IsTaskFinished) //targetがタスクを終わらせたマッドスニッチ
|
||||
Mark.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Marshall), "★")); //targetにマーク付与
|
||||
}
|
||||
/* if (seer.Is(CustomRoles.Jackal)) //seerがインポスター
|
||||
{
|
||||
if (target.Is(CustomRoles.Sidekick)) //targetがタスクを終わらせたマッドスニッチ
|
||||
Mark.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Jackal), " ♥")); //targetにマーク付与
|
||||
}
|
||||
/* if (seer.Is(CustomRoles.Monarch)) //seerがインポスター
|
||||
{
|
||||
if (target.Is(CustomRoles.Knighted)) //targetがタスクを終わらせたマッドスニッチ
|
||||
Mark.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Knighted), " 亗")); //targetにマーク付与
|
||||
} */
|
||||
/* if (seer.Is(CustomRoles.Jackal)) //seerがインポスター
|
||||
{
|
||||
if (target.Is(CustomRoles.Sidekick)) //targetがタスクを終わらせたマッドスニッチ
|
||||
Mark.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Jackal), " ♥")); //targetにマーク付与
|
||||
}
|
||||
/* if (seer.Is(CustomRoles.Monarch)) //seerがインポスター
|
||||
{
|
||||
if (target.Is(CustomRoles.Knighted)) //targetがタスクを終わらせたマッドスニッチ
|
||||
Mark.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Knighted), " 亗")); //targetにマーク付与
|
||||
} */
|
||||
|
||||
/* if (seer.Is(CustomRoles.Sidekick)) //seerがインポスター
|
||||
{
|
||||
if (target.Is(CustomRoles.Sidekick) && Options.SidekickKnowOtherSidekick.GetBool()) //targetがタスクを終わらせたマッドスニッチ
|
||||
Mark.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Jackal), " ♥")); //targetにマーク付与
|
||||
} */
|
||||
/* if (seer.Is(CustomRoles.Sidekick)) //seerがインポスター
|
||||
{
|
||||
if (target.Is(CustomRoles.Sidekick) && Options.SidekickKnowOtherSidekick.GetBool()) //targetがタスクを終わらせたマッドスニッチ
|
||||
Mark.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Jackal), " ♥")); //targetにマーク付与
|
||||
} */
|
||||
if (seer.GetCustomRole().IsCrewmate() && seer.Is(CustomRoles.Madmate) && Marshall.MadmateCanFindMarshall) //seerがインポスター
|
||||
{
|
||||
if (target.Is(CustomRoles.Marshall) && target.GetPlayerTaskState().IsTaskFinished) //targetがタスクを終わらせたマッドスニッチ
|
||||
Mark.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Marshall), "★")); //targetにマーク付与
|
||||
}
|
||||
if (seer.Is(CustomRoles.Lookout))
|
||||
{
|
||||
if (seer.IsAlive() && target.IsAlive())
|
||||
{
|
||||
Mark.Append(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Lookout), " " + target.PlayerId.ToString()) + " ");
|
||||
}
|
||||
}
|
||||
|
||||
//インポスター/キル可能なニュートラルがタスクが終わりそうなSnitchを確認できる
|
||||
Mark.Append(Snitch.GetWarningMark(seer, target));
|
||||
@@ -2219,7 +2268,7 @@ class FixedUpdatePatch
|
||||
if (PlagueBearer.isPlagued(seer.PlayerId, target.PlayerId))
|
||||
{
|
||||
Mark.Append($"<color={Utils.GetRoleColorCode(CustomRoles.PlagueBearer)}>●</color>");
|
||||
// PlagueBearer.SendRPC(seer, target);
|
||||
// PlagueBearer.SendRPC(seer, target);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2264,7 +2313,7 @@ class FixedUpdatePatch
|
||||
|
||||
Mark.Append(Executioner.TargetMark(seer, target));
|
||||
|
||||
// Mark.Append(Lawyer.TargetMark(seer, target));
|
||||
// Mark.Append(Lawyer.TargetMark(seer, target));
|
||||
|
||||
Mark.Append(Gamer.TargetMark(seer, target));
|
||||
|
||||
@@ -2437,11 +2486,11 @@ class FixedUpdatePatch
|
||||
{
|
||||
if (partnerPlayer.Is(CustomRoles.Lovers))
|
||||
{
|
||||
Main.PlayerStates[partnerPlayer.PlayerId].deathReason = PlayerState.DeathReason.FollowingSuicide;
|
||||
if (isExiled)
|
||||
CheckForEndVotingPatch.TryAddAfterMeetingDeathPlayers(PlayerState.DeathReason.FollowingSuicide, partnerPlayer.PlayerId);
|
||||
else
|
||||
partnerPlayer.RpcMurderPlayerV3(partnerPlayer);
|
||||
Main.PlayerStates[partnerPlayer.PlayerId].deathReason = PlayerState.DeathReason.FollowingSuicide;
|
||||
if (isExiled)
|
||||
CheckForEndVotingPatch.TryAddAfterMeetingDeathPlayers(PlayerState.DeathReason.FollowingSuicide, partnerPlayer.PlayerId);
|
||||
else
|
||||
partnerPlayer.RpcMurderPlayerV3(partnerPlayer);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2492,10 +2541,10 @@ class EnterVentPatch
|
||||
pc?.ReportDeadBody(null);
|
||||
}
|
||||
}
|
||||
/* if (pc.Is(CustomRoles.Wraith)) // THIS WAS FOR WEREWOLF TESTING PURPOSES, PLEASE IGNORE
|
||||
{
|
||||
pc?.MyPhysics?.RpcBootFromVent(__instance.Id);
|
||||
} */
|
||||
/* if (pc.Is(CustomRoles.Wraith)) // THIS WAS FOR WEREWOLF TESTING PURPOSES, PLEASE IGNORE
|
||||
{
|
||||
pc?.MyPhysics?.RpcBootFromVent(__instance.Id);
|
||||
} */
|
||||
|
||||
if (pc.Is(CustomRoles.Paranoia))
|
||||
{
|
||||
@@ -2521,8 +2570,8 @@ class EnterVentPatch
|
||||
Utils.NotifyRoles(SpecifySeer: pc);
|
||||
if (pc.AmOwner)
|
||||
{
|
||||
// if (Main.MarioVentCount[pc.PlayerId] % 5 == 0) CustomSoundsManager.Play("MarioCoin");
|
||||
// else CustomSoundsManager.Play("MarioJump");
|
||||
// if (Main.MarioVentCount[pc.PlayerId] % 5 == 0) CustomSoundsManager.Play("MarioCoin");
|
||||
// else CustomSoundsManager.Play("MarioJump");
|
||||
}
|
||||
if (AmongUsClient.Instance.AmHost && Main.MarioVentCount[pc.PlayerId] >= Options.MarioVentNumWin.GetInt())
|
||||
{
|
||||
@@ -2541,6 +2590,7 @@ class EnterVentPatch
|
||||
Swooper.OnEnterVent(pc, __instance);
|
||||
Wraith.OnEnterVent(pc, __instance);
|
||||
Addict.OnEnterVent(pc, __instance);
|
||||
Alchemist.OnEnterVent(pc, __instance.Id);
|
||||
Chameleon.OnEnterVent(pc, __instance);
|
||||
Lurker.OnEnterVent(pc);
|
||||
|
||||
@@ -2556,8 +2606,8 @@ class EnterVentPatch
|
||||
pc.Notify(GetString("VeteranOnGuard"), Options.VeteranSkillDuration.GetFloat());
|
||||
pc.MarkDirtySettings();
|
||||
}
|
||||
else
|
||||
{
|
||||
else
|
||||
{
|
||||
pc.Notify(GetString("OutOfAbilityUsesDoMoreTasks"));
|
||||
}
|
||||
}
|
||||
@@ -2623,17 +2673,17 @@ class EnterVentPatch
|
||||
{
|
||||
Main.DovesOfNeaceNumOfUsed[pc.PlayerId] -= 1;
|
||||
//pc.RpcGuardAndKill(pc);
|
||||
Main.AllAlivePlayerControls.Where(x =>
|
||||
Main.AllAlivePlayerControls.Where(x =>
|
||||
pc.Is(CustomRoles.Madmate) ?
|
||||
(x.CanUseKillButton() && x.GetCustomRole().IsCrewmate()) :
|
||||
(x.CanUseKillButton())
|
||||
).Do(x =>
|
||||
{
|
||||
x.RPCPlayCustomSound("Dove");
|
||||
x.ResetKillCooldown();
|
||||
x.SetKillCooldown();
|
||||
if (x.Is(CustomRoles.SerialKiller))
|
||||
{ SerialKiller.OnReportDeadBody(); }
|
||||
x.RPCPlayCustomSound("Dove");
|
||||
x.ResetKillCooldown();
|
||||
x.SetKillCooldown();
|
||||
if (x.Is(CustomRoles.SerialKiller))
|
||||
{ SerialKiller.OnReportDeadBody(); }
|
||||
x.Notify(Utils.ColorString(Utils.GetRoleColor(CustomRoles.DovesOfNeace), GetString("DovesOfNeaceSkillNotify")));
|
||||
});
|
||||
pc.RPCPlayCustomSound("Dove");
|
||||
@@ -2742,6 +2792,9 @@ class CoEnterVentPatch
|
||||
if (__instance.myPlayer.Is(CustomRoles.Chameleon))
|
||||
Chameleon.OnCoEnterVent(__instance, id);
|
||||
|
||||
if (__instance.myPlayer.Is(CustomRoles.Alchemist) && Alchemist.PotionID == 6)
|
||||
Alchemist.OnCoEnterVent(__instance, id);
|
||||
|
||||
//if (__instance.myPlayer.Is(CustomRoles.DovesOfNeace)) __instance.myPlayer.Notify(GetString("DovesOfNeaceMaxUsage"));
|
||||
//if (__instance.myPlayer.Is(CustomRoles.Veteran)) __instance.myPlayer.Notify(GetString("OutOfAbilityUsesDoMoreTasks"));
|
||||
//if (__instance.myPlayer.Is(CustomRoles.Grenadier)) __instance.myPlayer.Notify(GetString("OutOfAbilityUsesDoMoreTasks"));
|
||||
@@ -2784,7 +2837,7 @@ class PlayerControlCompleteTaskPatch
|
||||
taskState.AllTasksCount += Main.CapitalismAddTask[player.PlayerId];
|
||||
Main.CapitalismAddTask.Remove(player.PlayerId);
|
||||
taskState.CompletedTasksCount++;
|
||||
GameData.Instance.RpcSetTasks(player.PlayerId, new byte[0]); //タスクを再配布
|
||||
GameData.Instance.RpcSetTasks(player.PlayerId, Array.Empty<byte>()); //タスクを再配布
|
||||
player.SyncSettings();
|
||||
Utils.NotifyRoles(SpecifySeer: player);
|
||||
return false;
|
||||
@@ -2850,7 +2903,7 @@ class PlayerControlSetRolePatch
|
||||
{
|
||||
ghostRoles[seer] = RoleTypes.GuardianAngel;
|
||||
}
|
||||
else if((self && targetIsKiller) || (!seerIsKiller && (target.Is(CustomRoleTypes.Impostor) || Main.ResetCamPlayerList.Contains(target.PlayerId) || (target.Is(CustomRoles.Pickpocket)) || (target.Is(CustomRoles.Medusa)) || (target.Is(CustomRoles.Amnesiac)) || (target.Is(CustomRoles.Refugee)))))
|
||||
else if ((self && targetIsKiller) || (!seerIsKiller && (target.Is(CustomRoleTypes.Impostor) || Main.ResetCamPlayerList.Contains(target.PlayerId) || (target.Is(CustomRoles.Pickpocket)) || (target.Is(CustomRoles.Medusa)) || (target.Is(CustomRoles.Amnesiac)) || (target.Is(CustomRoles.Refugee)))))
|
||||
{
|
||||
ghostRoles[seer] = RoleTypes.ImpostorGhost;
|
||||
}
|
||||
|
||||
@@ -176,15 +176,15 @@ class OnPlayerLeftPatch
|
||||
Logger.SendInGame(string.Format(GetString("PlayerLeftByAU-Anticheat"), data?.PlayerName));
|
||||
break;
|
||||
case DisconnectReasons.Error:
|
||||
Logger.SendInGame(string.Format(GetString("PlayerLeftByError"), data?.PlayerName));
|
||||
new LateTask(() =>
|
||||
{
|
||||
CustomWinnerHolder.ResetAndSetWinner(CustomWinner.Error);
|
||||
GameManager.Instance.enabled = false;
|
||||
GameManager.Instance.RpcEndGame(GameOverReason.ImpostorDisconnect, false);
|
||||
}, 3f, "Disconnect Error Auto-end");
|
||||
Logger.SendInGame(string.Format(GetString("PlayerLeftByError"), data?.PlayerName));
|
||||
new LateTask(() =>
|
||||
{
|
||||
CustomWinnerHolder.ResetAndSetWinner(CustomWinner.Error);
|
||||
GameManager.Instance.enabled = false;
|
||||
GameManager.Instance.RpcEndGame(GameOverReason.ImpostorDisconnect, false);
|
||||
}, 3f, "Disconnect Error Auto-end");
|
||||
|
||||
break;
|
||||
break;
|
||||
}
|
||||
|
||||
Logger.Info($"{data?.PlayerName}(ClientID:{data?.Id}/FriendCode:{data?.FriendCode})断开连接(理由:{reason},Ping:{AmongUsClient.Instance.Ping})", "Session");
|
||||
@@ -279,7 +279,7 @@ class CreatePlayerPatch
|
||||
if (!AmongUsClient.Instance.IsGameStarted && client.Character != null)
|
||||
{
|
||||
Main.isChatCommand = true;
|
||||
// Utils.SendMessage($"{GetString("Message.YTPlanNotice")} {PlayerControl.LocalPlayer.FriendCode.GetDevUser().UpName}", client.Character.PlayerId);
|
||||
// Utils.SendMessage($"{GetString("Message.YTPlanNotice")} {PlayerControl.LocalPlayer.FriendCode.GetDevUser().UpName}", client.Character.PlayerId);
|
||||
}
|
||||
}, 3.3f, "DisplayUpWarnning");
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ public static class HeliSabotageSystemPatch
|
||||
{
|
||||
if (!__instance.IsActive || !Options.SabotageTimeControl.GetBool())
|
||||
return;
|
||||
if (AirshipStatus.Instance != null)
|
||||
if (ShipStatus.Instance != null)
|
||||
if (__instance.Countdown >= Options.AirshipReactorTimeLimit.GetFloat())
|
||||
__instance.Countdown = Options.AirshipReactorTimeLimit.GetFloat();
|
||||
}
|
||||
|
||||
+27
-25
@@ -52,7 +52,7 @@ class RepairSystemPatch
|
||||
if (Options.DisableCloseDoor.GetBool() && systemType == SystemTypes.Doors) return false;
|
||||
|
||||
//Note: "SystemTypes.Laboratory" сauses bugs in the Host, it is better not to use
|
||||
if (player.Is(CustomRoles.Fool) &&
|
||||
if (player.Is(CustomRoles.Fool) &&
|
||||
(systemType is
|
||||
SystemTypes.Reactor or
|
||||
SystemTypes.LifeSupp or
|
||||
@@ -60,30 +60,31 @@ class RepairSystemPatch
|
||||
SystemTypes.Electrical))
|
||||
{ return false; }
|
||||
|
||||
if (player.Is(CustomRoles.Unlucky) && player.IsAlive() &&
|
||||
if (player.Is(CustomRoles.Unlucky) && player.IsAlive() &&
|
||||
(systemType is
|
||||
SystemTypes.Doors))
|
||||
{
|
||||
var Ue = IRandom.Instance;
|
||||
if (Ue.Next(0, 100) < Options.UnluckySabotageSuicideChance.GetInt())
|
||||
{
|
||||
player.RpcMurderPlayerV3(player);
|
||||
Main.PlayerStates[player.PlayerId].deathReason = PlayerState.DeathReason.Suicide;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
{
|
||||
var Ue = IRandom.Instance;
|
||||
if (Ue.Next(0, 100) < Options.UnluckySabotageSuicideChance.GetInt())
|
||||
{
|
||||
player.RpcMurderPlayerV3(player);
|
||||
Main.PlayerStates[player.PlayerId].deathReason = PlayerState.DeathReason.Suicide;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/*if (player.Is(CustomRoles.Madmate) && !Options.MadmateCanFixSabotage.GetBool() &&
|
||||
(systemType is
|
||||
SystemTypes.Reactor or
|
||||
SystemTypes.LifeSupp or
|
||||
SystemTypes.Comms or
|
||||
SystemTypes.Electrical))
|
||||
{ return false; }*/
|
||||
/*if (player.Is(CustomRoles.Madmate) && !Options.MadmateCanFixSabotage.GetBool() &&
|
||||
(systemType is
|
||||
SystemTypes.Reactor or
|
||||
SystemTypes.LifeSupp or
|
||||
SystemTypes.Comms or
|
||||
SystemTypes.Electrical))
|
||||
{ return false; }*/
|
||||
|
||||
//SabotageMaster
|
||||
if (player.Is(CustomRoles.SabotageMaster))
|
||||
SabotageMaster.RepairSystem(__instance, systemType, amount);
|
||||
if (player.Is(CustomRoles.Alchemist) && Alchemist.FixNextSabo) Alchemist.RepairSystem(systemType, amount);
|
||||
|
||||
if (systemType == SystemTypes.Electrical && 0 <= amount && amount <= 4)
|
||||
{
|
||||
@@ -108,13 +109,13 @@ class RepairSystemPatch
|
||||
if (player.Is(CustomRoles.Glitch) && (player.IsAlive())) return true;
|
||||
return false;
|
||||
}
|
||||
/*if (systemType == SystemTypes.Doors && AmongUsClient.Instance.NetworkMode != NetworkModes.FreePlay)
|
||||
{
|
||||
if (player.Is(CustomRoleTypes.Impostor) && (player.IsAlive() || !Options.DeadImpCantSabotage.GetBool())) return true;
|
||||
if (player.Is(CustomRoles.Jackal) && Jackal.CanUseSabotage.GetBool()) return true;
|
||||
if (player.Is(CustomRoles.Parasite) && (player.IsAlive() || !Options.DeadImpCantSabotage.GetBool())) return true;
|
||||
return false;
|
||||
}*/
|
||||
/*if (systemType == SystemTypes.Doors && AmongUsClient.Instance.NetworkMode != NetworkModes.FreePlay)
|
||||
{
|
||||
if (player.Is(CustomRoleTypes.Impostor) && (player.IsAlive() || !Options.DeadImpCantSabotage.GetBool())) return true;
|
||||
if (player.Is(CustomRoles.Jackal) && Jackal.CanUseSabotage.GetBool()) return true;
|
||||
if (player.Is(CustomRoles.Parasite) && (player.IsAlive() || !Options.DeadImpCantSabotage.GetBool())) return true;
|
||||
return false;
|
||||
}*/
|
||||
|
||||
if (systemType == SystemTypes.Security && amount == 1)
|
||||
{
|
||||
@@ -166,6 +167,7 @@ class SwitchSystemRepairPatch
|
||||
{
|
||||
if (player.Is(CustomRoles.SabotageMaster))
|
||||
SabotageMaster.SwitchSystemRepair(__instance, amount);
|
||||
if (player.Is(CustomRoles.Alchemist) && Alchemist.FixNextSabo) Alchemist.SwitchSystemRepair(__instance, amount);
|
||||
}
|
||||
}
|
||||
[HarmonyPatch(typeof(ShipStatus), nameof(ShipStatus.Start))]
|
||||
|
||||
@@ -5,9 +5,9 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using TOHE.Modules;
|
||||
using TOHE.Roles.AddOns.Common;
|
||||
using TOHE.Roles.AddOns.Crewmate;
|
||||
using TOHE.Roles.AddOns.Impostor;
|
||||
using TOHE.Roles.AddOns.Common;
|
||||
using TOHE.Roles.Crewmate;
|
||||
using TOHE.Roles.Impostor;
|
||||
using TOHE.Roles.Neutral;
|
||||
@@ -40,6 +40,7 @@ internal class ChangeRoleSettings
|
||||
Main.AllPlayerCustomRoles = new Dictionary<byte, CustomRoles>();
|
||||
Main.WarlockTimer = new();
|
||||
Main.AssassinTimer = new();
|
||||
Main.UndertakerTimer = new();
|
||||
Main.isDoused = new();
|
||||
Main.isDraw = new();
|
||||
Main.isRevealed = new();
|
||||
@@ -66,6 +67,7 @@ internal class ChangeRoleSettings
|
||||
Main.KilledDiseased = new();
|
||||
Main.KilledAntidote = new();
|
||||
Main.WorkaholicAlive = new();
|
||||
Main.SpeedrunnerAlive = new();
|
||||
Main.BaitAlive = new();
|
||||
Main.BoobyTrapBody = new();
|
||||
Main.KillerOfBoobyTrapBody = new();
|
||||
@@ -185,7 +187,7 @@ internal class ChangeRoleSettings
|
||||
FireWorks.Init();
|
||||
Sniper.Init();
|
||||
TimeThief.Init();
|
||||
// Mare.Init();
|
||||
// Mare.Init();
|
||||
Witch.Init();
|
||||
HexMaster.Init();
|
||||
SabotageMaster.Init();
|
||||
@@ -222,7 +224,9 @@ internal class ChangeRoleSettings
|
||||
Divinator.Init();
|
||||
Oracle.Init();
|
||||
Eraser.Init();
|
||||
NiceEraser.Init();
|
||||
Assassin.Init();
|
||||
Undertaker.Init();
|
||||
Sans.Init();
|
||||
Juggernaut.Init();
|
||||
Hacker.Init();
|
||||
@@ -255,6 +259,7 @@ internal class ChangeRoleSettings
|
||||
DoubleShot.Init();
|
||||
Dazzler.Init();
|
||||
Addict.Init();
|
||||
Alchemist.Init();
|
||||
Deathpact.Init();
|
||||
Tracefinder.Init();
|
||||
Devourer.Init();
|
||||
@@ -273,6 +278,8 @@ internal class ChangeRoleSettings
|
||||
PlagueBearer.Init();
|
||||
Reverie.Init();
|
||||
Doomsayer.Init();
|
||||
Disperser.Init();
|
||||
Twister.Init();
|
||||
//Pirate.Init();
|
||||
|
||||
|
||||
@@ -318,7 +325,7 @@ internal class SelectRolesPatch
|
||||
PlayerControl.LocalPlayer.Data.IsDead = true;
|
||||
Main.PlayerStates[PlayerControl.LocalPlayer.PlayerId].SetDead();
|
||||
}
|
||||
|
||||
|
||||
|
||||
SelectCustomRoles();
|
||||
SelectAddonRoles();
|
||||
@@ -481,9 +488,9 @@ internal class SelectRolesPatch
|
||||
case CustomRoles.Sniper:
|
||||
Sniper.Add(pc.PlayerId);
|
||||
break;
|
||||
/* case CustomRoles.Mare:
|
||||
Mare.Add(pc.PlayerId);
|
||||
break; */
|
||||
/* case CustomRoles.Mare:
|
||||
Mare.Add(pc.PlayerId);
|
||||
break; */
|
||||
case CustomRoles.Vampire:
|
||||
Vampire.Add(pc.PlayerId);
|
||||
break;
|
||||
@@ -500,7 +507,7 @@ internal class SelectRolesPatch
|
||||
break;
|
||||
case CustomRoles.Farseer:
|
||||
foreach (var ar in Main.AllPlayerControls)
|
||||
{
|
||||
{
|
||||
Main.isRevealed.Add((pc.PlayerId, ar.PlayerId), false);
|
||||
}
|
||||
Farseer.RandomRole.Add(pc.PlayerId, Farseer.GetRandomCrewRoleString());
|
||||
@@ -616,9 +623,15 @@ internal class SelectRolesPatch
|
||||
case CustomRoles.Eraser:
|
||||
Eraser.Add(pc.PlayerId);
|
||||
break;
|
||||
case CustomRoles.NiceEraser:
|
||||
NiceEraser.Add(pc.PlayerId);
|
||||
break;
|
||||
case CustomRoles.Assassin:
|
||||
Assassin.Add(pc.PlayerId);
|
||||
break;
|
||||
case CustomRoles.Undertaker:
|
||||
Undertaker.Add(pc.PlayerId);
|
||||
break;
|
||||
case CustomRoles.Sans:
|
||||
Sans.Add(pc.PlayerId);
|
||||
break;
|
||||
@@ -640,6 +653,12 @@ internal class SelectRolesPatch
|
||||
case CustomRoles.Councillor:
|
||||
Councillor.Add(pc.PlayerId);
|
||||
break;
|
||||
case CustomRoles.Camouflager:
|
||||
Camouflager.Add(pc.PlayerId);
|
||||
break;
|
||||
case CustomRoles.Twister:
|
||||
Twister.Add(pc.PlayerId);
|
||||
break;
|
||||
case CustomRoles.Mortician:
|
||||
Mortician.Add(pc.PlayerId);
|
||||
break;
|
||||
@@ -739,6 +758,9 @@ internal class SelectRolesPatch
|
||||
case CustomRoles.Addict:
|
||||
Addict.Add(pc.PlayerId);
|
||||
break;
|
||||
case CustomRoles.Alchemist:
|
||||
Alchemist.Add(pc.PlayerId);
|
||||
break;
|
||||
case CustomRoles.Deathpact:
|
||||
Deathpact.Add(pc.PlayerId);
|
||||
break;
|
||||
@@ -769,9 +791,12 @@ internal class SelectRolesPatch
|
||||
case CustomRoles.Doomsayer:
|
||||
Doomsayer.Add(pc.PlayerId);
|
||||
break;
|
||||
//case CustomRoles.Pirate:
|
||||
// Pirate.Add(pc.PlayerId);
|
||||
// break;
|
||||
case CustomRoles.Disperser:
|
||||
Disperser.Add(pc.PlayerId);
|
||||
break;
|
||||
//case CustomRoles.Pirate:
|
||||
// Pirate.Add(pc.PlayerId);
|
||||
// break;
|
||||
}
|
||||
foreach (var subRole in pc.GetCustomSubRoles())
|
||||
{
|
||||
@@ -886,47 +911,47 @@ internal class SelectRolesPatch
|
||||
SetColorPatch.IsAntiGlitchDisabled = false;
|
||||
}
|
||||
private static void ForceAssignRole(CustomRoles role, List<PlayerControl> AllPlayers, CustomRpcSender sender, RoleTypes BaseRole, RoleTypes hostBaseRole = RoleTypes.Crewmate, bool skip = false, int Count = -1)
|
||||
{
|
||||
var count = 1;
|
||||
{
|
||||
var count = 1;
|
||||
|
||||
if (Count != -1)
|
||||
count = Count;
|
||||
for (var i = 0; i < count; i++)
|
||||
if (Count != -1)
|
||||
count = Count;
|
||||
for (var i = 0; i < count; i++)
|
||||
{
|
||||
if (AllPlayers.Count <= 0) break;
|
||||
var rand = new System.Random();
|
||||
var player = AllPlayers[rand.Next(0, AllPlayers.Count)];
|
||||
AllPlayers.Remove(player);
|
||||
Main.AllPlayerCustomRoles[player.PlayerId] = role;
|
||||
if (!skip)
|
||||
{
|
||||
if (AllPlayers.Count <= 0) break;
|
||||
var rand = new System.Random();
|
||||
var player = AllPlayers[rand.Next(0, AllPlayers.Count)];
|
||||
AllPlayers.Remove(player);
|
||||
Main.AllPlayerCustomRoles[player.PlayerId] = role;
|
||||
if (!skip)
|
||||
if (!player.IsModClient())
|
||||
{
|
||||
if (!player.IsModClient())
|
||||
int playerCID = player.GetClientId();
|
||||
sender.RpcSetRole(player, BaseRole, playerCID);
|
||||
//Desyncする人視点で他プレイヤーを科学者にするループ
|
||||
foreach (var pc in PlayerControl.AllPlayerControls)
|
||||
{
|
||||
int playerCID = player.GetClientId();
|
||||
sender.RpcSetRole(player, BaseRole, playerCID);
|
||||
//Desyncする人視点で他プレイヤーを科学者にするループ
|
||||
foreach (var pc in PlayerControl.AllPlayerControls)
|
||||
{
|
||||
if (pc == player) continue;
|
||||
sender.RpcSetRole(pc, RoleTypes.Scientist, playerCID);
|
||||
}
|
||||
//他視点でDesyncする人の役職を科学者にするループ
|
||||
foreach (var pc in PlayerControl.AllPlayerControls)
|
||||
{
|
||||
if (pc == player) continue;
|
||||
if (pc.PlayerId == 0) player.SetRole(RoleTypes.Scientist); //ホスト視点用
|
||||
else sender.RpcSetRole(player, RoleTypes.Scientist, pc.GetClientId());
|
||||
}
|
||||
if (pc == player) continue;
|
||||
sender.RpcSetRole(pc, RoleTypes.Scientist, playerCID);
|
||||
}
|
||||
else
|
||||
//他視点でDesyncする人の役職を科学者にするループ
|
||||
foreach (var pc in PlayerControl.AllPlayerControls)
|
||||
{
|
||||
//ホストは別の役職にする
|
||||
player.SetRole(hostBaseRole); //ホスト視点用
|
||||
sender.RpcSetRole(player, hostBaseRole);
|
||||
if (pc == player) continue;
|
||||
if (pc.PlayerId == 0) player.SetRole(RoleTypes.Scientist); //ホスト視点用
|
||||
else sender.RpcSetRole(player, RoleTypes.Scientist, pc.GetClientId());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//ホストは別の役職にする
|
||||
player.SetRole(hostBaseRole); //ホスト視点用
|
||||
sender.RpcSetRole(player, hostBaseRole);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void AssignLoversRolesFromList()
|
||||
{
|
||||
@@ -944,14 +969,14 @@ internal class SelectRolesPatch
|
||||
var allPlayers = new List<PlayerControl>();
|
||||
foreach (var pc in Main.AllPlayerControls)
|
||||
{
|
||||
if (pc.Is(CustomRoles.GM)
|
||||
|| (pc.HasSubRole() && pc.GetCustomSubRoles().Count >= Options.NoLimitAddonsNumMax.GetInt())
|
||||
|| pc.Is(CustomRoles.Ntr)
|
||||
|| pc.Is(CustomRoles.Dictator)
|
||||
|| pc.Is(CustomRoles.God)
|
||||
|| pc.Is(CustomRoles.FFF)
|
||||
if (pc.Is(CustomRoles.GM)
|
||||
|| (pc.HasSubRole() && pc.GetCustomSubRoles().Count >= Options.NoLimitAddonsNumMax.GetInt())
|
||||
|| pc.Is(CustomRoles.Ntr)
|
||||
|| pc.Is(CustomRoles.Dictator)
|
||||
|| pc.Is(CustomRoles.God)
|
||||
|| pc.Is(CustomRoles.FFF)
|
||||
|| pc.Is(CustomRoles.Bomber)
|
||||
|| pc.Is(CustomRoles.Nuker)
|
||||
|| pc.Is(CustomRoles.Nuker)
|
||||
|| pc.Is(CustomRoles.Provocateur)
|
||||
|| (pc.GetCustomRole().IsCrewmate() && !Options.CrewCanBeInLove.GetBool())
|
||||
|| (pc.GetCustomRole().IsNeutral() && !Options.NeutralCanBeInLove.GetBool())
|
||||
|
||||
Reference in new issue
Block a user