Compare commits

..
4 Commits
Author SHA1 Message Date
Gurge44 3233ffc6af Final touches 2023-11-03 17:52:04 +01:00
Gurge44 6ac685fb81 Finish Chronomancer & Add strings 2023-11-03 17:21:36 +01:00
Gurge44 7404df30bd Finish Nullifier, Start Chronomancer 2023-11-03 16:12:28 +01:00
Gurge44 25a7d14ea0 Start Nullifier, Fix bugs, Add settings 2023-11-03 15:17:28 +01:00
27 changed files with 724 additions and 231 deletions

No files matched your search

+4
View File
@@ -50,6 +50,8 @@ internal static class CustomRolesHelper
CustomRoles.SpeedBooster => CustomRoles.Crewmate,
CustomRoles.Dictator => CustomRoles.Crewmate,
CustomRoles.Inhibitor => CustomRoles.Impostor,
CustomRoles.Chronomancer => CustomRoles.Impostor,
CustomRoles.Nullifier => CustomRoles.Impostor,
CustomRoles.Stealth => CustomRoles.Impostor,
CustomRoles.Penguin => CustomRoles.Shapeshifter,
CustomRoles.Sapper => Options.UsePets.GetBool() ? CustomRoles.Impostor : CustomRoles.Shapeshifter,
@@ -691,6 +693,8 @@ internal static class CustomRolesHelper
CustomRoles.SerialKiller or
CustomRoles.Underdog or
CustomRoles.Inhibitor or
CustomRoles.Nullifier or
CustomRoles.Chronomancer or
CustomRoles.Stealth or
CustomRoles.Penguin or
CustomRoles.Sapper or
+10
View File
@@ -467,6 +467,8 @@ static class ExtendedPlayerControl
CustomRoles.RiftMaker => true,
CustomRoles.Hitman => true,
CustomRoles.Inhibitor => true,
CustomRoles.Chronomancer => true,
CustomRoles.Nullifier => true,
CustomRoles.Stealth => true,
CustomRoles.Penguin => true,
CustomRoles.Sapper => true,
@@ -571,6 +573,8 @@ static class ExtendedPlayerControl
CustomRoles.Sapper => false,
CustomRoles.Penguin => pc.IsAlive(),
CustomRoles.Stealth => pc.IsAlive(),
CustomRoles.Nullifier => pc.IsAlive(),
CustomRoles.Chronomancer => pc.IsAlive(),
CustomRoles.Inhibitor => !Utils.IsActive(SystemTypes.Electrical) && !Utils.IsActive(SystemTypes.Laboratory) && !Utils.IsActive(SystemTypes.Comms) && !Utils.IsActive(SystemTypes.LifeSupp) && !Utils.IsActive(SystemTypes.Reactor),
CustomRoles.Saboteur => Utils.IsActive(SystemTypes.Electrical) || Utils.IsActive(SystemTypes.Laboratory) || Utils.IsActive(SystemTypes.Comms) || Utils.IsActive(SystemTypes.LifeSupp) || Utils.IsActive(SystemTypes.Reactor),
CustomRoles.Sniper => Sniper.CanUseKillButton(pc),
@@ -888,6 +892,12 @@ static class ExtendedPlayerControl
case CustomRoles.Inhibitor:
Main.AllPlayerKillCooldown[player.PlayerId] = Options.InhibitorCDAfterMeetings.GetFloat();
break;
case CustomRoles.Chronomancer:
Chronomancer.SetKillCooldown(player.PlayerId);
break;
case CustomRoles.Nullifier:
Nullifier.SetKillCooldown(player.PlayerId);
break;
case CustomRoles.Stealth:
Stealth.SetKillCooldown(player.PlayerId);
break;
+125 -131
View File
@@ -79,138 +79,132 @@ public class PlayerState
if (!SubRoles.Contains(role))
SubRoles.Add(role);
if (role == CustomRoles.Madmate)
switch (role)
{
countTypes = Options.MadmateCountMode.GetInt() switch
{
0 => CountTypes.OutOfGame,
1 => CountTypes.Impostor,
2 => CountTypes.Crew,
_ => throw new NotImplementedException()
};
SubRoles.Remove(CustomRoles.Charmed);
SubRoles.Remove(CustomRoles.Recruit);
SubRoles.Remove(CustomRoles.Infected);
SubRoles.Remove(CustomRoles.Contagious);
SubRoles.Remove(CustomRoles.Rogue);
SubRoles.Remove(CustomRoles.Rascal);
SubRoles.Remove(CustomRoles.Soulless);
SubRoles.Remove(CustomRoles.Loyal);
SubRoles.Remove(CustomRoles.Admired);
}
if (role == CustomRoles.Charmed)
{
countTypes = Succubus.CharmedCountMode.GetInt() switch
{
0 => CountTypes.OutOfGame,
1 => CountTypes.Succubus,
2 => countTypes,
_ => throw new NotImplementedException()
};
SubRoles.Remove(CustomRoles.Madmate);
SubRoles.Remove(CustomRoles.Recruit);
SubRoles.Remove(CustomRoles.Infected);
SubRoles.Remove(CustomRoles.Contagious);
SubRoles.Remove(CustomRoles.Rogue);
SubRoles.Remove(CustomRoles.Rascal);
SubRoles.Remove(CustomRoles.Soulless);
SubRoles.Remove(CustomRoles.Loyal);
SubRoles.Remove(CustomRoles.Admired);
}
if (role == CustomRoles.LastImpostor)
{
SubRoles.Remove(CustomRoles.Mare);
}
if (role == CustomRoles.Recruit)
{
countTypes = Jackal.SidekickCountMode.GetInt() switch
{
0 => CountTypes.Jackal,
1 => CountTypes.OutOfGame,
2 => countTypes,
_ => throw new NotImplementedException()
};
SubRoles.Remove(CustomRoles.Madmate);
SubRoles.Remove(CustomRoles.Charmed);
SubRoles.Remove(CustomRoles.Infected);
SubRoles.Remove(CustomRoles.Contagious);
SubRoles.Remove(CustomRoles.Rogue);
SubRoles.Remove(CustomRoles.Rascal);
SubRoles.Remove(CustomRoles.Soulless);
SubRoles.Remove(CustomRoles.Loyal);
SubRoles.Remove(CustomRoles.Loyal);
SubRoles.Remove(CustomRoles.Admired);
}
if (role == CustomRoles.Infected)
{
countTypes = CountTypes.Infectious;
SubRoles.Remove(CustomRoles.Madmate);
SubRoles.Remove(CustomRoles.Recruit);
SubRoles.Remove(CustomRoles.Charmed);
SubRoles.Remove(CustomRoles.Rogue);
SubRoles.Remove(CustomRoles.Contagious);
SubRoles.Remove(CustomRoles.Rascal);
SubRoles.Remove(CustomRoles.Soulless);
SubRoles.Remove(CustomRoles.Loyal);
SubRoles.Remove(CustomRoles.Admired);
}
if (role == CustomRoles.Contagious)
{
countTypes = Virus.ContagiousCountMode.GetInt() switch
{
0 => CountTypes.OutOfGame,
1 => CountTypes.Virus,
2 => countTypes,
_ => throw new NotImplementedException()
};
SubRoles.Remove(CustomRoles.Madmate);
SubRoles.Remove(CustomRoles.Recruit);
SubRoles.Remove(CustomRoles.Rogue);
SubRoles.Remove(CustomRoles.Charmed);
SubRoles.Remove(CustomRoles.Infected);
SubRoles.Remove(CustomRoles.Rascal);
SubRoles.Remove(CustomRoles.Soulless);
SubRoles.Remove(CustomRoles.Loyal);
SubRoles.Remove(CustomRoles.Admired);
}
if (role == CustomRoles.Rogue)
{
countTypes = CountTypes.Rogue;
SubRoles.Remove(CustomRoles.Madmate);
SubRoles.Remove(CustomRoles.Recruit);
SubRoles.Remove(CustomRoles.Charmed);
SubRoles.Remove(CustomRoles.Infected);
SubRoles.Remove(CustomRoles.Contagious);
SubRoles.Remove(CustomRoles.Rascal);
SubRoles.Remove(CustomRoles.Soulless);
SubRoles.Remove(CustomRoles.Loyal);
SubRoles.Remove(CustomRoles.Admired);
}
if (role == CustomRoles.Admired)
{
countTypes = CountTypes.Crew;
SubRoles.Remove(CustomRoles.Madmate);
SubRoles.Remove(CustomRoles.Recruit);
SubRoles.Remove(CustomRoles.Charmed);
SubRoles.Remove(CustomRoles.Infected);
SubRoles.Remove(CustomRoles.Contagious);
SubRoles.Remove(CustomRoles.Rascal);
SubRoles.Remove(CustomRoles.Soulless);
SubRoles.Remove(CustomRoles.Loyal);
SubRoles.Remove(CustomRoles.Rogue);
}
if (role == CustomRoles.Soulless)
{
countTypes = CountTypes.OutOfGame;
SubRoles.Remove(CustomRoles.Madmate);
SubRoles.Remove(CustomRoles.Recruit);
SubRoles.Remove(CustomRoles.Charmed);
SubRoles.Remove(CustomRoles.Infected);
SubRoles.Remove(CustomRoles.Contagious);
SubRoles.Remove(CustomRoles.Rascal);
SubRoles.Remove(CustomRoles.Rogue);
SubRoles.Remove(CustomRoles.Loyal);
SubRoles.Remove(CustomRoles.Admired);
case CustomRoles.Madmate:
countTypes = Options.MadmateCountMode.GetInt() switch
{
0 => CountTypes.OutOfGame,
1 => CountTypes.Impostor,
2 => CountTypes.Crew,
_ => throw new NotImplementedException()
};
SubRoles.Remove(CustomRoles.Charmed);
SubRoles.Remove(CustomRoles.Recruit);
SubRoles.Remove(CustomRoles.Infected);
SubRoles.Remove(CustomRoles.Contagious);
SubRoles.Remove(CustomRoles.Rogue);
SubRoles.Remove(CustomRoles.Rascal);
SubRoles.Remove(CustomRoles.Soulless);
SubRoles.Remove(CustomRoles.Loyal);
SubRoles.Remove(CustomRoles.Admired);
break;
case CustomRoles.Charmed:
countTypes = Succubus.CharmedCountMode.GetInt() switch
{
0 => CountTypes.OutOfGame,
1 => CountTypes.Succubus,
2 => countTypes,
_ => throw new NotImplementedException()
};
SubRoles.Remove(CustomRoles.Madmate);
SubRoles.Remove(CustomRoles.Recruit);
SubRoles.Remove(CustomRoles.Infected);
SubRoles.Remove(CustomRoles.Contagious);
SubRoles.Remove(CustomRoles.Rogue);
SubRoles.Remove(CustomRoles.Rascal);
SubRoles.Remove(CustomRoles.Soulless);
SubRoles.Remove(CustomRoles.Loyal);
SubRoles.Remove(CustomRoles.Admired);
break;
case CustomRoles.LastImpostor:
SubRoles.Remove(CustomRoles.Mare);
break;
case CustomRoles.Recruit:
countTypes = Jackal.SidekickCountMode.GetInt() switch
{
0 => CountTypes.Jackal,
1 => CountTypes.OutOfGame,
2 => countTypes,
_ => throw new NotImplementedException()
};
SubRoles.Remove(CustomRoles.Madmate);
SubRoles.Remove(CustomRoles.Charmed);
SubRoles.Remove(CustomRoles.Infected);
SubRoles.Remove(CustomRoles.Contagious);
SubRoles.Remove(CustomRoles.Rogue);
SubRoles.Remove(CustomRoles.Rascal);
SubRoles.Remove(CustomRoles.Soulless);
SubRoles.Remove(CustomRoles.Loyal);
SubRoles.Remove(CustomRoles.Loyal);
SubRoles.Remove(CustomRoles.Admired);
break;
case CustomRoles.Infected:
countTypes = CountTypes.Infectious;
SubRoles.Remove(CustomRoles.Madmate);
SubRoles.Remove(CustomRoles.Recruit);
SubRoles.Remove(CustomRoles.Charmed);
SubRoles.Remove(CustomRoles.Rogue);
SubRoles.Remove(CustomRoles.Contagious);
SubRoles.Remove(CustomRoles.Rascal);
SubRoles.Remove(CustomRoles.Soulless);
SubRoles.Remove(CustomRoles.Loyal);
SubRoles.Remove(CustomRoles.Admired);
break;
case CustomRoles.Contagious:
countTypes = Virus.ContagiousCountMode.GetInt() switch
{
0 => CountTypes.OutOfGame,
1 => CountTypes.Virus,
2 => countTypes,
_ => throw new NotImplementedException()
};
SubRoles.Remove(CustomRoles.Madmate);
SubRoles.Remove(CustomRoles.Recruit);
SubRoles.Remove(CustomRoles.Rogue);
SubRoles.Remove(CustomRoles.Charmed);
SubRoles.Remove(CustomRoles.Infected);
SubRoles.Remove(CustomRoles.Rascal);
SubRoles.Remove(CustomRoles.Soulless);
SubRoles.Remove(CustomRoles.Loyal);
SubRoles.Remove(CustomRoles.Admired);
break;
case CustomRoles.Rogue:
countTypes = CountTypes.Rogue;
SubRoles.Remove(CustomRoles.Madmate);
SubRoles.Remove(CustomRoles.Recruit);
SubRoles.Remove(CustomRoles.Charmed);
SubRoles.Remove(CustomRoles.Infected);
SubRoles.Remove(CustomRoles.Contagious);
SubRoles.Remove(CustomRoles.Rascal);
SubRoles.Remove(CustomRoles.Soulless);
SubRoles.Remove(CustomRoles.Loyal);
SubRoles.Remove(CustomRoles.Admired);
break;
case CustomRoles.Admired:
countTypes = CountTypes.Crew;
SubRoles.Remove(CustomRoles.Madmate);
SubRoles.Remove(CustomRoles.Recruit);
SubRoles.Remove(CustomRoles.Charmed);
SubRoles.Remove(CustomRoles.Infected);
SubRoles.Remove(CustomRoles.Contagious);
SubRoles.Remove(CustomRoles.Rascal);
SubRoles.Remove(CustomRoles.Soulless);
SubRoles.Remove(CustomRoles.Loyal);
SubRoles.Remove(CustomRoles.Rogue);
break;
case CustomRoles.Soulless:
countTypes = CountTypes.OutOfGame;
SubRoles.Remove(CustomRoles.Madmate);
SubRoles.Remove(CustomRoles.Recruit);
SubRoles.Remove(CustomRoles.Charmed);
SubRoles.Remove(CustomRoles.Infected);
SubRoles.Remove(CustomRoles.Contagious);
SubRoles.Remove(CustomRoles.Rascal);
SubRoles.Remove(CustomRoles.Rogue);
SubRoles.Remove(CustomRoles.Loyal);
SubRoles.Remove(CustomRoles.Admired);
break;
}
}
public void RemoveSubRole(CustomRoles role)
+1 -1
View File
@@ -563,7 +563,7 @@ public static class GuessManager
_ = new LateTask(() =>
{
Utils.SendMessage(string.Format(GetString("DoomsayerGuessCountMsg"), Doomsayer.GuessesCount), pc.PlayerId, Utils.ColorString(Utils.GetRoleColor(CustomRoles.Doomsayer), GetString("DoomsayerGuessCountTitle")));
Utils.SendMessage(string.Format(GetString("DoomsayerGuessCountMsg"), Doomsayer.GuessingToWin[pc.PlayerId]), pc.PlayerId, Utils.ColorString(Utils.GetRoleColor(CustomRoles.Doomsayer), GetString("DoomsayerGuessCountTitle")));
}, 0.7f, "Doomsayer Guess Msg 1");
}
+100 -7
View File
@@ -547,6 +547,25 @@ public static class Options
public static OptionItem DisableFuelEngines;
public static OptionItem DisableDivertPower;
public static OptionItem DisableActivateWeatherNodes;
public static OptionItem DisableRoastMarshmallow;
public static OptionItem DisableCollectSamples;
public static OptionItem DisableReplaceParts;
public static OptionItem DisableCollectVegetables;
public static OptionItem DisableMineOres;
public static OptionItem DisableExtractFuel;
public static OptionItem DisableCatchFish;
public static OptionItem DisablePolishGem;
public static OptionItem DisableHelpCritter;
public static OptionItem DisableHoistSupplies;
public static OptionItem DisableFixAntenna;
public static OptionItem DisableBuildSandcastle;
public static OptionItem DisableCrankGenerator;
public static OptionItem DisableMonitorMushroom;
public static OptionItem DisablePlayVideoGame;
public static OptionItem DisableFindSignal;
public static OptionItem DisableThrowFisbee;
public static OptionItem DisableLiftWeights;
public static OptionItem DisableCollectShells;
// Merchant Filters //
public static OptionItem BaitCanBeSold;
@@ -606,6 +625,9 @@ public static class Options
public static OptionItem DisableZiplineOnFungle;
public static OptionItem DisableZiplineFromTop;
public static OptionItem DisableZiplineFromUnder;
public static OptionItem DisableZiplineForImps;
public static OptionItem DisableZiplineForNeutrals;
public static OptionItem DisableZiplineForCrew;
public static OptionItem ZiplineTravelTimeFromBottom;
public static OptionItem ZiplineTravelTimeFromTop;
@@ -1118,6 +1140,10 @@ public static class Options
InhibitorCDAfterMeetings = FloatOptionItem.Create(1511, "AfterMeetingKillCooldown", new(0f, 180f, 2.5f), 22.5f, TabGroup.ImpostorRoles, false)
.SetParent(CustomRoleSpawnChances[CustomRoles.Inhibitor])
.SetValueFormat(OptionFormat.Seconds);
RoleLoadingText = "Impostor roles\nNullifier";
Nullifier.SetupCustomOption();
RoleLoadingText = "Impostor roles\nChronomancer";
Chronomancer.SetupCustomOption();
RoleLoadingText = "Impostor roles\nStealth";
Stealth.SetupCustomOption();
RoleLoadingText = "Impostor roles\nPenguin";
@@ -2669,6 +2695,16 @@ public static class Options
.SetParent(DisableZiplineOnFungle)
.SetColor(new Color32(19, 188, 233, byte.MaxValue));
DisableZiplineForCrew = BooleanOptionItem.Create(22316, "DisableZiplineForCrew", false, TabGroup.GameSettings, false)
.SetParent(DisableZiplineOnFungle)
.SetColor(new Color32(19, 188, 233, byte.MaxValue));
DisableZiplineForImps = BooleanOptionItem.Create(22318, "DisableZiplineForImps", false, TabGroup.GameSettings, false)
.SetParent(DisableZiplineOnFungle)
.SetColor(new Color32(19, 188, 233, byte.MaxValue));
DisableZiplineForNeutrals = BooleanOptionItem.Create(22320, "DisableZiplineForNeutrals", false, TabGroup.GameSettings, false)
.SetParent(DisableZiplineOnFungle)
.SetColor(new Color32(19, 188, 233, byte.MaxValue));
ZiplineTravelTimeFromBottom = FloatOptionItem.Create(22312, "ZiplineTravelTimeFromBottom", new(0.5f, 10f, 0.5f), 4f, TabGroup.GameSettings, false)
.SetColor(new Color32(19, 188, 233, byte.MaxValue));
ZiplineTravelTimeFromTop = FloatOptionItem.Create(22314, "ZiplineTravelTimeFromTop", new(0.5f, 10f, 0.5f), 2f, TabGroup.GameSettings, false)
@@ -3019,6 +3055,15 @@ public static class Options
DisableDressMannequin = BooleanOptionItem.Create(23029, "DisableDressMannequin", false, TabGroup.TaskSettings, false)
.SetParent(DisableShortTasks)
.SetGameMode(CustomGameMode.Standard);
DisableRoastMarshmallow = BooleanOptionItem.Create(23030, "DisableRoastMarshmallow", false, TabGroup.TaskSettings, false)
.SetParent(DisableShortTasks)
.SetGameMode(CustomGameMode.Standard);
DisableCollectSamples = BooleanOptionItem.Create(23031, "DisableCollectSamples", false, TabGroup.TaskSettings, false)
.SetParent(DisableShortTasks)
.SetGameMode(CustomGameMode.Standard);
DisableReplaceParts = BooleanOptionItem.Create(23032, "DisableReplaceParts", false, TabGroup.TaskSettings, false)
.SetParent(DisableShortTasks)
.SetGameMode(CustomGameMode.Standard);
LoadingPercentage = 84;
@@ -3042,6 +3087,27 @@ public static class Options
DisableScanBoardingPass = BooleanOptionItem.Create(23105, "DisableScanBoardingPass", false, TabGroup.TaskSettings, false)
.SetParent(DisableCommonTasks)
.SetGameMode(CustomGameMode.Standard);
DisableCollectVegetables = BooleanOptionItem.Create(23106, "DisableCollectVegetables", false, TabGroup.TaskSettings, false)
.SetParent(DisableCommonTasks)
.SetGameMode(CustomGameMode.Standard);
DisableMineOres = BooleanOptionItem.Create(23107, "DisableMineOres", false, TabGroup.TaskSettings, false)
.SetParent(DisableCommonTasks)
.SetGameMode(CustomGameMode.Standard);
DisableExtractFuel = BooleanOptionItem.Create(23108, "DisableExtractFuel", false, TabGroup.TaskSettings, false)
.SetParent(DisableCommonTasks)
.SetGameMode(CustomGameMode.Standard);
DisableCatchFish = BooleanOptionItem.Create(23109, "DisableCatchFish", false, TabGroup.TaskSettings, false)
.SetParent(DisableCommonTasks)
.SetGameMode(CustomGameMode.Standard);
DisablePolishGem = BooleanOptionItem.Create(23110, "DisablePolishGem", false, TabGroup.TaskSettings, false)
.SetParent(DisableCommonTasks)
.SetGameMode(CustomGameMode.Standard);
DisableHelpCritter = BooleanOptionItem.Create(23111, "DisableHelpCritter", false, TabGroup.TaskSettings, false)
.SetParent(DisableCommonTasks)
.SetGameMode(CustomGameMode.Standard);
DisableHoistSupplies = BooleanOptionItem.Create(23112, "DisableHoistSupplies", false, TabGroup.TaskSettings, false)
.SetParent(DisableCommonTasks)
.SetGameMode(CustomGameMode.Standard);
LoadingPercentage = 85;
@@ -3055,24 +3121,21 @@ public static class Options
DisableUnlockSafe = BooleanOptionItem.Create(23152, "DisableUnlockSafeTask", false, TabGroup.TaskSettings, false)
.SetParent(DisableLongTasks)
.SetGameMode(CustomGameMode.Standard);
LoadingPercentage = 86;
DisableStartReactor = BooleanOptionItem.Create(23153, "DisableStartReactorTask", false, TabGroup.TaskSettings, false)
.SetParent(DisableLongTasks)
.SetGameMode(CustomGameMode.Standard);
DisableResetBreaker = BooleanOptionItem.Create(23154, "DisableResetBreakerTask", false, TabGroup.TaskSettings, false)
.SetParent(DisableLongTasks)
.SetGameMode(CustomGameMode.Standard);
LoadingPercentage = 86;
DisableAlignEngineOutput = BooleanOptionItem.Create(23155, "DisableAlignEngineOutput", false, TabGroup.TaskSettings, false)
.SetParent(DisableLongTasks)
.SetGameMode(CustomGameMode.Standard);
DisableInspectSample = BooleanOptionItem.Create(23156, "DisableInspectSample", false, TabGroup.TaskSettings, false)
.SetParent(DisableLongTasks)
.SetGameMode(CustomGameMode.Standard);
LoadingPercentage = 87;
DisableEmptyChute = BooleanOptionItem.Create(23157, "DisableEmptyChute", false, TabGroup.TaskSettings, false)
.SetParent(DisableLongTasks)
.SetGameMode(CustomGameMode.Standard);
@@ -3086,7 +3149,7 @@ public static class Options
.SetParent(DisableLongTasks)
.SetGameMode(CustomGameMode.Standard);
LoadingPercentage = 88;
LoadingPercentage = 87;
DisableReplaceWaterJug = BooleanOptionItem.Create(23161, "DisableReplaceWaterJug", false, TabGroup.TaskSettings, false)
.SetParent(DisableLongTasks)
@@ -3103,6 +3166,36 @@ public static class Options
DisableStartFans = BooleanOptionItem.Create(23165, "DisableStartFans", false, TabGroup.TaskSettings, false)
.SetParent(DisableLongTasks)
.SetGameMode(CustomGameMode.Standard);
DisableFixAntenna = BooleanOptionItem.Create(23166, "DisableFixAntenna", false, TabGroup.TaskSettings, false)
.SetParent(DisableLongTasks)
.SetGameMode(CustomGameMode.Standard);
DisableBuildSandcastle = BooleanOptionItem.Create(23167, "DisableBuildSandcastle", false, TabGroup.TaskSettings, false)
.SetParent(DisableLongTasks)
.SetGameMode(CustomGameMode.Standard);
LoadingPercentage = 88;
DisableCrankGenerator = BooleanOptionItem.Create(23168, "DisableCrankGenerator", false, TabGroup.TaskSettings, false)
.SetParent(DisableLongTasks)
.SetGameMode(CustomGameMode.Standard);
DisableMonitorMushroom = BooleanOptionItem.Create(23169, "DisableMonitorMushroom", false, TabGroup.TaskSettings, false)
.SetParent(DisableLongTasks)
.SetGameMode(CustomGameMode.Standard);
DisablePlayVideoGame = BooleanOptionItem.Create(23170, "DisablePlayVideoGame", false, TabGroup.TaskSettings, false)
.SetParent(DisableLongTasks)
.SetGameMode(CustomGameMode.Standard);
DisableFindSignal = BooleanOptionItem.Create(23171, "DisableFindSignal", false, TabGroup.TaskSettings, false)
.SetParent(DisableLongTasks)
.SetGameMode(CustomGameMode.Standard);
DisableThrowFisbee = BooleanOptionItem.Create(23172, "DisableThrowFisbee", false, TabGroup.TaskSettings, false)
.SetParent(DisableLongTasks)
.SetGameMode(CustomGameMode.Standard);
DisableLiftWeights = BooleanOptionItem.Create(23173, "DisableLiftWeights", false, TabGroup.TaskSettings, false)
.SetParent(DisableLongTasks)
.SetGameMode(CustomGameMode.Standard);
DisableCollectShells = BooleanOptionItem.Create(23174, "DisableCollectShells", false, TabGroup.TaskSettings, false)
.SetParent(DisableLongTasks)
.SetGameMode(CustomGameMode.Standard);
LoadingPercentage = 89;
+13
View File
@@ -58,6 +58,7 @@ enum CustomRPC
//Roles
SetDrawPlayer,
SyncChronomancer,
StealthDarken,
PenguinSync,
SyncPlagueDoctor,
@@ -629,6 +630,9 @@ internal class RPCHandlerPatch
case CustomRPC.SetMarkedPlayer:
Assassin.ReceiveRPC(reader);
break;
case CustomRPC.SyncChronomancer:
Chronomancer.ReceiveRPC(reader);
break;
case CustomRPC.SetMarkedPlayerV2:
Undertaker.ReceiveRPC(reader);
break;
@@ -1273,6 +1277,15 @@ internal static class RPC
case CustomRoles.Deputy:
Deputy.Add(targetId);
break;
case CustomRoles.NiceEraser:
NiceEraser.Add(targetId);
break;
case CustomRoles.Nullifier:
Nullifier.Add(targetId);
break;
case CustomRoles.Chronomancer:
Chronomancer.Add(targetId);
break;
case CustomRoles.Virus:
Virus.Add(targetId);
break;
+3 -2
View File
@@ -90,12 +90,12 @@ public static class Utils
}
// Modded
nt.SnapTo(location, (ushort)(nt.lastSequenceId + 8));
if (AmongUsClient.Instance.AmHost) nt.SnapTo(location, (ushort)(nt.lastSequenceId + 8));
// Vanilla
MessageWriter messageWriter = AmongUsClient.Instance.StartRpcImmediately(nt.NetId, (byte)RpcCalls.SnapTo, SendOption.Reliable);
NetHelpers.WriteVector2(location, messageWriter);
messageWriter.Write(nt.lastSequenceId + 10U);
messageWriter.Write(nt.lastSequenceId + 100U);
AmongUsClient.Instance.FinishRpcImmediately(messageWriter);
Logger.Info($"{pc.GetNameWithRole().RemoveHtmlTags()} => {location}", "TP");
@@ -2607,6 +2607,7 @@ public static class Utils
if (Jailor.IsEnable) Jailor.AfterMeetingTasks();
if (PlagueDoctor.IsEnable) PlagueDoctor.AfterMeetingTasks();
if (Penguin.IsEnable) Penguin.AfterMeetingTasks();
if (Chronomancer.IsEnable) Chronomancer.OnReportDeadBody();
if (Vulture.IsEnable) Vulture.AfterMeetingTasks();
//if (Baker.IsEnable()) Baker.AfterMeetingTasks();
if (CopyCat.IsEnable()) CopyCat.AfterMeetingTasks();
+1
View File
@@ -466,6 +466,7 @@ class HudManagerPatch
CustomRoles.Tether => Tether.GetHudText(player),
CustomRoles.WeaponMaster => WeaponMaster.GetHudAndProgressText(),
CustomRoles.Postman => Postman.GetHudText(player),
CustomRoles.Chronomancer => Chronomancer.GetHudText(),
CustomRoles.PlagueDoctor => PlagueDoctor.GetLowerTextOthers(player, isForHud: true),
CustomRoles.Stealth => Stealth.GetSuffix(player, isHUD: true),
CustomRoles.Sapper => GetCD_HUDText(Main.SapperCD, Sapper.ShapeshiftCooldown.GetInt(), player.PlayerId),
+14
View File
@@ -253,6 +253,12 @@ class CheckMurderPatch
killer.SyncSettings();
}
break;
case CustomRoles.Nullifier:
if (Nullifier.OnCheckMurder(killer, target)) return false;
break;
case CustomRoles.Chronomancer:
Chronomancer.OnCheckMurder(killer, target);
break;
case CustomRoles.Penguin:
if (!Penguin.OnCheckMurderAsKiller(killer, target)) return false;
break;
@@ -1853,6 +1859,7 @@ class ReportDeadBodyPatch
if (PlagueDoctor.IsEnable) PlagueDoctor.OnReportDeadBody();
if (Penguin.IsEnable) Penguin.OnReportDeadBody();
if (Sapper.IsEnable) Sapper.OnReportDeadBody();
if (Chronomancer.IsEnable) Chronomancer.OnReportDeadBody();
if (Magician.IsEnable) Magician.OnReportDeadBody();
if (Stealth.IsEnable) Stealth.OnStartMeeting();
if (Reckless.IsEnable) Reckless.OnReportDeadBody();
@@ -2059,6 +2066,9 @@ class FixedUpdatePatch
case CustomRoles.Penguin:
Penguin.OnFixedUpdate(player);
break;
case CustomRoles.Chronomancer when !lowLoad:
Chronomancer.OnFixedUpdate(player);
break;
case CustomRoles.Stealth when !lowLoad:
Stealth.OnFixedUpdate(player);
break;
@@ -3663,6 +3673,10 @@ public static class PlayerControlCheckUseZiplinePatch
{
if (Options.DisableZiplineFromTop.GetBool() && fromTop) return false;
if (Options.DisableZiplineFromUnder.GetBool() && !fromTop) return false;
if (__instance.GetCustomRole().IsImpostor() && Options.DisableZiplineForImps.GetBool()) return false;
if (__instance.GetCustomRole().IsNeutral() && Options.DisableZiplineForNeutrals.GetBool()) return false;
if (__instance.GetCustomRole().IsCrewmate() && Options.DisableZiplineForCrew.GetBool()) return false;
}
return true;
+80 -54
View File
@@ -19,60 +19,86 @@ class AddTasksFromListPatch
for (var i = 0; i < unusedTasks.Count; i++)
{
var task = unusedTasks[i];
if (task.TaskType == TaskTypes.SwipeCard && Options.DisableSwipeCard.GetBool()) disabledTasks.Add(task);//SwipeCard task
if (task.TaskType == TaskTypes.SubmitScan && Options.DisableSubmitScan.GetBool()) disabledTasks.Add(task);//SubmitScan tast
if (task.TaskType == TaskTypes.UnlockSafe && Options.DisableUnlockSafe.GetBool()) disabledTasks.Add(task);//UnlockSafe task
if (task.TaskType == TaskTypes.UploadData && Options.DisableUploadData.GetBool()) disabledTasks.Add(task);//UploadData task
if (task.TaskType == TaskTypes.StartReactor && Options.DisableStartReactor.GetBool()) disabledTasks.Add(task);//StartReactor task
if (task.TaskType == TaskTypes.ResetBreakers && Options.DisableResetBreaker.GetBool()) disabledTasks.Add(task);//ResetBreakers task
if (task.TaskType == TaskTypes.VentCleaning && Options.DisableCleanVent.GetBool()) disabledTasks.Add(task);//CleanVent task
if (task.TaskType == TaskTypes.CalibrateDistributor && Options.DisableCalibrateDistributor.GetBool()) disabledTasks.Add(task);//CalibrateDistributor task
if (task.TaskType == TaskTypes.ChartCourse && Options.DisableChartCourse.GetBool()) disabledTasks.Add(task);//ChartCourse task
if (task.TaskType == TaskTypes.StabilizeSteering && Options.DisableStabilizeSteering.GetBool()) disabledTasks.Add(task);//StabilizeSteering task
if (task.TaskType == TaskTypes.CleanO2Filter && Options.DisableCleanO2Filter.GetBool()) disabledTasks.Add(task);//CleanO2Filter task
if (task.TaskType == TaskTypes.UnlockManifolds && Options.DisableUnlockManifolds.GetBool()) disabledTasks.Add(task);//UnlockManifolds task
if (task.TaskType == TaskTypes.PrimeShields && Options.DisablePrimeShields.GetBool()) disabledTasks.Add(task);//PrimeShields task
if (task.TaskType == TaskTypes.MeasureWeather && Options.DisableMeasureWeather.GetBool()) disabledTasks.Add(task);//MeasureWeather task
if (task.TaskType == TaskTypes.BuyBeverage && Options.DisableBuyBeverage.GetBool()) disabledTasks.Add(task);//BuyBeverage task
if (task.TaskType == TaskTypes.AssembleArtifact && Options.DisableAssembleArtifact.GetBool()) disabledTasks.Add(task);//AssembleArtifact task
if (task.TaskType == TaskTypes.SortSamples && Options.DisableSortSamples.GetBool()) disabledTasks.Add(task);//SortSamples task
if (task.TaskType == TaskTypes.ProcessData && Options.DisableProcessData.GetBool()) disabledTasks.Add(task);//ProcessData task
if (task.TaskType == TaskTypes.RunDiagnostics && Options.DisableRunDiagnostics.GetBool()) disabledTasks.Add(task);//RunDiagnostics task
if (task.TaskType == TaskTypes.RepairDrill && Options.DisableRepairDrill.GetBool()) disabledTasks.Add(task);//RepairDrill task
if (task.TaskType == TaskTypes.AlignTelescope && Options.DisableAlignTelescope.GetBool()) disabledTasks.Add(task);//AlignTelescope task
if (task.TaskType == TaskTypes.RecordTemperature && Options.DisableRecordTemperature.GetBool()) disabledTasks.Add(task);//RecordTemperature task
if (task.TaskType == TaskTypes.FillCanisters && Options.DisableFillCanisters.GetBool()) disabledTasks.Add(task);//FillCanisters task
if (task.TaskType == TaskTypes.MonitorOxygen && Options.DisableMonitorTree.GetBool()) disabledTasks.Add(task);//MonitorTree task
if (task.TaskType == TaskTypes.StoreArtifacts && Options.DisableStoreArtifacts.GetBool()) disabledTasks.Add(task);//StoreArtifacts task
if (task.TaskType == TaskTypes.PutAwayPistols && Options.DisablePutAwayPistols.GetBool()) disabledTasks.Add(task);//PutAwayPistols task
if (task.TaskType == TaskTypes.PutAwayRifles && Options.DisablePutAwayRifles.GetBool()) disabledTasks.Add(task);//PutAwayRifles task
if (task.TaskType == TaskTypes.MakeBurger && Options.DisableMakeBurger.GetBool()) disabledTasks.Add(task);//MakeBurger task
if (task.TaskType == TaskTypes.CleanToilet && Options.DisableCleanToilet.GetBool()) disabledTasks.Add(task);//CleanToilet task
if (task.TaskType == TaskTypes.Decontaminate && Options.DisableDecontaminate.GetBool()) disabledTasks.Add(task);//Decontaminate task
if (task.TaskType == TaskTypes.SortRecords && Options.DisableSortRecords.GetBool()) disabledTasks.Add(task);//SortRecords task
if (task.TaskType == TaskTypes.FixShower && Options.DisableFixShower.GetBool()) disabledTasks.Add(task);//FixShower task
if (task.TaskType == TaskTypes.PickUpTowels && Options.DisablePickUpTowels.GetBool()) disabledTasks.Add(task);//PickUpTowels task
if (task.TaskType == TaskTypes.PolishRuby && Options.DisablePolishRuby.GetBool()) disabledTasks.Add(task);//PolishRuby task
if (task.TaskType == TaskTypes.DressMannequin && Options.DisableDressMannequin.GetBool()) disabledTasks.Add(task);//DressMannequin task
if (task.TaskType == TaskTypes.AlignEngineOutput && Options.DisableAlignEngineOutput.GetBool()) disabledTasks.Add(task);//AlignEngineOutput task
if (task.TaskType == TaskTypes.InspectSample && Options.DisableInspectSample.GetBool()) disabledTasks.Add(task);//InspectSample task
if (task.TaskType == TaskTypes.EmptyChute && Options.DisableEmptyChute.GetBool()) disabledTasks.Add(task);//EmptyChute task
if (task.TaskType == TaskTypes.ClearAsteroids && Options.DisableClearAsteroids.GetBool()) disabledTasks.Add(task);//ClearAsteroids task
if (task.TaskType == TaskTypes.WaterPlants && Options.DisableWaterPlants.GetBool()) disabledTasks.Add(task);//WaterPlants task
if (task.TaskType == TaskTypes.OpenWaterways && Options.DisableOpenWaterways.GetBool()) disabledTasks.Add(task);//OpenWaterways task
if (task.TaskType == TaskTypes.ReplaceWaterJug && Options.DisableReplaceWaterJug.GetBool()) disabledTasks.Add(task);//ReplaceWaterJug task
if (task.TaskType == TaskTypes.RebootWifi && Options.DisableRebootWifi.GetBool()) disabledTasks.Add(task);//RebootWifi task
if (task.TaskType == TaskTypes.DevelopPhotos && Options.DisableDevelopPhotos.GetBool()) disabledTasks.Add(task);//DevelopPhotos task
if (task.TaskType == TaskTypes.RewindTapes && Options.DisableRewindTapes.GetBool()) disabledTasks.Add(task);//RewindTapes task
if (task.TaskType == TaskTypes.StartFans && Options.DisableStartFans.GetBool()) disabledTasks.Add(task);//StartFans task
if (task.TaskType == TaskTypes.FixWiring && Options.DisableFixWiring.GetBool()) disabledTasks.Add(task);//FixWiring task (nightmare)
if (task.TaskType == TaskTypes.EnterIdCode && Options.DisableEnterIdCode.GetBool()) disabledTasks.Add(task);//EnterIdCode task
if (task.TaskType == TaskTypes.InsertKeys && Options.DisableInsertKeys.GetBool()) disabledTasks.Add(task);//InsertKeys task
if (task.TaskType == TaskTypes.ScanBoardingPass && Options.DisableScanBoardingPass.GetBool()) disabledTasks.Add(task);//ScanBoardingPass task
if (task.TaskType == TaskTypes.EmptyGarbage && Options.DisableEmptyGarbage.GetBool()) disabledTasks.Add(task);//EmptyGarbage task
if (task.TaskType == TaskTypes.FuelEngines && Options.DisableFuelEngines.GetBool()) disabledTasks.Add(task);//FuelEngines task
if (task.TaskType == TaskTypes.DivertPower && Options.DisableDivertPower.GetBool()) disabledTasks.Add(task);//DivertPower task v1.0a
if (task.TaskType == TaskTypes.FixWeatherNode && Options.DisableActivateWeatherNodes.GetBool()) disabledTasks.Add(task);//ActivateWeatherNodes task
switch (task.TaskType)
{
case TaskTypes.SwipeCard when Options.DisableSwipeCard.GetBool():
case TaskTypes.SubmitScan when Options.DisableSubmitScan.GetBool():
case TaskTypes.UnlockSafe when Options.DisableUnlockSafe.GetBool():
case TaskTypes.UploadData when Options.DisableUploadData.GetBool():
case TaskTypes.StartReactor when Options.DisableStartReactor.GetBool():
case TaskTypes.ResetBreakers when Options.DisableResetBreaker.GetBool():
case TaskTypes.VentCleaning when Options.DisableCleanVent.GetBool():
case TaskTypes.CalibrateDistributor when Options.DisableCalibrateDistributor.GetBool():
case TaskTypes.ChartCourse when Options.DisableChartCourse.GetBool():
case TaskTypes.StabilizeSteering when Options.DisableStabilizeSteering.GetBool():
case TaskTypes.CleanO2Filter when Options.DisableCleanO2Filter.GetBool():
case TaskTypes.UnlockManifolds when Options.DisableUnlockManifolds.GetBool():
case TaskTypes.PrimeShields when Options.DisablePrimeShields.GetBool():
case TaskTypes.MeasureWeather when Options.DisableMeasureWeather.GetBool():
case TaskTypes.BuyBeverage when Options.DisableBuyBeverage.GetBool():
case TaskTypes.AssembleArtifact when Options.DisableAssembleArtifact.GetBool():
case TaskTypes.SortSamples when Options.DisableSortSamples.GetBool():
case TaskTypes.ProcessData when Options.DisableProcessData.GetBool():
case TaskTypes.RunDiagnostics when Options.DisableRunDiagnostics.GetBool():
case TaskTypes.RepairDrill when Options.DisableRepairDrill.GetBool():
case TaskTypes.AlignTelescope when Options.DisableAlignTelescope.GetBool():
case TaskTypes.RecordTemperature when Options.DisableRecordTemperature.GetBool():
case TaskTypes.FillCanisters when Options.DisableFillCanisters.GetBool():
case TaskTypes.MonitorOxygen when Options.DisableMonitorTree.GetBool():
case TaskTypes.StoreArtifacts when Options.DisableStoreArtifacts.GetBool():
case TaskTypes.PutAwayPistols when Options.DisablePutAwayPistols.GetBool():
case TaskTypes.PutAwayRifles when Options.DisablePutAwayRifles.GetBool():
case TaskTypes.MakeBurger when Options.DisableMakeBurger.GetBool():
case TaskTypes.CleanToilet when Options.DisableCleanToilet.GetBool():
case TaskTypes.Decontaminate when Options.DisableDecontaminate.GetBool():
case TaskTypes.SortRecords when Options.DisableSortRecords.GetBool():
case TaskTypes.FixShower when Options.DisableFixShower.GetBool():
case TaskTypes.PickUpTowels when Options.DisablePickUpTowels.GetBool():
case TaskTypes.PolishRuby when Options.DisablePolishRuby.GetBool():
case TaskTypes.DressMannequin when Options.DisableDressMannequin.GetBool():
case TaskTypes.AlignEngineOutput when Options.DisableAlignEngineOutput.GetBool():
case TaskTypes.InspectSample when Options.DisableInspectSample.GetBool():
case TaskTypes.EmptyChute when Options.DisableEmptyChute.GetBool():
case TaskTypes.ClearAsteroids when Options.DisableClearAsteroids.GetBool():
case TaskTypes.WaterPlants when Options.DisableWaterPlants.GetBool():
case TaskTypes.OpenWaterways when Options.DisableOpenWaterways.GetBool():
case TaskTypes.ReplaceWaterJug when Options.DisableReplaceWaterJug.GetBool():
case TaskTypes.RebootWifi when Options.DisableRebootWifi.GetBool():
case TaskTypes.DevelopPhotos when Options.DisableDevelopPhotos.GetBool():
case TaskTypes.RewindTapes when Options.DisableRewindTapes.GetBool():
case TaskTypes.StartFans when Options.DisableStartFans.GetBool():
case TaskTypes.FixWiring when Options.DisableFixWiring.GetBool():
case TaskTypes.EnterIdCode when Options.DisableEnterIdCode.GetBool():
case TaskTypes.InsertKeys when Options.DisableInsertKeys.GetBool():
case TaskTypes.ScanBoardingPass when Options.DisableScanBoardingPass.GetBool():
case TaskTypes.EmptyGarbage when Options.DisableEmptyGarbage.GetBool():
case TaskTypes.FuelEngines when Options.DisableFuelEngines.GetBool():
case TaskTypes.DivertPower when Options.DisableDivertPower.GetBool():
case TaskTypes.FixWeatherNode when Options.DisableActivateWeatherNodes.GetBool():
case TaskTypes.RoastMarshmallow when Options.DisableRoastMarshmallow.GetBool():
case TaskTypes.CollectSamples when Options.DisableCollectSamples.GetBool():
case TaskTypes.ReplaceParts when Options.DisableReplaceParts.GetBool():
case TaskTypes.CollectVegetables when Options.DisableCollectVegetables.GetBool():
case TaskTypes.MineOres when Options.DisableMineOres.GetBool():
case TaskTypes.ExtractFuel when Options.DisableExtractFuel.GetBool():
case TaskTypes.CatchFish when Options.DisableCatchFish.GetBool():
case TaskTypes.PolishGem when Options.DisablePolishGem.GetBool():
case TaskTypes.HelpCritter when Options.DisableHelpCritter.GetBool():
case TaskTypes.HoistSupplies when Options.DisableHoistSupplies.GetBool():
case TaskTypes.FixAntenna when Options.DisableFixAntenna.GetBool():
case TaskTypes.BuildSandcastle when Options.DisableBuildSandcastle.GetBool():
case TaskTypes.CrankGenerator when Options.DisableCrankGenerator.GetBool():
case TaskTypes.MonitorMushroom when Options.DisableMonitorMushroom.GetBool():
case TaskTypes.PlayVideogame when Options.DisablePlayVideoGame.GetBool():
case TaskTypes.TuneRadio when Options.DisableFindSignal.GetBool():
case TaskTypes.TestFrisbee when Options.DisableThrowFisbee.GetBool():
case TaskTypes.LiftWeights when Options.DisableLiftWeights.GetBool():
case TaskTypes.CollectShells when Options.DisableCollectShells.GetBool():
disabledTasks.Add(task);
break;
default:
break;
}
}
for (int i = 0; i < disabledTasks.Count; i++)
{
+9
View File
@@ -271,6 +271,9 @@ internal class ChangeRoleSettings
Succubus.Init();
CursedSoul.Init();
Admirer.Init();
Nullifier.Init();
Deputy.Init();
Chronomancer.Init();
Amnesiac.Init();
Infectious.Init();
Monarch.Init();
@@ -851,6 +854,12 @@ internal class SelectRolesPatch
case CustomRoles.Deputy:
Deputy.Add(pc.PlayerId);
break;
case CustomRoles.Chronomancer:
Chronomancer.Add(pc.PlayerId);
break;
case CustomRoles.Nullifier:
Nullifier.Add(pc.PlayerId);
break;
case CustomRoles.Virus:
Virus.Add(pc.PlayerId);
break;
+4
View File
@@ -62,6 +62,9 @@ tilesteep#2740,Engineer
imagetense#5619,Chinese//Non aum hacker
gabledebb#2717.部屋潰しガチ勢SEX
coopfunny#1119,Terklom
lawnhoppy#4726,封禁
larkyprow#0965,9eb11d42b,hacker
rapidmatch#3120,7a320d676,rawpotato6
## Griefer
setmolar#4374,藏族顶针
@@ -71,6 +74,7 @@ whipsame#5558,齐心 习母
epicdoer#2966,毛泽车
ternaryjog#6069,习皇帝万岁
bigtunnel#1506,카제하야가꿈 //Discrimination against Chinese
feeprim#7337,Athena //Racism
## 冒充开发者
polkaoval#0453,自作Modな橋本環奈
+17 -2
View File
@@ -2463,8 +2463,8 @@
"DivinatorCheck.Result25","<b>{0}</b>是扫把星、骑士、老兵或刽子手其中之一","<b>{0}</b> is either Jinx, Vigilante, Veteran, Enigma, Task Manager, Pyromaniac, or Hangman","","",""
"DivinatorCheck.Result26","<b>{0}</b>是通灵师、灵魂召唤师、灵魂论者、寄生虫、隐匿者或魅影其中之一","<b>{0}</b> is either Medium, Camera Man, Spiritcaller, Spiritualist, Parasite, Swooper, or Wraith","","",""
"DivinatorCheck.Result27","<b>{0}</b>可能是时间操控者, 时间之主, 蚀时者, 千面鬼, 或者狙击手其中之一","<b>{0}</b> is either Time Manager, Curse, Time Master, Time Thief, Tether, Shapemaster, or Sniper"
"DivinatorCheck.Result28","<b>{0}</b>可能是傀儡师, 巫婆, 捕快, 传送师, 龙卷风, 或者嗜血杀手其中之一","<b>{0}</b> is either Puppeteer, Deputy, Aid, Transporter, Twister, Mercenary","","",""
"DivinatorCheck.Result29","<b>{0}</b>可能是船鬼, 展现者, 工作狂, 幻影, 或者恐怖分子其中之一","<b>{0}</b> is either Crewpostor, Marshall, Workaholic, Phantom, Speedrunner, or Terrorist","","",""
"DivinatorCheck.Result28","<b>{0}</b>可能是傀儡师, 巫婆, 捕快, 传送师, 龙卷风, 或者嗜血杀手其中之一","<b>{0}</b> is either Puppeteer, Chronomancer, Deputy, Aid, Transporter, Twister, Mercenary","","",""
"DivinatorCheck.Result29","<b>{0}</b>可能是船鬼, 展现者, 工作狂, 幻影, 或者恐怖分子其中之一","<b>{0}</b> is either Crewpostor, Marshall, Nullifier, Workaholic, Phantom, Speedrunner, or Terrorist","","",""
"## Hidden Role Chances"
"SunnyboyChance","<color=#ff9902>阳光开朗大男孩</color>概率","<color=#ff9902>Sunnyboy</color> Chance","","",""
@@ -2536,6 +2536,21 @@
"FFFCanKillContagious","","Can Kill Contagious Players","","",""
"FFFCanKillAdmired","","Can Kill Admired Players","","",""
"## Chronomancer"
"Chronomancer","","Chronomancer","","",""
"ChronomancerInfo","","Charge up your kill button and go ham!","","",""
"ChronomancerInfoLong","","(Impostors):\nAs the Chronomancer, when your kill cooldown is up, your kill button starts charging (you'll see the percentage of the charge under your name). When you make a kill, you use the charge. Depending on how much you've charged your kill button up, you'll have a 0 second kill cooldown until the charge runs out. When the charge runs out, your kill cooldown is reset.","","",""
"ChronomancerPercent","","<color=#00ffa5>Charge:</color> <b>{0}</b>%","","",""
"ChargeInterval","","Charge Percentage Gained Each Second When Kill Cooldown Is Up","","",""
"ChangeLossInterval","","Charge Percentage Lost Each Second While Killing","","",""
"## Nullifier"
"Nullifier","","Nullifier","","",""
"NullifierInfo","","Remove Ability Uses From Crewmates","","",""
"NullifierInfoLong","","(Impostors):\nAs the Nullifier, clicking your kill button on a player once will remove 1 ability use from them, if they have any. Double click with your kill button on someone to kill them normally.\n\nNote: You won't know if the target had an ability use limit, but the target may notice the removal. Be careful!","","",""
"NullifierUseRemoved","","Ability use removed","","",""
"NullCD","","Ability Cooldown","","",""
"## Ventguard"
"Ventguard","","Ventguard","","",""
"VentguardInfo","","Block vents by entering them","","",""
Can't render this file because it is too large.
+2 -2
View File
@@ -14,7 +14,7 @@ public static class Admirer
public static OptionItem AdmireCooldown;
public static OptionItem KnowTargetRole;
private static int AdmireLimit;
public static int AdmireLimit;
public static void SetupCustomOption()
{
@@ -39,7 +39,7 @@ public static class Admirer
}
public static bool IsEnable => playerIdList.Any();
private static void SendRPC()
public static void SendRPC()
{
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetAdmireLimit, SendOption.Reliable, -1);
writer.Write(AdmireLimit);
+1 -1
View File
@@ -55,7 +55,7 @@ public static class Cleanser
else x = Color.gray;
return Utils.ColorString(x, $"({CleanserUsesOpt.GetInt() - CleanserUses[playerId]})");
}
private static void SendRPC(byte playerId)
public static void SendRPC(byte playerId)
{
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetCleanserCleanLimit, SendOption.Reliable, -1);
writer.Write(playerId);
+8 -7
View File
@@ -17,7 +17,7 @@ public static class Deputy
public static OptionItem DeputyHandcuffCDForTarget;
private static OptionItem DeputyHandcuffDelay;
private static int HandcuffLimit;
public static int HandcuffLimit;
public static void SetupCustomOption()
{
@@ -47,12 +47,12 @@ public static class Deputy
}
public static bool IsEnable => playerIdList.Any();
//private static void SendRPC()
//{
// MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetDeputyHandcuffLimit, SendOption.Reliable, -1);
// writer.Write(HandcuffLimit);
// AmongUsClient.Instance.FinishRpcImmediately(writer);
//}
public static void SendRPC()
{
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetDeputyHandcuffLimit, SendOption.Reliable, -1);
writer.Write(HandcuffLimit);
AmongUsClient.Instance.FinishRpcImmediately(writer);
}
public static void ReceiveRPC(MessageReader reader)
{
HandcuffLimit = reader.ReadInt32();
@@ -65,6 +65,7 @@ public static class Deputy
if (CanBeHandcuffed(target))
{
HandcuffLimit--;
SendRPC();
killer.Notify(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Deputy), GetString("DeputyHandcuffedPlayer")));
+2 -1
View File
@@ -344,9 +344,9 @@ public static class Divinator
=> "Result27",
CustomRoles.Puppeteer or
//CustomRoles.NWitch or
CustomRoles.Deputy or
CustomRoles.Transporter or
CustomRoles.Chronomancer or
CustomRoles.Twister or
CustomRoles.Aid or
CustomRoles.SerialKiller
@@ -355,6 +355,7 @@ public static class Divinator
CustomRoles.Crewpostor or
CustomRoles.Marshall or
CustomRoles.Workaholic or
CustomRoles.Nullifier or
CustomRoles.Phantom or
CustomRoles.Speedrunner or
CustomRoles.Terrorist
+9 -14
View File
@@ -16,7 +16,7 @@ public static class Monarch
public static OptionItem KnightMax;
private static int KnightLimit;
public static int KnightLimit;
public static void SetupCustomOption()
{
@@ -42,12 +42,12 @@ public static class Monarch
}
public static bool IsEnable => playerIdList.Any();
//private static void SendRPC()
//{
// MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetMonarchKnightLimit, SendOption.Reliable, -1);
// writer.Write(KnightLimit);
// AmongUsClient.Instance.FinishRpcImmediately(writer);
//}
public static void SendRPC()
{
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetMonarchKnightLimit, SendOption.Reliable, -1);
writer.Write(KnightLimit);
AmongUsClient.Instance.FinishRpcImmediately(writer);
}
public static void ReceiveRPC(MessageReader reader)
{
KnightLimit = reader.ReadInt32();
@@ -60,6 +60,7 @@ public static class Monarch
if (CanBeKnighted(target))
{
KnightLimit--;
SendRPC();
target.RpcSetCustomRole(CustomRoles.Knighted);
killer.Notify(Utils.ColorString(Utils.GetRoleColor(CustomRoles.Monarch), GetString("MonarchKnightedPlayer")));
@@ -87,11 +88,5 @@ public static class Monarch
return false;
}
public static string GetKnightLimit() => Utils.ColorString(KnightLimit >= 1 ? Utils.GetRoleColor(CustomRoles.Monarch).ShadeColor(0.25f) : Color.gray, $"({KnightLimit})");
public static bool CanBeKnighted(this PlayerControl pc)
{
return pc != null && !pc.GetCustomRole().IsNotKnightable() && !pc.Is(CustomRoles.Knighted) && !pc.Is(CustomRoles.TicketsStealer)
&& !
false
;
}
public static bool CanBeKnighted(this PlayerControl pc) => pc != null && !pc.GetCustomRole().IsNotKnightable() && !pc.Is(CustomRoles.Knighted) && !pc.Is(CustomRoles.TicketsStealer);
}
+2 -2
View File
@@ -15,7 +15,7 @@ internal static class NiceEraser
public static OptionItem HideVote;
private static List<byte> didVote = new();
private static Dictionary<byte, int> EraseLimit = new();
public static Dictionary<byte, int> EraseLimit = new();
private static List<byte> PlayerToErase = new();
public static void SetupCustomOption()
@@ -37,7 +37,7 @@ internal static class NiceEraser
Logger.Info($"{Utils.GetPlayerById(playerId)?.GetNameWithRole().RemoveHtmlTags()} : 剩余{EraseLimit[playerId]}次", "NiceEraser");
}
public static bool IsEnable => playerIdList.Any();
private static void SendRPC(byte playerId)
public static void SendRPC(byte playerId)
{
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetEraseLimit, SendOption.Reliable, -1);
writer.Write(playerId);
+2
View File
@@ -107,6 +107,8 @@ public static class Oracle
CustomRoles.SerialKiller or
// CustomRoles.Mare or
CustomRoles.Inhibitor or
CustomRoles.Nullifier or
CustomRoles.Chronomancer or
CustomRoles.Stealth or
CustomRoles.Penguin or
CustomRoles.Sapper or
+1 -1
View File
@@ -98,7 +98,7 @@ public static class Sheriff
Main.ResetCamPlayerList.Add(playerId);
}
public static bool IsEnable => playerIdList.Any();
private static void SendRPC(byte playerId)
public static void SendRPC(byte playerId)
{
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetSheriffShotLimit, SendOption.Reliable, -1);
writer.Write(playerId);
+1 -1
View File
@@ -36,7 +36,7 @@ public static class SwordsMan
if (!Main.ResetCamPlayerList.Contains(playerId))
Main.ResetCamPlayerList.Add(playerId);
}
private static void SendRPC(byte playerId)
public static void SendRPC(byte playerId)
{
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SwordsManKill, SendOption.Reliable, -1);
writer.Write(playerId);
+129
View File
@@ -0,0 +1,129 @@
using Hazel;
using System.Collections.Generic;
using System.Linq;
using static TOHE.Options;
namespace TOHE.Roles.Impostor
{
public static class Chronomancer
{
private static readonly int Id = 642100;
public static List<byte> playerIdList = new();
private static OptionItem KCD;
private static OptionItem ChargeInterval;
private static OptionItem ChargeLossInterval;
private static bool isRampaging;
private static int chargePercent;
private static long lastUpdate;
public static void SetupCustomOption()
{
SetupSingleRoleOptions(Id, TabGroup.ImpostorRoles, CustomRoles.Chronomancer, 1);
KCD = FloatOptionItem.Create(Id + 11, "KillCooldown", new(0f, 180f, 2.5f), 25f, TabGroup.ImpostorRoles, false)
.SetParent(CustomRoleSpawnChances[CustomRoles.Chronomancer])
.SetValueFormat(OptionFormat.Seconds);
ChargeInterval = IntegerOptionItem.Create(Id + 12, "ChargeInterval", new(1, 20, 1), 5, TabGroup.ImpostorRoles, false)
.SetParent(CustomRoleSpawnChances[CustomRoles.Chronomancer])
.SetValueFormat(OptionFormat.Seconds);
ChargeLossInterval = IntegerOptionItem.Create(Id + 13, "ChargeLossInterval", new(1, 50, 1), 25, TabGroup.ImpostorRoles, false)
.SetParent(CustomRoleSpawnChances[CustomRoles.Chronomancer])
.SetValueFormat(OptionFormat.Seconds);
}
public static void SendRPC()
{
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetAdmireLimit, SendOption.Reliable, -1);
writer.Write(isRampaging);
writer.Write(chargePercent);
writer.Write(lastUpdate);
AmongUsClient.Instance.FinishRpcImmediately(writer);
}
public static void ReceiveRPC(MessageReader reader)
{
isRampaging = reader.ReadBoolean();
chargePercent = reader.ReadInt32();
lastUpdate = long.Parse(reader.ReadString());
}
public static void Init()
{
playerIdList = new();
isRampaging = false;
chargePercent = 0;
lastUpdate = Utils.GetTimeStamp() + 30;
}
public static void Add(byte playerId)
{
playerIdList.Add(playerId);
lastUpdate = Utils.GetTimeStamp() + 10;
}
public static void SetKillCooldown(byte id) => Main.AllPlayerKillCooldown[id] = isRampaging ? 0.01f : KCD.GetFloat();
public static bool IsEnable => playerIdList.Any();
public static void OnCheckMurder(PlayerControl killer, PlayerControl target)
{
if (killer == null) return;
if (target == null) return;
if (!killer.Is(CustomRoles.Chronomancer)) return;
if (chargePercent <= 0) return;
if (!isRampaging)
{
isRampaging = true;
SendRPC();
killer.ResetKillCooldown();
killer.SyncSettings();
}
}
public static void OnFixedUpdate(PlayerControl pc)
{
if (pc == null) return;
if (!pc.Is(CustomRoles.Chronomancer)) return;
if (!GameStates.IsInTask) return;
if (lastUpdate >= Utils.GetTimeStamp()) return;
lastUpdate = Utils.GetTimeStamp();
bool notify = false;
var beforeCharge = chargePercent;
if (isRampaging)
{
chargePercent -= ChargeLossInterval.GetInt();
if (chargePercent <= 0)
{
chargePercent = 0;
isRampaging = false;
pc.ResetKillCooldown();
pc.SyncSettings();
pc.SetKillCooldown();
}
notify = true;
}
else if (pc.killTimer <= 0)
{
chargePercent += ChargeInterval.GetInt();
if (chargePercent > 100) chargePercent = 100;
notify = true;
}
if ((notify || chargePercent == 100) && !pc.IsModClient())
{
pc.Notify(string.Format(Translator.GetString("ChronomancerPercent"), chargePercent));
}
if (beforeCharge != chargePercent)
{
SendRPC();
}
}
public static string GetHudText() => chargePercent > 0 ? string.Format(Translator.GetString("ChronomancerPercent"), chargePercent) : string.Empty;
public static void OnReportDeadBody()
{
lastUpdate = Utils.GetTimeStamp();
chargePercent = 0;
isRampaging = false;
SendRPC();
}
}
}
+179
View File
@@ -0,0 +1,179 @@
using System.Collections.Generic;
using System.Linq;
using TOHE.Roles.Crewmate;
using static TOHE.Options;
namespace TOHE.Roles.Impostor
{
internal class Nullifier
{
private static readonly int Id = 642000;
public static List<byte> playerIdList = new();
public static OptionItem NullCD;
private static OptionItem KCD;
public static void SetupCustomOption()
{
SetupRoleOptions(Id, TabGroup.ImpostorRoles, CustomRoles.Nullifier);
NullCD = FloatOptionItem.Create(Id + 10, "NullCD", new(0f, 180f, 2.5f), 30f, TabGroup.ImpostorRoles, false)
.SetParent(CustomRoleSpawnChances[CustomRoles.Nullifier])
.SetValueFormat(OptionFormat.Seconds);
KCD = FloatOptionItem.Create(Id + 11, "KillCooldown", new(0f, 180f, 2.5f), 25f, TabGroup.ImpostorRoles, false)
.SetParent(CustomRoleSpawnChances[CustomRoles.Nullifier])
.SetValueFormat(OptionFormat.Seconds);
}
public static void Init()
{
playerIdList = new();
}
public static void Add(byte playerId)
{
playerIdList.Add(playerId);
}
public static void SetKillCooldown(byte id) => Main.AllPlayerKillCooldown[id] = KCD.GetFloat();
public static bool IsEnable => playerIdList.Any();
public static bool OnCheckMurder(PlayerControl killer, PlayerControl target)
{
if (killer == null) return false;
if (target == null) return false;
if (!killer.Is(CustomRoles.Nullifier)) return false;
return killer.CheckDoubleTrigger(target, () =>
{
killer.SetKillCooldown(time: NullCD.GetFloat());
killer.Notify(Translator.GetString("NullifierUseRemoved"));
switch (target.GetCustomRole())
{
case CustomRoles.Admirer:
Admirer.AdmireLimit--;
Admirer.SendRPC();
break;
case CustomRoles.Aid:
Aid.UseLimit[target.PlayerId]--;
break;
case CustomRoles.Bloodhound:
Bloodhound.UseLimit[target.PlayerId]--;
Bloodhound.SendRPCPlus(target.PlayerId, true);
break;
case CustomRoles.CameraMan:
CameraMan.UseLimit[target.PlayerId]--;
CameraMan.SendRPC(target.PlayerId, true);
break;
case CustomRoles.Chameleon:
Chameleon.UseLimit[target.PlayerId]--;
Chameleon.SendRPCPlus(target.PlayerId, true);
break;
case CustomRoles.Cleanser:
Cleanser.CleanserUses[target.PlayerId]--;
Cleanser.SendRPC(target.PlayerId);
break;
case CustomRoles.Crusader:
Crusader.CrusaderLimit[target.PlayerId]--;
break;
case CustomRoles.Deputy:
Deputy.HandcuffLimit--;
Deputy.SendRPC();
break;
case CustomRoles.Divinator:
Divinator.CheckLimit[target.PlayerId]--;
Divinator.SendRPC(target.PlayerId, true);
break;
case CustomRoles.Doormaster:
Doormaster.UseLimit[target.PlayerId]--;
Doormaster.SendRPC(target.PlayerId, true);
break;
case CustomRoles.Mediumshiper:
Mediumshiper.ContactLimit[target.PlayerId]--;
Mediumshiper.SendRPC(target.PlayerId, true);
break;
case CustomRoles.Monarch:
Monarch.KnightLimit--;
Monarch.SendRPC();
break;
case CustomRoles.NiceEraser:
NiceEraser.EraseLimit[target.PlayerId]--;
NiceEraser.SendRPC(target.PlayerId);
break;
case CustomRoles.NiceHacker:
if (target.IsModClient())
{
NiceHacker.UseLimitSeconds[target.PlayerId] -= NiceHacker.ModdedClientAbilityUseSecondsMultiplier.GetInt();
NiceHacker.SendRPC(target.PlayerId, NiceHacker.UseLimitSeconds[target.PlayerId]);
}
else
{
NiceHacker.UseLimit[target.PlayerId]--;
}
break;
case CustomRoles.NiceSwapper:
NiceSwapper.NiceSwappermax[target.PlayerId]--;
break;
case CustomRoles.Oracle:
Oracle.CheckLimit[target.PlayerId]--;
Oracle.SendRPC(target.PlayerId, true);
break;
case CustomRoles.ParityCop:
ParityCop.MaxCheckLimit[target.PlayerId]--;
break;
case CustomRoles.Ricochet:
Ricochet.UseLimit[target.PlayerId]--;
Ricochet.SendRPC(target.PlayerId, true);
break;
case CustomRoles.SabotageMaster:
SabotageMaster.UsedSkillCount++;
SabotageMaster.SendRPC(SabotageMaster.UsedSkillCount);
break;
case CustomRoles.Sheriff:
Sheriff.ShotLimit[target.PlayerId]--;
Sheriff.SendRPC(target.PlayerId);
break;
case CustomRoles.Spy:
Spy.UseLimit[target.PlayerId]--;
Spy.SendAbilityRPC(target.PlayerId);
break;
case CustomRoles.SwordsMan:
SwordsMan.killed.Add(target.PlayerId);
SwordsMan.SendRPC(target.PlayerId);
break;
case CustomRoles.Tether:
Tether.UseLimit[target.PlayerId]--;
Tether.SendRPC(target.PlayerId, true);
break;
case CustomRoles.Tracker:
Tracker.TrackLimit[target.PlayerId]--;
Tracker.SendRPC(trackerId: target.PlayerId);
break;
case CustomRoles.Veteran:
Main.VeteranNumOfUsed[target.PlayerId]--;
break;
case CustomRoles.Grenadier:
Main.GrenadierNumOfUsed[target.PlayerId]--;
break;
case CustomRoles.Lighter:
Main.LighterNumOfUsed[target.PlayerId]--;
break;
case CustomRoles.DovesOfNeace:
Main.DovesOfNeaceNumOfUsed[target.PlayerId]--;
break;
case CustomRoles.TimeMaster:
Main.TimeMasterNumOfUsed[target.PlayerId]--;
break;
case CustomRoles.SecurityGuard:
Main.SecurityGuardNumOfUsed[target.PlayerId]--;
break;
case CustomRoles.Ventguard:
Main.VentguardNumberOfAbilityUses--;
break;
default:
break;
}
});
}
}
}
+1 -1
View File
@@ -26,7 +26,7 @@ namespace TOHE.Roles.Impostor
public static void SetupCustomOption()
{
Options.SetupSingleRoleOptions(Id, TabGroup.ImpostorRoles, CustomRoles.Penguin, 1);
OptionAbductTimerLimit = FloatOptionItem.Create(Id + 11, "PenguinAbductTimerLimit", new(5f, 20f, 1f), 10f, TabGroup.ImpostorRoles, false)
OptionAbductTimerLimit = FloatOptionItem.Create(Id + 11, "PenguinAbductTimerLimit", new(1f, 20f, 1f), 10f, TabGroup.ImpostorRoles, false)
.SetParent(Options.CustomRoleSpawnChances[CustomRoles.Penguin])
.SetValueFormat(OptionFormat.Seconds);
OptionMeetingKill = BooleanOptionItem.Create(Id + 12, "PenguinMeetingKill", false, TabGroup.ImpostorRoles, false)
+2 -2
View File
@@ -7,7 +7,7 @@ namespace TOHE.Roles.Impostor
{
public static class Stealth
{
private static readonly int Id = 641800;
private static readonly int Id = 641900;
private static List<byte> playerIdList = new();
private static OptionItem optionExcludeImpostors;
@@ -18,7 +18,7 @@ namespace TOHE.Roles.Impostor
Options.SetupSingleRoleOptions(Id, TabGroup.ImpostorRoles, CustomRoles.Stealth, 1);
optionExcludeImpostors = BooleanOptionItem.Create(Id + 10, "StealthExcludeImpostors", false, TabGroup.ImpostorRoles, false)
.SetParent(Options.CustomRoleSpawnChances[CustomRoles.Stealth]);
optionDarkenDuration = FloatOptionItem.Create(Id + 20, "StealthDarkenDuration", new(0.5f, 5f, 0.5f), 1f, TabGroup.ImpostorRoles, false)
optionDarkenDuration = FloatOptionItem.Create(Id + 20, "StealthDarkenDuration", new(0.5f, 10f, 0.5f), 3f, TabGroup.ImpostorRoles, false)
.SetParent(Options.CustomRoleSpawnChances[CustomRoles.Stealth])
.SetValueFormat(OptionFormat.Seconds);
}
+4 -2
View File
@@ -33,8 +33,8 @@ public class Main : BasePlugin
public static ConfigEntry<string> DebugKeyInput { get; private set; }
public static readonly string MainMenuText = " ";
public const string PluginGuid = "com.gurge44.toheplus";
public const string PluginVersion = "1.3.0";
public const string PluginDisplayVersion = "1.3.0";
public const string PluginVersion = "1.3.1";
public const string PluginDisplayVersion = "1.3.1";
public static readonly string SupportedAUVersion = "2023.10.24";
public const int PluginCreate = 3;
public const bool Canary = false;
@@ -634,6 +634,8 @@ public enum CustomRoles
Miner,
Escapee,
Inhibitor,
Chronomancer,
Nullifier,
Stealth,
Penguin,
Sapper,