public static void clearAndReloadRoles() { Jester.clearAndReload(); Mayor.clearAndReload(); Engineer.clearAndReload(); Sheriff.clearAndReload(); Lighter.clearAndReload(); Godfather.clearAndReload(); Mafioso.clearAndReload(); Janitor.clearAndReload(); Detective.clearAndReload(); TimeMaster.clearAndReload(); Medic.clearAndReload(); Shifter.clearAndReload(); Swapper.clearAndReload(); Lovers.clearAndReload(); Seer.clearAndReload(); Morphling.clearAndReload(); Camouflager.clearAndReload(); Hacker.clearAndReload(); Child.clearAndReload(); Tracker.clearAndReload(); Vampire.clearAndReload(); Snitch.clearAndReload(); Jackal.clearAndReload(); Sidekick.clearAndReload(); Eraser.clearAndReload(); Spy.clearAndReload(); Trickster.clearAndReload(); }
public static void clearAndReloadRoles() { Morphling.clearAndReload(); Camouflager.clearAndReload(); Shifter.clearAndReload(); Swapper.clearAndReload(); GM.clearAndReload(); Lovers.Clear(); Opportunist.Clear(); Ninja.Clear(); Madmate.Clear(); CreatedMadmate.Clear(); PlagueDoctor.Clear(); Lighter.Clear(); SerialKiller.Clear(); Fox.Clear(); Immoralist.Clear(); FortuneTeller.Clear(); LastImpostor.Clear(); SoulPlayer.Clear(); Munou.Clear(); SchrodingersCat.Clear(); Trapper.Clear(); BomberA.Clear(); BomberB.Clear(); EvilTracker.Clear(); Puppeteer.Clear(); MimicK.Clear(); MimicA.Clear(); Mini.Clear(); AntiTeleport.Clear(); Role.ClearAll(); }
public static void Postfix(PlayerPhysics __instance) { if (isRole(__instance.myPlayer)) { var fox = __instance.myPlayer; if (fox == null || fox.isDead()) { return; } bool canSee = PlayerControl.LocalPlayer.isRole(RoleType.Fox) || PlayerControl.LocalPlayer.isRole(RoleType.Immoralist) || PlayerControl.LocalPlayer.isDead() || (PlayerControl.LocalPlayer.isRole(RoleType.Lighter) && Lighter.isLightActive(PlayerControl.LocalPlayer)); var opacity = canSee ? 0.1f : 0.0f; if (isStealthed(fox)) { opacity = Math.Max(opacity, 1.0f - stealthFade(fox)); fox.MyRend.material.SetFloat("_Outline", 0f); } else { opacity = Math.Max(opacity, stealthFade(fox)); } Ninja.setOpacity(fox, opacity); } }
public static void setCustomButtonCooldowns() { Ninja.SetButtonCooldowns(); Sheriff.SetButtonCooldowns(); PlagueDoctor.SetButtonCooldowns(); Lighter.SetButtonCooldowns(); SerialKiller.SetButtonCooldowns(); Immoralist.SetButtonCooldowns(); SchrodingersCat.SetButtonCooldowns(); Trapper.SetButtonCooldowns(); BomberA.SetButtonCooldowns(); BomberB.SetButtonCooldowns(); EvilTracker.SetButtonCooldowns(); Puppeteer.SetButtonCooldowns(); MimicK.SetButtonCooldowns(); MimicA.SetButtonCooldowns(); SoulPlayer.SetButtonCooldowns(); foreach (CustomButton gmButton in gmButtons) { gmButton.MaxTimer = 0.0f; } foreach (CustomButton gmButton in gmKillButtons) { gmButton.MaxTimer = 0.0f; } gmZoomIn.MaxTimer = 0.0f; gmZoomOut.MaxTimer = 0.0f; }
public static void Postfix(HudManager __instance) { // Engineer Repair engineerRepairButton = new CustomButton( () => { engineerRepairButton.Timer = 0f; MessageWriter usedRepairWriter = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.EngineerUsedRepair, Hazel.SendOption.Reliable, -1); AmongUsClient.Instance.FinishRpcImmediately(usedRepairWriter); RPCProcedure.engineerUsedRepair(); foreach (PlayerTask task in PlayerControl.LocalPlayer.myTasks) { if (task.TaskType == TaskTypes.FixLights) { MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.EngineerFixLights, Hazel.SendOption.Reliable, -1); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.engineerFixLights(); } else if (task.TaskType == TaskTypes.RestoreOxy) { ShipStatus.Instance.RpcRepairSystem(SystemTypes.LifeSupp, 0 | 64); ShipStatus.Instance.RpcRepairSystem(SystemTypes.LifeSupp, 1 | 64); } else if (task.TaskType == TaskTypes.ResetReactor) { ShipStatus.Instance.RpcRepairSystem(SystemTypes.Reactor, 16); } else if (task.TaskType == TaskTypes.ResetSeismic) { ShipStatus.Instance.RpcRepairSystem(SystemTypes.Laboratory, 16); } else if (task.TaskType == TaskTypes.FixComms) { ShipStatus.Instance.RpcRepairSystem(SystemTypes.Comms, 16 | 0); ShipStatus.Instance.RpcRepairSystem(SystemTypes.Comms, 16 | 1); } else if (task.TaskType == TaskTypes.StopCharles) { ShipStatus.Instance.RpcRepairSystem(SystemTypes.Reactor, 0 | 16); ShipStatus.Instance.RpcRepairSystem(SystemTypes.Reactor, 1 | 16); } } }, () => { return(Engineer.engineer != null && Engineer.engineer == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead); }, () => { bool sabotageActive = false; foreach (PlayerTask task in PlayerControl.LocalPlayer.myTasks) { if (task.TaskType == TaskTypes.FixLights || task.TaskType == TaskTypes.RestoreOxy || task.TaskType == TaskTypes.ResetReactor || task.TaskType == TaskTypes.ResetSeismic || task.TaskType == TaskTypes.FixComms || task.TaskType == TaskTypes.StopCharles) { sabotageActive = true; } } return(sabotageActive && !Engineer.usedRepair && PlayerControl.LocalPlayer.CanMove); }, () => {}, Engineer.getButtonSprite(), new Vector3(-1.3f, 0, 0), __instance, KeyCode.Q ); // Janitor Clean janitorCleanButton = new CustomButton( () => { foreach (Collider2D collider2D in Physics2D.OverlapCircleAll(PlayerControl.LocalPlayer.GetTruePosition(), PlayerControl.LocalPlayer.MaxReportDistance, Constants.PlayersOnlyMask)) { if (collider2D.tag == "DeadBody") { DeadBody component = collider2D.GetComponent <DeadBody>(); if (component && !component.Reported) { Vector2 truePosition = PlayerControl.LocalPlayer.GetTruePosition(); Vector2 truePosition2 = component.TruePosition; if (Vector2.Distance(truePosition2, truePosition) <= PlayerControl.LocalPlayer.MaxReportDistance && PlayerControl.LocalPlayer.CanMove && !PhysicsHelpers.AnythingBetween(truePosition, truePosition2, Constants.ShipAndObjectsMask, false)) { GameData.PlayerInfo playerInfo = GameData.Instance.GetPlayerById(component.ParentId); MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.CleanBody, Hazel.SendOption.Reliable, -1); writer.Write(playerInfo.PlayerId); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.cleanBody(playerInfo.PlayerId); janitorCleanButton.Timer = janitorCleanButton.MaxTimer; break; } } } } }, () => { return(Janitor.janitor != null && Janitor.janitor == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead); }, () => { return(__instance.ReportButton.renderer.color == Palette.EnabledColor && PlayerControl.LocalPlayer.CanMove); }, () => { janitorCleanButton.Timer = janitorCleanButton.MaxTimer; }, Janitor.getButtonSprite(), new Vector3(-1.3f, 0, 0), __instance, KeyCode.Q ); // Sheriff Kill sheriffKillButton = new CustomButton( () => { if (Medic.shielded != null && Medic.shielded == Sheriff.currentTarget) { MessageWriter attemptWriter = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShieldedMurderAttempt, Hazel.SendOption.Reliable, -1); AmongUsClient.Instance.FinishRpcImmediately(attemptWriter); RPCProcedure.shieldedMurderAttempt(); return; } byte targetId = 0; if ((Sheriff.currentTarget.Data.IsImpostor && (Sheriff.currentTarget != Child.child || Child.isGrownUp())) || Sheriff.currentTarget == Jackal.jackal || Sheriff.currentTarget == Sidekick.sidekick || (Sheriff.spyCanDieToSheriff && Spy.spy != null && Spy.spy == Sheriff.currentTarget) || (Sheriff.jesterCanDieToSheriff && Jester.jester != null && Jester.jester == Sheriff.currentTarget)) { targetId = Sheriff.currentTarget.PlayerId; } else { targetId = PlayerControl.LocalPlayer.PlayerId; } MessageWriter killWriter = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SheriffKill, Hazel.SendOption.Reliable, -1); killWriter.Write(targetId); AmongUsClient.Instance.FinishRpcImmediately(killWriter); RPCProcedure.sheriffKill(targetId); sheriffKillButton.Timer = sheriffKillButton.MaxTimer; Sheriff.currentTarget = null; }, () => { return(Sheriff.sheriff != null && Sheriff.sheriff == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead); }, () => { return(Sheriff.currentTarget && PlayerControl.LocalPlayer.CanMove); }, () => { sheriffKillButton.Timer = sheriffKillButton.MaxTimer; }, __instance.KillButton.renderer.sprite, new Vector3(-1.3f, 0, 0), __instance, KeyCode.Q ); // Time Master Rewind Time timeMasterShieldButton = new CustomButton( () => { MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.TimeMasterShield, Hazel.SendOption.Reliable, -1); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.timeMasterShield(); }, () => { return(TimeMaster.timeMaster != null && TimeMaster.timeMaster == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead); }, () => { return(PlayerControl.LocalPlayer.CanMove); }, () => { timeMasterShieldButton.Timer = timeMasterShieldButton.MaxTimer; timeMasterShieldButton.isEffectActive = false; timeMasterShieldButton.killButtonManager.TimerText.color = Palette.EnabledColor; }, TimeMaster.getButtonSprite(), new Vector3(-1.3f, 0, 0), __instance, KeyCode.Q, true, TimeMaster.shieldDuration, () => { timeMasterShieldButton.Timer = timeMasterShieldButton.MaxTimer; } ); // Medic Shield medicShieldButton = new CustomButton( () => { medicShieldButton.Timer = 0f; MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.MedicSetShielded, Hazel.SendOption.Reliable, -1); writer.Write(Medic.currentTarget.PlayerId); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.medicSetShielded(Medic.currentTarget.PlayerId); }, () => { return(Medic.medic != null && Medic.medic == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead); }, () => { return(!Medic.usedShield && Medic.currentTarget && PlayerControl.LocalPlayer.CanMove); }, () => {}, Medic.getButtonSprite(), new Vector3(-1.3f, 0, 0), __instance, KeyCode.Q ); // Shifter shift shifterShiftButton = new CustomButton( () => { MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetFutureShifted, Hazel.SendOption.Reliable, -1); writer.Write(Shifter.currentTarget.PlayerId); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.setFutureShifted(Shifter.currentTarget.PlayerId); }, () => { return(Shifter.shifter != null && Shifter.shifter == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead); }, () => { return(Shifter.currentTarget && Shifter.futureShift == null && PlayerControl.LocalPlayer.CanMove); }, () => { }, Shifter.getButtonSprite(), new Vector3(-1.3f, 0, 0), __instance, KeyCode.Q ); // Morphling morph morphlingButton = new CustomButton( () => { if (Morphling.sampledTarget != null) { MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.MorphlingMorph, Hazel.SendOption.Reliable, -1); writer.Write(Morphling.sampledTarget.PlayerId); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.morphlingMorph(Morphling.sampledTarget.PlayerId); Morphling.sampledTarget = null; morphlingButton.EffectDuration = Morphling.duration; } else if (Morphling.currentTarget != null) { Morphling.sampledTarget = Morphling.currentTarget; morphlingButton.Sprite = Morphling.getMorphSprite(); morphlingButton.EffectDuration = 1f; } }, () => { return(Morphling.morphling != null && Morphling.morphling == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead); }, () => { return((Morphling.currentTarget || Morphling.sampledTarget) && PlayerControl.LocalPlayer.CanMove); }, () => { morphlingButton.Timer = morphlingButton.MaxTimer; morphlingButton.Sprite = Morphling.getSampleSprite(); morphlingButton.isEffectActive = false; morphlingButton.killButtonManager.TimerText.color = Palette.EnabledColor; Morphling.sampledTarget = null; }, Morphling.getSampleSprite(), new Vector3(-1.3f, 1.3f, 0f), __instance, KeyCode.F, true, Morphling.duration, () => { if (Morphling.sampledTarget == null) { morphlingButton.Timer = morphlingButton.MaxTimer; morphlingButton.Sprite = Morphling.getSampleSprite(); } } ); // Camouflager camouflage camouflagerButton = new CustomButton( () => { MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.CamouflagerCamouflage, Hazel.SendOption.Reliable, -1); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.camouflagerCamouflage(); }, () => { return(Camouflager.camouflager != null && Camouflager.camouflager == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead); }, () => { return(PlayerControl.LocalPlayer.CanMove); }, () => { camouflagerButton.Timer = camouflagerButton.MaxTimer; camouflagerButton.isEffectActive = false; camouflagerButton.killButtonManager.TimerText.color = Palette.EnabledColor; }, Camouflager.getButtonSprite(), new Vector3(-1.3f, 1.3f, 0f), __instance, KeyCode.F, true, Camouflager.duration, () => { camouflagerButton.Timer = camouflagerButton.MaxTimer; } ); // Hacker button hackerButton = new CustomButton( () => { Hacker.hackerTimer = Hacker.duration; }, () => { return(Hacker.hacker != null && Hacker.hacker == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead); }, () => { return(PlayerControl.LocalPlayer.CanMove); }, () => { hackerButton.Timer = hackerButton.MaxTimer; hackerButton.isEffectActive = false; hackerButton.killButtonManager.TimerText.color = Palette.EnabledColor; }, Hacker.getButtonSprite(), new Vector3(-1.3f, 0, 0), __instance, KeyCode.Q, true, 0f, () => { hackerButton.Timer = hackerButton.MaxTimer; } ); // Tracker button trackerButton = new CustomButton( () => { MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.TrackerUsedTracker, Hazel.SendOption.Reliable, -1); writer.Write(Tracker.currentTarget.PlayerId); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.trackerUsedTracker(Tracker.currentTarget.PlayerId); }, () => { return(Tracker.tracker != null && Tracker.tracker == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead); }, () => { return(PlayerControl.LocalPlayer.CanMove && Tracker.currentTarget != null && !Tracker.usedTracker); }, () => { }, Tracker.getButtonSprite(), new Vector3(-1.3f, 0, 0), __instance, KeyCode.Q ); vampireKillButton = new CustomButton( () => { if (Helpers.handleMurderAttempt(Vampire.currentTarget)) { if (Vampire.targetNearGarlic) { PlayerControl.LocalPlayer.RpcMurderPlayer(Vampire.currentTarget); vampireKillButton.HasEffect = false; // Block effect on this click vampireKillButton.Timer = vampireKillButton.MaxTimer; } else { Vampire.bitten = Vampire.currentTarget; // Notify players about bitten MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.VampireSetBitten, Hazel.SendOption.Reliable, -1); writer.Write(Vampire.bitten.PlayerId); writer.Write(0); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.vampireSetBitten(Vampire.bitten.PlayerId, 0); HudManager.Instance.StartCoroutine(Effects.Lerp(Vampire.delay, new Action <float>((p) => { // Delayed action if (p == 1f) { if (Vampire.bitten != null && !Vampire.bitten.Data.IsDead && Helpers.handleMurderAttempt(Vampire.bitten)) { // Perform kill MessageWriter killWriter = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.VampireTryKill, Hazel.SendOption.Reliable, -1); AmongUsClient.Instance.FinishRpcImmediately(killWriter); RPCProcedure.vampireTryKill(); } else { // Notify players about clearing bitten MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.VampireSetBitten, Hazel.SendOption.Reliable, -1); writer.Write(byte.MaxValue); writer.Write(byte.MaxValue); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.vampireSetBitten(byte.MaxValue, byte.MaxValue); } } }))); vampireKillButton.HasEffect = true; // Trigger effect on this click } } else { vampireKillButton.HasEffect = false; // Block effect if no action was fired } }, () => { return(Vampire.vampire != null && Vampire.vampire == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead); }, () => { if (Vampire.targetNearGarlic && Vampire.canKillNearGarlics) { vampireKillButton.killButtonManager.renderer.sprite = __instance.KillButton.renderer.sprite; } else { vampireKillButton.killButtonManager.renderer.sprite = Vampire.getButtonSprite(); } return(Vampire.currentTarget != null && PlayerControl.LocalPlayer.CanMove && (!Vampire.targetNearGarlic || Vampire.canKillNearGarlics)); }, () => { vampireKillButton.Timer = vampireKillButton.MaxTimer; vampireKillButton.isEffectActive = false; vampireKillButton.killButtonManager.TimerText.color = Palette.EnabledColor; }, Vampire.getButtonSprite(), new Vector3(-1.3f, 0, 0), __instance, KeyCode.Q, false, 0f, () => { vampireKillButton.Timer = vampireKillButton.MaxTimer; } ); garlicButton = new CustomButton( () => { Vampire.localPlacedGarlic = true; var pos = PlayerControl.LocalPlayer.transform.position; byte[] buff = new byte[sizeof(float) * 2]; Buffer.BlockCopy(BitConverter.GetBytes(pos.x), 0, buff, 0 * sizeof(float), sizeof(float)); Buffer.BlockCopy(BitConverter.GetBytes(pos.y), 0, buff, 1 * sizeof(float), sizeof(float)); MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.PlaceGarlic, Hazel.SendOption.Reliable); writer.WriteBytesAndSize(buff); writer.EndMessage(); RPCProcedure.placeGarlic(buff); }, () => { return(!Vampire.localPlacedGarlic && !PlayerControl.LocalPlayer.Data.IsDead && Vampire.garlicsActive); }, () => { return(PlayerControl.LocalPlayer.CanMove && !Vampire.localPlacedGarlic); }, () => { }, Vampire.getGarlicButtonSprite(), Vector3.zero, __instance, null, true ); // Jackal Sidekick Button jackalSidekickButton = new CustomButton( () => { MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.JackalCreatesSidekick, Hazel.SendOption.Reliable, -1); writer.Write(Jackal.currentTarget.PlayerId); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.jackalCreatesSidekick(Jackal.currentTarget.PlayerId); }, () => { return(Jackal.canCreateSidekick && Sidekick.sidekick == null && Jackal.fakeSidekick == null && Jackal.jackal != null && Jackal.jackal == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead); }, () => { return(Sidekick.sidekick == null && Jackal.fakeSidekick == null && Jackal.currentTarget != null && PlayerControl.LocalPlayer.CanMove); }, () => { jackalSidekickButton.Timer = jackalSidekickButton.MaxTimer; }, Jackal.getSidekickButtonSprite(), new Vector3(-1.3f, 1.3f, 0f), __instance, KeyCode.F ); // Jackal Kill jackalKillButton = new CustomButton( () => { if (!Helpers.handleMurderAttempt(Jackal.currentTarget)) { return; } byte targetId = Jackal.currentTarget.PlayerId; MessageWriter killWriter = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.JackalKill, Hazel.SendOption.Reliable, -1); killWriter.Write(targetId); AmongUsClient.Instance.FinishRpcImmediately(killWriter); RPCProcedure.jackalKill(targetId); jackalKillButton.Timer = jackalKillButton.MaxTimer; Jackal.currentTarget = null; }, () => { return(Jackal.jackal != null && Jackal.jackal == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead); }, () => { return(Jackal.currentTarget && PlayerControl.LocalPlayer.CanMove); }, () => { jackalKillButton.Timer = jackalKillButton.MaxTimer; }, __instance.KillButton.renderer.sprite, new Vector3(-1.3f, 0, 0), __instance, KeyCode.Q ); // Sidekick Kill sidekickKillButton = new CustomButton( () => { if (!Helpers.handleMurderAttempt(Sidekick.currentTarget)) { return; } byte targetId = Sidekick.currentTarget.PlayerId; MessageWriter killWriter = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SidekickKill, Hazel.SendOption.Reliable, -1); killWriter.Write(targetId); AmongUsClient.Instance.FinishRpcImmediately(killWriter); RPCProcedure.sidekickKill(targetId); sidekickKillButton.Timer = sidekickKillButton.MaxTimer; Sidekick.currentTarget = null; }, () => { return(Sidekick.canKill && Sidekick.sidekick != null && Sidekick.sidekick == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead); }, () => { return(Sidekick.currentTarget && PlayerControl.LocalPlayer.CanMove); }, () => { sidekickKillButton.Timer = sidekickKillButton.MaxTimer; }, __instance.KillButton.renderer.sprite, new Vector3(-1.3f, 0, 0), __instance, KeyCode.Q ); // Lighter light lighterButton = new CustomButton( () => { Lighter.lighterTimer = Lighter.duration; }, () => { return(Lighter.lighter != null && Lighter.lighter == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead); }, () => { return(PlayerControl.LocalPlayer.CanMove); }, () => { lighterButton.Timer = lighterButton.MaxTimer; lighterButton.isEffectActive = false; lighterButton.killButtonManager.TimerText.color = Palette.EnabledColor; }, Lighter.getButtonSprite(), new Vector3(-1.3f, 0f, 0f), __instance, KeyCode.Q, true, Lighter.duration, () => { lighterButton.Timer = lighterButton.MaxTimer; } ); // Eraser erase button eraserButton = new CustomButton( () => { eraserButton.MaxTimer += 10; eraserButton.Timer = eraserButton.MaxTimer; MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetFutureErased, Hazel.SendOption.Reliable, -1); writer.Write(Eraser.currentTarget.PlayerId); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.setFutureErased(Eraser.currentTarget.PlayerId); }, () => { return(Eraser.eraser != null && Eraser.eraser == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead); }, () => { return(PlayerControl.LocalPlayer.CanMove && Eraser.currentTarget != null); }, () => { eraserButton.Timer = eraserButton.MaxTimer; }, Eraser.getButtonSprite(), new Vector3(-1.3f, 1.3f, 0f), __instance, KeyCode.F ); placeJackInTheBoxButton = new CustomButton( () => { placeJackInTheBoxButton.Timer = placeJackInTheBoxButton.MaxTimer; var pos = PlayerControl.LocalPlayer.transform.position; byte[] buff = new byte[sizeof(float) * 2]; Buffer.BlockCopy(BitConverter.GetBytes(pos.x), 0, buff, 0 * sizeof(float), sizeof(float)); Buffer.BlockCopy(BitConverter.GetBytes(pos.y), 0, buff, 1 * sizeof(float), sizeof(float)); MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.PlaceJackInTheBox, Hazel.SendOption.Reliable); writer.WriteBytesAndSize(buff); writer.EndMessage(); RPCProcedure.placeJackInTheBox(buff); }, () => { return(Trickster.trickster != null && Trickster.trickster == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead && !JackInTheBox.hasJackInTheBoxLimitReached()); }, () => { return(PlayerControl.LocalPlayer.CanMove && !JackInTheBox.hasJackInTheBoxLimitReached()); }, () => { placeJackInTheBoxButton.Timer = placeJackInTheBoxButton.MaxTimer; }, Trickster.getPlaceBoxButtonSprite(), new Vector3(-1.3f, 1.3f, 0f), __instance, KeyCode.F ); lightsOutButton = new CustomButton( () => { MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.LightsOut, Hazel.SendOption.Reliable, -1); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.lightsOut(); }, () => { return(Trickster.trickster != null && Trickster.trickster == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead && JackInTheBox.hasJackInTheBoxLimitReached() && JackInTheBox.boxesConvertedToVents); }, () => { return(PlayerControl.LocalPlayer.CanMove && JackInTheBox.hasJackInTheBoxLimitReached() && JackInTheBox.boxesConvertedToVents); }, () => { lightsOutButton.Timer = lightsOutButton.MaxTimer; lightsOutButton.isEffectActive = false; lightsOutButton.killButtonManager.TimerText.color = Palette.EnabledColor; }, Trickster.getLightsOutButtonSprite(), new Vector3(-1.3f, 1.3f, 0f), __instance, KeyCode.F, true, Trickster.lightsOutDuration, () => { lightsOutButton.Timer = lightsOutButton.MaxTimer; } ); // Cleaner Clean cleanerCleanButton = new CustomButton( () => { foreach (Collider2D collider2D in Physics2D.OverlapCircleAll(PlayerControl.LocalPlayer.GetTruePosition(), PlayerControl.LocalPlayer.MaxReportDistance, Constants.PlayersOnlyMask)) { if (collider2D.tag == "DeadBody") { DeadBody component = collider2D.GetComponent <DeadBody>(); if (component && !component.Reported) { Vector2 truePosition = PlayerControl.LocalPlayer.GetTruePosition(); Vector2 truePosition2 = component.TruePosition; if (Vector2.Distance(truePosition2, truePosition) <= PlayerControl.LocalPlayer.MaxReportDistance && PlayerControl.LocalPlayer.CanMove && !PhysicsHelpers.AnythingBetween(truePosition, truePosition2, Constants.ShipAndObjectsMask, false)) { GameData.PlayerInfo playerInfo = GameData.Instance.GetPlayerById(component.ParentId); MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.CleanBody, Hazel.SendOption.Reliable, -1); writer.Write(playerInfo.PlayerId); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.cleanBody(playerInfo.PlayerId); Cleaner.cleaner.killTimer = cleanerCleanButton.Timer = cleanerCleanButton.MaxTimer; break; } } } } }, () => { return(Cleaner.cleaner != null && Cleaner.cleaner == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead); }, () => { return(__instance.ReportButton.renderer.color == Palette.EnabledColor && PlayerControl.LocalPlayer.CanMove); }, () => { cleanerCleanButton.Timer = cleanerCleanButton.MaxTimer; }, Cleaner.getButtonSprite(), new Vector3(-1.3f, 1.3f, 0f), __instance, KeyCode.F ); // Warlock curse warlockCurseButton = new CustomButton( () => { if (Warlock.curseVictim == null) { // Apply Curse Warlock.curseVictim = Warlock.currentTarget; warlockCurseButton.Sprite = Warlock.getCurseKillButtonSprite(); warlockCurseButton.Timer = 1f; } else if (Warlock.curseVictim != null && Warlock.curseVictimTarget != null && Helpers.handleMurderAttempt(Warlock.curseVictimTarget)) { // Curse Kill Warlock.curseKillTarget = Warlock.curseVictimTarget; MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.WarlockCurseKill, Hazel.SendOption.Reliable, -1); writer.Write(Warlock.curseKillTarget.PlayerId); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.warlockCurseKill(Warlock.curseKillTarget.PlayerId); Warlock.curseVictim = null; Warlock.curseVictimTarget = null; warlockCurseButton.Sprite = Warlock.getCurseButtonSprite(); Warlock.warlock.killTimer = warlockCurseButton.Timer = warlockCurseButton.MaxTimer; if (Warlock.rootTime > 0) { PlayerControl.LocalPlayer.moveable = false; PlayerControl.LocalPlayer.NetTransform.Halt(); // Stop current movement so the warlock is not just running straight into the next object HudManager.Instance.StartCoroutine(Effects.Lerp(Warlock.rootTime, new Action <float>((p) => { // Delayed action if (p == 1f) { PlayerControl.LocalPlayer.moveable = true; } }))); } } }, () => { return(Warlock.warlock != null && Warlock.warlock == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead); }, () => { return(((Warlock.curseVictim == null && Warlock.currentTarget != null) || (Warlock.curseVictim != null && Warlock.curseVictimTarget != null)) && PlayerControl.LocalPlayer.CanMove); }, () => { warlockCurseButton.Timer = warlockCurseButton.MaxTimer; warlockCurseButton.Sprite = Warlock.getCurseButtonSprite(); Warlock.curseVictim = null; Warlock.curseVictimTarget = null; }, Warlock.getCurseButtonSprite(), new Vector3(-1.3f, 1.3f, 0f), __instance, KeyCode.F ); // Set the default (or settings from the previous game) timers/durations when spawning the buttons setCustomButtonCooldowns(); }
public static void erasePlayerRole(byte playerId) { PlayerControl player = Helpers.playerById(playerId); if (player == null) { return; } // Crewmate roles if (player == Mayor.mayor) { Mayor.clearAndReload(); } if (player == Engineer.engineer) { Engineer.clearAndReload(); } if (player == Sheriff.sheriff) { Sheriff.clearAndReload(); } if (player == Lighter.lighter) { Lighter.clearAndReload(); } if (player == Detective.detective) { Detective.clearAndReload(); } if (player == TimeMaster.timeMaster) { TimeMaster.clearAndReload(); } if (player == Medic.medic) { Medic.clearAndReload(); } if (player == Shifter.shifter) { Shifter.clearAndReload(); } if (player == Seer.seer) { Seer.clearAndReload(); } if (player == Hacker.hacker) { Hacker.clearAndReload(); } if (player == Child.child) { Child.clearAndReload(); } if (player == Tracker.tracker) { Tracker.clearAndReload(); } if (player == Snitch.snitch) { Snitch.clearAndReload(); } if (player == Swapper.swapper) { Swapper.clearAndReload(); } if (player == Spy.spy) { Spy.clearAndReload(); } // Impostor roles if (player == Morphling.morphling) { Morphling.clearAndReload(); } if (player == Camouflager.camouflager) { Camouflager.clearAndReload(); } if (player == Godfather.godfather) { Godfather.clearAndReload(); } if (player == Mafioso.mafioso) { Mafioso.clearAndReload(); } if (player == Janitor.janitor) { Janitor.clearAndReload(); } if (player == Vampire.vampire) { Vampire.clearAndReload(); } if (player == Eraser.eraser) { Eraser.clearAndReload(); } if (player == Trickster.trickster) { Trickster.clearAndReload(); } if (player == Cleaner.cleaner) { Cleaner.clearAndReload(); } if (player == Warlock.warlock) { Warlock.clearAndReload(); } // Other roles if (player == Jester.jester) { Jester.clearAndReload(); } if (player == Lovers.lover1 || player == Lovers.lover2) // The whole Lover couple is being erased { Lovers.clearAndReload(); } if (player == Jackal.jackal) // Promote Sidekick and hence override the the Jackal or erase Jackal { if (Sidekick.promotesToJackal && Sidekick.sidekick != null && !Sidekick.sidekick.Data.IsDead) { RPCProcedure.sidekickPromotes(); } else { Jackal.clearAndReload(); } } if (player == Sidekick.sidekick) { Sidekick.clearAndReload(); } }
public static void makeButtons(HudManager hm) { Ninja.MakeButtons(hm); Sheriff.MakeButtons(hm); PlagueDoctor.MakeButtons(hm); Lighter.MakeButtons(hm); SerialKiller.MakeButtons(hm); Fox.MakeButtons(hm); Immoralist.MakeButtons(hm); FortuneTeller.MakeButtons(hm); LastImpostor.MakeButtons(hm); SoulPlayer.MakeButtons(hm); SchrodingersCat.MakeButtons(hm); Trapper.MakeButtons(hm); BomberA.MakeButtons(hm); BomberB.MakeButtons(hm); EvilTracker.MakeButtons(hm); Puppeteer.MakeButtons(hm); MimicK.MakeButtons(hm); MimicA.MakeButtons(hm); gmButtons = new List <CustomButton>(); gmKillButtons = new List <CustomButton>(); Vector3 gmCalcPos(byte index) { return(new Vector3(-0.25f, -0.25f, 1.0f) + Vector3.right * index * 0.55f); } Action gmButtonOnClick(byte index) { return(() => { PlayerControl target = Helpers.playerById(index); if (!MapOptions.playerIcons.ContainsKey(index) || target.Data.Disconnected) { return; } if (GM.gm.transform.position != target.transform.position) { GM.gm.transform.position = target.transform.position; } }); }; Action gmKillButtonOnClick(byte index) { return(() => { PlayerControl target = Helpers.playerById(index); if (!MapOptions.playerIcons.ContainsKey(index) || target.Data.Disconnected) { return; } if (!target.Data.IsDead) { MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.GMKill, Hazel.SendOption.Reliable, -1); writer.Write(index); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.GMKill(index); } else { MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.GMRevive, Hazel.SendOption.Reliable, -1); writer.Write(index); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.GMRevive(index); } }); }; Func <bool> gmHasButton(byte index) { return(() => { if ((GM.gm == null || PlayerControl.LocalPlayer != GM.gm) || (!MapOptions.playerIcons.ContainsKey(index)) || (!GM.canWarp) || (Helpers.playerById(index).Data.Disconnected)) { return false; } return true; }); } Func <bool> gmHasKillButton(byte index) { return(() => { if ((GM.gm == null || PlayerControl.LocalPlayer != GM.gm) || (!MapOptions.playerIcons.ContainsKey(index)) || (!GM.canKill) || (Helpers.playerById(index).Data.Disconnected)) { return false; } return true; }); } Func <bool> gmCouldUse(byte index) { return(() => { if (!MapOptions.playerIcons.ContainsKey(index) || !GM.canWarp) { return false; } Vector3 pos = gmCalcPos(index); Vector3 scale = new Vector3(0.4f, 0.8f, 1.0f); Vector3 iconBase = hm.UseButton.transform.localPosition; iconBase.x *= -1; if (gmButtons[index].PositionOffset != pos) { gmButtons[index].PositionOffset = pos; gmButtons[index].LocalScale = scale; MapOptions.playerIcons[index].transform.localPosition = iconBase + pos; //TheOtherRolesPlugin.Instance.Log.LogInfo($"Updated {index}: {pos.x}, {pos.y}, {pos.z}"); } //MapOptions.playerIcons[index].gameObject.SetActive(PlayerControl.LocalPlayer.CanMove); return PlayerControl.LocalPlayer.CanMove; }); } Func <bool> gmCouldKill(byte index) { return(() => { if (!MapOptions.playerIcons.ContainsKey(index) || !GM.canKill) { return false; } Vector3 pos = gmCalcPos(index) + Vector3.up * 0.55f; Vector3 scale = new Vector3(0.4f, 0.25f, 1.0f); if (gmKillButtons[index].PositionOffset != pos) { gmKillButtons[index].PositionOffset = pos; gmKillButtons[index].LocalScale = scale; } PlayerControl target = Helpers.playerById(index); if (target.Data.IsDead) { gmKillButtons[index].buttonText = ModTranslation.getString("gmRevive"); } else { gmKillButtons[index].buttonText = ModTranslation.getString("gmKill"); } //MapOptions.playerIcons[index].gameObject.SetActive(PlayerControl.LocalPlayer.CanMove); return true; }); } for (byte i = 0; i < 15; i++) { //TheOtherRolesPlugin.Instance.Log.LogInfo($"Added {i}"); CustomButton gmButton = new CustomButton( // Action OnClick gmButtonOnClick(i), // bool HasButton gmHasButton(i), // bool CouldUse gmCouldUse(i), // Action OnMeetingEnds () => { }, // sprite null, // position Vector3.zero, // hudmanager hm, hm.UseButton, // keyboard shortcut null, true ); gmButton.Timer = 0.0f; gmButton.MaxTimer = 0.0f; gmButton.showButtonText = false; gmButtons.Add(gmButton); CustomButton gmKillButton = new CustomButton( // Action OnClick gmKillButtonOnClick(i), // bool HasButton gmHasKillButton(i), // bool CouldUse gmCouldKill(i), // Action OnMeetingEnds () => { }, // sprite null, // position Vector3.zero, // hudmanager hm, hm.KillButton, // keyboard shortcut null, true ); gmKillButton.Timer = 0.0f; gmKillButton.MaxTimer = 0.0f; gmKillButton.showButtonText = true; var buttonPos = gmKillButton.actionButton.buttonLabelText.transform.localPosition; gmKillButton.actionButton.buttonLabelText.transform.localPosition = new Vector3(buttonPos.x, buttonPos.y + 0.6f, -500f); gmKillButton.actionButton.buttonLabelText.transform.localScale = new Vector3(1.5f, 1.8f, 1.0f); gmKillButtons.Add(gmKillButton); } gmZoomOut = new CustomButton( () => { if (Camera.main.orthographicSize < 18.0f) { Camera.main.orthographicSize *= 1.5f; hm.UICamera.orthographicSize *= 1.5f; } if (hm.transform.localScale.x < 6.0f) { hm.transform.localScale *= 1.5f; } /*TheOtherRolesPlugin.Instance.Log.LogInfo($"Camera zoom {Camera.main.orthographicSize} / {TaskPanelBehaviour.Instance.transform.localPosition.x}");*/ }, () => { return(!(GM.gm == null || PlayerControl.LocalPlayer != GM.gm)); }, () => { return(true); }, () => { }, GM.getZoomOutSprite(), // position Vector3.zero + Vector3.up * 3.75f + Vector3.right * 0.55f, // hudmanager hm, hm.UseButton, // keyboard shortcut KeyCode.PageDown, false ); gmZoomOut.Timer = 0.0f; gmZoomOut.MaxTimer = 0.0f; gmZoomOut.showButtonText = false; gmZoomOut.LocalScale = Vector3.one * 0.275f; gmZoomIn = new CustomButton( () => { if (Camera.main.orthographicSize > 3.0f) { Camera.main.orthographicSize /= 1.5f; hm.UICamera.orthographicSize /= 1.5f; } if (hm.transform.localScale.x > 1.0f) { hm.transform.localScale /= 1.5f; } /*TheOtherRolesPlugin.Instance.Log.LogInfo($"Camera zoom {Camera.main.orthographicSize} / {TaskPanelBehaviour.Instance.transform.localPosition.x}");*/ }, () => { return(!(GM.gm == null || PlayerControl.LocalPlayer != GM.gm)); }, () => { return(true); }, () => { }, GM.getZoomInSprite(), // position Vector3.zero + Vector3.up * 3.75f + Vector3.right * 0.2f, // hudmanager hm, hm.UseButton, // keyboard shortcut KeyCode.PageUp, false ); gmZoomIn.Timer = 0.0f; gmZoomIn.MaxTimer = 0.0f; gmZoomIn.showButtonText = false; gmZoomIn.LocalScale = Vector3.one * 0.275f; }
public static void jackalCreatesSidekick(byte targetId) { foreach (PlayerControl player in PlayerControl.AllPlayerControls) { if (player.PlayerId == targetId) { if (!Jackal.canCreateSidekickFromImpostor && player.Data.IsImpostor) { Jackal.fakeSidekick = player; return; } Sidekick.sidekick = player; player.RemoveInfected(); // Crewmate roles if (player == Jester.jester) { Jester.clearAndReload(); } if (player == Mayor.mayor) { Mayor.clearAndReload(); } if (player == Engineer.engineer) { Engineer.clearAndReload(); } if (player == Sheriff.sheriff) { Sheriff.clearAndReload(); } if (player == Lighter.lighter) { Lighter.clearAndReload(); } if (player == Detective.detective) { Detective.clearAndReload(); } if (player == TimeMaster.timeMaster) { TimeMaster.clearAndReload(); } if (player == Medic.medic) { Medic.clearAndReload(); } if (player == Shifter.shifter) { Shifter.clearAndReload(); } if (player == Seer.seer) { Seer.clearAndReload(); } if (player == Spy.spy) { Spy.clearAndReload(); } if (player == Child.child) { Child.clearAndReload(); } if (player == Tracker.tracker) { Tracker.clearAndReload(); } if (player == BountyHunter.bountyHunter) { BountyHunter.clearAndReload(); } if (player == Snitch.snitch) { Snitch.clearAndReload(); } if (player == Swapper.swapper) { Swapper.clearAndReload(); } // Impostor roles if (player == Morphling.morphling) { Morphling.clearAndReload(); } if (player == Camouflager.camouflager) { Camouflager.clearAndReload(); } if (player == Godfather.godfather) { Godfather.clearAndReload(); } if (player == Mafioso.mafioso) { Mafioso.clearAndReload(); } if (player == Janitor.janitor) { Janitor.clearAndReload(); } if (player == Vampire.vampire) { Vampire.clearAndReload(); } // The Sidekick stays a part of the lover couple! if (PlayerControl.LocalPlayer == null) { return; } if (PlayerControl.LocalPlayer == player) { //Only the Lover keeps his ImportantTextTask Helpers.removeTasksFromPlayer(player, player != Lovers.lover1 && player != Lovers.lover2); var task = new GameObject("RoleTask").AddComponent <ImportantTextTask>(); task.transform.SetParent(player.transform, false); task.Text = "[00B4EBFF]Sidekick: Help your Jackal to kill everyone"; player.myTasks.Insert(0, task); } return; } } }
public static void Postfix(HudManager __instance) { // Engineer Repair engineerRepairButton = new CustomButton( () => { engineerRepairButton.Timer = 0f; MessageWriter usedRepairWriter = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.EngineerUsedRepair, Hazel.SendOption.Reliable, -1); AmongUsClient.Instance.FinishRpcImmediately(usedRepairWriter); RPCProcedure.engineerUsedRepair(); foreach (PlayerTask task in PlayerControl.LocalPlayer.myTasks) { if (task.TaskType == TaskTypes.FixLights) { MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.EngineerFixLights, Hazel.SendOption.Reliable, -1); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.engineerFixLights(); } else if (task.TaskType == TaskTypes.RestoreOxy) { ShipStatus.Instance.RpcRepairSystem(SystemTypes.LifeSupp, 0 | 64); ShipStatus.Instance.RpcRepairSystem(SystemTypes.LifeSupp, 1 | 64); } else if (task.TaskType == TaskTypes.ResetReactor) { ShipStatus.Instance.RpcRepairSystem(SystemTypes.Reactor, 16); } else if (task.TaskType == TaskTypes.ResetSeismic) { ShipStatus.Instance.RpcRepairSystem(SystemTypes.Laboratory, 16); } else if (task.TaskType == TaskTypes.FixComms) { ShipStatus.Instance.RpcRepairSystem(SystemTypes.Comms, 16 | 0); ShipStatus.Instance.RpcRepairSystem(SystemTypes.Comms, 16 | 1); } else if (task.TaskType == TaskTypes.StopCharles) { ShipStatus.Instance.RpcRepairSystem(SystemTypes.Reactor, 0 | 16); ShipStatus.Instance.RpcRepairSystem(SystemTypes.Reactor, 1 | 16); } } }, () => { return(Engineer.engineer != null && Engineer.engineer == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.IDOFAMCIJKE.FGNJJFABIHJ); }, () => { bool sabotageActive = false; foreach (PlayerTask task in PlayerControl.LocalPlayer.myTasks) { if (task.TaskType == TaskTypes.FixLights || task.TaskType == TaskTypes.RestoreOxy || task.TaskType == TaskTypes.ResetReactor || task.TaskType == TaskTypes.ResetSeismic || task.TaskType == TaskTypes.FixComms || task.TaskType == TaskTypes.StopCharles) { sabotageActive = true; } } return(sabotageActive && !Engineer.usedRepair && PlayerControl.LocalPlayer.AMDJMEEHNIG); }, () => {}, Engineer.getButtonSprite(), new Vector3(-1.3f, 0, 0), __instance ); // Janitor Clean janitorCleanButton = new CustomButton( () => { foreach (Collider2D collider2D in Physics2D.OverlapCircleAll(PlayerControl.LocalPlayer.GetTruePosition(), PlayerControl.LocalPlayer.MaxReportDistance, Constants.NFGGONLDDAN)) { if (collider2D.tag == "DeadBody") { DeadBody component = collider2D.GetComponent <DeadBody>(); if (component && !component.Reported) { Vector2 truePosition = PlayerControl.LocalPlayer.GetTruePosition(); Vector2 truePosition2 = component.NCMFGFMFDJB; if (Vector2.Distance(truePosition2, truePosition) <= PlayerControl.LocalPlayer.MaxReportDistance && PlayerControl.LocalPlayer.AMDJMEEHNIG && !PhysicsHelpers.GCFCONMBBOF(truePosition, truePosition2, Constants.DHLPLBPJNBA, false)) { GameData.OFKOJOKOOAK OFKOJOKOOAK = GameData.Instance.GetPlayerById(component.ParentId); MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.JanitorClean, Hazel.SendOption.Reliable, -1); writer.Write(OFKOJOKOOAK.GMBAIPNOKLP); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.janitorClean(OFKOJOKOOAK.GMBAIPNOKLP); janitorCleanButton.Timer = janitorCleanButton.MaxTimer; break; } } } } }, () => { return(Janitor.janitor != null && Janitor.janitor == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.IDOFAMCIJKE.FGNJJFABIHJ); }, () => { return(__instance.ReportButton.renderer.color == Palette.MKAFGNEBHKC && PlayerControl.LocalPlayer.AMDJMEEHNIG); }, () => { janitorCleanButton.Timer = janitorCleanButton.MaxTimer; }, Janitor.getButtonSprite(), new Vector3(-1.3f, 0, 0), __instance ); // Sheriff Kill sheriffKillButton = new CustomButton( () => { if (Medic.shielded != null && Medic.shielded == Sheriff.currentTarget) { MessageWriter attemptWriter = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShieldedMurderAttempt, Hazel.SendOption.Reliable, -1); AmongUsClient.Instance.FinishRpcImmediately(attemptWriter); RPCProcedure.shieldedMurderAttempt(); return; } byte targetId = 0; if ((Sheriff.currentTarget.IDOFAMCIJKE.CIDDOFDJHJH && (Sheriff.currentTarget != Child.child || Child.isGrownUp())) || Sheriff.currentTarget == Jackal.jackal || Sheriff.currentTarget == Sidekick.sidekick || (Sheriff.spyCanDieToSheriff && Spy.spy != null && Spy.spy == Sheriff.currentTarget) || (Sheriff.jesterCanDieToSheriff && Jester.jester != null && Jester.jester == Sheriff.currentTarget)) { targetId = Sheriff.currentTarget.PlayerId; } else { targetId = PlayerControl.LocalPlayer.PlayerId; } MessageWriter killWriter = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SheriffKill, Hazel.SendOption.Reliable, -1); killWriter.Write(targetId); AmongUsClient.Instance.FinishRpcImmediately(killWriter); RPCProcedure.sheriffKill(targetId); sheriffKillButton.Timer = sheriffKillButton.MaxTimer; Sheriff.currentTarget = null; }, () => { return(Sheriff.sheriff != null && Sheriff.sheriff == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.IDOFAMCIJKE.FGNJJFABIHJ); }, () => { return(Sheriff.currentTarget && PlayerControl.LocalPlayer.AMDJMEEHNIG); }, () => { sheriffKillButton.Timer = sheriffKillButton.MaxTimer; }, __instance.KillButton.renderer.sprite, new Vector3(-1.3f, 0, 0), __instance ); // Time Master Rewind Time timeMasterShieldButton = new CustomButton( () => { MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.TimeMasterShield, Hazel.SendOption.Reliable, -1); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.timeMasterShield(); }, () => { return(TimeMaster.timeMaster != null && TimeMaster.timeMaster == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.IDOFAMCIJKE.FGNJJFABIHJ); }, () => { return(PlayerControl.LocalPlayer.AMDJMEEHNIG); }, () => { timeMasterShieldButton.Timer = timeMasterShieldButton.MaxTimer; timeMasterShieldButton.isEffectActive = false; timeMasterShieldButton.killButtonManager.TimerText.Color = Palette.MKAFGNEBHKC; }, TimeMaster.getButtonSprite(), new Vector3(-1.3f, 0, 0), __instance, true, TimeMaster.shieldDuration, () => { timeMasterShieldButton.Timer = timeMasterShieldButton.MaxTimer; } ); // Medic Shield medicShieldButton = new CustomButton( () => { medicShieldButton.Timer = 0f; MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.MedicSetShielded, Hazel.SendOption.Reliable, -1); writer.Write(Medic.currentTarget.PlayerId); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.medicSetShielded(Medic.currentTarget.PlayerId); }, () => { return(Medic.medic != null && Medic.medic == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.IDOFAMCIJKE.FGNJJFABIHJ); }, () => { return(!Medic.usedShield && Medic.currentTarget && PlayerControl.LocalPlayer.AMDJMEEHNIG); }, () => {}, Medic.getButtonSprite(), new Vector3(-1.3f, 0, 0), __instance ); // Shifter shift shifterShiftButton = new CustomButton( () => { MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetFutureShifted, Hazel.SendOption.Reliable, -1); writer.Write(Shifter.currentTarget.PlayerId); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.setFutureShifted(Shifter.currentTarget.PlayerId); }, () => { return(Shifter.shifter != null && Shifter.shifter == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.IDOFAMCIJKE.FGNJJFABIHJ); }, () => { return(Shifter.currentTarget && Shifter.futureShift == null && PlayerControl.LocalPlayer.AMDJMEEHNIG); }, () => { }, Shifter.getButtonSprite(), new Vector3(-1.3f, 0, 0), __instance ); // Morphling morph morphlingButton = new CustomButton( () => { if (Morphling.sampledTarget != null) { MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.MorphlingMorph, Hazel.SendOption.Reliable, -1); writer.Write(Morphling.sampledTarget.PlayerId); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.morphlingMorph(Morphling.sampledTarget.PlayerId); Morphling.sampledTarget = null; morphlingButton.EffectDuration = 10f; } else if (Morphling.currentTarget != null) { Morphling.sampledTarget = Morphling.currentTarget; morphlingButton.Sprite = Morphling.getMorphSprite(); morphlingButton.EffectDuration = 1f; } }, () => { return(Morphling.morphling != null && Morphling.morphling == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.IDOFAMCIJKE.FGNJJFABIHJ); }, () => { return((Morphling.currentTarget || Morphling.sampledTarget) && PlayerControl.LocalPlayer.AMDJMEEHNIG); }, () => { morphlingButton.Timer = morphlingButton.MaxTimer; morphlingButton.Sprite = Morphling.getSampleSprite(); morphlingButton.isEffectActive = false; morphlingButton.killButtonManager.TimerText.Color = Palette.MKAFGNEBHKC; Morphling.sampledTarget = null; }, Morphling.getSampleSprite(), new Vector3(-1.3f, 1.3f, 0f), __instance, true, 10f, () => { if (Morphling.sampledTarget == null) { morphlingButton.Timer = morphlingButton.MaxTimer; morphlingButton.Sprite = Morphling.getSampleSprite(); } } ); // Camouflager camouflage camouflagerButton = new CustomButton( () => { MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.CamouflagerCamouflage, Hazel.SendOption.Reliable, -1); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.camouflagerCamouflage(); }, () => { return(Camouflager.camouflager != null && Camouflager.camouflager == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.IDOFAMCIJKE.FGNJJFABIHJ); }, () => { return(PlayerControl.LocalPlayer.AMDJMEEHNIG); }, () => { camouflagerButton.Timer = camouflagerButton.MaxTimer; camouflagerButton.isEffectActive = false; camouflagerButton.killButtonManager.TimerText.Color = Palette.MKAFGNEBHKC; }, Camouflager.getButtonSprite(), new Vector3(-1.3f, 1.3f, 0f), __instance, true, 10f, () => { camouflagerButton.Timer = camouflagerButton.MaxTimer; } ); // Hacker button hackerButton = new CustomButton( () => { Hacker.hackerTimer = Hacker.duration; }, () => { return(Hacker.hacker != null && Hacker.hacker == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.IDOFAMCIJKE.FGNJJFABIHJ); }, () => { return(PlayerControl.LocalPlayer.AMDJMEEHNIG); }, () => { hackerButton.Timer = hackerButton.MaxTimer; hackerButton.isEffectActive = false; hackerButton.killButtonManager.TimerText.Color = Palette.MKAFGNEBHKC; }, Hacker.getButtonSprite(), new Vector3(-1.3f, 0, 0), __instance, true, 0f, () => { hackerButton.Timer = hackerButton.MaxTimer; } ); // Tracker button trackerButton = new CustomButton( () => { MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.TrackerUsedTracker, Hazel.SendOption.Reliable, -1); writer.Write(Tracker.currentTarget.PlayerId); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.trackerUsedTracker(Tracker.currentTarget.PlayerId); }, () => { return(Tracker.tracker != null && Tracker.tracker == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.IDOFAMCIJKE.FGNJJFABIHJ); }, () => { return(PlayerControl.LocalPlayer.AMDJMEEHNIG && Tracker.currentTarget != null && !Tracker.usedTracker); }, () => { }, Tracker.getButtonSprite(), new Vector3(-1.3f, 0, 0), __instance ); vampireKillButton = new CustomButton( () => { if (Helpers.handleMurderAttempt(Vampire.currentTarget)) { if (Vampire.targetNearGarlic) { PlayerControl.LocalPlayer.RpcMurderPlayer(Vampire.currentTarget); vampireKillButton.HasEffect = false; // Block effect on this click vampireKillButton.Timer = vampireKillButton.MaxTimer; } else { Vampire.bitten = Vampire.currentTarget; // Notify players about bitten MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.VampireSetBitten, Hazel.SendOption.Reliable, -1); writer.Write(Vampire.bitten.PlayerId); writer.Write(0); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.vampireSetBitten(Vampire.bitten.PlayerId, 0); PlayerControl.LocalPlayer.StartCoroutine(Effects.LDACHPMFOIF(Vampire.delay, new Action <float>((p) => { // Delayed action if (p == 1f) { if (Vampire.bitten != null && !Vampire.bitten.IDOFAMCIJKE.FGNJJFABIHJ && Helpers.handleMurderAttempt(Vampire.bitten)) { // Perform kill MessageWriter killWriter = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.VampireTryKill, Hazel.SendOption.Reliable, -1); AmongUsClient.Instance.FinishRpcImmediately(killWriter); RPCProcedure.vampireTryKill(); } else { // Notify players about clearing bitten MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.VampireSetBitten, Hazel.SendOption.Reliable, -1); writer.Write(byte.MaxValue); writer.Write(byte.MaxValue); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.vampireSetBitten(byte.MaxValue, byte.MaxValue); } } }))); vampireKillButton.HasEffect = true; // Trigger effect on this click } } else { vampireKillButton.HasEffect = false; // Block effect if no action was fired } }, () => { return(Vampire.vampire != null && Vampire.vampire == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.IDOFAMCIJKE.FGNJJFABIHJ); }, () => { if (Vampire.targetNearGarlic && Vampire.canKillNearGarlics) { vampireKillButton.killButtonManager.renderer.sprite = __instance.KillButton.renderer.sprite; } else { vampireKillButton.killButtonManager.renderer.sprite = Vampire.getButtonSprite(); } return(Vampire.currentTarget != null && PlayerControl.LocalPlayer.AMDJMEEHNIG && (!Vampire.targetNearGarlic || Vampire.canKillNearGarlics)); }, () => { vampireKillButton.Timer = vampireKillButton.MaxTimer; vampireKillButton.isEffectActive = false; vampireKillButton.killButtonManager.TimerText.Color = Palette.MKAFGNEBHKC; }, Vampire.getButtonSprite(), new Vector3(-1.3f, 0, 0), __instance, false, 0f, () => { vampireKillButton.Timer = vampireKillButton.MaxTimer; } ); garlicButton = new CustomButton( () => { Vampire.localPlacedGarlic = true; var pos = PlayerControl.LocalPlayer.transform.position; byte[] buff = new byte[sizeof(float) * 2]; Buffer.BlockCopy(BitConverter.GetBytes(pos.x), 0, buff, 0 * sizeof(float), sizeof(float)); Buffer.BlockCopy(BitConverter.GetBytes(pos.y), 0, buff, 1 * sizeof(float), sizeof(float)); MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.PlaceGarlic, Hazel.SendOption.Reliable); writer.WriteBytesAndSize(buff); writer.EndMessage(); RPCProcedure.placeGarlic(buff); }, () => { return(!Vampire.localPlacedGarlic && !PlayerControl.LocalPlayer.IDOFAMCIJKE.FGNJJFABIHJ && Vampire.garlicsActive); }, () => { return(PlayerControl.LocalPlayer.AMDJMEEHNIG && !Vampire.localPlacedGarlic); }, () => { }, Vampire.getGarlicButtonSprite(), Vector3.zero, __instance, true ); // Jackal Sidekick Button jackalSidekickButton = new CustomButton( () => { MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.JackalCreatesSidekick, Hazel.SendOption.Reliable, -1); writer.Write(Jackal.currentTarget.PlayerId); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.jackalCreatesSidekick(Jackal.currentTarget.PlayerId); }, () => { return(Jackal.canCreateSidekick && Sidekick.sidekick == null && Jackal.fakeSidekick == null && Jackal.jackal != null && Jackal.jackal == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.IDOFAMCIJKE.FGNJJFABIHJ); }, () => { return(Sidekick.sidekick == null && Jackal.fakeSidekick == null && Jackal.currentTarget != null && PlayerControl.LocalPlayer.AMDJMEEHNIG); }, () => { jackalSidekickButton.Timer = jackalSidekickButton.MaxTimer; }, Jackal.getSidekickButtonSprite(), new Vector3(-1.3f, 1.3f, 0f), __instance ); // Jackal Kill jackalKillButton = new CustomButton( () => { if (!Helpers.handleMurderAttempt(Jackal.currentTarget)) { return; } byte targetId = Jackal.currentTarget.PlayerId; MessageWriter killWriter = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.JackalKill, Hazel.SendOption.Reliable, -1); killWriter.Write(targetId); AmongUsClient.Instance.FinishRpcImmediately(killWriter); RPCProcedure.jackalKill(targetId); jackalKillButton.Timer = jackalKillButton.MaxTimer; Jackal.currentTarget = null; }, () => { return(Jackal.jackal != null && Jackal.jackal == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.IDOFAMCIJKE.FGNJJFABIHJ); }, () => { return(Jackal.currentTarget && PlayerControl.LocalPlayer.AMDJMEEHNIG); }, () => { jackalKillButton.Timer = jackalKillButton.MaxTimer; }, __instance.KillButton.renderer.sprite, new Vector3(-1.3f, 0, 0), __instance ); // Sidekick Kill sidekickKillButton = new CustomButton( () => { if (!Helpers.handleMurderAttempt(Sidekick.currentTarget)) { return; } byte targetId = Sidekick.currentTarget.PlayerId; MessageWriter killWriter = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SidekickKill, Hazel.SendOption.Reliable, -1); killWriter.Write(targetId); AmongUsClient.Instance.FinishRpcImmediately(killWriter); RPCProcedure.sidekickKill(targetId); sidekickKillButton.Timer = sidekickKillButton.MaxTimer; Sidekick.currentTarget = null; }, () => { return(Sidekick.canKill && Sidekick.sidekick != null && Sidekick.sidekick == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.IDOFAMCIJKE.FGNJJFABIHJ); }, () => { return(Sidekick.currentTarget && PlayerControl.LocalPlayer.AMDJMEEHNIG); }, () => { sidekickKillButton.Timer = sidekickKillButton.MaxTimer; }, __instance.KillButton.renderer.sprite, new Vector3(-1.3f, 0, 0), __instance ); // Lighter light lighterButton = new CustomButton( () => { Lighter.lighterTimer = Lighter.duration; }, () => { return(Lighter.lighter != null && Lighter.lighter == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.IDOFAMCIJKE.FGNJJFABIHJ); }, () => { return(PlayerControl.LocalPlayer.AMDJMEEHNIG); }, () => { lighterButton.Timer = lighterButton.MaxTimer; lighterButton.isEffectActive = false; lighterButton.killButtonManager.TimerText.Color = Palette.MKAFGNEBHKC; }, Lighter.getButtonSprite(), new Vector3(-1.3f, 0f, 0f), __instance, true, Lighter.duration, () => { lighterButton.Timer = lighterButton.MaxTimer; } ); // Eraser erase button eraserButton = new CustomButton( () => { eraserButton.MaxTimer += 10; eraserButton.Timer = eraserButton.MaxTimer; MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetFutureErased, Hazel.SendOption.Reliable, -1); writer.Write(Eraser.currentTarget.PlayerId); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.setFutureErased(Eraser.currentTarget.PlayerId); }, () => { return(Eraser.eraser != null && Eraser.eraser == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.IDOFAMCIJKE.FGNJJFABIHJ); }, () => { return(PlayerControl.LocalPlayer.AMDJMEEHNIG && Eraser.currentTarget != null); }, () => { eraserButton.Timer = eraserButton.MaxTimer; }, Eraser.getButtonSprite(), new Vector3(-1.3f, 1.3f, 0f), __instance ); // Set the default (or settings from the previous game) timers/durations when spawning the buttons setCustomButtonCooldowns(); }
public static void Postfix(PlayerPhysics __instance) { if (__instance.AmOwner && __instance.myPlayer.CanMove && GameData.Instance && isStealthed(__instance.myPlayer)) { __instance.body.velocity *= speedBonus; } if (isRole(__instance.myPlayer)) { var ninja = __instance.myPlayer; if (ninja == null || ninja.isDead()) { return; } bool canSee = PlayerControl.LocalPlayer.isImpostor() || PlayerControl.LocalPlayer.isDead() || (Lighter.canSeeNinja && PlayerControl.LocalPlayer.isRole(RoleType.Lighter) && Lighter.isLightActive(PlayerControl.LocalPlayer)); var opacity = canSee ? 0.1f : 0.0f; if (isStealthed(ninja)) { opacity = Math.Max(opacity, 1.0f - stealthFade(ninja)); ninja.MyRend.material.SetFloat("_Outline", 0f); } else { opacity = Math.Max(opacity, stealthFade(ninja)); } setOpacity(ninja, opacity); } }