From: gendelo3 Date: Wed, 15 May 2024 06:26:18 +0000 (+0200) Subject: Preparation vor Update v4.5.3 X-Git-Url: https://git.deb.at/?a=commitdiff_plain;h=9c36355058321e57ad8088f68393673c2009aa05;p=rhonda%2Ftheotherroles.git Preparation vor Update v4.5.3 --- diff --git a/README.md b/README.md index 4c577fe..4e04661 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,8 @@ Even more roles are coming soon. :) | [Witch](#witch) | [Tracker](#tracker) | | | | [Ninja](#ninja) | [Snitch](#snitch) | | | | [Bomber](#bomber) | [Spy](#spy) | | | -| [Evil Guesser](#guesser) | [Portalmaker](#portalmaker) | | | -| | [Security Guard](#security-guard) | | | +| [Yo-Yo](#yoyo) | [Portalmaker](#portalmaker) | | | +| [Evil Guesser](#guesser) | [Security Guard](#security-guard) | | | | | [Medium](#medium) | | | | | [Trapper](#trapper) | | | | | [Nice Guesser](#guesser) | | | @@ -42,6 +42,7 @@ The [Role Assignment](#role-assignment) section explains how the roles are being # Releases | Among Us - Version| Mod Version | Link | |----------|-------------|-----------------| +| 2024.3.5s| v4.5.3| [Download](https://github.com/TheOtherRolesAU/TheOtherRoles/releases/download/v4.5.3/TheOtherRoles.zip) | 2024.3.5s| v4.5.2| [Download](https://github.com/TheOtherRolesAU/TheOtherRoles/releases/download/v4.5.2/TheOtherRoles.zip) | 2023.11.28s| v4.5.1| [Download](https://github.com/TheOtherRolesAU/TheOtherRoles/releases/download/v4.5.1/TheOtherRoles.zip) @@ -132,6 +133,19 @@ The [Role Assignment](#role-assignment) section explains how the roles are being
Click to show the Changelog +**Version 4.5.3** +- Added a new role: Yo-Yo (Impostor) - Mark and blink to a position, then blink back to the start of the blink! +- Added a new option to Jackal And Sidekick: Jackal / Sidekick can sabotage lights (cooldown syncs with Imp Sabotages) +- Added a new option: Block Dead Impostor From Sabotaging +- Added a new option to the Tracker: Tracking Type: Arrow, Proximity Meter, Both +- Added a new feature: The host is always displayed to all players, in the meeting ui and ping tracker text +- Added a new feature: Ghosts see the icons of all players on their map +- Fixed the chat command to ban a player from the lobby `/ban` +- Fixed an issue where killing in PropHunt crashed the lobby +- Fixed an issue with the very short kill distance in Vanilla HideNSeek +- Changed trapper trap: is now visible with transparency to the trapper while inactive + + **Version 4.5.2** - Updated to Among Us version 2024.3.5s (various small / "long" features and bugfixes) - Updated BepInEx dependency to 688 @@ -1228,6 +1242,31 @@ Crewmates can defuse a bomb depending on the settings. | Bomb Is Active After | ----------------------- +## YoYo +### **Team: Impostors** +The Yo-Yo is an Impostor who has the ability mark a position and later blink (teleport) to this position.\ +After the initial blink, the Yo-Yo has a fixed amount of time (option) to do whatever they want, before automatically blinking back to the starting point of the first blink.\ +Each blink leaves behind a silhouette with configurable transparency. The silhouette is very hard to see.\ +The Yo-Yo may also have access to a mobile admin table, depending on the settings. + +**NOTE:** + +- The marked position for the first jump's target is displayed to the Yo-Yo and ghosts only. +- The silhouette of the first blink stays (almost) until the Yo-Yo returns +- The silhouette of the second blink (return) stays for 5 seconds + +### Game Options +| Name | Description | +|----------|:-------------:| +| Yo-Yo Spawn Chance | - +| Blink Duration | - +| Mark Location Cooldown | - +| Marked Location Stays After Meeting | - +| Has Admin Table | - +| Admin Table Cooldown | - +| Silhouette Visibility | - +----------------------- + ## Guesser ### **Team: Crewmates or Impostors** The Guesser can be a Crewmate or an Impostor (depending on the settings).\ @@ -1321,7 +1360,12 @@ If both Impostors and Jackals are in the game, the game continues even if all Cr | Jackal/Sidekick Kill Cooldown | Kill cooldown | | Jackal Create Sidekick Cooldown | Cooldown before a Sidekick can be created | | Jackal can use vents | Yes/No | +| Jackal can sabotage Lights | Yes/No | | Jackal can create a Sidekick | Yes/No | +| Sidekick gets promoted to Jackal on Jackal Death | Yes/No | +| Sidekick can kill | Yes/No | +| Sidekick can Vent | Yes/No | +| Jackal can sabotage Lights | Yes/No | | Jackals promoted from Sidekick can create a Sidekick | Yes/No (to prevent the Jackal team from growing) | | Jackals can make an Impostor to their Sidekick | Yes/No (to prevent a Jackal from turning an Impostor into a Sidekick, if they use the ability on an Impostor they see the Impostor as Sidekick, but the Impostor isn't converted to Sidekick. If this option is set to "No" Jackal and Sidekick can kill each other.) | | Jackal and Sidekick have Impostor vision | - | @@ -1685,6 +1729,7 @@ While accessing those mobile gadgets, the Hacker is not able to move. The Tracker can select one player to track. Depending on the options the Tracker can track a different person after each meeting or the Tracker tracks the same person for the whole game.\ An arrow points to the last tracked position of the player.\ The arrow updates its position every few seconds (configurable).\ +By an option, the arrow can be replaced or combined with the Proximity Tracker from Hide N Seek.\ Depending on the options, the Tracker has another ability: They can track all corpses on the map for a set amount of time. They will keep tracking corpses, even if they were cleaned or eaten by the Vulture. **NOTE** @@ -1699,6 +1744,7 @@ Depending on the options, the Tracker has another ability: They can track all co | Tracker Can Track Corpses | - | Corpses Tracking Cooldown | - | Corpses Tracking Duration | - +| How Tracker Gets Target Location| - ----------------------- ## Snitch diff --git a/TheOtherRoles/Buttons.cs b/TheOtherRoles/Buttons.cs index c9e3b85..763bbda 100644 --- a/TheOtherRoles/Buttons.cs +++ b/TheOtherRoles/Buttons.cs @@ -40,6 +40,7 @@ namespace TheOtherRoles public static CustomButton jackalKillButton; public static CustomButton sidekickKillButton; private static CustomButton jackalSidekickButton; + public static CustomButton jackalAndSidekickSabotageLightsButton; private static CustomButton eraserButton; private static CustomButton placeJackInTheBoxButton; private static CustomButton lightsOutButton; @@ -57,6 +58,8 @@ namespace TheOtherRoles public static CustomButton thiefKillButton; public static CustomButton trapperButton; public static CustomButton bomberButton; + public static CustomButton yoyoButton; + public static CustomButton yoyoAdminTableButton; public static CustomButton defuseButton; public static CustomButton zoomOutButton; private static CustomButton hunterLighterButton; @@ -136,6 +139,9 @@ namespace TheOtherRoles mayorMeetingButton.MaxTimer = GameManager.Instance.LogicOptions.GetEmergencyCooldown(); trapperButton.MaxTimer = Trapper.cooldown; bomberButton.MaxTimer = Bomber.bombCooldown; + yoyoButton.MaxTimer = Yoyo.markCooldown; + yoyoAdminTableButton.MaxTimer = Yoyo.adminCooldown; + yoyoAdminTableButton.EffectDuration = 10f; hunterLighterButton.MaxTimer = Hunter.lightCooldown; hunterAdminTableButton.MaxTimer = Hunter.AdminCooldown; hunterArrowButton.MaxTimer = Hunter.ArrowCooldown; @@ -1065,6 +1071,27 @@ namespace TheOtherRoles KeyCode.Q ); + jackalAndSidekickSabotageLightsButton = new CustomButton( + () => { + ShipStatus.Instance.RpcUpdateSystem(SystemTypes.Sabotage, (byte)SystemTypes.Electrical); + }, + () => { + return (Jackal.jackal != null && Jackal.jackal == CachedPlayer.LocalPlayer.PlayerControl && Jackal.canSabotageLights || + Sidekick.sidekick != null && Sidekick.sidekick == CachedPlayer.LocalPlayer.PlayerControl && Sidekick.canSabotageLights) && !CachedPlayer.LocalPlayer.Data.IsDead; + }, + () => { + if (Helpers.sabotageTimer() > jackalAndSidekickSabotageLightsButton.Timer || Helpers.sabotageActive()) + jackalAndSidekickSabotageLightsButton.Timer = Helpers.sabotageTimer() + 5f; // this will give imps time to do another sabotage. + return Helpers.canUseSabotage();}, + () => { + jackalAndSidekickSabotageLightsButton.Timer = Helpers.sabotageTimer() + 5f; + }, + Trickster.getLightsOutButtonSprite(), + CustomButton.ButtonPositions.upperRowCenter, + __instance, + KeyCode.G + ); + // Eraser erase button eraserButton = new CustomButton( () => { @@ -1894,10 +1921,140 @@ namespace TheOtherRoles trapperChargesText.transform.localScale = Vector3.one * 0.5f; trapperChargesText.transform.localPosition += new Vector3(-0.05f, 0.7f, 0); + + // Yoyo button + yoyoButton = new CustomButton( + () => { + var pos = CachedPlayer.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)); + + if (Yoyo.markedLocation == null) { + TheOtherRolesPlugin.Logger.LogMessage($"marked location is null in button press"); + MessageWriter writer = AmongUsClient.Instance.StartRpc(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.YoyoMarkLocation, Hazel.SendOption.Reliable); + writer.WriteBytesAndSize(buff); + writer.EndMessage(); + RPCProcedure.yoyoMarkLocation(buff); + SoundEffectsManager.play("tricksterPlaceBox"); + yoyoButton.Sprite = Yoyo.getBlinkButtonSprite(); + yoyoButton.Timer = 10f; + yoyoButton.HasEffect = false; + yoyoButton.buttonText = "Blink"; + } else { + TheOtherRolesPlugin.Logger.LogMessage("in else for some reason"); + // Jump to location + TheOtherRolesPlugin.Logger.LogMessage($"trying to blink!"); + var exit = (Vector3)Yoyo.markedLocation; + if (SubmergedCompatibility.IsSubmerged) { + SubmergedCompatibility.ChangeFloor(exit.y > -7); + } + MessageWriter writer = AmongUsClient.Instance.StartRpc(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.YoyoBlink, Hazel.SendOption.Reliable); + writer.Write(Byte.MaxValue); + writer.WriteBytesAndSize(buff); + writer.EndMessage(); + RPCProcedure.yoyoBlink(true, buff); + yoyoButton.EffectDuration = Yoyo.blinkDuration; + yoyoButton.Timer = 10f; + yoyoButton.HasEffect = true; + yoyoButton.buttonText = "Returning..."; + SoundEffectsManager.play("morphlingMorph"); + } + }, + () => { return Yoyo.yoyo != null && Yoyo.yoyo == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; }, + () => { return CachedPlayer.LocalPlayer.PlayerControl.CanMove; }, + () => { + if (Yoyo.markStaysOverMeeting) { + yoyoButton.Timer = 10f; + } else { + Yoyo.markedLocation = null; + yoyoButton.Timer = yoyoButton.MaxTimer; + yoyoButton.Sprite = Yoyo.getMarkButtonSprite(); + yoyoButton.buttonText = "Mark Location"; + } + }, + Yoyo.getMarkButtonSprite(), + CustomButton.ButtonPositions.upperRowLeft, + __instance, + KeyCode.F, + false, + Yoyo.blinkDuration, + () => { + if (TransportationToolPatches.isUsingTransportation(Yoyo.yoyo)) { + yoyoButton.Timer = 0.5f; + yoyoButton.DeputyTimer = 0.5f; + yoyoButton.isEffectActive = true; + yoyoButton.actionButton.cooldownTimerText.color = new Color(0F, 0.8F, 0F); + return; + } else if (Yoyo.yoyo.inVent) { + __instance.ImpostorVentButton.DoClick(); + } + + // jump back! + var pos = CachedPlayer.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)); + var exit = (Vector3)Yoyo.markedLocation; + if (SubmergedCompatibility.IsSubmerged) { + SubmergedCompatibility.ChangeFloor(exit.y > -7); + } + MessageWriter writer = AmongUsClient.Instance.StartRpc(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.YoyoBlink, Hazel.SendOption.Reliable); + writer.Write((byte)0); + writer.WriteBytesAndSize(buff); + writer.EndMessage(); + RPCProcedure.yoyoBlink(false, buff); + + yoyoButton.Timer = yoyoButton.MaxTimer; + yoyoButton.isEffectActive = false; + yoyoButton.actionButton.cooldownTimerText.color = Palette.EnabledColor; + yoyoButton.HasEffect = false; + yoyoButton.Sprite = Yoyo.getMarkButtonSprite(); + yoyoButton.buttonText = "Mark Location"; + SoundEffectsManager.play("morphlingMorph"); + if (Minigame.Instance) { + Minigame.Instance.Close(); + } + }, + buttonText: "Mark Location" + ); + + yoyoAdminTableButton = new CustomButton( + () => { + if (!MapBehaviour.Instance || !MapBehaviour.Instance.isActiveAndEnabled) { + HudManager __instance = FastDestroyableSingleton.Instance; + __instance.InitMap(); + MapBehaviour.Instance.ShowCountOverlay(allowedToMove: true, showLivePlayerPosition: true, includeDeadBodies: true); + } + }, + () => { return Yoyo.yoyo != null && Yoyo.yoyo == CachedPlayer.LocalPlayer.PlayerControl && Yoyo.hasAdminTable && !CachedPlayer.LocalPlayer.Data.IsDead; }, + () => { + return true; + }, + () => { + yoyoAdminTableButton.Timer = yoyoAdminTableButton.MaxTimer; + yoyoAdminTableButton.isEffectActive = false; + yoyoAdminTableButton.actionButton.cooldownTimerText.color = Palette.EnabledColor; + }, + Hacker.getAdminSprite(), + CustomButton.ButtonPositions.lowerRowCenter, + __instance, + KeyCode.G, + true, + 0f, + () => { + yoyoAdminTableButton.Timer = yoyoAdminTableButton.MaxTimer; + if (MapBehaviour.Instance && MapBehaviour.Instance.isActiveAndEnabled) MapBehaviour.Instance.Close(); + }, + GameOptionsManager.Instance.currentNormalGameOptions.MapId == 3, + "ADMIN" + ); + + zoomOutButton = new CustomButton( () => { Helpers.toggleZoom(); }, - () => { if (CachedPlayer.LocalPlayer.PlayerControl == null || !CachedPlayer.LocalPlayer.Data.IsDead || CachedPlayer.LocalPlayer.Data.Role.IsImpostor) return false; + () => { if (CachedPlayer.LocalPlayer.PlayerControl == null || !CachedPlayer.LocalPlayer.Data.IsDead || (CachedPlayer.LocalPlayer.Data.Role.IsImpostor && !CustomOptionHolder.deadImpsBlockSabotage.getBool())) return false; var (playerCompleted, playerTotal) = TasksHandler.taskInfo(CachedPlayer.LocalPlayer.Data); int numberOfLeftTasks = playerTotal - playerCompleted; return numberOfLeftTasks <= 0 || !CustomOptionHolder.finishTasksBeforeHauntingOrZoomingOut.getBool(); diff --git a/TheOtherRoles/CustomGameModes/PropHunt.cs b/TheOtherRoles/CustomGameModes/PropHunt.cs index 6afac7a..633e140 100644 --- a/TheOtherRoles/CustomGameModes/PropHunt.cs +++ b/TheOtherRoles/CustomGameModes/PropHunt.cs @@ -544,7 +544,7 @@ namespace TheOtherRoles.CustomGameModes { [HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.MurderPlayer))] [HarmonyPostfix] public static void MurderPlayerPostfix(PlayerControl __instance, [HarmonyArgument(0)] PlayerControl target) { - if (!PropHunt.isPropHuntGM) return; + if (!PropHunt.isPropHuntGM || target != CachedPlayer.LocalPlayer.PlayerControl) return; try { target.NetTransform.RpcSnapTo(__instance.transform.position); } catch { } diff --git a/TheOtherRoles/CustomOptionHolder.cs b/TheOtherRoles/CustomOptionHolder.cs index 0578dcf..505590c 100644 --- a/TheOtherRoles/CustomOptionHolder.cs +++ b/TheOtherRoles/CustomOptionHolder.cs @@ -23,6 +23,7 @@ namespace TheOtherRoles { public static CustomOption anyPlayerCanStopStart; public static CustomOption enableEventMode; + public static CustomOption deadImpsBlockSabotage; public static CustomOption mafiaSpawnRate; public static CustomOption janitorCooldown; @@ -63,11 +64,13 @@ namespace TheOtherRoles { public static CustomOption jackalSpawnRate; public static CustomOption jackalKillCooldown; public static CustomOption jackalCreateSidekickCooldown; + public static CustomOption jackalCanSabotageLights; public static CustomOption jackalCanUseVents; public static CustomOption jackalCanCreateSidekick; public static CustomOption sidekickPromotesToJackal; public static CustomOption sidekickCanKill; public static CustomOption sidekickCanUseVents; + public static CustomOption sidekickCanSabotageLights; public static CustomOption jackalPromotedFromSidekickCanCreateSidekick; public static CustomOption jackalCanCreateSidekickFromImpostor; public static CustomOption jackalAndSidekickHaveImpostorVision; @@ -174,6 +177,7 @@ namespace TheOtherRoles { public static CustomOption trackerCanTrackCorpses; public static CustomOption trackerCorpsesTrackingCooldown; public static CustomOption trackerCorpsesTrackingDuration; + public static CustomOption trackerTrackingMethod; public static CustomOption snitchSpawnRate; public static CustomOption snitchLeftTasksForReveal; @@ -254,6 +258,16 @@ namespace TheOtherRoles { public static CustomOption bomberBombCooldown; public static CustomOption bomberBombActiveAfter; + public static CustomOption yoyoSpawnRate; + public static CustomOption yoyoBlinkDuration; + public static CustomOption yoyoMarkCooldown; + public static CustomOption yoyoMarkStaysOverMeeting; + public static CustomOption yoyoHasAdminTable; + public static CustomOption yoyoAdminTableCooldown; + public static CustomOption yoyoSilhouetteVisibility; + + + public static CustomOption modifiersAreHidden; public static CustomOption modifierBait; @@ -414,7 +428,7 @@ namespace TheOtherRoles { presetSelection = CustomOption.Create(0, Types.General, cs(new Color(204f / 255f, 204f / 255f, 0, 1f), "Preset"), presets, null, true); activateRoles = CustomOption.Create(1, Types.General, cs(new Color(204f / 255f, 204f / 255f, 0, 1f), "Enable Mod Roles And Block Vanilla Roles"), true, null, true); anyPlayerCanStopStart = CustomOption.Create(2, Types.General, cs(new Color(204f / 255f, 204f / 255f, 0, 1f), "Any Player Can Stop The Start"), false, null, false); - + if (Utilities.EventUtility.canBeEnabled) enableEventMode = CustomOption.Create(10423, Types.General, cs(Color.green, "Enable Special Mode"), true, null, true); // Using new id's for the options to not break compatibilty with older versions @@ -490,6 +504,16 @@ namespace TheOtherRoles { bomberBombCooldown = CustomOption.Create(465, Types.Impostor, "Bomb Cooldown", 15f, 2.5f, 30f, 2.5f, bomberSpawnRate); bomberBombActiveAfter = CustomOption.Create(466, Types.Impostor, "Bomb Is Active After", 3f, 0.5f, 15f, 0.5f, bomberSpawnRate); + + yoyoSpawnRate = CustomOption.Create(470, Types.Impostor, cs(Yoyo.color, "Yo-Yo"), rates, null, true); + yoyoBlinkDuration = CustomOption.Create(471, Types.Impostor, "Blink Duration", 20f, 2.5f, 120f, 2.5f, yoyoSpawnRate); + yoyoMarkCooldown = CustomOption.Create(472, Types.Impostor, "Mark Location Cooldown", 20f, 2.5f, 120f, 2.5f, yoyoSpawnRate); + yoyoMarkStaysOverMeeting = CustomOption.Create(473, Types.Impostor, "Marked Location Stays After Meeting", true, yoyoSpawnRate); + yoyoHasAdminTable = CustomOption.Create(474, Types.Impostor, "Has Admin Table", true, yoyoSpawnRate); + yoyoAdminTableCooldown = CustomOption.Create(475, Types.Impostor, "Admin Table Cooldown", 20f, 2.5f, 120f, 2.5f, yoyoHasAdminTable); + yoyoSilhouetteVisibility = CustomOption.Create(476, Types.Impostor, "Silhouette Visibility", new string[] { "0%", "10%", "20%", "30%", "40%", "50%" }, yoyoSpawnRate); + + guesserSpawnRate = CustomOption.Create(310, Types.Neutral, cs(Guesser.color, "Guesser"), rates, null, true); guesserIsImpGuesserRate = CustomOption.Create(311, Types.Neutral, "Chance That The Guesser Is An Impostor", rates, guesserSpawnRate); guesserNumberOfShots = CustomOption.Create(312, Types.Neutral, "Guesser Number Of Shots", 2f, 1f, 15f, 1f, guesserSpawnRate); @@ -511,10 +535,12 @@ namespace TheOtherRoles { jackalKillCooldown = CustomOption.Create(221, Types.Neutral, "Jackal/Sidekick Kill Cooldown", 30f, 10f, 60f, 2.5f, jackalSpawnRate); jackalCreateSidekickCooldown = CustomOption.Create(222, Types.Neutral, "Jackal Create Sidekick Cooldown", 30f, 10f, 60f, 2.5f, jackalSpawnRate); jackalCanUseVents = CustomOption.Create(223, Types.Neutral, "Jackal Can Use Vents", true, jackalSpawnRate); + jackalCanSabotageLights = CustomOption.Create(431, Types.Neutral, "Jackal Can Sabotage Lights", true, jackalSpawnRate); jackalCanCreateSidekick = CustomOption.Create(224, Types.Neutral, "Jackal Can Create A Sidekick", false, jackalSpawnRate); sidekickPromotesToJackal = CustomOption.Create(225, Types.Neutral, "Sidekick Gets Promoted To Jackal On Jackal Death", false, jackalCanCreateSidekick); sidekickCanKill = CustomOption.Create(226, Types.Neutral, "Sidekick Can Kill", false, jackalCanCreateSidekick); sidekickCanUseVents = CustomOption.Create(227, Types.Neutral, "Sidekick Can Use Vents", true, jackalCanCreateSidekick); + sidekickCanSabotageLights = CustomOption.Create(432, Types.Neutral, "Sidekick Can Sabotage Lights", true, jackalCanCreateSidekick); jackalPromotedFromSidekickCanCreateSidekick = CustomOption.Create(228, Types.Neutral, "Jackals Promoted From Sidekick Can Create A Sidekick", true, sidekickPromotesToJackal); jackalCanCreateSidekickFromImpostor = CustomOption.Create(229, Types.Neutral, "Jackals Can Make An Impostor To His Sidekick", true, jackalCanCreateSidekick); jackalAndSidekickHaveImpostorVision = CustomOption.Create(430, Types.Neutral, "Jackal And Sidekick Have Impostor Vision", false, jackalSpawnRate); @@ -608,6 +634,7 @@ namespace TheOtherRoles { trackerCanTrackCorpses = CustomOption.Create(203, Types.Crewmate, "Tracker Can Track Corpses", true, trackerSpawnRate); trackerCorpsesTrackingCooldown = CustomOption.Create(204, Types.Crewmate, "Corpses Tracking Cooldown", 30f, 5f, 120f, 5f, trackerCanTrackCorpses); trackerCorpsesTrackingDuration = CustomOption.Create(205, Types.Crewmate, "Corpses Tracking Duration", 5f, 2.5f, 30f, 2.5f, trackerCanTrackCorpses); + trackerTrackingMethod = CustomOption.Create(206, Types.Crewmate, "How Tracker Gets Target Location", new string[] { "Arrow Only", "Proximity Dectector Only", "Arrow + Proximity" }, trackerSpawnRate); snitchSpawnRate = CustomOption.Create(210, Types.Crewmate, cs(Snitch.color, "Snitch"), rates, null, true); snitchLeftTasksForReveal = CustomOption.Create(219, Types.Crewmate, "Task Count Where The Snitch Will Be Revealed", 5f, 0f, 25f, 1f, snitchSpawnRate); @@ -793,6 +820,7 @@ namespace TheOtherRoles { finishTasksBeforeHauntingOrZoomingOut = CustomOption.Create(9, Types.General, "Finish Tasks Before Haunting Or Zooming Out", true); camsNightVision = CustomOption.Create(11, Types.General, "Cams Switch To Night Vision If Lights Are Off", false, null, true); camsNoNightVisionIfImpVision = CustomOption.Create(12, Types.General, "Impostor Vision Ignores Night Vision Cams", false, camsNightVision, false); + deadImpsBlockSabotage = CustomOption.Create(13, Types.General, cs(Palette.ImpostorRed, "Block Dead Impostor From Sabotaging"), false, null, false); dynamicMap = CustomOption.Create(500, Types.General, "Play On A Random Map", false, null, true); diff --git a/TheOtherRoles/Helpers.cs b/TheOtherRoles/Helpers.cs index d9dc79c..3071494 100644 --- a/TheOtherRoles/Helpers.cs +++ b/TheOtherRoles/Helpers.cs @@ -277,6 +277,26 @@ namespace TheOtherRoles { return CachedPlayer.LocalPlayer.PlayerControl.myTasks.ToArray().Any((x) => x.TaskType == TaskTypes.MushroomMixupSabotage); } + + public static bool sabotageActive() { + var sabSystem = ShipStatus.Instance.Systems[SystemTypes.Sabotage].CastFast(); + return sabSystem.AnyActive; + } + + public static float sabotageTimer() { + var sabSystem = ShipStatus.Instance.Systems[SystemTypes.Sabotage].CastFast(); + return sabSystem.Timer; + } + public static bool canUseSabotage() { + var sabSystem = ShipStatus.Instance.Systems[SystemTypes.Sabotage].CastFast(); + ISystemType systemType; + IActivatable doors = null; + if (ShipStatus.Instance.Systems.TryGetValue(SystemTypes.Doors, out systemType)) { + doors = systemType.CastFast(); + } + return GameManager.Instance.SabotagesEnabled() && sabSystem.Timer <= 0f && !sabSystem.AnyActive && !(doors != null && doors.IsActive); + } + public static void setSemiTransparent(this PoolablePlayer player, bool value, float alpha=0.25f) { alpha = value ? alpha : 1f; foreach (SpriteRenderer r in player.gameObject.GetComponentsInChildren()) diff --git a/TheOtherRoles/Main.cs b/TheOtherRoles/Main.cs index 5ccb3c5..bc502ce 100644 --- a/TheOtherRoles/Main.cs +++ b/TheOtherRoles/Main.cs @@ -33,7 +33,7 @@ namespace TheOtherRoles public class TheOtherRolesPlugin : BasePlugin { public const string Id = "me.eisbison.theotherroles"; - public const string VersionString = "4.5.2"; + public const string VersionString = "4.5.3"; public static uint betaDays = 0; // amount of days for the build to be usable (0 for infinite!) public static Version Version = Version.Parse(VersionString); diff --git a/TheOtherRoles/Modules/ChatCommands.cs b/TheOtherRoles/Modules/ChatCommands.cs index 4b0c2b6..4cabe69 100644 --- a/TheOtherRoles/Modules/ChatCommands.cs +++ b/TheOtherRoles/Modules/ChatCommands.cs @@ -27,7 +27,7 @@ namespace TheOtherRoles.Modules { } } } else if (text.ToLower().StartsWith("/ban ")) { - string playerName = text.Substring(6); + string playerName = text.Substring(5); PlayerControl target = CachedPlayer.AllPlayers.FirstOrDefault(x => x.Data.PlayerName.Equals(playerName)); if (target != null && AmongUsClient.Instance != null && AmongUsClient.Instance.CanBan()) { var client = AmongUsClient.Instance.GetClient(target.OwnerId); diff --git a/TheOtherRoles/Modules/CustomOptions.cs b/TheOtherRoles/Modules/CustomOptions.cs index 61bf0f3..eec9887 100644 --- a/TheOtherRoles/Modules/CustomOptions.cs +++ b/TheOtherRoles/Modules/CustomOptions.cs @@ -1188,7 +1188,13 @@ namespace TheOtherRoles { public static void Prefix(ref StringNames stringName, ref string value) { if (stringName == StringNames.GameKillDistance) { - var index = GameOptionsManager.Instance.currentNormalGameOptions.KillDistance; + int index; + if (GameOptionsManager.Instance.currentGameMode == GameModes.Normal) { + index = GameOptionsManager.Instance.currentNormalGameOptions.KillDistance; + } + else { + index = GameOptionsManager.Instance.currentHideNSeekGameOptions.KillDistance; + } value = GameOptionsData.KillDistanceStrings[index]; } } diff --git a/TheOtherRoles/Objects/Arrow.cs b/TheOtherRoles/Objects/Arrow.cs index e10e8a6..5b66dbb 100644 --- a/TheOtherRoles/Objects/Arrow.cs +++ b/TheOtherRoles/Objects/Arrow.cs @@ -41,5 +41,39 @@ namespace TheOtherRoles.Objects { arrowBehaviour.target = target; arrowBehaviour.Update(); } + + public static void UpdateProximity(Vector3 position) { + if (!GameManager.Instance.GameHasStarted) return; + + if (Tracker.DangerMeterParent == null) { + Tracker.DangerMeterParent = GameObject.Instantiate(GameObject.Find("ImpostorDetector"), HudManager.Instance.transform); + Tracker.Meter = Tracker.DangerMeterParent.transform.GetChild(0).GetComponent(); + Tracker.DangerMeterParent.transform.localPosition = new(3.7f, -1.6f, 0); + var backgroundrend = Tracker.DangerMeterParent.transform.GetChild(0).GetChild(0).GetComponent(); + backgroundrend.color = backgroundrend.color.SetAlpha(0.5f); + } + Tracker.DangerMeterParent.SetActive(MeetingHud.Instance == null && LobbyBehaviour.Instance == null && !Tracker.tracker.Data.IsDead && Tracker.tracked != null); + Tracker.Meter.gameObject.SetActive(MeetingHud.Instance == null && LobbyBehaviour.Instance == null && !Tracker.tracker.Data.IsDead && Tracker.tracked != null); + if (Tracker.tracker.Data.IsDead) return; + if (Tracker.tracked == null) { + Tracker.Meter.SetDangerValue(0, 0); + return; + } + if (Tracker.DangerMeterParent.transform.localPosition.x != 3.7f) Tracker.DangerMeterParent.transform.localPosition = new(3.7f, -1.6f, 0); + float num = float.MaxValue; + float dangerLevel1; + float dangerLevel2; + + float sqrMagnitude = (position - Tracker.tracker.transform.position).sqrMagnitude; + if (sqrMagnitude < (55 * GameOptionsManager.Instance.currentNormalGameOptions.PlayerSpeedMod) && num > sqrMagnitude) + { + num = sqrMagnitude; + } + + dangerLevel1 = Mathf.Clamp01((55 - num) / (55 - 15 * GameOptionsManager.Instance.currentNormalGameOptions.PlayerSpeedMod)); + dangerLevel2 = Mathf.Clamp01((15 - num) / (15 * GameOptionsManager.Instance.currentNormalGameOptions.PlayerSpeedMod)); + + Tracker.Meter.SetDangerValue(dangerLevel1, dangerLevel2); + } } } \ No newline at end of file diff --git a/TheOtherRoles/Objects/CustomButton.cs b/TheOtherRoles/Objects/CustomButton.cs index a086aa1..525f463 100644 --- a/TheOtherRoles/Objects/CustomButton.cs +++ b/TheOtherRoles/Objects/CustomButton.cs @@ -33,7 +33,7 @@ namespace TheOtherRoles.Objects { public HudManager hudManager; public bool mirror; public KeyCode? hotkey; - private string buttonText; + public string buttonText; public bool isHandcuffed = false; private static readonly int Desat = Shader.PropertyToID("_Desat"); diff --git a/TheOtherRoles/Objects/Silhouette.cs b/TheOtherRoles/Objects/Silhouette.cs new file mode 100644 index 0000000..5d0f09f --- /dev/null +++ b/TheOtherRoles/Objects/Silhouette.cs @@ -0,0 +1,82 @@ +using Innersloth.DebugTool; +using LibCpp2IL.Elf; +using Reactor.Utilities.Extensions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TheOtherRoles.Utilities; +using UnityEngine; + +namespace TheOtherRoles.Objects { + public class Silhouette { + public GameObject gameObject; + public float timeRemaining; + public bool permanent = false; + private bool visibleForEveryOne = false; + private SpriteRenderer renderer; + + public static List silhouettes = new List(); + + + private static Sprite SilhouetteSprite; + public static Sprite getSilhouetteSprite() { + if (SilhouetteSprite) return SilhouetteSprite; + SilhouetteSprite = Helpers.loadSpriteFromResources("TheOtherRoles.Resources.Silhouette.png", 225f); + return SilhouetteSprite; + } + + public Silhouette(Vector3 p, float duration = 1f, bool visibleForEveryOne = true) { + if (duration <= 0f) { + TheOtherRolesPlugin.Logger.LogMessage("silhouette: permanent!"); + permanent = true; + } + this.visibleForEveryOne = visibleForEveryOne; + gameObject = new GameObject("Silhouette"); + gameObject.AddSubmergedComponent(SubmergedCompatibility.Classes.ElevatorMover); + //Vector3 position = new Vector3(p.x, p.y, CachedPlayer.LocalPlayer.transform.localPosition.z + 0.001f); // just behind player + Vector3 position = new Vector3(p.x, p.y, p.y / 1000f + 0.01f); + gameObject.transform.position = position; + gameObject.transform.localPosition = position; + + renderer = gameObject.AddComponent(); + renderer.sprite = getSilhouetteSprite(); + + timeRemaining = duration; + + renderer.color = renderer.color.SetAlpha(Yoyo.SilhouetteVisibility); + + bool visible = visibleForEveryOne || PlayerControl.LocalPlayer == Yoyo.yoyo || PlayerControl.LocalPlayer.Data.IsDead; + + gameObject.SetActive(visible); + silhouettes.Add(this); + } + + public static void clearSilhouettes() { + foreach (var sil in silhouettes) + sil.gameObject.Destroy(); + silhouettes = new(); + } + + public static void UpdateAll() { + foreach (Silhouette current in new List(silhouettes)) { + current.timeRemaining -= Time.fixedDeltaTime; + bool visible = current.visibleForEveryOne || PlayerControl.LocalPlayer == Yoyo.yoyo || PlayerControl.LocalPlayer.Data.IsDead; + current.gameObject.SetActive(visible); + + if (visible && current.timeRemaining > 0 && current.timeRemaining < 0.5) { + var alphaRatio = current.timeRemaining / 0.5f; + current.renderer.color = current.renderer.color.SetAlpha(Yoyo.SilhouetteVisibility * alphaRatio); + } + + if (current.timeRemaining < 0 && !current.permanent) { + TheOtherRolesPlugin.Logger.LogMessage($"update: permanent: {current.permanent}, time: {current.timeRemaining}"); + current.gameObject.SetActive(false); + UnityEngine.Object.Destroy(current.gameObject); + silhouettes.Remove(current); + } + } + } + } +} diff --git a/TheOtherRoles/Objects/Trap.cs b/TheOtherRoles/Objects/Trap.cs index 76bdde7..e8ce265 100644 --- a/TheOtherRoles/Objects/Trap.cs +++ b/TheOtherRoles/Objects/Trap.cs @@ -39,6 +39,7 @@ namespace TheOtherRoles.Objects { trapRenderer.sprite = getTrapSprite(); trap.SetActive(false); if (CachedPlayer.LocalPlayer.PlayerId == Trapper.trapper.PlayerId) trap.SetActive(true); + trapRenderer.color = Color.white * new Vector4(1, 1, 1, 0.5f); this.instanceId = ++instanceCounter; traps.Add(this); arrow.Update(position); @@ -46,6 +47,7 @@ namespace TheOtherRoles.Objects { FastDestroyableSingleton.Instance.StartCoroutine(Effects.Lerp(5, new Action((x) => { if (x == 1f) { this.triggerable = true; + trapRenderer.color = Color.white; } }))); } diff --git a/TheOtherRoles/Patches/CredentialsPatch.cs b/TheOtherRoles/Patches/CredentialsPatch.cs index 9f8bccc..1f9fbd5 100644 --- a/TheOtherRoles/Patches/CredentialsPatch.cs +++ b/TheOtherRoles/Patches/CredentialsPatch.cs @@ -30,22 +30,10 @@ $@" Special thanks to Smeggy"; [HarmonyPatch(typeof(PingTracker), nameof(PingTracker.Update))] internal static class PingTrackerPatch { - public static GameObject modStamp; - /*static void Prefix(PingTracker __instance) { - if (modStamp == null) { - modStamp = new GameObject("ModStamp"); - var rend = modStamp.AddComponent(); - rend.sprite = TheOtherRolesPlugin.GetModStamp(); - rend.color = new Color(1, 1, 1, 0.5f); - modStamp.transform.parent = __instance.transform.parent; - modStamp.transform.localScale *= SubmergedCompatibility.Loaded ? 0 : 0.6f; - } - float offset = (AmongUsClient.Instance.GameState == InnerNet.InnerNetClient.GameStates.Started) ? 0.75f : 0f; - modStamp.transform.position = FastDestroyableSingleton.Instance.MapButton.transform.position + Vector3.down * offset; - }*/ static void Postfix(PingTracker __instance){ - __instance.text.alignment = TMPro.TextAlignmentOptions.TopRight; + __instance.text.alignment = TextAlignmentOptions.TopRight; + var position = __instance.GetComponent(); if (AmongUsClient.Instance.GameState == InnerNet.InnerNetClient.GameStates.Started) { string gameModeText = $""; if (HideNSeek.isHideNSeekGM) gameModeText = $"Hide 'N Seek"; @@ -53,11 +41,7 @@ $@" Special thanks to Smeggy"; else if (PropHunt.isPropHuntGM) gameModeText = "Prop Hunt"; if (gameModeText != "") gameModeText = Helpers.cs(Color.yellow, gameModeText) + "\n"; __instance.text.text = $"TheOtherRoles v{TheOtherRolesPlugin.Version.ToString() + (TheOtherRolesPlugin.betaDays > 0 ? "-BETA" : "")}\n{gameModeText}" + __instance.text.text; - if (CachedPlayer.LocalPlayer.Data.IsDead || (!(CachedPlayer.LocalPlayer.PlayerControl == null) && (CachedPlayer.LocalPlayer.PlayerControl == Lovers.lover1 || CachedPlayer.LocalPlayer.PlayerControl == Lovers.lover2))) { - __instance.transform.localPosition = new Vector3(3.45f, __instance.transform.localPosition.y, __instance.transform.localPosition.z); - } else { - __instance.transform.localPosition = new Vector3(4.2f, __instance.transform.localPosition.y, __instance.transform.localPosition.z); - } + position.DistanceFromEdge = new Vector3(2.25f, 0.11f, 0); } else { string gameModeText = $""; if (TORMapOptions.gameMode == CustomGamemodes.HideNSeek) gameModeText = $"Hide 'N Seek"; @@ -65,9 +49,11 @@ $@" Special thanks to Smeggy"; else if (TORMapOptions.gameMode == CustomGamemodes.PropHunt) gameModeText = $"Prop Hunt"; if (gameModeText != "") gameModeText = Helpers.cs(Color.yellow, gameModeText) + "\n"; - __instance.text.text = $"{fullCredentialsVersion}\n {gameModeText + fullCredentials}\n {__instance.text.text}"; - __instance.transform.localPosition = new Vector3(3.5f, __instance.transform.localPosition.y, __instance.transform.localPosition.z); + var host = $"Host: {GameData.Instance?.GetHost()?.PlayerName}"; + __instance.text.text = $"{fullCredentialsVersion}\n {gameModeText + fullCredentials}\n {host}\n {__instance.text.text}"; + position.DistanceFromEdge = new Vector3(3.5f, 0.1f, 0); } + position.AdjustPosition(); } } diff --git a/TheOtherRoles/Patches/DangerMeterPatch.cs b/TheOtherRoles/Patches/DangerMeterPatch.cs new file mode 100644 index 0000000..c3f041e --- /dev/null +++ b/TheOtherRoles/Patches/DangerMeterPatch.cs @@ -0,0 +1,21 @@ +using HarmonyLib; +using TheOtherRoles.Players; +using UnityEngine; + +namespace TheOtherRoles.Patches { + + [HarmonyPatch] + + public class DangerMeterPatch { + + [HarmonyPatch(typeof(DangerMeter), nameof(DangerMeter.SetFirstNBarColors))] + [HarmonyPrefix] + + public static void Prefix(DangerMeter __instance, ref Color color) { + if (CachedPlayer.LocalPlayer.PlayerControl != Tracker.tracker) return; + if (__instance == HudManager.Instance.DangerMeter) return; + + color = color.SetAlpha(0.5f); + } + } +} \ No newline at end of file diff --git a/TheOtherRoles/Patches/ExileControllerPatch.cs b/TheOtherRoles/Patches/ExileControllerPatch.cs index 63a4ef5..50e1f83 100644 --- a/TheOtherRoles/Patches/ExileControllerPatch.cs +++ b/TheOtherRoles/Patches/ExileControllerPatch.cs @@ -271,6 +271,9 @@ namespace TheOtherRoles.Patches { FastDestroyableSingleton.Instance.StartCoroutine(Effects.Lerp(GameOptionsManager.Instance.currentNormalGameOptions.KillCooldown / 2 + 2, new Action((p) => { if (p == 1f) foreach (Trap trap in Trap.traps) trap.triggerable = true; }))); + + if (!Yoyo.markStaysOverMeeting) + Silhouette.clearSilhouettes(); } } diff --git a/TheOtherRoles/Patches/MapBehaviourPatch.cs b/TheOtherRoles/Patches/MapBehaviourPatch.cs index 8456f7d..76e9272 100644 --- a/TheOtherRoles/Patches/MapBehaviourPatch.cs +++ b/TheOtherRoles/Patches/MapBehaviourPatch.cs @@ -34,6 +34,10 @@ namespace TheOtherRoles.Patches { [HarmonyPatch(typeof(MapBehaviour), nameof(MapBehaviour.FixedUpdate))] static void Postfix(MapBehaviour __instance) { + if (__instance.infectedOverlay.gameObject.active && PlayerControl.LocalPlayer.Data.IsDead && CustomOptionHolder.deadImpsBlockSabotage.getBool()) { + __instance.Close(); + } + __instance.HerePoint.transform.SetLocalZ(-2.1f); if (Trapper.trapper != null && CachedPlayer.LocalPlayer.PlayerId == Trapper.trapper.PlayerId) { foreach (PlayerControl player in Trapper.playersOnMap) { @@ -91,6 +95,30 @@ namespace TheOtherRoles.Patches { } } + // Show location of all players on the map for ghosts! + if (PlayerControl.LocalPlayer.Data.IsDead && (!PlayerControl.LocalPlayer.Data.Role.IsImpostor || CustomOptionHolder.deadImpsBlockSabotage.getBool())) { + foreach (PlayerControl player in CachedPlayer.AllPlayers) { + if (player == PlayerControl.LocalPlayer) + continue; + var alpha = player.Data.IsDead ? 0.25f : 1f; + Vector3 v = player.transform.position; + v /= MapUtilities.CachedShipStatus.MapScale; + v.x *= Mathf.Sign(MapUtilities.CachedShipStatus.transform.localScale.x); + v.z = -2.1f; + if (herePoints.ContainsKey(player)) { + herePoints[player].transform.localPosition = v; + herePoints[player].color = herePoints[player].color.SetAlpha(alpha); + continue; + } + var herePoint = UnityEngine.Object.Instantiate(__instance.HerePoint, __instance.HerePoint.transform.parent, true); + herePoint.transform.localPosition = v; + herePoint.enabled = true; + + int colorId = player.CurrentOutfit.ColorId; + player.SetPlayerMaterialColors(herePoint); + herePoints.Add(player, herePoint); + } + } foreach (var vent in MapUtilities.CachedShipStatus.AllVents) { if ((vent.name.StartsWith("JackInThe") && !(PlayerControl.LocalPlayer == Trickster.trickster || PlayerControl.LocalPlayer.Data.IsDead))) continue; //for trickster vents diff --git a/TheOtherRoles/Patches/MeetingPatch.cs b/TheOtherRoles/Patches/MeetingPatch.cs index 39b26a8..0a9023d 100644 --- a/TheOtherRoles/Patches/MeetingPatch.cs +++ b/TheOtherRoles/Patches/MeetingPatch.cs @@ -10,6 +10,7 @@ using TheOtherRoles.Players; using TheOtherRoles.Utilities; using UnityEngine; using Innersloth.Assets; +using TMPro; namespace TheOtherRoles.Patches { [HarmonyPatch] @@ -792,5 +793,36 @@ namespace TheOtherRoles.Patches { EventUtility.meetingStartsUpdate(); } + [HarmonyPatch] + public class ShowHost { + private static TextMeshPro Text = null; + [HarmonyPatch(typeof(MeetingHud), nameof(MeetingHud.Start))] + [HarmonyPostfix] + + public static void Setup(MeetingHud __instance) + { + if (AmongUsClient.Instance.NetworkMode != NetworkModes.OnlineGame) return; + + __instance.ProceedButton.gameObject.transform.localPosition = new(-2.5f, 2.2f, 0); + __instance.ProceedButton.gameObject.GetComponent().enabled = false; + __instance.ProceedButton.GetComponent().enabled = false; + __instance.HostIcon.gameObject.SetActive(true); + __instance.ProceedButton.gameObject.SetActive(true); + } + + [HarmonyPatch(typeof(MeetingHud), nameof(MeetingHud.Update))] + [HarmonyPostfix] + + public static void Postfix(MeetingHud __instance) { + var host = GameData.Instance.GetHost(); + + if (host != null) + { + PlayerMaterial.SetColors(host.DefaultOutfit.ColorId, __instance.HostIcon); + if (Text == null) Text = __instance.ProceedButton.gameObject.GetComponentInChildren(); + Text.text = $"host: {host.PlayerName}"; + } + } + } } } diff --git a/TheOtherRoles/Patches/PlayerControlPatch.cs b/TheOtherRoles/Patches/PlayerControlPatch.cs index 68355cb..213d1e2 100644 --- a/TheOtherRoles/Patches/PlayerControlPatch.cs +++ b/TheOtherRoles/Patches/PlayerControlPatch.cs @@ -398,10 +398,11 @@ namespace TheOtherRoles.Patches { if (Tracker.arrow?.arrow != null) { if (Tracker.tracker == null || CachedPlayer.LocalPlayer.PlayerControl != Tracker.tracker) { Tracker.arrow.arrow.SetActive(false); + if (Tracker.DangerMeterParent) Tracker.DangerMeterParent.SetActive(false); return; } - if (Tracker.tracker != null && Tracker.tracked != null && CachedPlayer.LocalPlayer.PlayerControl == Tracker.tracker && !Tracker.tracker.Data.IsDead) { + if (Tracker.tracked != null && !Tracker.tracker.Data.IsDead) { Tracker.timeUntilUpdate -= Time.fixedDeltaTime; if (Tracker.timeUntilUpdate <= 0f) { @@ -415,12 +416,19 @@ namespace TheOtherRoles.Patches { } } - Tracker.arrow.Update(position); - Tracker.arrow.arrow.SetActive(trackedOnMap); + if (Tracker.trackingMode == 1 || Tracker.trackingMode == 2) Arrow.UpdateProximity(position); + if (Tracker.trackingMode == 0 || Tracker.trackingMode == 2) { + Tracker.arrow.Update(position); + Tracker.arrow.arrow.SetActive(trackedOnMap); + } Tracker.timeUntilUpdate = Tracker.updateIntervall; } else { - Tracker.arrow.Update(); + if (Tracker.trackingMode == 0 || Tracker.trackingMode == 2) Tracker.arrow.Update(); } + } + else if (Tracker.tracker.Data.IsDead) { + Tracker.DangerMeterParent?.SetActive(false); + Tracker.Meter?.gameObject.SetActive(false); } } @@ -1072,6 +1080,8 @@ namespace TheOtherRoles.Patches { ninjaUpdate(); // Thief thiefSetTarget(); + // yoyo + Silhouette.UpdateAll(); hackerUpdate(); swapperUpdate(); diff --git a/TheOtherRoles/Patches/RoleAssignmentPatch.cs b/TheOtherRoles/Patches/RoleAssignmentPatch.cs index 43dddd5..31c7855 100644 --- a/TheOtherRoles/Patches/RoleAssignmentPatch.cs +++ b/TheOtherRoles/Patches/RoleAssignmentPatch.cs @@ -120,6 +120,7 @@ namespace TheOtherRoles.Patches { impSettings.Add((byte)RoleId.Witch, CustomOptionHolder.witchSpawnRate.getSelection()); impSettings.Add((byte)RoleId.Ninja, CustomOptionHolder.ninjaSpawnRate.getSelection()); impSettings.Add((byte)RoleId.Bomber, CustomOptionHolder.bomberSpawnRate.getSelection()); + impSettings.Add((byte)RoleId.Yoyo, CustomOptionHolder.yoyoSpawnRate.getSelection()); neutralSettings.Add((byte)RoleId.Jester, CustomOptionHolder.jesterSpawnRate.getSelection()); neutralSettings.Add((byte)RoleId.Arsonist, CustomOptionHolder.arsonistSpawnRate.getSelection()); diff --git a/TheOtherRoles/Patches/UpdatePatch.cs b/TheOtherRoles/Patches/UpdatePatch.cs index 7d25225..34cf405 100644 --- a/TheOtherRoles/Patches/UpdatePatch.cs +++ b/TheOtherRoles/Patches/UpdatePatch.cs @@ -324,6 +324,7 @@ namespace TheOtherRoles.Patches { static void updateSabotageButton(HudManager __instance) { if (MeetingHud.Instance || TORMapOptions.gameMode == CustomGamemodes.HideNSeek || TORMapOptions.gameMode == CustomGamemodes.PropHunt) __instance.SabotageButton.Hide(); + if (PlayerControl.LocalPlayer.Data.IsDead && CustomOptionHolder.deadImpsBlockSabotage.getBool()) __instance.SabotageButton.Hide(); } static void updateMapButton(HudManager __instance) { diff --git a/TheOtherRoles/Patches/UsablesPatch.cs b/TheOtherRoles/Patches/UsablesPatch.cs index 24b09e8..6c6569f 100644 --- a/TheOtherRoles/Patches/UsablesPatch.cs +++ b/TheOtherRoles/Patches/UsablesPatch.cs @@ -738,6 +738,10 @@ namespace TheOtherRoles.Patches { if (HideNSeek.isHideNSeekGM) return HideNSeek.canSabotage; if (PropHunt.isPropHuntGM) return false; + if (PlayerControl.LocalPlayer.Data.IsDead && CustomOptionHolder.deadImpsBlockSabotage.getBool()) { + __instance.ShowNormalMap(); + return false; + } return true; } } diff --git a/TheOtherRoles/RPC.cs b/TheOtherRoles/RPC.cs index 6153efd..8c11663 100644 --- a/TheOtherRoles/RPC.cs +++ b/TheOtherRoles/RPC.cs @@ -62,6 +62,7 @@ namespace TheOtherRoles Ninja, Thief, Bomber, + Yoyo, Crewmate, Impostor, // Modifier --- @@ -148,6 +149,8 @@ namespace TheOtherRoles PlaceBomb, DefuseBomb, ShareRoom, + YoyoMarkLocation, + YoyoBlink, // Gamemode SetGuesserGm, @@ -172,6 +175,7 @@ namespace TheOtherRoles Garlic.clearGarlics(); JackInTheBox.clearJackInTheBoxes(); NinjaTrace.clearTraces(); + Silhouette.clearSilhouettes(); Portal.clearPortals(); Bloodytrail.resetSprites(); Trap.clearTraps(); @@ -379,6 +383,9 @@ namespace TheOtherRoles case RoleId.Bomber: Bomber.bomber = player; break; + case RoleId.Yoyo: + Yoyo.yoyo = player; + break; } if (AmongUsClient.Instance.AmHost && Helpers.roleCanUseVents(player) && !player.Data.Role.IsImpostor) { player.RpcSetRole(RoleTypes.Engineer); @@ -744,6 +751,7 @@ namespace TheOtherRoles if (player == Witch.witch) Witch.clearAndReload(); if (player == Ninja.ninja) Ninja.clearAndReload(); if (player == Bomber.bomber) Bomber.clearAndReload(); + if (player == Yoyo.yoyo) Yoyo.clearAndReload(); // Other roles if (player == Jester.jester) Jester.clearAndReload(); @@ -1102,6 +1110,10 @@ namespace TheOtherRoles } if (target == Ninja.ninja) Ninja.ninja = thief; if (target == Bomber.bomber) Bomber.bomber = thief; + if (target == Yoyo.yoyo) { + Yoyo.yoyo = thief; + Yoyo.markedLocation = null; + } if (target.Data.Role.IsImpostor) { RoleManager.Instance.SetRole(Thief.thief, RoleTypes.Impostor); FastDestroyableSingleton.Instance.KillButton.SetCoolDown(Thief.thief.killTimer, GameOptionsManager.Instance.currentNormalGameOptions.KillCooldown); @@ -1288,6 +1300,40 @@ namespace TheOtherRoles if (Snitch.playerRoomMap.ContainsKey(playerId)) Snitch.playerRoomMap[playerId] = roomId; else Snitch.playerRoomMap.Add(playerId, roomId); } + + public static void yoyoMarkLocation(byte[] buff) { + if (Yoyo.yoyo == null) return; + Vector3 position = Vector3.zero; + position.x = BitConverter.ToSingle(buff, 0 * sizeof(float)); + position.y = BitConverter.ToSingle(buff, 1 * sizeof(float)); + Yoyo.markLocation(position); + new Silhouette(position, -1, false); + } + + public static void yoyoBlink(bool isFirstJump, byte[] buff) { + TheOtherRolesPlugin.Logger.LogMessage($"blink fistjumpo: {isFirstJump}"); + if (Yoyo.yoyo == null || Yoyo.markedLocation == null) return; + var markedPos = (Vector3)Yoyo.markedLocation; + Yoyo.yoyo.NetTransform.SnapTo(markedPos); + + var markedSilhouette = Silhouette.silhouettes.FirstOrDefault(s => s.gameObject.transform.position.x == markedPos.x && s.gameObject.transform.position.y == markedPos.y); + if (markedSilhouette != null) + markedSilhouette.permanent = false; + + Vector3 position = Vector3.zero; + position.x = BitConverter.ToSingle(buff, 0 * sizeof(float)); + position.y = BitConverter.ToSingle(buff, 1 * sizeof(float)); + // Create Silhoutte At Start Position: + if (isFirstJump) { + Yoyo.markLocation(position); + new Silhouette(position, Yoyo.blinkDuration, true); + } else { + new Silhouette(position, 5, true); + Yoyo.markedLocation = null; + } + if (Chameleon.chameleon.Any(x => x.PlayerId == Yoyo.yoyo.PlayerId)) // Make the Yoyo visible if chameleon! + Chameleon.lastMoved[Yoyo.yoyo.PlayerId] = Time.time; + } } [HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.HandleRpc))] @@ -1538,6 +1584,12 @@ namespace TheOtherRoles case (byte)CustomRPC.StopStart: RPCProcedure.stopStart(reader.ReadByte()); break; + case (byte)CustomRPC.YoyoMarkLocation: + RPCProcedure.yoyoMarkLocation(reader.ReadBytesAndSize()); + break; + case (byte)CustomRPC.YoyoBlink: + RPCProcedure.yoyoBlink(reader.ReadByte() == byte.MaxValue, reader.ReadBytesAndSize()); + break; // Game mode case (byte)CustomRPC.SetGuesserGm: diff --git a/TheOtherRoles/Resources/Silhouette.png b/TheOtherRoles/Resources/Silhouette.png new file mode 100644 index 0000000..ca0f93a Binary files /dev/null and b/TheOtherRoles/Resources/Silhouette.png differ diff --git a/TheOtherRoles/Resources/YoyoBlinkButtonSprite.png b/TheOtherRoles/Resources/YoyoBlinkButtonSprite.png new file mode 100644 index 0000000..cb8de34 Binary files /dev/null and b/TheOtherRoles/Resources/YoyoBlinkButtonSprite.png differ diff --git a/TheOtherRoles/Resources/YoyoMarkButtonSprite.png b/TheOtherRoles/Resources/YoyoMarkButtonSprite.png new file mode 100644 index 0000000..a8c40c9 Binary files /dev/null and b/TheOtherRoles/Resources/YoyoMarkButtonSprite.png differ diff --git a/TheOtherRoles/RoleInfo.cs b/TheOtherRoles/RoleInfo.cs index 53b0e3e..9fcccd5 100644 --- a/TheOtherRoles/RoleInfo.cs +++ b/TheOtherRoles/RoleInfo.cs @@ -75,6 +75,7 @@ namespace TheOtherRoles public static RoleInfo ninja = new RoleInfo("Ninja", Ninja.color, "Surprise and assassinate your foes", "Surprise and assassinate your foes", RoleId.Ninja); public static RoleInfo thief = new RoleInfo("Thief", Thief.color, "Steal a killers role by killing them", "Steal a killers role", RoleId.Thief, true); public static RoleInfo bomber = new RoleInfo("Bomber", Bomber.color, "Bomb all Crewmates", "Bomb all Crewmates", RoleId.Bomber); + public static RoleInfo yoyo = new RoleInfo("Yo-Yo", Yoyo.color, "Blink to a marked location and Back", "Blink to a location", RoleId.Yoyo); public static RoleInfo hunter = new RoleInfo("Hunter", Palette.ImpostorRed, Helpers.cs(Palette.ImpostorRed, "Seek and kill everyone"), "Seek and kill everyone", RoleId.Impostor); public static RoleInfo hunted = new RoleInfo("Hunted", Color.white, "Hide", "Hide", RoleId.Crewmate); @@ -113,6 +114,7 @@ namespace TheOtherRoles witch, ninja, bomber, + yoyo, goodGuesser, badGuesser, lover, @@ -202,6 +204,7 @@ namespace TheOtherRoles if (p == Witch.witch) infos.Add(witch); if (p == Ninja.ninja) infos.Add(ninja); if (p == Bomber.bomber) infos.Add(bomber); + if (p == Yoyo.yoyo) infos.Add(yoyo); if (p == Detective.detective) infos.Add(detective); if (p == TimeMaster.timeMaster) infos.Add(timeMaster); if (p == Medic.medic) infos.Add(medic); diff --git a/TheOtherRoles/SubmergedCompatibility.cs b/TheOtherRoles/SubmergedCompatibility.cs index f3311b6..fbfa491 100644 --- a/TheOtherRoles/SubmergedCompatibility.cs +++ b/TheOtherRoles/SubmergedCompatibility.cs @@ -113,9 +113,6 @@ namespace TheOtherRoles Version = plugin.Metadata.Version.BaseVersion(); Assembly = Plugin!.GetType().Assembly; } - - CredentialsPatch.PingTrackerPatch.modStamp = new GameObject(); - Object.DontDestroyOnLoad(CredentialsPatch.PingTrackerPatch.modStamp); Types = AccessTools.GetTypesFromAssembly(Assembly); diff --git a/TheOtherRoles/TheOtherRoles.cs b/TheOtherRoles/TheOtherRoles.cs index 8281ba9..63aa6be 100644 --- a/TheOtherRoles/TheOtherRoles.cs +++ b/TheOtherRoles/TheOtherRoles.cs @@ -10,6 +10,7 @@ using TheOtherRoles.CustomGameModes; using static TheOtherRoles.TheOtherRoles; using AmongUs.Data; using Hazel; +using Reactor.Utilities.Extensions; namespace TheOtherRoles { @@ -61,6 +62,7 @@ namespace TheOtherRoles Thief.clearAndReload(); Trapper.clearAndReload(); Bomber.clearAndReload(); + Yoyo.clearAndReload(); // Modifier Bait.clearAndReload(); @@ -737,7 +739,7 @@ namespace TheOtherRoles public static class Tracker { public static PlayerControl tracker; public static Color color = new Color32(100, 58, 220, byte.MaxValue); - public static List localArrows = new List(); + public static List localArrows = new(); public static float updateIntervall = 5f; public static bool resetTargetAfterMeeting = false; @@ -745,13 +747,17 @@ namespace TheOtherRoles public static float corpsesTrackingCooldown = 30f; public static float corpsesTrackingDuration = 5f; public static float corpsesTrackingTimer = 0f; - public static List deadBodyPositions = new List(); + public static int trackingMode = 0; + public static List deadBodyPositions = new(); public static PlayerControl currentTarget; public static PlayerControl tracked; public static bool usedTracker = false; public static float timeUntilUpdate = 0f; - public static Arrow arrow = new Arrow(Color.blue); + public static Arrow arrow = new(Color.blue); + + public static GameObject DangerMeterParent; + public static DangerMeter Meter; private static Sprite trackCorpsesButtonSprite; public static Sprite getTrackCorpsesButtonSprite() @@ -792,6 +798,11 @@ namespace TheOtherRoles corpsesTrackingCooldown = CustomOptionHolder.trackerCorpsesTrackingCooldown.getFloat(); corpsesTrackingDuration = CustomOptionHolder.trackerCorpsesTrackingDuration.getFloat(); canTrackCorpses = CustomOptionHolder.trackerCanTrackCorpses.getBool(); + trackingMode = CustomOptionHolder.trackerTrackingMethod.getSelection(); + if (DangerMeterParent) { + Meter.gameObject.Destroy(); + DangerMeterParent.Destroy(); + } } } @@ -889,6 +900,7 @@ namespace TheOtherRoles public static bool wasTeamRed; public static bool wasImpostor; public static bool wasSpy; + public static bool canSabotageLights; public static Sprite getSidekickButtonSprite() { if (buttonSprite) return buttonSprite; @@ -918,6 +930,7 @@ namespace TheOtherRoles formerJackals.Clear(); hasImpostorVision = CustomOptionHolder.jackalAndSidekickHaveImpostorVision.getBool(); wasTeamRed = wasImpostor = wasSpy = false; + canSabotageLights = CustomOptionHolder.jackalCanSabotageLights.getBool(); } } @@ -937,6 +950,7 @@ namespace TheOtherRoles public static bool canKill = true; public static bool promotesToJackal = true; public static bool hasImpostorVision = false; + public static bool canSabotageLights; public static void clearAndReload() { sidekick = null; @@ -947,6 +961,7 @@ namespace TheOtherRoles promotesToJackal = CustomOptionHolder.sidekickPromotesToJackal.getBool(); hasImpostorVision = CustomOptionHolder.jackalAndSidekickHaveImpostorVision.getBool(); wasTeamRed = wasImpostor = wasSpy = false; + canSabotageLights = CustomOptionHolder.sidekickCanSabotageLights.getBool(); } } @@ -1784,6 +1799,52 @@ namespace TheOtherRoles } } + public static class Yoyo { + public static PlayerControl yoyo = null; + public static Color color = Palette.ImpostorRed; + + public static float blinkDuration = 0; + public static float markCooldown = 0; + public static bool markStaysOverMeeting = false; + public static bool hasAdminTable = false; + public static float adminCooldown = 0; + public static float SilhouetteVisibility => (silhouetteVisibility == 0 && (PlayerControl.LocalPlayer == yoyo || PlayerControl.LocalPlayer.Data.IsDead)) ? 0.1f : silhouetteVisibility; + public static float silhouetteVisibility = 0; + + public static Vector3? markedLocation = null; + + private static Sprite markButtonSprite; + + public static Sprite getMarkButtonSprite() { + if (markButtonSprite) return markButtonSprite; + markButtonSprite = Helpers.loadSpriteFromResources("TheOtherRoles.Resources.YoyoMarkButtonSprite.png", 115f); + return markButtonSprite; + } + private static Sprite blinkButtonSprite; + + public static Sprite getBlinkButtonSprite() { + if (blinkButtonSprite) return blinkButtonSprite; + blinkButtonSprite = Helpers.loadSpriteFromResources("TheOtherRoles.Resources.YoyoBlinkButtonSprite.png", 115f); + return blinkButtonSprite; + } + + public static void markLocation(Vector3 position) { + markedLocation = position; + } + + public static void clearAndReload() { + blinkDuration = CustomOptionHolder.yoyoBlinkDuration.getFloat(); + markCooldown = CustomOptionHolder.yoyoMarkCooldown.getFloat(); + markStaysOverMeeting = CustomOptionHolder.yoyoMarkStaysOverMeeting.getBool(); + hasAdminTable = CustomOptionHolder.yoyoHasAdminTable.getBool(); + adminCooldown = CustomOptionHolder.yoyoAdminTableCooldown.getFloat(); + silhouetteVisibility = CustomOptionHolder.yoyoSilhouetteVisibility.getSelection() / 10f; + + markedLocation = null; + + } + } + // Modifier public static class Bait { public static List bait = new List(); diff --git a/TheOtherRoles/TheOtherRoles.csproj b/TheOtherRoles/TheOtherRoles.csproj index 1621806..9c056c1 100644 --- a/TheOtherRoles/TheOtherRoles.csproj +++ b/TheOtherRoles/TheOtherRoles.csproj @@ -1,7 +1,7 @@  net6.0 - 4.5.1 + 4.5.3 TheOtherRoles Eisbison latest @@ -17,8 +17,8 @@ - + diff --git a/TheOtherRoles/packages.lock.json b/TheOtherRoles/packages.lock.json index e3543ec..3bcb0fd 100644 --- a/TheOtherRoles/packages.lock.json +++ b/TheOtherRoles/packages.lock.json @@ -16,17 +16,17 @@ }, "BepInEx.Unity.IL2CPP": { "type": "Direct", - "requested": "[6.0.0-be.671, )", - "resolved": "6.0.0-be.671", - "contentHash": "XpmrBitEO7pe5YG9VHqn0nuelEF5Dp0Rpkxa2F7PFZF1a00KSsdCL809++HYnGzLumNOCIt7mO7yyDNP5k25mw==", + "requested": "[6.0.0-be.688, )", + "resolved": "6.0.0-be.688", + "contentHash": "a68J6PA9AdgYlj8HeuEK1hM4Vv+j1x/6TflK5/PaYAd05/TPdjNI09LsSTIOaS9hdWZwCcpPEw/HxLhXaQKodw==", "dependencies": { - "BepInEx.Core": "6.0.0-be.671", - "BepInEx.Unity.Common": "6.0.0-be.671", + "BepInEx.Core": "6.0.0-be.688", + "BepInEx.Unity.Common": "6.0.0-be.688", "HarmonyX": "2.10.1", "Iced": "1.18.0", - "Il2CppInterop.Generator": "1.4.6-ci.367", - "Il2CppInterop.HarmonySupport": "1.4.6-ci.367", - "Il2CppInterop.Runtime": "1.4.6-ci.367", + "Il2CppInterop.Generator": "1.4.6-ci.389", + "Il2CppInterop.HarmonySupport": "1.4.6-ci.389", + "Il2CppInterop.Runtime": "1.4.6-ci.389", "MonoMod.RuntimeDetour": "22.5.1.1", "Samboy063.Cpp2IL.Core": "2022.1.0-development.866" } @@ -70,15 +70,20 @@ "AsmResolver": "5.1.0" } }, + "AssetRipper.Primitives": { + "type": "Transitive", + "resolved": "2.1.0", + "contentHash": "nrgwUMa69ztOfMKbmytNI3mU/fuN3eWptq2Mu8aLg2ly394w51KJbUx5z477HbRvabD8TD8rM4wRe6EBqB2xdA==" + }, "AssetRipper.VersionUtilities": { "type": "Transitive", - "resolved": "1.3.1", - "contentHash": "/1D18NOpqm7rS7+qVUbAReVMNWwgDuYpsnf0RkX1Aah/I0a0irqldoFJ+Kku7YdbSm0zqD+Z6iYUGKoP3GwTNQ==" + "resolved": "1.2.1", + "contentHash": "knQ/W1YwTZS2AbdaZh+nhyyBEZQPQDcahhSOnh88i+cdg4/FEoFJiCwaavgFvCMNuUeHTbcZc4qttF8WQ8xLIA==" }, "BepInEx.Core": { "type": "Transitive", - "resolved": "6.0.0-be.671", - "contentHash": "Hp9QsgwtlGuNULFq5tF8YHrVD5R5WA5nMgFTJbcScWsGJDq7KPEhiLNGvKHAxcmMM8GA0CKM+jn8cJPtlMKvNQ==", + "resolved": "6.0.0-be.688", + "contentHash": "34VErIttx6PckRukoaRXIb6ZF5oby+9Oktt9E3ZafOGzA0lBWOmY/BKHfg766XZBplE06KijHp+vrryCjfLP7Q==", "dependencies": { "HarmonyX": "2.10.1", "MonoMod.Utils": "22.5.1.1", @@ -87,8 +92,8 @@ }, "BepInEx.Unity.Common": { "type": "Transitive", - "resolved": "6.0.0-be.671", - "contentHash": "05W7ERsHizZl0MacTAhiGkcihZl2b0DYBP0e6gA1Vzoay+teQ/mHy3zorGu1r8lLWlesH4LXl89HwFjrMA1ZKw==", + "resolved": "6.0.0-be.688", + "contentHash": "RRPG9sEgIdGgut0LOSQopW+6mMpE0LDggKZWfLBBeaJj1p0WFrVBCqEAruFLO0FrwT/+dEC7EtV62n13RV1JfA==", "dependencies": { "AssetRipper.VersionUtilities": "1.2.1", "MonoMod.Utils": "22.5.1.1" @@ -115,8 +120,8 @@ }, "Il2CppInterop.Common": { "type": "Transitive", - "resolved": "1.4.6-ci.367", - "contentHash": "zviSAk0COGdxx1KLTJlSi6lyvfRjbPO4qhj9RvLAU5zP74hwAkjhim0WsSo9clkkyGS+KXDrjnUEHqfXuMMm9Q==", + "resolved": "1.4.6-ci.389", + "contentHash": "KTyf2f66Q2mS9a6xhvoPWwD0VzRIoskPMVQehaVMo1dx4Di1FPFsKqukQ+ob6wgP5Rbnx53kiH0PY+IRSb35XA==", "dependencies": { "Iced": "1.17.0", "Microsoft.Extensions.Logging.Abstractions": "6.0.1", @@ -125,29 +130,29 @@ }, "Il2CppInterop.Generator": { "type": "Transitive", - "resolved": "1.4.6-ci.367", - "contentHash": "VP/1LX3wEy0/5BCrgggzIm9niyRGp/zjXaxFJip1D2bvM7oIXwK0LR0Rp8BE/uxKW8aQjVYxxwVwsdXPS/1KZw==", + "resolved": "1.4.6-ci.389", + "contentHash": "XJX4sn/RzAEBNIZZXuyDcLZrFx5tCoahujDu5aKWjApiMj/nTRQAxZn17daIIvd9aHqLaAfiWWth5QDLIt2bKw==", "dependencies": { - "Il2CppInterop.Common": "1.4.6-ci.367", + "Il2CppInterop.Common": "1.4.6-ci.389", "Mono.Cecil": "0.11.3" } }, "Il2CppInterop.HarmonySupport": { "type": "Transitive", - "resolved": "1.4.6-ci.367", - "contentHash": "rKb4Bt4cZQNWtI1L1/n/m5jJelP8pwAcQHwN/gaUAcobnapGZPJvRp8gyLQRvthGm3sxeleIQelEsv6L+21A2g==", + "resolved": "1.4.6-ci.389", + "contentHash": "Xd2zK6sLqwA0ReyUy83SWKcALwY99fq6vVL5gFOMN5Ct8OOVhtNIws0ysCWsfx1GL0RJiRYfR4pza/MmWRz4PQ==", "dependencies": { "HarmonyX": "2.10.0", - "Il2CppInterop.Runtime": "1.4.6-ci.367" + "Il2CppInterop.Runtime": "1.4.6-ci.389" } }, "Il2CppInterop.Runtime": { "type": "Transitive", - "resolved": "1.4.6-ci.367", - "contentHash": "Wb4rj/ESlfiYljfVXskndbkYNSX1WxPcsylrYex39QnVzujk6tRQUbHLA7PZn509z6P5wYbqJvhodzJ+w9Kk4A==", + "resolved": "1.4.6-ci.389", + "contentHash": "nzYjuVzDG/O8+AQ8ax3WVHf+ZVsQKrVtp/yvuW8XoEPLdkbgryIrMo75dvN+tPqxOU3o2MPt9MZ9j25P5aVJMw==", "dependencies": { "Iced": "1.17.0", - "Il2CppInterop.Common": "1.4.6-ci.367" + "Il2CppInterop.Common": "1.4.6-ci.389" } }, "js6pak.Gee.External.Capstone": { @@ -317,17 +322,17 @@ }, "Samboy063.LibCpp2IL": { "type": "Transitive", - "resolved": "2022.1.0-development.866", - "contentHash": "EcJSWTfQko8SQozozoUT+aQJVWC8wj8C0YUiPBF4rNRId19yTKp2IXcXnI747v+8/aal222QR6WHfoBK2WlVLg==", + "resolved": "2022.1.0-pre-release.13", + "contentHash": "fwkVLAXqD+7XfIXJEDh2OkJqe6YMkNmOP05oudEnuq3ITEuVUSb0K8ffa22vx+n/NDIyNP+s1lLRFcmHVP57oQ==", "dependencies": { - "AssetRipper.VersionUtilities": "1.3.1", - "Samboy063.WasmDisassembler": "2022.1.0-development.866" + "AssetRipper.Primitives": "2.1.0", + "Samboy063.WasmDisassembler": "2022.1.0-pre-release.13" } }, "Samboy063.WasmDisassembler": { "type": "Transitive", - "resolved": "2022.1.0-development.866", - "contentHash": "2QK8F3eISkLcoW/Nt7wtxyQh31EXAqEMBVXXjEnuxyvXpBXxOIGpjmE3pWhGwxQwDCbe4zBsLF1zUiqq3/pXRA==" + "resolved": "2022.1.0-pre-release.13", + "contentHash": "dI4PDG+AFctYzaD0pqojK7SGiiPi6xgIRXp07hHnXumW+DYbS2nVQ8nTFSHiP6xE7UhW6I+PpbC5jh/2nksW+Q==" }, "SemanticVersioning": { "type": "Transitive", @@ -336,8 +341,8 @@ }, "StableNameDotNet": { "type": "Transitive", - "resolved": "0.1.0-development.866", - "contentHash": "DJb8x4dV3ucDgM12sU28HxCdeqY/JudJbeJG6mgXWDJzpFZw2Jd7JF1pKFRNLzh/0gpo8bCGLQS9gOWZmBjdtg==" + "resolved": "0.1.0-pre-release.13", + "contentHash": "8ovX1WcVUO6R1pHzaW1v1SC9coSWSYh5JjjZ/vvr7jsb7+hWzMVpsV+uyWLMie9olE2FW1k4RLaXf5GmvlVwMg==" }, "System.Collections": { "type": "Transitive", diff --git a/nuget.config b/nuget.config index c00459b..9d33aaa 100644 --- a/nuget.config +++ b/nuget.config @@ -4,6 +4,5 @@ -