Skip to content

Commit 51a788c

Browse files
committed
v5.1.2 Source Code
1 parent 7dbccf8 commit 51a788c

File tree

25 files changed

+336
-141
lines changed

25 files changed

+336
-141
lines changed

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ Join our [Discord](https://discord.gg/ugyc4EVUYZ) if you have any problems or wa
3939
# Releases
4040
| Among Us - Version| Mod Version | Link |
4141
|----------|-------------|-----------------|
42+
| 2024.10.29s & 2024.10.29e | v5.1.2 | [Download](https://github.com/eDonnes124/Town-Of-Us/releases/download/v5.1.2/ToU.v5.1.2.zip) |
4243
| 2024.9.4s & 2024.9.4e | v5.1.1 | [Download](https://github.com/eDonnes124/Town-Of-Us/releases/download/v5.1.1/ToU.v5.1.1.zip) |
4344
| 2024.9.4s & 2024.9.4e | v5.1.0 | [Download](https://github.com/eDonnes124/Town-Of-Us/releases/download/v5.1.0/ToU.v5.1.0.zip) |
4445
| 2024.3.5s & 2024.3.5e | v5.0.4 | [Download](https://github.com/eDonnes124/Town-Of-Us/releases/download/v5.0.4/ToU.v5.0.4.zip) |
@@ -105,6 +106,12 @@ Join our [Discord](https://discord.gg/ugyc4EVUYZ) if you have any problems or wa
105106
<details>
106107
<summary> Changelog </summary>
107108
<details>
109+
<summary> v5.1.2 </summary>
110+
<ul> <li>Compatibility with the new Among Us version v2024.10.29</li> </ul>
111+
<ul> <li>Minor Bug Fixes</li> </ul>
112+
<ul> <li>Added Retribution back to Hunter as a setting</li> </ul>
113+
</details>
114+
<details>
108115
<summary> v5.1.1 </summary>
109116
<ul> <li>Hotfix Versioning Issue</li> </ul>
110117
</details>
@@ -993,6 +1000,7 @@ however the Hunter may only execute players who have given them probable cause.
9931000
| Hunter Stalk Cooldown | The cooldown of the Hunter's Stalk button | Number | 10s |
9941001
| Hunter Stalk Duration | The duration of the Hunter's Stalk | Number | 25s |
9951002
| Maximum Stalk Uses | Maximum number of times a Hunter can Stalk | Number | 5 |
1003+
| Hunter Kills Last Voter If Voted Out | Whether the Hunter kills the last person that votes them if they are voted out | Toggle | False |
9961004
| Hunter Can Report Who They've Killed | Whether the Hunter is able to report their own kills | Toggle | True |
9971005

9981006
-----------------------
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
using HarmonyLib;
2+
using UnityEngine;
3+
using Object = UnityEngine.Object;
4+
using Il2CppInterop.Runtime.InteropTypes.Arrays;
5+
using System.Linq;
6+
using TownOfUs.CrewmateRoles.MedicMod;
7+
using TownOfUs.Extensions;
8+
using TownOfUs.Patches;
9+
using TownOfUs.Roles;
10+
using TownOfUs.Roles.Modifiers;
11+
using Reactor.Utilities.Extensions;
12+
using TownOfUs.CrewmateRoles.ImitatorMod;
13+
using TownOfUs.CrewmateRoles.SwapperMod;
14+
using TownOfUs.CrewmateRoles.VigilanteMod;
15+
using TownOfUs.ImpostorRoles.BlackmailerMod;
16+
using TownOfUs.Modifiers.AssassinMod;
17+
using TownOfUs.NeutralRoles.DoomsayerMod;
18+
using UnityEngine.UI;
19+
20+
namespace TownOfUs.CrewmateRoles.HunterMod
21+
{
22+
[HarmonyPatch(typeof(MeetingHud), nameof(MeetingHud.CastVote))]
23+
internal class CastVote
24+
{
25+
private static void Postfix(MeetingHud __instance, [HarmonyArgument(0)] byte srcPlayerId, [HarmonyArgument(1)] byte suspectPlayerId)
26+
{
27+
var votingPlayer = Utils.PlayerById(srcPlayerId);
28+
var suspectPlayer = Utils.PlayerById(suspectPlayerId);
29+
if (!suspectPlayer.Is(RoleEnum.Hunter)) return;
30+
var hunter = Role.GetRole<Hunter>(suspectPlayer);
31+
hunter.LastVoted = votingPlayer;
32+
}
33+
}
34+
35+
[HarmonyPatch(typeof(ExileController), nameof(ExileController.BeginForGameplay))]
36+
internal class MeetingExiledEnd
37+
{
38+
private static void Postfix(ExileController __instance)
39+
{
40+
var exiled = __instance.initData.networkedPlayer;
41+
if (exiled == null) return;
42+
var player = exiled.Object;
43+
if (player.Is(RoleEnum.Hunter) && CustomGameOptions.RetributionOnVote)
44+
{
45+
var hunter = Role.GetRole<Hunter>(player);
46+
if (hunter.LastVoted != null && hunter.LastVoted != player && !hunter.LastVoted.Is(RoleEnum.Pestilence))
47+
{
48+
foreach (var role in Role.AllRoles.Where(x => x.RoleType == RoleEnum.Executioner))
49+
{
50+
var exe = (Executioner)role;
51+
if (exe.target == player) return;
52+
}
53+
Utils.Rpc(CustomRPC.Retribution, hunter.Player.PlayerId, hunter.LastVoted.PlayerId);
54+
Retribution.MurderPlayer(hunter, hunter.LastVoted);
55+
}
56+
}
57+
foreach (var role in Role.AllRoles.Where(x => x.RoleType == RoleEnum.Hunter))
58+
{
59+
var hunter = (Hunter)role;
60+
hunter.LastVoted = null;
61+
}
62+
}
63+
}
64+
65+
public class Retribution
66+
{
67+
public static void MurderPlayer(Hunter hunter, PlayerControl player)
68+
{
69+
if (player.Is(Faction.Crewmates)) hunter.IncorrectKills += 1;
70+
else hunter.CorrectKills += 1;
71+
MurderPlayer(player);
72+
}
73+
74+
public static void MurderPlayer(
75+
PlayerControl player,
76+
bool checkLover = true
77+
)
78+
{
79+
var hudManager = DestroyableSingleton<HudManager>.Instance;
80+
if (checkLover)
81+
{
82+
SoundManager.Instance.PlaySound(player.KillSfx, false, 0.8f);
83+
hudManager.KillOverlay.ShowKillAnimation(player.Data, player.Data);
84+
}
85+
var amOwner = player.AmOwner;
86+
if (amOwner)
87+
{
88+
Utils.ShowDeadBodies = true;
89+
hudManager.ShadowQuad.gameObject.SetActive(false);
90+
player.nameText().GetComponent<MeshRenderer>().material.SetInt("_Mask", 0);
91+
player.RpcSetScanner(false);
92+
ImportantTextTask importantTextTask = new GameObject("_Player").AddComponent<ImportantTextTask>();
93+
importantTextTask.transform.SetParent(AmongUsClient.Instance.transform, false);
94+
if (!GameOptionsManager.Instance.currentNormalGameOptions.GhostsDoTasks)
95+
{
96+
for (int i = 0; i < player.myTasks.Count; i++)
97+
{
98+
PlayerTask playerTask = player.myTasks.ToArray()[i];
99+
playerTask.OnRemove();
100+
Object.Destroy(playerTask.gameObject);
101+
}
102+
103+
player.myTasks.Clear();
104+
importantTextTask.Text = DestroyableSingleton<TranslationController>.Instance.GetString(
105+
StringNames.GhostIgnoreTasks,
106+
new Il2CppReferenceArray<Il2CppSystem.Object>(0)
107+
);
108+
}
109+
else
110+
{
111+
importantTextTask.Text = DestroyableSingleton<TranslationController>.Instance.GetString(
112+
StringNames.GhostDoTasks,
113+
new Il2CppReferenceArray<Il2CppSystem.Object>(0));
114+
}
115+
116+
player.myTasks.Insert(0, importantTextTask);
117+
}
118+
player.Die(DeathReason.Kill, false);
119+
if (checkLover && player.IsLover() && CustomGameOptions.BothLoversDie)
120+
{
121+
var otherLover = Modifier.GetModifier<Lover>(player).OtherLover.Player;
122+
if (!otherLover.Is(RoleEnum.Pestilence)) MurderPlayer(otherLover, false);
123+
}
124+
125+
var deadPlayer = new DeadPlayer
126+
{
127+
PlayerId = player.PlayerId,
128+
KillerId = player.PlayerId,
129+
KillTime = System.DateTime.UtcNow,
130+
};
131+
132+
Murder.KilledPlayers.Add(deadPlayer);
133+
134+
AddHauntPatch.AssassinatedPlayers.Add(player);
135+
}
136+
}
137+
}

source/Patches/CrewmateRoles/JailorMod/JailChat.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,12 @@ public static bool Prefix(ChatController __instance, [HarmonyArgument(0)] ref Pl
2323
else if (chatText.ToLower().StartsWith("/ jail")) chatText = chatText[6..];
2424
else if (chatText.ToLower().StartsWith("/ jail ")) chatText = chatText[7..];
2525
JailorMessage = true;
26-
if (sourcePlayer != PlayerControl.LocalPlayer && PlayerControl.LocalPlayer.IsJailed()) sourcePlayer = PlayerControl.LocalPlayer;
26+
if (sourcePlayer != PlayerControl.LocalPlayer && PlayerControl.LocalPlayer.IsJailed() && !sourcePlayer.Data.IsDead) sourcePlayer = PlayerControl.LocalPlayer;
2727
return true;
2828
}
2929
else return false;
3030
}
31+
if (chatText.ToLower().StartsWith("/")) return false;
3132
if (sourcePlayer.IsJailed() && MeetingHud.Instance)
3233
{
3334
if (PlayerControl.LocalPlayer == sourcePlayer || PlayerControl.LocalPlayer.Is(RoleEnum.Jailor)) return true;

source/Patches/CrewmateRoles/ProsecutorMod/AddProsecute.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public class AddProsecute
1010
public static void UpdateButton(Prosecutor role, MeetingHud __instance)
1111
{
1212
var skip = __instance.SkipVoteButton;
13-
role.Prosecute.gameObject.SetActive(skip.gameObject.active && !role.Prosecuted);
13+
role.Prosecute.gameObject.SetActive(skip.gameObject.active && !role.Prosecuted && !role.Player.IsJailed());
1414
role.Prosecute.voteComplete = skip.voteComplete;
1515
role.Prosecute.GetComponent<SpriteRenderer>().enabled = skip.GetComponent<SpriteRenderer>().enabled;
1616
role.Prosecute.GetComponentsInChildren<TextMeshPro>()[0].text = "Prosecute";
@@ -36,7 +36,7 @@ public static void Postfix(MeetingHud __instance)
3636
{
3737
if (!PlayerControl.LocalPlayer.Is(RoleEnum.Prosecutor)) return;
3838
var prosRole = Role.GetRole<Prosecutor>(PlayerControl.LocalPlayer);
39-
if (!PlayerControl.LocalPlayer.IsJailed()) GenButton(prosRole, __instance);
39+
GenButton(prosRole, __instance);
4040
}
4141
}
4242

source/Patches/CrewmateRoles/TransporterMod/PerformKillButton.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public static bool Prefix(KillButton __instance)
2525
{
2626
try
2727
{
28-
PlayerMenu.singleton.Menu.Close();
28+
PlayerMenu.singleton.Menu.ForceClose();
2929
}
3030
catch {
3131
role.TransportPlayer1 = null;

source/Patches/CustomGameOptions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,7 @@ public static class CustomGameOptions
351351
public static float HunterStalkCd => Generate.HunterStalkCd.Get();
352352
public static float HunterStalkDuration => Generate.HunterStalkDuration.Get();
353353
public static int HunterStalkUses => (int)Generate.HunterStalkUses.Get();
354+
public static bool RetributionOnVote => Generate.RetributionOnVote.Get();
354355
public static bool HunterBodyReport => Generate.HunterBodyReport.Get();
355356
public static bool DoomsayerCantObserve => Generate.DoomsayerCantObserve.Get();
356357
public static float HypnotiseCd => Generate.HypnotiseCooldown.Get();

source/Patches/CustomOption/Generate.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ public class Generate
174174
public static CustomNumberOption HunterStalkCd;
175175
public static CustomNumberOption HunterStalkDuration;
176176
public static CustomNumberOption HunterStalkUses;
177+
public static CustomToggleOption RetributionOnVote;
177178
public static CustomToggleOption HunterBodyReport;
178179

179180
public static CustomHeaderOption Engineer;
@@ -797,7 +798,7 @@ public static void GenerateAll()
797798
CooldownFormat);
798799

799800
Haunter =
800-
new CustomHeaderOption(num++, MultiMenu.crewmate, "<color=#d3d3d3FF>Haunter</color>");
801+
new CustomHeaderOption(num++, MultiMenu.crewmate, "<color=#D3D3D3FF>Haunter</color>");
801802
HaunterTasksRemainingClicked =
802803
new CustomNumberOption(num++, MultiMenu.crewmate, "Tasks Remaining When Haunter Can Be Clicked", 5, 1, 15, 1);
803804
HaunterTasksRemainingAlert =
@@ -893,6 +894,8 @@ public static void GenerateAll()
893894
new CustomNumberOption(num++, MultiMenu.crewmate, "Hunter Stalk Duration", 25f, 5f, 60f, 2.5f, CooldownFormat);
894895
HunterStalkUses =
895896
new CustomNumberOption(num++, MultiMenu.crewmate, "Maximum Stalk Uses", 5, 1, 15, 1);
897+
RetributionOnVote =
898+
new CustomToggleOption(num++, MultiMenu.crewmate, "Hunter Kills Last Voter If Voted Out", false);
896899
HunterBodyReport =
897900
new CustomToggleOption(num++, MultiMenu.crewmate, "Hunter Can Report Who They've Killed");
898901

source/Patches/CustomOption/Patches.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -588,15 +588,15 @@ public static void AddSettings(LobbyViewSettingsPane __instance, MultiMenu menu)
588588
{
589589
if (option.Type == CustomOptionType.Header)
590590
{
591-
if (settingsThisHeader % 2 != 0) num -= 0.6f;
591+
if (settingsThisHeader % 2 != 0) num -= 0.85f;
592592
CategoryHeaderMasked header = UnityEngine.Object.Instantiate<CategoryHeaderMasked>(__instance.categoryHeaderOrigin);
593593
header.SetHeader(StringNames.ImpostorsCategory, 61);
594594
header.Title.text = option.Name;
595595
header.transform.SetParent(__instance.settingsContainer);
596596
header.transform.localScale = Vector3.one;
597597
header.transform.localPosition = new Vector3(-9.8f, num, -2f);
598598
__instance.settingsInfo.Add(header.gameObject);
599-
num -= 0.85f;
599+
num -= 1f;
600600
headingCount += 1;
601601
settingsThisHeader = 0;
602602
continue;
@@ -610,7 +610,7 @@ public static void AddSettings(LobbyViewSettingsPane __instance, MultiMenu menu)
610610
if (settingsThisHeader % 2 != 0)
611611
{
612612
panel.transform.localPosition = new Vector3(-3f, num, -2f);
613-
num -= 0.6f;
613+
num -= 0.85f;
614614
}
615615
else
616616
{
@@ -624,7 +624,7 @@ public static void AddSettings(LobbyViewSettingsPane __instance, MultiMenu menu)
624624
}
625625
}
626626

627-
float spacing = (headingCount * 0.85f + settingRowCount * 0.6f + 0.5f) / (headingCount + settingRowCount);
627+
float spacing = (headingCount * 1f + settingRowCount * 0.85f + 2f) / (headingCount + settingRowCount);
628628
__instance.scrollBar.CalculateAndSetYBounds((float)(__instance.settingsInfo.Count + headingCount + settingRowCount), 4f, 6f, spacing);
629629
}
630630
}

source/Patches/CustomOption/Rpc.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public static void ReceiveRpc(MessageReader reader)
5353

5454
var panels = GameObject.FindObjectsOfType<ViewSettingsInfoPanel>();
5555
foreach (var panel in panels) {
56-
if (panel.titleText.text == customOption.Name)
56+
if (panel.titleText.text == customOption.Name && customOption.Type != CustomOptionType.Header)
5757
{
5858
panel.SetInfo(StringNames.ImpostorsCategory, customOption.ToString(), 61);
5959
panel.titleText.text = customOption.Name;

source/Patches/CustomRPC.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ public enum CustomRPC
7676
Hypnotise,
7777
Jail,
7878
Collect,
79+
Retribution,
7980

8081
BypassKill,
8182
BypassMultiKill,

0 commit comments

Comments
 (0)