# Releases
| Among Us - Version| Mod Version | Link |
|----------|-------------|-----------------|
+| 2021.12.15s| v3.4.3| [Download](https://github.com/Eisbison/TheOtherRoles/releases/download/v3.4.2/TheOtherRoles.zip)
+| 2021.12.15s| v3.4.2| [Download](https://github.com/Eisbison/TheOtherRoles/releases/download/v3.4.2/TheOtherRoles.zip)
| 2021.12.15s| v3.4.1| [Download](https://github.com/Eisbison/TheOtherRoles/releases/download/v3.4.1/TheOtherRoles.zip)
| 2021.12.15s| v3.4.0| [Download](https://github.com/Eisbison/TheOtherRoles/releases/download/v3.4.0/TheOtherRoles.zip)
| 2021.12.15s| v3.3.3| [Download](https://github.com/Eisbison/TheOtherRoles/releases/download/v3.3.3/TheOtherRoles.zip)
# Changelog
<details>
<summary>Click to show the Changelog</summary>
+
+**Version 3.4.3**
+- Fixed a bug where "Guesser Is Impostor Chance" crashed the role system
+- Fixed a bug where a sidekicked Hacker was stuck
+- Fixed a bug where a sidekicked Security Guard was stuck
+- Fixed a bug where a disabled Report Button triggered handcuffs
+- Fixed a bug where the Evil Guesser spawn rate was not correct
+- Changed that Cleaner & Vulture exlude each other
+- Changed that the lighter/darker color indicator can be displayed as dead
+
+**Version 3.4.2**
+- Fixed a game breaking bug
**Version 3.4.1**
- Added a new mod option "Show Lighter/Darker" for meetings
\
**NOTE:**
- The Kill and Clean cooldown are shared, preventing them from immediately cleaning their own kills.
+- If there is a Cleaner in the game, there can't be a Vulture.
### Game Options
| Name | Description |
The Vulture does not have any tasks, they have to win the game as a solo.\
The Vulture is a neutral role that must eat a specified number of corpses (depending on the options) in order to win.\
Depending on the options, when a player dies, the Vulture gets an arrow pointing to the corpse.
+If there is a Vulture in the game, there can't be a Cleaner.
### Game Options
| Name | Description |
// Vent Button if enabled
if (PlayerControl.LocalPlayer.roleCanUseVents()) addReplacementHandcuffedButton(arsonistButton, new Vector3(-1.8f, 1f, 0), couldUse: () => { return HudManager.Instance.ImpostorVentButton.currentTarget != null; });
// Report Button
- addReplacementHandcuffedButton(arsonistButton, new Vector3(-0.9f, -0.06f, 0), () => { return HudManager.Instance.ReportButton.enabled; });
+ addReplacementHandcuffedButton(arsonistButton, new Vector3(-0.9f, -0.06f, 0), () => { return HudManager.Instance.ReportButton.graphic.color == Palette.EnabledColor; });
}
else if (!handcuffed && deputyHandcuffedButtons.ContainsKey(PlayerControl.LocalPlayer.PlayerId)) // Reset to original. Disables the replacements, enables the original buttons.
{
blockedRolePairings.Add((byte)RoleId.Warlock, new [] { (byte)RoleId.Vampire});
blockedRolePairings.Add((byte)RoleId.Spy, new [] { (byte)RoleId.Mini});
blockedRolePairings.Add((byte)RoleId.Mini, new [] { (byte)RoleId.Spy});
+ blockedRolePairings.Add((byte)RoleId.Vulture, new [] { (byte)RoleId.Cleaner});
+ blockedRolePairings.Add((byte)RoleId.Cleaner, new [] { (byte)RoleId.Vulture});
}
}
public class TheOtherRolesPlugin : BasePlugin
{
public const string Id = "me.eisbison.theotherroles";
- public const string VersionString = "3.4.2";
+ public const string VersionString = "3.4.3";
public static System.Version Version = System.Version.Parse(VersionString);
internal static BepInEx.Logging.ManualLogSource Logger;
class RoleManagerSelectRolesPatch {
private static int crewValues;
private static int impValues;
+ private static bool isEvilGuesser;
public static void Postfix() {
MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ResetVaribles, Hazel.SendOption.Reliable, -1);
AmongUsClient.Instance.FinishRpcImmediately(writer);
}
// Assign Guesser (chance to be impostor based on setting)
+ isEvilGuesser = rnd.Next(1, 101) <= CustomOptionHolder.guesserIsImpGuesserRate.getSelection() * 10;
if ((CustomOptionHolder.guesserSpawnBothRate.getSelection() > 0 &&
CustomOptionHolder.guesserSpawnRate.getSelection() == 10) ||
CustomOptionHolder.guesserSpawnBothRate.getSelection() == 0) {
-
- if (rnd.Next(1, 101) <= CustomOptionHolder.guesserIsImpGuesserRate.getSelection() * 10)
- data.impSettings.Add((byte)RoleId.EvilGuesser, CustomOptionHolder.guesserSpawnRate.getSelection());
- else data.crewSettings.Add((byte)RoleId.NiceGuesser, CustomOptionHolder.guesserSpawnRate.getSelection());
+ if (isEvilGuesser) data.impSettings.Add((byte)RoleId.EvilGuesser, CustomOptionHolder.guesserSpawnRate.getSelection());
+ else data.crewSettings.Add((byte)RoleId.NiceGuesser, CustomOptionHolder.guesserSpawnRate.getSelection());
}
private static void assignDependentRoles(RoleAssignmentData data) {
// Roles that prob have a dependent role
- bool guesserFlag = CustomOptionHolder.guesserSpawnBothRate.getSelection() > 0 && CustomOptionHolder.guesserSpawnRate.getSelection() > 0;
- bool sheriffFlag = CustomOptionHolder.deputySpawnRate.getSelection() > 0 && CustomOptionHolder.sheriffSpawnRate.getSelection() > 0;
+ bool guesserFlag = CustomOptionHolder.guesserSpawnBothRate.getSelection() > 0
+ && CustomOptionHolder.guesserSpawnRate.getSelection() > 0;
+ bool sheriffFlag = CustomOptionHolder.deputySpawnRate.getSelection() > 0
+ && CustomOptionHolder.sheriffSpawnRate.getSelection() > 0
+ && Sheriff.sheriff == null;
+
if (!guesserFlag && !sheriffFlag) return; // assignDependentRoles is not needed
int crew = data.crewmates.Count < data.maxCrewmateRoles ? data.crewmates.Count : data.maxCrewmateRoles; // Max number of crew loops
bool isSheriff = !sheriffFlag;
bool isGuesser = !guesserFlag;
- bool isEvilGuesser = (rnd.Next(1, 101) <= CustomOptionHolder.guesserIsImpGuesserRate.getSelection() * 10);
-
// --- Simulate Crew & Imp ticket system ---
while (crew > 0 && (!isSheriff || (!isEvilGuesser && !isGuesser))) {
if (!isSheriff && rnd.Next(crewValues) < CustomOptionHolder.sheriffSpawnRate.getSelection()) isSheriff = true;
crewValues -= crewSteps;
}
while (imp > 0 && (isEvilGuesser && !isGuesser)) {
- if (rnd.Next(crewValues) < CustomOptionHolder.guesserSpawnRate.getSelection()) isGuesser = true;
+ if (rnd.Next(impValues) < CustomOptionHolder.guesserSpawnRate.getSelection()) isGuesser = true;
imp--;
impValues -= impSteps;
}
}
// Display lighter / darker color for all alive players
- if (PlayerControl.LocalPlayer != null && !PlayerControl.LocalPlayer.Data.IsDead) {
- if (MeetingHud.Instance != null && MapOptions.showLighterDarker) {
- foreach (PlayerVoteArea player in MeetingHud.Instance.playerStates) {
- var target = Helpers.playerById(player.TargetPlayerId);
- if (target != null) player.NameText.text += $" ({(Helpers.isLighterColor(target.Data.DefaultOutfit.ColorId) ? "L" : "D")})";
- }
+ if (PlayerControl.LocalPlayer != null && MeetingHud.Instance != null && MapOptions.showLighterDarker) {
+ foreach (PlayerVoteArea player in MeetingHud.Instance.playerStates) {
+ var target = Helpers.playerById(player.TargetPlayerId);
+ if (target != null) player.NameText.text += $" ({(Helpers.isLighterColor(target.Data.DefaultOutfit.ColorId) ? "L" : "D")})";
}
}
}
[HarmonyPatch(typeof(ReportButton), nameof(ReportButton.DoClick))]
class ReportButtonDoClickPatch {
public static bool Prefix(ReportButton __instance) {
- if (__instance.isActiveAndEnabled && Deputy.handcuffedPlayers.Contains(PlayerControl.LocalPlayer.PlayerId)) Deputy.setHandcuffedKnows();
+ if (__instance.isActiveAndEnabled && Deputy.handcuffedPlayers.Contains(PlayerControl.LocalPlayer.PlayerId) && __instance.graphic.color == Palette.EnabledColor) Deputy.setHandcuffedKnows();
return !Deputy.handcuffedKnows.ContainsKey(PlayerControl.LocalPlayer.PlayerId);
}
}
DestroyableSingleton<RoleManager>.Instance.SetRole(player, RoleTypes.Crewmate);
erasePlayerRoles(player.PlayerId, true);
Sidekick.sidekick = player;
+ if (player.PlayerId == PlayerControl.LocalPlayer.PlayerId) PlayerControl.LocalPlayer.moveable = true;
}
Jackal.canCreateSidekick = false;
}
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
- <Version>3.4.2</Version>
+ <Version>3.4.3</Version>
<Description>TheOtherRoles</Description>
<Authors>Eisbison</Authors>
</PropertyGroup>