Skip to content

Commit 05f4e62

Browse files
committed
bump dependencies and improvements
1 parent 721b1c8 commit 05f4e62

File tree

8 files changed

+87
-59
lines changed

8 files changed

+87
-59
lines changed

LaunchpadReloaded/Buttons/Impostor/HackButton.cs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
using LaunchpadReloaded.Features;
22
using LaunchpadReloaded.Modifiers;
3+
using LaunchpadReloaded.Networking;
34
using LaunchpadReloaded.Options.Roles.Impostor;
45
using LaunchpadReloaded.Roles.Impostor;
56
using LaunchpadReloaded.Utilities;
67
using MiraAPI.GameOptions;
78
using MiraAPI.Modifiers;
89
using MiraAPI.Utilities.Assets;
10+
using Reactor.Networking.Attributes;
911
using UnityEngine;
1012

1113
namespace LaunchpadReloaded.Buttons.Impostor;
@@ -24,16 +26,26 @@ public class HackButton : BaseLaunchpadButton
2426

2527
protected override void OnClick()
2628
{
29+
RpcHackPlayers(PlayerControl.LocalPlayer);
30+
}
31+
32+
[MethodRpc((ushort)LaunchpadRpc.Hack)]
33+
public static void RpcHackPlayers(PlayerControl hacker)
34+
{
35+
if (hacker.Data.Role is not HackerRole)
36+
{
37+
hacker.KickForCheating();
38+
return;
39+
}
40+
2741
foreach (var player in PlayerControl.AllPlayerControls)
2842
{
2943
if (player.Data.IsDead || player.Data.Disconnected)
3044
{
3145
continue;
3246
}
3347

34-
player.RpcAddModifier<HackedModifier>();
48+
player.AddModifier<HackedModifier>();
3549
}
36-
37-
PlayerControl.LocalPlayer.RawSetColor(15);
3850
}
3951
}

LaunchpadReloaded/LaunchpadReloaded.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212
</PropertyGroup>
1313

1414
<ItemGroup>
15-
<PackageReference Include="AllOfUs.MiraAPI" Version="0.3.3" />
15+
<PackageReference Include="AllOfUs.MiraAPI" Version="0.3.6" />
1616
<PackageReference Include="Reactor" Version="2.3.1" />
1717
<PackageReference Include="BepInEx.Unity.IL2CPP" Version="6.0.0-be.735" Private="false" ExcludeAssets="runtime;native" />
18-
<PackageReference Include="AmongUs.GameLibs.Steam" Version="2025.10.14" PrivateAssets="all" />
18+
<PackageReference Include="AmongUs.GameLibs.Steam" Version="2025.11.18" PrivateAssets="all" />
1919
<PackageReference Include="BepInEx.AutoPlugin" Version="1.1.0" PrivateAssets="all" />
2020
<PackageReference Include="BepInEx.IL2CPP.MSBuild" Version="2.1.0-rc.1" PrivateAssets="all" ExcludeAssets="runtime">
2121
<IncludeAssets>compile; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

LaunchpadReloaded/LaunchpadReloadedPlugin.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using BepInEx;
1+
global using static Reactor.Utilities.Logger<LaunchpadReloaded.LaunchpadReloadedPlugin>;
2+
using BepInEx;
23
using BepInEx.Configuration;
34
using BepInEx.Unity.IL2CPP;
45
using HarmonyLib;

LaunchpadReloaded/Modifiers/HackedModifier.cs

Lines changed: 47 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66
using MiraAPI.GameOptions;
77
using MiraAPI.Modifiers.Types;
88
using MiraAPI.Networking;
9-
using Reactor.Utilities;
109
using Reactor.Utilities.Extensions;
1110
using System;
1211
using System.Collections;
12+
using BepInEx.Unity.IL2CPP.Utils.Collections;
1313
using TMPro;
1414
using UnityEngine;
1515
using Helpers = LaunchpadReloaded.Utilities.Helpers;
@@ -32,89 +32,91 @@ public class HackedModifier : TimedModifier
3232
private HackNodeComponent? _lastCloseNode;
3333
private HackNodeComponent? _closestNode;
3434

