Files

156 lines
6.3 KiB
C#

using AmongUs.GameOptions;
using Hazel;
using InnerNet;
using System;
using UnityEngine;
namespace AmongUsRevamped;
[HarmonyPatch(typeof(HudManager), nameof(HudManager.CoShowIntro))]
internal static class CoShowIntroPatch
{
public static void Postfix(IntroCutscene __instance)
{
Logger.Info(" Intro initiated", "CoShowIntro");
if (!AmongUsClient.Instance.AmHost) return;
OptionManager.CacheOptions();
foreach (var p in PlayerControl.AllPlayerControls)
{
p.protectedByGuardianId = -1;
if (NormalGameEndChecker.firstDeath != null && NormalGameEndChecker.firstDeath == p.Data.PlayerName && Options.ShieldFirstDeath.GetBool() && Options.Gamemode.GetValue() != 1)
{
if (Main.NormalOptions.roleOptions.TryGetRoleOptions<GuardianAngelRoleOptionsV12>(RoleTypes.GuardianAngel, out var GuardianAngelOptions))
{
var oldGA = GuardianAngelOptions.ImpostorsCanSeeProtect;
var oldGAProt = GuardianAngelOptions.ProtectionDurationSeconds;
GuardianAngelOptions.ProtectionDurationSeconds = Options.ShieldFirstDeathDuration.GetFloat();
GuardianAngelOptions.ImpostorsCanSeeProtect = true;
_ = new LateTask(() =>
{ GuardianAngelOptions.ImpostorsCanSeeProtect = oldGA;
GuardianAngelOptions.ProtectionDurationSeconds = oldGAProt + 6;
OptionManager.SyncGameOptions();
}, Options.ShieldFirstDeathDuration.GetFloat(), "RevertGAProtTime");
}
OptionManager.SyncGameOptions();
p.RpcProtectPlayer(p, p.cosmetics.ColorId);
p.Data.MarkDirty();
Logger.Info($" {p.Data.PlayerName} has been granted a shield for {Options.ShieldFirstDeathDuration.GetInt()}s", "RoleInfo");
}
p.cosmetics.nameText.text = p.Data.PlayerName;
MurderPlayerPatch.killCount[p.PlayerId] = 0;
MurderPlayerPatch.misfireCount[p.PlayerId] = 0;
PlayerControlCompleteTaskPatch.playerTasksCompleted[p.PlayerId] = 0;
PlayerControlCompleteTaskPatch.tasksPerPlayer[p.PlayerId] = 0;
Logger.Info($" {p.Data.PlayerName} -> {p.Data.RoleType}", "RoleInfo");
}
if (Options.DisableAnnoyingMeetingCalls.GetBool() && !Utils.isHideNSeek)
{
Utils.CanCallMeetings = false;
_ = new LateTask(() =>
{
Utils.CanCallMeetings = true;
}, 34f, "MeetingEnabled");
}
if (Options.Gamemode.GetValue() == 1 && !Utils.isHideNSeek)
{
if (Options.SNSChatInGameExtend.GetBool())
{
Utils.ModeratorChatCommand("Shift and Seek:\n\nImpostors can only kill someone while shapeshifted as them\nMeetings & Reports = Off", $"Crewmates win by tasks/surviving {Options.CrewAutoWinsGameAfter.GetInt()}s\nImpostors win by killing Crewmates", true);
}
if (!Options.SNSSuicideMode.GetBool())
{
if (Main.NormalOptions.roleOptions.TryGetRoleOptions<GuardianAngelRoleOptionsV12>(RoleTypes.GuardianAngel, out var GuardianAngelOptions))
{
GuardianAngelOptions.ProtectionDurationSeconds = 254f;
}
OptionManager.SyncGameOptions();
foreach (var p in PlayerControl.AllPlayerControls)
{
if (p.Data == null || p.Data.IsDead || p.Data.RoleType == RoleTypes.Shapeshifter) continue;
p.RpcProtectPlayer(p, p.cosmetics.ColorId);
p.Data.MarkDirty();
}
if (Options.SNSChatInGameExtend2.GetBool())
{
_ = new LateTask(() =>
{
Utils.ChatCommand(DestroyableSingleton<HudManager>.Instance.Chat, "Correctly killing a target will directly turn them into a ghost and leave no dead body", "", false);
}, 6.6f, "SNSChatInGameExtend2");
}
}
}
if ((GameOptionsManager.Instance.CurrentGameOptions.GetFloat(FloatOptionNames.KillCooldown) == 0.001f) && !Options.DisablePeacePeriod.GetBool())
{
Main.NormalOptions.KillCooldown = 5f;
OptionManager.SyncGameOptions();
_ = new LateTask(() =>
{
Main.NormalOptions.KillCooldown = 0.001f;
OptionManager.SyncGameOptions();
}, 13f, "NoKcdEnabled");
}
if (Options.Gamemode.GetValue() == 3 && !Utils.isHideNSeek)
{
if (Options.PNSChatInGame.GetBool())
{
Main.NormalOptions.KillCooldown = 5f;
OptionManager.SyncGameOptions();
_ = new LateTask(() =>
{
Main.NormalOptions.KillCooldown = 0.001f;
OptionManager.SyncGameOptions();
}, 18f, "NoKcdEnabled");
}
else
{
Main.NormalOptions.KillCooldown = 8f;
OptionManager.SyncGameOptions();
_ = new LateTask(() =>
{
Main.NormalOptions.KillCooldown = 0.001f;
OptionManager.SyncGameOptions();
}, 13f, "NoKcdEnabled");
}
}
if (Options.Gamemode.GetValue() == 3 && Options.PNSChatInGameExtend.GetBool() && !Utils.isHideNSeek)
{
Utils.ModeratorChatCommand($"Poof and Seek:\n\nImpostors can only move while vanished\n Meetings & Reports = Off\nVisibly moving {Options.BadMoveTimeToSuicide.GetInt()}s as Phantom = Suicide", $"Crewmates win by doing tasks or surviving {Options.PNSCrewAutoWinsGameAfter.GetInt()}s\nImpostors win by killing everyone", true);
}
NormalGameEndChecker.firstDeath = "";
}
}
[HarmonyPatch(typeof(IntroCutscene), nameof(IntroCutscene.BeginCrewmate))]
class BeginCrewmatePatch
{
public static void Postfix(IntroCutscene __instance)
{
if (!AmongUsClient.Instance.AmHost) return;
if (Main.GM.Value)
{
__instance.TeamTitle.text = "Game Master";
}
}
}