35-
public override void FixedUpdate()
36-
{
37-
base.FixedUpdate();
35+
private Coroutine? _hackEffectCoroutine;
3836

39-
IsImpostor = Player!.Data.Role.IsImpostor;
40-
41-
var randomString = MiraAPI.Utilities.Helpers.RandomString(Helpers.Random.Next(4, 6),
42-
"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#!?$(???#@)$@@@@0000");
43-
Player!.cosmetics.SetName(randomString);
44-
Player.cosmetics.SetNameMask(true);
37+
public override void OnActivate()
38+
{
39+
GradientManager.SetGradientEnabled(Player, false);
40+
Player.cosmetics.SetColor(15);
4541

46-
if (Player.cosmetics.gameObject.activeSelf)
42+
if (Player.cosmetics.CurrentPet != null)
4743
{
48-
Player.cosmetics.gameObject.SetActive(false);
44+
Player.cosmetics.CurrentPet.gameObject.SetActive(false);
4945
}
5046

47+
Player.cosmetics.gameObject.SetActive(false);
48+
5149
if (!Player.AmOwner)
5250
{
5351
return;
5452
}
5553

56-
_closestNode = MiraAPI.Utilities.Helpers.FindClosestObjectOfType(HackNodeComponent.AllNodes, PlayerControl.LocalPlayer.transform.position);
54+
if (Minigame.Instance != null)
55+
{
56+
Minigame.Instance.Close();
57+
Minigame.Instance.Close();
58+
}
5759

58-
if (_closestNode != null && _lastCloseNode != _closestNode)
60+
foreach (var node in HackNodeComponent.AllNodes)
5961
{
60-
foreach (var node in HackNodeComponent.AllNodes)
61-
{
62-
node.SetArrowActive(false);
63-
}
64-
_closestNode.SetArrowActive(true);
62+
node.isActive = true;
6563
}
6664

67-
_lastCloseNode = _closestNode;
65+
_hackedText = MiraAPI.Utilities.Helpers.CreateTextLabel("HackedText", HudManager.Instance.transform, AspectPosition.EdgeAlignments.Top, new Vector3(0, 1, 0));
6866

69-
if (_hackedText != null)
67+
if (IsImpostor)
7068
{
71-
_hackedText.text = $"Find a node on the map to unhack!\nIf you don't unhack in time, <b>YOU WILL DIE.</b>\n<size=70%>{Math.Round(TimeRemaining, 0)} seconds remaining.</size>";
69+
return;
7270
}
71+
72+
_hackEffectCoroutine = Player.StartCoroutine(HackEffect().WrapToIl2Cpp());
7373
}
7474

75-
public override void OnActivate()
75+
public override void FixedUpdate()
7676
{
77-
GradientManager.SetGradientEnabled(Player!, false);
78-
Player!.cosmetics.SetColor(15);
77+
base.FixedUpdate();
7978

80-
if (Player.cosmetics.CurrentPet != null)
79+
IsImpostor = Player.Data.Role.IsImpostor;
80+
81+
var randomString = MiraAPI.Utilities.Helpers.RandomString(Helpers.Random.Next(4, 6),
82+
"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#!?$(???#@)$@@@@0000");
83+
Player.cosmetics.SetName(randomString);
84+
Player.cosmetics.SetNameMask(true);
85+
86+
if (Player.cosmetics.gameObject.activeSelf)
8187
{
82-
Player.cosmetics.CurrentPet.gameObject.SetActive(false);
88+
Player.cosmetics.gameObject.SetActive(false);
8389
}
8490

85-
Player.cosmetics.gameObject.SetActive(false);
86-
8791
if (!Player.AmOwner)
8892
{
8993
return;
9094
}
9195

92-
if (Minigame.Instance != null)
93-
{
94-
Minigame.Instance.Close();
95-
Minigame.Instance.Close();
96-
}
96+
_closestNode = MiraAPI.Utilities.Helpers.FindClosestObjectOfType(HackNodeComponent.AllNodes, PlayerControl.LocalPlayer.transform.position);
9797

98-
foreach (var node in HackNodeComponent.AllNodes)
98+
if (_closestNode != null && _lastCloseNode != _closestNode)
9999
{
100-
node.isActive = true;
100+
foreach (var node in HackNodeComponent.AllNodes)
101+
{
102+
node.SetArrowActive(false);
103+
}
104+
_closestNode.SetArrowActive(true);
101105
}
102106

103-
_hackedText = MiraAPI.Utilities.Helpers.CreateTextLabel("HackedText", HudManager.Instance.transform, AspectPosition.EdgeAlignments.Top, new Vector3(0, 1, 0));
107+
_lastCloseNode = _closestNode;
104108

105-
if (IsImpostor)
109+
if (_hackedText != null)
106110
{
107-
return;
111+
_hackedText.text = $"Find a node on the map to unhack!\nIf you don't unhack in time, <b>YOU WILL DIE.</b>\n<size=70%>{Math.Round(TimeRemaining, 0)} seconds remaining.</size>";
108112
}
109-
110-
Coroutines.Start(HackEffect());
111113
}
112114

113115
public override void OnDeactivate()
114116
{
115117
DeActivating = true;
116-
GradientManager.SetGradientEnabled(Player!, true);
117-
Player!.cosmetics.SetColor((byte)Player.Data.DefaultOutfit.ColorId);
118+
GradientManager.SetGradientEnabled(Player, true);
119+
Player.cosmetics.SetColor((byte)Player.Data.DefaultOutfit.ColorId);
118120

119121
if (Player.cosmetics.CurrentPet != null)
120122
{
@@ -140,12 +142,12 @@ public override void OnDeactivate()
140142
_hackedText.gameObject.DestroyImmediate();
141143
}
142144

143-
if (IsImpostor)
145+
if (_hackEffectCoroutine == null)
144146
{
145147
return;
146148
}
147149

148-
Coroutines.Stop(HackEffect());
150+
Player.StopCoroutine(_hackEffectCoroutine);
149151
}
150152

151153
public override void OnDeath(DeathReason reason)

LaunchpadReloaded/Modifiers/RevivedModifier.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class RevivedModifier : BaseModifier
2424

2525
public override void OnActivate()
2626
{
27-
var tagManager = Player!.GetTagManager();
27+
var tagManager = Player.GetTagManager();
2828

2929
if (tagManager != null)
3030
{
@@ -37,15 +37,15 @@ public override void OnActivate()
3737
tagManager.AddTag(_revivedTag);
3838
}
3939

40-
_ogVisorColor = Player!.cosmetics.currentBodySprite.BodySprite.material.GetColor(_visorColor);
41-
Player!.cosmetics.currentBodySprite.BodySprite.material.SetColor(_visorColor, LaunchpadPalette.MedicColor);
40+
_ogVisorColor = Player.cosmetics.currentBodySprite.BodySprite.material.GetColor(_visorColor);
41+
Player.cosmetics.currentBodySprite.BodySprite.material.SetColor(_visorColor, LaunchpadPalette.MedicColor);
4242

4343
if (!Player.Data.IsDead)
4444
{
4545
return;
4646
}
4747

48-
Player!.Revive();
48+
Player.Revive();
4949

5050
Player.RemainingEmergencies = GameManager.Instance.LogicOptions.GetNumEmergencyMeetings();
5151
RoleManager.Instance.SetRole(Player, RoleTypes.Crewmate);
@@ -82,7 +82,7 @@ public override void FixedUpdate()
8282
{
8383
if (MeetingHud.Instance)
8484
{
85-
var playerState = MeetingHud.Instance.playerStates.First(plr => plr.TargetPlayerId == Player!.PlayerId);
85+
var playerState = MeetingHud.Instance.playerStates.First(plr => plr.TargetPlayerId == Player.PlayerId);
8686
if (playerState is null)
8787
{
8888
return;

LaunchpadReloaded/Networking/HostAntiCheat.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,10 @@ public static void KickForCheating(this PlayerControl hacker)
1414

1515
var id = AmongUsClient.Instance.GetClientIdFromCharacter(hacker);
1616
AmongUsClient.Instance.KickPlayer(id, OptionGroupSingleton<GeneralOptions>.Instance.BanCheaters);
17+
Info($"[HostAntiCheat] Kicked player {hacker.Data.PlayerName} for cheating.");
18+
19+
var lastMethod = new System.Diagnostics.StackTrace().GetFrame(1)?.GetMethod();
20+
var methodName = lastMethod != null ? $"{lastMethod.DeclaringType?.FullName}.{lastMethod.Name}" : "UnknownMethod";
21+
Info($"[HostAntiCheat] Cheating detected in method: {methodName}");
1722
}
1823
}

LaunchpadReloaded/Networking/LaunchpadRpc.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ public enum LaunchpadRpc : uint
88
CustomCheckColor,
99
CustomSetColor,
1010
SyncAllColors,
11-
RemoveVote,
12-
PopulateResults,
11+
Hack,
1312
Dissect,
1413
DigVent,
1514
SealVent,

LaunchpadReloaded/Utilities/HackerUtilities.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,16 @@ public static class HackerUtilities
5454

5555
public static bool AnyPlayerHacked()
5656
{
57-
return PlayerControl.AllPlayerControls.ToArray().Any(PlayerHacked);
57+
// Avoid LINQ for performance
58+
foreach (var player in PlayerControl.AllPlayerControls)
59+
{
60+
if (PlayerHacked(player))
61+
{
62+
return true;
63+
}
64+
}
65+
66+
return false;
5867
}
5968

6069
public static bool IsHacked(this NetworkedPlayerInfo playerInfo)

0 commit comments

Comments
 (0)