# Releases
| Among Us - Version| Mod Version | Link |
|----------|-------------|-----------------|
+| 2023.07.12s| v4.3.3| [Download](https://github.com/Eisbison/TheOtherRoles/releases/download/v4.3.3/TheOtherRoles.zip)
| 2023.03.28s| v4.3.2| [Download](https://github.com/Eisbison/TheOtherRoles/releases/download/v4.3.2/TheOtherRoles.zip)
-| 2023.03.28s| v4.3.1| [Download](https://github.com/Eisbison/TheOtherRoles/releases/download/v4.3.1/TheOtherRoles.zip)
-| 2023.02.28s| v4.3.0| [Download](https://github.com/Eisbison/TheOtherRoles/releases/download/v4.3.0/TheOtherRoles.zip)
-| 2022.12.14s| v4.2.1| [Download](https://github.com/Eisbison/TheOtherRoles/releases/download/v4.2.1/TheOtherRoles.zip)
<details>
<summary>Click to show older versions</summary>
| Among Us - Version| Mod Version | Link |
|----------|-------------|-----------------|
+| 2023.03.28s| v4.3.1| [Download](https://github.com/Eisbison/TheOtherRoles/releases/download/v4.3.1/TheOtherRoles.zip)
+| 2023.02.28s| v4.3.0| [Download](https://github.com/Eisbison/TheOtherRoles/releases/download/v4.3.0/TheOtherRoles.zip)
+| 2022.12.14s| v4.2.1| [Download](https://github.com/Eisbison/TheOtherRoles/releases/download/v4.2.1/TheOtherRoles.zip)
| 2022.10.25s| v4.2.0| [Download](https://github.com/Eisbison/TheOtherRoles/releases/download/v4.2.0/TheOtherRoles.zip)
| 2022.9.20s| v4.1.7| [Download](https://github.com/Eisbison/TheOtherRoles/releases/download/v4.1.7/TheOtherRoles.zip)
| 2022.6.21s| v4.1.6| [Download](https://github.com/Eisbison/TheOtherRoles/releases/download/v4.1.6/TheOtherRoles.zip)
<details>
<summary>Click to show the Changelog</summary>
+**Version 4.3.3**
+- Updated to Among Us version 2023.07.12
+- Fixed an issue where the swap icon of a swapper guesser would be in front of the witch icon on a spelled player
+- Fixed an issue where haunting was impossible in vanilla Hide'n'Seek
+- Fixed an issue where the settings for the Trapper would not appear in the in-game settings shower
+- Fixed a bug where the Arsonists win would show "killed by" on dead players in the summary screen
+- Fixed a bug where placing a garlic would convert a random player into a horse for the rest of the round
+- Changed the Eraser Guesser: Jackal and Sidekick are no longer guessable after being fake-"erased"
+
**Version 4.3.2**
- Added new option to Thief: Can Guess To Steal Role
- Added new option to Guesser Mode: Force Thief Guesser
[Ottomated](https://twitter.com/ottomated_) - Idea for the Morphling, Snitch and Camouflager role came from **Ottomated**\
[Crowded-Mod](https://github.com/CrowdedMods/CrowdedMod) - Our implementation for 10+ player lobbies were inspired by the one from the **Crowded Mod Team**\
[Goose-Goose-Duck](https://store.steampowered.com/app/1568590/Goose_Goose_Duck) - Idea for the Vulture role came from **Slushiegoose**\
+[TheEpicRoles](https://github.com/LaicosVK/TheEpicRoles) - Idea for the first kill shield (partly) and the tabbed option menu (fully + some code), by **LaicosVK** **DasMonschta** **Nova**\
[Ninja](#ninja), [Thief](#thief), [Lawyer](#lawyer) / [Pursuer](#pursuer), [Deputy](#deputy), [Portalmaker](#portalmaker), [Guesser Modifier](#guesser-modifier) - Idea: [K3ndo](https://github.com/K3ndoo) ; Developed by [Gendelo](https://github.com/gendelo3) & [Mallöris](https://github.com/Mallaris)
# Settings
**NOTE**
- If the option "Thief Can Kill Sheriff" is On, the Thief has tasks which will ONLY begin to count, if they kill
the Sheriff. While the Thief hasn't fired, their tasks do not count towards the taskwin.
-- If the option "Thief Can Kill Sheriff" is Off, the Thief will not have tasks.
-
+- If the option "Thief Can Kill Sheriff" is Off, the Thief will not have tasks.
- If the Thief kills the witch, already witched players stay witched (except for the Thief).
- If the Thief can guess to steal the role, guessing the witch will either save all targets or none of the targets (depending on the setting for Witch: Voting The Witch Saves All The Targets)
| Number of Crew Guessers | -
| Number of Neutral Guessers | -
| Number of Impostor Guessers | -
-| Force Jackal Guesser | If set to "On", the first neutral role who will be Guesser is the Jackal.
-| Force Thief Guesser | If set to "On", the first (or second if Force Jackal Guesser) neutral role who will be Guesser is the Thief.
+| Force Jackal Guesser | If set to "On", the first neutral role who will be Guesser is the Jackal.
+| Force Thief Guesser | If set to "On", the first (or second if Force Jackal Guesser) neutral role who will be Guesser is the Thief.
| Guessers Can Have A Modifier | -
| Guesser Number Of Shots | -
| Guesser Can Shoot Multiple Times Per Meeting | -
garlicButton = new CustomButton(
() => {
- Utilities.EventUtility.StartEvent(EventUtility.EventTypes.Animation);
Vampire.localPlacedGarlic = true;
var pos = CachedPlayer.LocalPlayer.transform.position;
byte[] buff = new byte[sizeof(float) * 2];
if (GameOptionsManager.Instance.currentNormalGameOptions.MapId != 1) {
if (SecurityGuard.minigame == null) {
byte mapId = GameOptionsManager.Instance.currentNormalGameOptions.MapId;
+ UnityEngine.Object.FindObjectsOfType<SystemConsole>().ToList().ForEach(x => TheOtherRolesPlugin.Logger.LogMessage($"{x.name} {x.GetType()}, {x.MinigamePrefab.TaskType}"));
var e = UnityEngine.Object.FindObjectsOfType<SystemConsole>().FirstOrDefault(x => x.gameObject.name.Contains("Surv_Panel") || x.name.Contains("Cam"));
if (mapId == 0 || mapId == 3) e = UnityEngine.Object.FindObjectsOfType<SystemConsole>().FirstOrDefault(x => x.gameObject.name.Contains("SurvConsole"));
else if (mapId == 4) e = UnityEngine.Object.FindObjectsOfType<SystemConsole>().FirstOrDefault(x => x.gameObject.name.Contains("task_cams"));
LawyerSuicide,
LoverSuicide, // not necessary
WitchExile,
- Bomb
+ Bomb,
+ Arson,
};
public PlayerControl player;
using TheOtherRoles.CustomGameModes;
using Reactor.Utilities.Extensions;
using AmongUs.GameOptions;
+using Innersloth.Assets;
namespace TheOtherRoles {
target.RawSetHat(hatId, colorId);
target.RawSetName(hidePlayerName(CachedPlayer.LocalPlayer.PlayerControl, target) ? "" : playerName);
- SkinViewData nextSkin = FastDestroyableSingleton<HatManager>.Instance.GetSkinById(skinId).viewData.viewData;
+
+ SkinViewData nextSkin = null;
+ try { nextSkin = ShipStatus.Instance.CosmeticsCache.GetSkin(skinId); } catch { return; };
+
PlayerPhysics playerPhysics = target.MyPhysics;
AnimationClip clip = null;
var spriteAnim = playerPhysics.myPlayer.cosmetics.skin.animator;
spriteAnim.m_animator.Play("a", 0, progress % 1);
spriteAnim.m_animator.Update(0f);
- if (target.cosmetics.currentPet) UnityEngine.Object.Destroy(target.cosmetics.currentPet.gameObject);
- target.cosmetics.currentPet = UnityEngine.Object.Instantiate<PetBehaviour>(FastDestroyableSingleton<HatManager>.Instance.GetPetById(petId).viewData.viewData);
- target.cosmetics.currentPet.transform.position = target.transform.position;
- target.cosmetics.currentPet.Source = target;
- target.cosmetics.currentPet.Visible = target.Visible;
- target.SetPlayerMaterialColors(target.cosmetics.currentPet.rend);
+ target.RawSetPet(petId, colorId);
if (enforceNightVisionUpdate) Patches.SurveillanceMinigamePatch.enforceNightVision(target);
Chameleon.update(); // so that morphling and camo wont make the chameleons visible
HudManagerStartPatch.zoomOutButton.Sprite = zoomOutStatus ? Helpers.loadSpriteFromResources("TheOtherRoles.Resources.PlusButton.png", 75f) : Helpers.loadSpriteFromResources("TheOtherRoles.Resources.MinusButton.png", 150f);
HudManagerStartPatch.zoomOutButton.PositionOffset = zoomOutStatus ? new Vector3(0f, 3f, 0) : new Vector3(0.4f, 2.8f, 0);
}
- ResolutionManager.ResolutionChanged.Invoke((float)Screen.width / Screen.height); // This will move button positions to the correct position.
+ ResolutionManager.ResolutionChanged.Invoke((float)Screen.width / Screen.height, Screen.width, Screen.height, Screen.fullScreen); // This will move button positions to the correct position.
}
public static async Task checkBeta() {
public class TheOtherRolesPlugin : BasePlugin
{
public const string Id = "me.eisbison.theotherroles";
- public const string VersionString = "4.3.2";
+ public const string VersionString = "4.3.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);
DebugMode = Config.Bind("Custom", "Enable Debug Mode", "false");
Harmony.PatchAll();
-
+
CustomOptionHolder.Load();
CustomColors.Load();
-
if (BepInExUpdater.UpdateRequired)
{
AddComponent<BepInExUpdater>();
}
EventUtility.Load();
-
SubmergedCompatibility.Initialize();
AddComponent<ModUpdateBehaviour>();
Modules.MainMenuPatch.addSceneChangeCallbacks();
.Select(s => s[random.Next(s.Length)]).ToArray());
}
}
-}
+}
public class BepInExUpdater : MonoBehaviour
{
- public const string RequiredBepInExVersion = "6.0.0-be.664+0b23557c1355913983f3540797fa22c43a02247d";
- public const string BepInExDownloadURL = "https://builds.bepinex.dev/projects/bepinex_be/664/BepInEx-Unity.IL2CPP-win-x86-6.0.0-be.664%2B0b23557.zip";
+ public const string RequiredBepInExVersion = "6.0.0-be.670+42a6727370c2b9356fc043ea601410540a8b4042";
+ public const string BepInExDownloadURL = "https://builds.bepinex.dev/projects/bepinex_be/670/BepInEx-Unity.IL2CPP-win-x86-6.0.0-be.670%2B42a6727.zip";
public static bool UpdateRequired => Paths.BepInExVersion.ToString() != RequiredBepInExVersion;
public void Awake()
[HarmonyPatch(typeof(ChatController), nameof(ChatController.SendChat))]
private static class SendChatPatch {
static bool Prefix(ChatController __instance) {
- string text = __instance.TextArea.text;
+ string text = __instance.freeChatField.Text;
bool handled = false;
if (AmongUsClient.Instance.GameState != InnerNet.InnerNetClient.GameStates.Started) {
if (text.ToLower().StartsWith("/kick ")) {
}
if (handled) {
- __instance.TextArea.Clear();
- __instance.quickChatMenu.ResetGlyphs();
+ __instance.freeChatField.Clear();
+ __instance.quickChatMenu.Clear();
}
return !handled;
}
using System.Reflection;
using static Rewired.Controller;
using static TheOtherRoles.Modules.CustomHatLoader;
+using Innersloth.Assets;
+using UnityEngine.AddressableAssets;
+using PowerTools;
+using System.Drawing;
namespace TheOtherRoles.Modules {
[HarmonyPatch]
public static Material hatShader;
public static Dictionary<string, HatExtension> CustomHatRegistry = new Dictionary<string, HatExtension>();
+ public static Dictionary<string, HatViewData> CustomHatViewDatas = new Dictionary<string, HatViewData>();
public static HatExtension TestExt = null;
public class HatExtension {
Material tmpShader = FastDestroyableSingleton<HatManager>.Instance.PlayerMaterial;
hatShader = tmpShader;
}
-
+ var viewdata = ScriptableObject.CreateInstance<HatViewData>();
HatData hat = ScriptableObject.CreateInstance<HatData>();
- hat.hatViewData.viewData = ScriptableObject.CreateInstance<HatViewData>();
- hat.hatViewData.viewData.MainImage = CreateHatSprite(ch.resource, fromDisk);
+
+ viewdata.MainImage = CreateHatSprite(ch.resource, fromDisk);
+ viewdata.FloorImage = viewdata.MainImage;
if (ch.backresource != null) {
- hat.hatViewData.viewData.BackImage = CreateHatSprite(ch.backresource, fromDisk);
+ viewdata.BackImage = CreateHatSprite(ch.backresource, fromDisk);
ch.behind = true; // Required to view backresource
}
- if (ch.climbresource != null)
- hat.hatViewData.viewData.ClimbImage = CreateHatSprite(ch.climbresource, fromDisk);
+ if (ch.climbresource != null) {
+ viewdata.ClimbImage = CreateHatSprite(ch.climbresource, fromDisk);
+ viewdata.LeftClimbImage = viewdata.ClimbImage;
+ }
hat.name = ch.name;
hat.displayOrder = 99;
hat.ProductId = "hat_" + ch.name.Replace(' ', '_');
hat.Free = true;
if (ch.adaptive && hatShader != null)
- hat.hatViewData.viewData.AltShader = hatShader;
+ viewdata.AltShader = hatShader;
HatExtension extend = new HatExtension();
extend.author = ch.author != null ? ch.author : "Unknown";
extend.condition = ch.condition != null ? ch.condition : "none";
if (ch.flipresource != null)
- extend.FlipImage = CreateHatSprite(ch.flipresource, fromDisk);
+ extend.FlipImage = CreateHatSprite(ch.flipresource, fromDisk);
if (ch.backflipresource != null)
extend.BackFlipImage = CreateHatSprite(ch.backflipresource, fromDisk);
} else {
CustomHatRegistry.Add(hat.name, extend);
}
+ CustomHatViewDatas.Add(hat.name, viewdata);
+ var assetRef = new AssetReference(viewdata.Pointer);
+ hat.ViewDataRef = assetRef;
+ hat.CreateAddressableAsset();
return hat;
}
private static class HatManagerPatch {
private static List<HatData> allHatsList;
static void Prefix(HatManager __instance) {
- if (RUNNING) return;
+ if (RUNNING || LOADED) return;
RUNNING = true; // prevent simultanious execution
allHatsList = __instance.allHats.ToList();
CustomHatLoader.hatdetails.RemoveAt(0);
}
__instance.allHats = allHatsList.ToArray();
+ LOADED = true; // this will only be set to true if loading is succesful.
} catch (System.Exception e) {
if (!LOADED)
- System.Console.WriteLine("Unable to add Custom Hats\n" + e);
+ TheOtherRolesPlugin.Logger.LogMessage("Unable to add Custom Hats\n" + e);
}
- LOADED = true;
}
static void Postfix(HatManager __instance) {
RUNNING = false;
[HarmonyPatch(typeof(PlayerPhysics), nameof(PlayerPhysics.HandleAnimation))]
private static class PlayerPhysicsHandleAnimationPatch {
private static void Postfix(PlayerPhysics __instance) {
+ if (!CustomHatViewDatas.ContainsKey(__instance.myPlayer.cosmetics.hat.Hat.name)) return;
+ HatViewData viewData = CustomHatViewDatas[__instance.myPlayer.cosmetics.hat.Hat.name];
AnimationClip currentAnimation = __instance.Animations.Animator.GetCurrentAnimation();
if (currentAnimation == __instance.Animations.group.ClimbUpAnim || currentAnimation == __instance.Animations.group.ClimbDownAnim) return;
HatParent hp = __instance.myPlayer.cosmetics.hat;
- if (hp.Hat == null) return;
+ if (hp == null || hp.Hat == null) return;
HatExtension extend = hp.Hat.getHatExtension();
if (extend == null) return;
if (extend.FlipImage != null) {
if (__instance.FlipX) {
hp.FrontLayer.sprite = extend.FlipImage;
} else {
- hp.FrontLayer.sprite = hp.hatView.MainImage;
+ hp.FrontLayer.sprite = viewData.MainImage;
}
}
if (extend.BackFlipImage != null) {
if (__instance.FlipX) {
hp.BackLayer.sprite = extend.BackFlipImage;
} else {
- hp.BackLayer.sprite = hp.hatView.BackImage;
+ hp.BackLayer.sprite = viewData.BackImage;
}
}
}
}
}
- [HarmonyPatch(typeof(HatParent), nameof(HatParent.SetHat), typeof(HatData), typeof(HatViewData), typeof(int))]
+ [HarmonyPatch(typeof(HatParent), nameof(HatParent.SetHat), typeof(HatData), typeof(int))]
private static class HatParentSetHatPatchExtra {
- static bool Prefix(HatParent __instance, HatData hat, HatViewData hatViewData, int color)
+ static bool Prefix(HatParent __instance, HatData hat, int color)
{
if (!DestroyableSingleton<TutorialManager>.InstanceExists) return true;
try
{
__instance.Hat = hat;
- __instance.hatView = hatViewData;
-
+ __instance.hatDataAsset = __instance.Hat.CreateAddressableAsset();
+
string filePath = Path.GetDirectoryName(Application.dataPath) + @"\TheOtherHats\Test";
if (!Directory.Exists(filePath)) return true;
DirectoryInfo d = new DirectoryInfo(filePath);
- string[] filePaths = d.GetFiles("*.png").Select(x => x.FullName).ToArray(); // Getting Text files
+ string[] filePaths = d.GetFiles("*.png").Select(x => x.FullName).ToArray(); // Getting Test files
List<CustomHat> hats = createCustomHatDetails(filePaths, true);
if (hats.Count > 0)
{
__instance.Hat = CreateHatBehaviour(hats[0], true, true);
- __instance.hatView = __instance.Hat.hatViewData.viewData;
-
+ __instance.hatDataAsset = __instance.Hat.CreateAddressableAsset();
}
}
catch (System.Exception e)
return true;
}
-
__instance.PopulateFromHatViewData();
__instance.SetMaterialColor(color);
return false;
}
}
+ [HarmonyPatch(typeof(HatParent), nameof(HatParent.SetHat), typeof(int))]
+ public class SetHatPatch {
+ public static bool Prefix(HatParent __instance, int color) {
+ if (!CustomHatRegistry.ContainsKey(__instance.Hat.name)) return true;
+ __instance.hatDataAsset = null;
+ __instance.PopulateFromHatViewData();
+ __instance.SetMaterialColor(color);
+ return false;
+ }
+ }
+
+ [HarmonyPatch(typeof(HatParent), nameof(HatParent.UpdateMaterial))]
+ public class UpdateMaterialPatch {
+ public static bool Prefix(HatParent __instance) {
+ HatViewData asset;
+ try {
+ HatViewData vanillaAsset = __instance.hatDataAsset.GetAsset();
+ return true;
+ } catch {
+ try {
+ asset = CustomHatViewDatas[__instance.Hat.name];
+ } catch {
+ return false;
+ }
+ }
+ if (asset.AltShader) {
+ __instance.FrontLayer.sharedMaterial = asset.AltShader;
+ if (__instance.BackLayer) {
+ __instance.BackLayer.sharedMaterial = asset.AltShader;
+ }
+ } else {
+ __instance.FrontLayer.sharedMaterial = DestroyableSingleton<HatManager>.Instance.DefaultShader;
+ if (__instance.BackLayer) {
+ __instance.BackLayer.sharedMaterial = DestroyableSingleton<HatManager>.Instance.DefaultShader;
+ }
+ }
+ int colorId = __instance.matProperties.ColorId;
+ PlayerMaterial.SetColors(colorId, __instance.FrontLayer);
+ if (__instance.BackLayer) {
+ PlayerMaterial.SetColors(colorId, __instance.BackLayer);
+ }
+ __instance.FrontLayer.material.SetInt(PlayerMaterial.MaskLayer, __instance.matProperties.MaskLayer);
+ if (__instance.BackLayer) {
+ __instance.BackLayer.material.SetInt(PlayerMaterial.MaskLayer, __instance.matProperties.MaskLayer);
+ }
+ PlayerMaterial.MaskType maskType = __instance.matProperties.MaskType;
+ if (maskType == PlayerMaterial.MaskType.ScrollingUI) {
+ if (__instance.FrontLayer) {
+ __instance.FrontLayer.maskInteraction = SpriteMaskInteraction.VisibleInsideMask;
+ }
+ if (__instance.BackLayer) {
+ __instance.BackLayer.maskInteraction = SpriteMaskInteraction.VisibleInsideMask;
+ return false;
+ }
+ } else if (maskType == PlayerMaterial.MaskType.Exile) {
+ if (__instance.FrontLayer) {
+ __instance.FrontLayer.maskInteraction = SpriteMaskInteraction.VisibleOutsideMask;
+ }
+ if (__instance.BackLayer) {
+ __instance.BackLayer.maskInteraction = SpriteMaskInteraction.VisibleOutsideMask;
+ return false;
+ }
+ } else {
+ if (__instance.FrontLayer) {
+ __instance.FrontLayer.maskInteraction = SpriteMaskInteraction.None;
+ }
+ if (__instance.BackLayer) {
+ __instance.BackLayer.maskInteraction = SpriteMaskInteraction.None;
+ }
+ }
+ return false;
+ }
+ }
+
+ [HarmonyPatch(typeof(HatParent), nameof(HatParent.SetFloorAnim))]
+ public class HatParentSetFloorAnimPatch {
+ public static bool Prefix(HatParent __instance) {
+ try {
+ HatViewData vanillaAsset = __instance.hatDataAsset.GetAsset();
+ return true;
+ } catch { }
+ HatViewData hatViewData = CustomHatViewDatas[__instance.Hat.name];
+ __instance.BackLayer.enabled = false;
+ __instance.FrontLayer.enabled = true;
+ __instance.FrontLayer.sprite = hatViewData.FloorImage;
+ return false;
+ }
+ }
+
+ [HarmonyPatch(typeof(HatParent), nameof(HatParent.SetIdleAnim))]
+ public class HatParentSetIdleAnimPatch {
+ public static bool Prefix(HatParent __instance, int colorId) {
+ if (!__instance.Hat) return false;
+ if (!CustomHatRegistry.ContainsKey(__instance.Hat.name))
+ return true;
+ HatViewData hatViewData = CustomHatViewDatas[__instance.Hat.name];
+ __instance.hatDataAsset = null;
+ __instance.PopulateFromHatViewData();
+ __instance.SetMaterialColor(colorId);
+ return false;
+ }
+ }
+
+ [HarmonyPatch(typeof(HatParent), nameof(HatParent.SetClimbAnim))]
+ public class HatParentSetClimbAnimPatch {
+ public static bool Prefix(HatParent __instance) {
+ try {
+ HatViewData vanillaAsset = __instance.hatDataAsset.GetAsset();
+ return true;
+ } catch { }
+
+ HatViewData hatViewData = CustomHatViewDatas[__instance.Hat.name];
+ if (!__instance.options.ShowForClimb) {
+ return false;
+ }
+ __instance.BackLayer.enabled = false;
+ __instance.FrontLayer.enabled = true;
+ __instance.FrontLayer.sprite = hatViewData.ClimbImage;
+ return false;
+ }
+ }
+
+
+ [HarmonyPatch(typeof(HatParent), nameof(HatParent.PopulateFromHatViewData))]
+ public class PopulateFromHatViewDataPatch {
+ public static bool Prefix(HatParent __instance) {
+ try {
+ HatViewData vanillaAsset = __instance.hatDataAsset.GetAsset();
+ return true;
+ } catch {
+ if (__instance.Hat && !CustomHatViewDatas.ContainsKey(__instance.Hat.name))
+ return true;
+ }
+
+
+ HatViewData asset = CustomHatViewDatas[__instance.Hat.name];
+
+ if (!asset) {
+ return true;
+ }
+ __instance.UpdateMaterial();
+
+ SpriteAnimNodeSync spriteAnimNodeSync = __instance.SpriteSyncNode ?? __instance.GetComponent<SpriteAnimNodeSync>();
+ if (spriteAnimNodeSync) {
+ spriteAnimNodeSync.NodeId = (__instance.Hat.NoBounce ? 1 : 0);
+ }
+ if (__instance.Hat.InFront) {
+ __instance.BackLayer.enabled = false;
+ __instance.FrontLayer.enabled = true;
+ __instance.FrontLayer.sprite = asset.MainImage;
+ } else if (asset.BackImage) {
+ __instance.BackLayer.enabled = true;
+ __instance.FrontLayer.enabled = true;
+ __instance.BackLayer.sprite = asset.BackImage;
+ __instance.FrontLayer.sprite = asset.MainImage;
+ } else {
+ __instance.BackLayer.enabled = true;
+ __instance.FrontLayer.enabled = false;
+ __instance.FrontLayer.sprite = null;
+ __instance.BackLayer.sprite = asset.MainImage;
+ }
+ if (__instance.options.Initialized && __instance.HideHat()) {
+ __instance.FrontLayer.enabled = false;
+ __instance.BackLayer.enabled = false;
+ }
+ return false;
+ }
+ }
+
[HarmonyPatch(typeof(HatsTab), nameof(HatsTab.OnEnable))]
public class HatsTabOnEnablePatch {
public static string innerslothPackageName = "Innersloth Hats";
int j = 0;
for (int i = 0; i < blocks.Length; i++) {
curBlock = blocks[i];
- if (Helpers.lineCount(curBlock) + Helpers.lineCount(curString) < 40) {
+ if (Helpers.lineCount(curBlock) + Helpers.lineCount(curString) < 43) {
curString += curBlock + "\n\n";
} else {
settingsTMPs[j].text = curString;
j++;
-
+
curString = "\n" + curBlock + "\n\n";
if (curString.Substring(0, 2) != "\n\n") curString = "\n" + curString;
}
}
- if (j < 3) settingsTMPs[j].text = curString;
+ if (j < settingsTMPs.Length) settingsTMPs[j].text = curString;
+ int blockCount = 0;
+ foreach (var tmp in settingsTMPs) {
+ if (tmp.text != "")
+ blockCount++;
+ }
+ for (int i = 0; i < blockCount; i++) {
+ TheOtherRolesPlugin.Logger.LogMessage(blockCount);
+ settingsTMPs[i].transform.localPosition = new Vector3(- blockCount * 1.2f + 2.7f * i, 2.2f, -500f);
+ }
}
- private static TMPro.TextMeshPro[] settingsTMPs = new TMPro.TextMeshPro[3];
+ private static TMPro.TextMeshPro[] settingsTMPs = new TMPro.TextMeshPro[4];
private static GameObject settingsBackground;
public static void OpenSettings(HudManager __instance) {
if (__instance.FullScreen == null || MapBehaviour.Instance && MapBehaviour.Instance.IsOpen
var renderer = settingsBackground.GetComponent<SpriteRenderer>();
renderer.color = new Color(0.2f, 0.2f, 0.2f, 0.9f);
renderer.enabled = true;
- for (int i = 0; i < 3; i++) {
+
+ for (int i = 0; i < settingsTMPs.Length; i++) {
settingsTMPs[i] = GameObject.Instantiate(__instance.KillButton.cooldownTimerText, __instance.transform);
settingsTMPs[i].alignment = TMPro.TextAlignmentOptions.TopLeft;
settingsTMPs[i].enableWordWrapping = false;
- settingsTMPs[i].transform.localScale = Vector3.one * 0.25f;
- settingsTMPs[i].transform.localPosition += new Vector3(-4f + 3f * i, 1.8f, -500f);
+ settingsTMPs[i].transform.localScale = Vector3.one * 0.25f;
settingsTMPs[i].gameObject.SetActive(true);
}
}
toggleSettingsButtonObject.transform.localPosition = __instance.MapButton.transform.localPosition + new Vector3(0, -0.66f, -500f);
}
}
-}
\ No newline at end of file
+}
[HarmonyPatch(typeof(ChatController), nameof(ChatController.SendChat))]
private static class SendChatPatch {
static bool Prefix(ChatController __instance) {
- string text = __instance.TextArea.text;
+ string text = __instance.freeChatField.Text;
bool handled = false;
if (AmongUsClient.Instance.GameState != InnerNet.InnerNetClient.GameStates.Started) {
if (text.ToLower().StartsWith("/size ")) { // Unfortunately server holds this - need to do more trickery
}
}
if (handled) {
- __instance.TextArea.Clear();
- __instance.quickChatMenu.ResetGlyphs();
+ __instance.freeChatField.Clear();
+ __instance.quickChatMenu.Clear();
}
return !handled;
}
using System.Reflection;
using System.Threading.Tasks;
using AmongUs.Data;
+using Assets.InnerNet;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Unity.IL2CPP;
var button = Instantiate(template, null);
var buttonTransform = button.transform;
- var pos = buttonTransform.localPosition;
- pos.y += 1.2f;
- buttonTransform.localPosition = pos;
+ //buttonTransform.localPosition = new Vector3(-2f, -2f);
+ button.GetComponent<AspectPosition>().anchorPoint = new Vector2(0.458f, 0.124f);
PassiveButton passiveButton = button.GetComponent<PassiveButton>();
- SpriteRenderer buttonSprite = button.GetComponent<SpriteRenderer>();
passiveButton.OnClick = new Button.ButtonClickedEvent();
passiveButton.OnClick.AddListener((Action) (() =>
{
button.SetActive(false);
}));
- var text = button.transform.GetChild(0).GetComponent<TMP_Text>();
- string t = "Update";
+ var text = button.transform.GetComponentInChildren<TMPro.TMP_Text>();
+ string t = "Update TOR";
if (TORUpdate is null && SubmergedUpdate is not null) t = SubmergedCompatibility.Loaded ? $"Update\nSubmerged" : $"Download\nSubmerged";
StartCoroutine(Effects.Lerp(0.1f, (System.Action<float>)(p => text.SetText(t))));
-
- buttonSprite.color = text.color = Color.red;
- passiveButton.OnMouseOut.AddListener((Action)(() => buttonSprite.color = text.color = Color.red));
+ passiveButton.OnMouseOut.AddListener((Action)(() => text.color = Color.red));
+ passiveButton.OnMouseOver.AddListener((Action)(() => text.color = Color.white));
var isSubmerged = TORUpdate == null;
var announcement = $"<size=150%>A new {(isSubmerged ? "Submerged" : "THE OTHER ROLES")} update to {(isSubmerged ? SubmergedUpdate.Tag : TORUpdate.Tag)} is available</size>\n{(isSubmerged ? SubmergedUpdate.Content : TORUpdate.Content)}";
private static int announcementNumber = 501;
[HideFromIl2Cpp]
- public IEnumerator CoShowAnnouncement(string announcement, bool show=true, string shortTitle="TOR Update", string date="")
+ public IEnumerator CoShowAnnouncement(string announcement, bool show=true, string shortTitle="TOR Update", string title="", string date="")
{
- var popUp = Instantiate(FindObjectOfType<AnnouncementPopUp>(true));
- popUp.gameObject.SetActive(show);
- yield return popUp.Init(show);
-
- var announcementS = new Assets.InnerNet.Announcement();
- announcementS.Title = "TOR Announcement";
- announcementS.Text = announcement; // Can add clickable urls like this: "[https://www.google.de/]Text[]"
- announcementS.ShortTitle = shortTitle;
- announcementS.Id = "torUpdateAnnouncement_" + announcementNumber.ToString();
- announcementS.Language = 0;
- announcementS.Number = announcementNumber++;
- announcementS.SubTitle = "";
- announcementS.PinState = true;
- announcementS.Date = date == "" ? DateTime.Today.ToString() : date;
+ var mgr = FindObjectOfType<MainMenuManager>(true);
+ var popUpTemplate = UnityEngine.Object.FindObjectOfType<AnnouncementPopUp>(true);
+ if (popUpTemplate == null) {
+ TheOtherRolesPlugin.Logger.LogError("couldnt show credits, popUp is null");
+ yield return null;
+ }
+ var popUp = UnityEngine.Object.Instantiate(popUpTemplate);
- DataManager.Player.Announcements.allAnnouncements.Insert(0, announcementS);
- popUp.CreateAnnouncementList();
+ popUp.gameObject.SetActive(true);
+
+ Assets.InnerNet.Announcement creditsAnnouncement = new() {
+ Id = "torAnnouncement",
+ Language = 0,
+ Number = announcementNumber++,
+ Title = title == "" ? "The Other Roles Announcement" : title,
+ ShortTitle = shortTitle,
+ SubTitle = "",
+ PinState = false,
+ Date = date == "" ? DateTime.Now.Date.ToString() : date,
+ Text = announcement,
+ };
+ mgr.StartCoroutine(Effects.Lerp(0.1f, new Action<float>((p) => {
+ if (p == 1) {
+ var backup = DataManager.Player.Announcements.allAnnouncements;
+ DataManager.Player.Announcements.allAnnouncements = new();
+ popUp.Init(false);
+ DataManager.Player.Announcements.SetAnnouncements(new Announcement[] { creditsAnnouncement });
+ popUp.CreateAnnouncementList();
+ popUp.UpdateAnnouncementText(creditsAnnouncement.Number);
+ popUp.visibleAnnouncements[0].PassiveButton.OnClick.RemoveAllListeners();
+ DataManager.Player.Announcements.allAnnouncements = backup;
+ }
+ })));
}
[HideFromIl2Cpp]
{
Instance.TORUpdate = torUpdateCheck.Result;
}
-
if (CheckForSubmergedUpdates)
{
var submergedUpdateCheck = Task.Run(() => Instance.GetGithubUpdate("SubmergedAmongUs", "Submerged"));
if (Instance.SubmergedUpdate.Tag.Equals("2022.10.26")) Instance.SubmergedUpdate = null;
}
}
-
Instance.OnSceneLoaded(SceneManager.GetActiveScene(), LoadSceneMode.Single);
}
backgroundSprite = null;
}
}
-}
+}
\ No newline at end of file
--- /dev/null
+using HarmonyLib;
+
+namespace TheOtherRoles.Patches {
+ [HarmonyPatch(typeof(Constants), nameof(Constants.GetBroadcastVersion))]
+ public static class ConstantsPatch {
+ public static void Postfix(ref int __result) {
+ if (AmongUsClient.Instance.NetworkMode == NetworkModes.OnlineGame)
+ __result = Constants.GetVersion(2222, 0, 0, 0);
+ }
+ }
+}
using TheOtherRoles.CustomGameModes;
using TheOtherRoles.Players;
using TheOtherRoles.Utilities;
+using TMPro;
using UnityEngine;
namespace TheOtherRoles.Patches {
public static string contributorsCredentials =
$@"<size=60%> <color=#FCCE03FF>Special thanks to K3ndo & Smeggy</color></size>";
- [HarmonyPatch(typeof(VersionShower), nameof(VersionShower.Start))]
- private static class VersionShowerPatch
- {
- static void Postfix(VersionShower __instance) {
- var amongUsLogo = GameObject.Find("bannerLogo_AmongUs");
- if (amongUsLogo == null) return;
-
- var credentials = UnityEngine.Object.Instantiate<TMPro.TextMeshPro>(__instance.text);
- credentials.transform.position = new Vector3(0, 0, 0);
- credentials.SetText($"v{TheOtherRolesPlugin.Version.ToString() + (TheOtherRolesPlugin.betaDays > 0 ? "-BETA" : "")}\n<size=30f%>\n</size>{mainMenuCredentials}\n<size=30%>\n</size>{contributorsCredentials}");
- credentials.alignment = TMPro.TextAlignmentOptions.Center;
- credentials.fontSize *= 0.75f;
-
- credentials.transform.SetParent(amongUsLogo.transform);
- }
- }
-
[HarmonyPatch(typeof(PingTracker), nameof(PingTracker.Update))]
internal static class PingTrackerPatch
{
public static Sprite banner2Sprite;
private static PingTracker instance;
static void Postfix(PingTracker __instance) {
- var amongUsLogo = GameObject.Find("bannerLogo_AmongUs");
- if (amongUsLogo != null) {
- amongUsLogo.transform.localScale *= 0.6f;
- amongUsLogo.transform.position += Vector3.up * 0.25f;
- }
-
var torLogo = new GameObject("bannerLogo_TOR");
- torLogo.transform.position = Vector3.up;
+ torLogo.transform.SetParent(GameObject.Find("RightPanel").transform, false);
+ torLogo.transform.localPosition = new Vector3(-0.4f, 1f, 5f);
+
renderer = torLogo.AddComponent<SpriteRenderer>();
loadSprites();
renderer.sprite = Helpers.loadSpriteFromResources("TheOtherRoles.Resources.Banner.png", 300f);
loadSprites();
// renderer.sprite = TORMapOptions.enableHorseMode ? horseBannerSprite : bannerSprite;
renderer.sprite = EventUtility.isEnabled ? banner2Sprite : bannerSprite;
+ var credentialObject = new GameObject("credentialsTOR");
+ var credentials = credentialObject.AddComponent<TextMeshPro>();
+ credentials.SetText($"v{TheOtherRolesPlugin.Version.ToString() + (TheOtherRolesPlugin.betaDays > 0 ? "-BETA" : "")}\n<size=30f%>\n</size>{mainMenuCredentials}\n<size=30%>\n</size>{contributorsCredentials}");
+ credentials.alignment = TMPro.TextAlignmentOptions.Center;
+ credentials.fontSize *= 0.05f;
+
+ credentials.transform.SetParent(torLogo.transform);
+ credentials.transform.localPosition = Vector3.down * 2;
}
public static void loadSprites() {
[HarmonyPriority(Priority.First)]
class ExileControllerBeginPatch {
public static GameData.PlayerInfo lastExiled;
- public static void Prefix(ExileController __instance, [HarmonyArgument(0)] ref GameData.PlayerInfo exiled, [HarmonyArgument(1)] bool tie) {
+ public static void Prefix(ExileController __instance, [HarmonyArgument(0)]ref GameData.PlayerInfo exiled, [HarmonyArgument(1)]bool tie) {
lastExiled = exiled;
// Medic shield
// Eraser erase
if (Eraser.eraser != null && AmongUsClient.Instance.AmHost && Eraser.futureErased != null) { // We need to send the RPC from the host here, to make sure that the order of shifting and erasing is correct (for that reason the futureShifted and futureErased are being synced)
foreach (PlayerControl target in Eraser.futureErased) {
- if (target != null && target.canBeErased()) {
- MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ErasePlayerRoles, Hazel.SendOption.Reliable, -1);
- writer.Write(target.PlayerId);
- AmongUsClient.Instance.FinishRpcImmediately(writer);
- RPCProcedure.erasePlayerRoles(target.PlayerId);
- Eraser.alreadyErased.Add(target.PlayerId);
- }
+ MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ErasePlayerRoles, Hazel.SendOption.Reliable, -1);
+ writer.Write(target.PlayerId);
+ AmongUsClient.Instance.FinishRpcImmediately(writer);
+ RPCProcedure.erasePlayerRoles(target.PlayerId);
+ Eraser.alreadyErased.Add(target.PlayerId);
}
}
Eraser.futureErased = new List<PlayerControl>();
if ((witchDiesWithExiledLover || exiledIsWitch) && Witch.witchVoteSavesTargets) Witch.futureSpelled = new List<PlayerControl>();
foreach (PlayerControl target in Witch.futureSpelled) {
- if (target != null && !target.Data.IsDead && Helpers.checkMuderAttempt(Witch.witch, target, true) == MurderAttemptResult.PerformKill) {
+ if (target != null && !target.Data.IsDead && Helpers.checkMuderAttempt(Witch.witch, target, true) == MurderAttemptResult.PerformKill)
+ {
if (exiled != null && Lawyer.lawyer != null && (target == Lawyer.lawyer || target == Lovers.otherLover(Lawyer.lawyer)) && Lawyer.target != null && Lawyer.isProsecutor && Lawyer.target.PlayerId == exiled.PlayerId)
continue;
if (target == Lawyer.target && Lawyer.lawyer != null) {
TORMapOptions.camerasToAdd = new List<SurvCamera>();
foreach (Vent vent in TORMapOptions.ventsToSeal) {
- PowerTools.SpriteAnim animator = vent.GetComponent<PowerTools.SpriteAnim>();
+ PowerTools.SpriteAnim animator = vent.GetComponent<PowerTools.SpriteAnim>();
animator?.Stop();
vent.EnterVentAnim = vent.ExitVentAnim = null;
vent.myRend.sprite = animator == null ? SecurityGuard.getStaticVentSealedSprite() : SecurityGuard.getAnimatedVentSealedSprite();
var rend = soul.AddComponent<SpriteRenderer>();
soul.AddSubmergedComponent(SubmergedCompatibility.Classes.ElevatorMover);
rend.sprite = Seer.getSoulSprite();
-
- if (Seer.limitSoulDuration) {
+
+ if(Seer.limitSoulDuration) {
FastDestroyableSingleton<HudManager>.Instance.StartCoroutine(Effects.Lerp(Seer.soulDuration, new Action<float>((p) => {
if (rend != null) {
var tmp = rend.color;
tmp.a = Mathf.Clamp01(1 - p);
rend.color = tmp;
- }
+ }
if (p == 1f && rend != null && rend.gameObject != null) UnityEngine.Object.Destroy(rend.gameObject);
})));
}
}
// Deputy check Promotion, see if the sheriff still exists. The promotion will be after the meeting.
- if (Deputy.deputy != null) {
+ if (Deputy.deputy != null)
+ {
PlayerControlFixedUpdatePatch.deputyCheckPromotion(isMeeting: true);
}
foreach (Trap trap in Trap.traps) trap.triggerable = false;
FastDestroyableSingleton<HudManager>.Instance.StartCoroutine(Effects.Lerp(GameOptionsManager.Instance.currentNormalGameOptions.KillCooldown / 2 + 2, new Action<float>((p) => {
- if (p == 1f) foreach (Trap trap in Trap.traps) trap.triggerable = true;
+ if (p == 1f) foreach (Trap trap in Trap.traps) trap.triggerable = true;
})));
}
}
[HarmonyPatch(typeof(TranslationController), nameof(TranslationController.GetString), new Type[] { typeof(StringNames), typeof(Il2CppReferenceArray<Il2CppSystem.Object>) })]
class ExileControllerMessagePatch {
- static void Postfix(ref string __result, [HarmonyArgument(0)] StringNames id) {
+ static void Postfix(ref string __result, [HarmonyArgument(0)]StringNames id) {
try {
if (ExileController.Instance != null && ExileController.Instance.exiled != null) {
PlayerControl player = Helpers.playerById(ExileController.Instance.exiled.Object.PlayerId);
}
}
}
-}
\ No newline at end of file
+}
[HarmonyPostfix]
[HarmonyPatch(typeof(AbilityButton), nameof(AbilityButton.Update))]
public static void showOrHideAbilityButtonPostfix(AbilityButton __instance) {
- if (CachedPlayer.LocalPlayer.Data.IsDead && (CustomOptionHolder.finishTasksBeforeHauntingOrZoomingOut.getBool() || GameOptionsManager.Instance.currentGameOptions.GameMode == GameModes.HideNSeek)) {
+ bool isHideNSeek = GameOptionsManager.Instance.currentGameOptions.GameMode == GameModes.HideNSeek;
+ if (CachedPlayer.LocalPlayer.Data.IsDead && (CustomOptionHolder.finishTasksBeforeHauntingOrZoomingOut.getBool() || isHideNSeek)) {
// player has haunt button.
var (playerCompleted, playerTotal) = TasksHandler.taskInfo(CachedPlayer.LocalPlayer.Data);
int numberOfLeftTasks = playerTotal - playerCompleted;
- if (numberOfLeftTasks <= 0)
+ if (numberOfLeftTasks <= 0 || isHideNSeek)
__instance.Show();
else
__instance.Hide();
private static bool horseButtonState = TORMapOptions.enableHorseMode;
//private static Sprite horseModeOffSprite = null;
//private static Sprite horseModeOnSprite = null;
- private static GameObject bottomTemplate;
private static AnnouncementPopUp popUp;
private static void Prefix(MainMenuManager __instance) {
CustomHatLoader.LaunchHatFetcher();
var template = GameObject.Find("ExitGameButton");
- if (template == null) return;
+ var template2 = GameObject.Find("CreditsButton");
+ if (template == null || template2 == null) return;
+ template.transform.localScale = new Vector3(0.42f, 0.84f, 0.84f);
+ template.GetComponent<AspectPosition>().anchorPoint = new Vector2(0.625f, 0.5f);
+ template.transform.FindChild("FontPlacer").transform.localScale = new Vector3(1.8f, 0.9f, 0.9f);
+ template.transform.FindChild("FontPlacer").transform.localPosition = new Vector3(-1.1f, 0f, 0f);
- var buttonDiscord = UnityEngine.Object.Instantiate(template, null);
- buttonDiscord.transform.localPosition = new Vector3(buttonDiscord.transform.localPosition.x, buttonDiscord.transform.localPosition.y + 0.6f, buttonDiscord.transform.localPosition.z);
+ template2.transform.localScale = new Vector3(0.42f, 0.84f, 0.84f);
+ template2.GetComponent<AspectPosition>().anchorPoint = new Vector2(0.378f, 0.5f);
+ template2.transform.FindChild("FontPlacer").transform.localScale = new Vector3(1.8f, 0.9f, 0.9f);
+ template2.transform.FindChild("FontPlacer").transform.localPosition = new Vector3(-1.1f, 0f, 0f);
- var textDiscord = buttonDiscord.transform.GetChild(0).GetComponent<TMPro.TMP_Text>();
- __instance.StartCoroutine(Effects.Lerp(0.1f, new System.Action<float>((p) => {
- textDiscord.SetText("Discord");
- })));
- PassiveButton passiveButtonDiscord = buttonDiscord.GetComponent<PassiveButton>();
- SpriteRenderer buttonSpriteDiscord = buttonDiscord.GetComponent<SpriteRenderer>();
+ var buttonDiscord = UnityEngine.Object.Instantiate(template, template.transform.parent);
+ buttonDiscord.transform.localScale = new Vector3(0.42f, 0.84f, 0.84f);
+ buttonDiscord.GetComponent<AspectPosition>().anchorPoint = new Vector2(0.542f, 0.5f);
+
+ var textDiscord = buttonDiscord.transform.GetComponentInChildren<TMPro.TMP_Text>();
+ __instance.StartCoroutine(Effects.Lerp(0.5f, new System.Action<float>((p) => {
+ textDiscord.SetText("TOR Discord");
+ })));
+ PassiveButton passiveButtonDiscord = buttonDiscord.GetComponent<PassiveButton>();
+
passiveButtonDiscord.OnClick = new Button.ButtonClickedEvent();
passiveButtonDiscord.OnClick.AddListener((System.Action)(() => Application.OpenURL("https://discord.gg/77RkMJHWsM")));
- Color discordColor = new Color32(88, 101, 242, byte.MaxValue);
- buttonSpriteDiscord.color = textDiscord.color = discordColor;
- passiveButtonDiscord.OnMouseOut.AddListener((System.Action)delegate {
- buttonSpriteDiscord.color = textDiscord.color = discordColor;
- });
-
-
- bottomTemplate = GameObject.Find("InventoryButton");
- /*
- // Horse mode stuff
- var horseModeSelectionBehavior = new ClientOptionsPatch.SelectionBehaviour("Enable Horse Mode", () => TORMapOptions.enableHorseMode = TheOtherRolesPlugin.EnableHorseMode.Value = !TheOtherRolesPlugin.EnableHorseMode.Value, TheOtherRolesPlugin.EnableHorseMode.Value);
- if (bottomTemplate == null) return;
- var horseButton = Object.Instantiate(bottomTemplate, bottomTemplate.transform.parent);
- var passiveHorseButton = horseButton.GetComponent<PassiveButton>();
- var spriteHorseButton = horseButton.GetComponent<SpriteRenderer>();
-
- horseModeOffSprite = Helpers.loadSpriteFromResources("TheOtherRoles.Resources.HorseModeButtonOff.png", 75f);
- horseModeOnSprite = Helpers.loadSpriteFromResources("TheOtherRoles.Resources.HorseModeButtonOn.png", 75f);
-
- spriteHorseButton.sprite = horseButtonState ? horseModeOnSprite : horseModeOffSprite;
-
- passiveHorseButton.OnClick = new ButtonClickedEvent();
-
- passiveHorseButton.OnClick.AddListener((System.Action)delegate {
- horseButtonState = horseModeSelectionBehavior.OnClick();
- if (horseButtonState) {
- if (horseModeOnSprite == null) horseModeOnSprite = Helpers.loadSpriteFromResources("TheOtherRoles.Resources.HorseModeButtonOn.png", 75f);
- spriteHorseButton.sprite = horseModeOnSprite;
- } else {
- if (horseModeOffSprite == null) horseModeOffSprite = Helpers.loadSpriteFromResources("TheOtherRoles.Resources.HorseModeButtonOff.png", 75f);
- spriteHorseButton.sprite = horseModeOffSprite;
- }
- CredentialsPatch.LogoPatch.updateSprite();
- // Avoid wrong Player Particles floating around in the background
- var particles = GameObject.FindObjectOfType<PlayerParticles>();
- if (particles != null) {
- particles.pool.ReclaimAll();
- particles.Start();
- }
- });*/
-
// TOR credits button
- if (bottomTemplate == null) return;
- var creditsButton = Object.Instantiate(bottomTemplate, bottomTemplate.transform.parent);
- var passiveCreditsButton = creditsButton.GetComponent<PassiveButton>();
- var spriteCreditsButton = creditsButton.GetComponent<SpriteRenderer>();
+ if (template == null) return;
+ var creditsButton = Object.Instantiate(template, template.transform.parent);
- spriteCreditsButton.sprite = Helpers.loadSpriteFromResources("TheOtherRoles.Resources.CreditsButton.png", 75f);
+ creditsButton.transform.localScale = new Vector3(0.42f, 0.84f, 0.84f);
+ creditsButton.GetComponent<AspectPosition>().anchorPoint = new Vector2(0.462f, 0.5f);
+
+ var textCreditsButton = creditsButton.transform.GetComponentInChildren<TMPro.TMP_Text>();
+ __instance.StartCoroutine(Effects.Lerp(0.5f, new System.Action<float>((p) => {
+ textCreditsButton.SetText("TOR Credits");
+ })));
+ PassiveButton passiveCreditsButton = creditsButton.GetComponent<PassiveButton>();
- passiveCreditsButton.OnClick = new ButtonClickedEvent();
+ passiveCreditsButton.OnClick = new Button.ButtonClickedEvent();
passiveCreditsButton.OnClick.AddListener((System.Action)delegate {
// do stuff
if (popUp != null) Object.Destroy(popUp);
- popUp = Object.Instantiate(Object.FindObjectOfType<AnnouncementPopUp>(true));
- popUp.gameObject.SetActive(true);
+ var popUpTemplate = Object.FindObjectOfType<AnnouncementPopUp>(true);
+ if (popUpTemplate == null) {
+ TheOtherRolesPlugin.Logger.LogError("couldnt show credits, popUp is null");
+ return;
+ }
+ popUp = Object.Instantiate(popUpTemplate);
- Assets.InnerNet.Announcement creditsAnnouncement = new Assets.InnerNet.Announcement();
- creditsAnnouncement.Id = "torCredits";
- creditsAnnouncement.Language = 0;
- creditsAnnouncement.Number = 500;
- creditsAnnouncement.Title = "The Other Roles Credits & Resources";
- creditsAnnouncement.ShortTitle = "TOR Credits";
- creditsAnnouncement.SubTitle = "";
- creditsAnnouncement.PinState = false;
- creditsAnnouncement.Date = "03.07.2020";
- string creditsString = @$"<align=""center"">Github Contributors:
+ popUp.gameObject.SetActive(true);
+ string creditsString = @$"<align=""center""><b>Github Contributors:</b>
Alex2911 amsyarasyiq MaximeGillot
Psynomit probablyadnf JustASysAdmin
-Discord Moderators:
+[https://discord.gg/77RkMJHWsM]Discord[] Moderators:
Streamblox Draco Cordraconis
Thanks to all our discord helpers!
TownOfUs - Idea for the Swapper, Shifter, Arsonist and a similar Mayor role came from Slushiegoose
Ottomated - Idea for the Morphling, Snitch and Camouflager role came from Ottomated
Crowded-Mod - Our implementation for 10+ player lobbies was inspired by the one from the Crowded Mod Team
-Goose-Goose-Duck - Idea for the Vulture role came from Slushiegoose</size>";
+Goose-Goose-Duck - Idea for the Vulture role came from Slushiegoose
+TheEpicRoles - Idea for the first kill shield (partly) and the tabbed option menu (fully + some code), by LaicosVK DasMonschta Nova</size>";
creditsString += "</align>";
- creditsAnnouncement.Text = creditsString;
- __instance.StartCoroutine(Effects.Lerp(0.01f, new Action<float>((p) => {
+
+ Assets.InnerNet.Announcement creditsAnnouncement = new() {
+ Id = "torCredits",
+ Language = 0,
+ Number = 500,
+ Title = "The Other Roles\nCredits & Resources",
+ ShortTitle = "TOR Credits",
+ SubTitle = "",
+ PinState = false,
+ Date = "01.07.2021",
+ Text = creditsString,
+ };
+ __instance.StartCoroutine(Effects.Lerp(0.1f, new Action<float>((p) => {
if (p == 1) {
var backup = DataManager.Player.Announcements.allAnnouncements;
- popUp.Init(false);
DataManager.Player.Announcements.allAnnouncements = new();
- DataManager.Player.Announcements.allAnnouncements.Insert(0, creditsAnnouncement);
- foreach (var item in popUp.visibleAnnouncements) Object.Destroy(item);
- foreach (var item in Object.FindObjectsOfType<AnnouncementPanel>()) {
- if (item != popUp.ErrorPanel) Object.Destroy(item.gameObject);
- }
+ popUp.Init(false);
+ DataManager.Player.Announcements.SetAnnouncements(new Announcement[] { creditsAnnouncement });
popUp.CreateAnnouncementList();
+ popUp.UpdateAnnouncementText(creditsAnnouncement.Number);
popUp.visibleAnnouncements[0].PassiveButton.OnClick.RemoveAllListeners();
DataManager.Player.Announcements.allAnnouncements = backup;
- var titleText = GameObject.Find("Title_Text").GetComponent<TMPro.TextMeshPro>();
- if (titleText != null) titleText.text = "";
}
})));
});
}
- public static void Postfix(MainMenuManager __instance) {
- __instance.StartCoroutine(Effects.Lerp(0.01f, new Action<float>((p) => {
- if (p == 1) {
- bottomTemplate = GameObject.Find("InventoryButton");
- foreach (Transform tf in bottomTemplate.transform.parent.GetComponentsInChildren<Transform>()) {
- tf.localPosition = new Vector2(tf.localPosition.x * 0.8f, tf.localPosition.y);
- }
- }
- })));
-
- }
-
public static void addSceneChangeCallbacks() {
SceneManager.add_sceneLoaded((Action<Scene, LoadSceneMode>)((scene, _) => {
if (!scene.name.Equals("MatchMaking", StringComparison.Ordinal)) return;
}));
}
}
-
- /*[HarmonyPatch(typeof(AnnouncementPopUp), nameof(AnnouncementPopUp.UpdateAnnounceText))]
- public static class Announcement
- {
- public static ModUpdateBehaviour.UpdateData updateData = null;
- public static bool Prefix(AnnouncementPopUp __instance)
- {
- if (ModUpdateBehaviour.showPopUp || updateData == null) return true;
-
- var text = __instance.AnnounceTextMeshPro;
- text.text = $"<size=150%><color=#FC0303>THE OTHER ROLES </color> {(updateData.Tag)}\n{(updateData.Content)}";
-
- return false;
- }
- }*/
}
using TheOtherRoles.Players;
using TheOtherRoles.Utilities;
using UnityEngine;
+using Innersloth.Assets;
namespace TheOtherRoles.Patches {
[HarmonyPatch]
Transform button = UnityEngine.Object.Instantiate(buttonTemplate, buttonParent);
Transform buttonMask = UnityEngine.Object.Instantiate(maskTemplate, buttonParent);
TMPro.TextMeshPro label = UnityEngine.Object.Instantiate(textTemplate, button);
- button.GetComponent<SpriteRenderer>().sprite = FastDestroyableSingleton<HatManager>.Instance.GetNamePlateById("nameplate_NoPlate")?.viewData?.viewData?.Image;
+ button.GetComponent<SpriteRenderer>().sprite = ShipStatus.Instance.CosmeticsCache.GetNameplate("nameplate_NoPlate").Image;
buttons.Add(button);
int row = i/5, col = i%5;
buttonParent.localPosition = new Vector3(-3.47f + 1.75f * col, 1.5f - 0.45f * row, -5);
Transform meetingExtraButtonMask = UnityEngine.Object.Instantiate(maskTemplate, meetingExtraButtonParent);
meetingExtraButtonLabel = UnityEngine.Object.Instantiate(textTemplate, meetingExtraButton);
- meetingExtraButton.GetComponent<SpriteRenderer>().sprite = FastDestroyableSingleton<HatManager>.Instance.GetNamePlateById("nameplate_NoPlate")?.viewData?.viewData?.Image;
+ meetingExtraButton.GetComponent<SpriteRenderer>().sprite = ShipStatus.Instance.CosmeticsCache.GetNameplate("nameplate_NoPlate").Image;
+
meetingExtraButtonParent.localPosition = new Vector3(0, -2.225f, -5);
meetingExtraButtonParent.localScale = new Vector3(0.55f, 0.55f, 1f);
meetingExtraButtonLabel.alignment = TMPro.TextAlignmentOptions.Center;
}
})));
}
-
+
//Fix visor in Meetings
/**
foreach (PlayerVoteArea pva in __instance.playerStates) {
}
} */
+ bool isGuesser = HandleGuesser.isGuesser(CachedPlayer.LocalPlayer.PlayerId);
+
// Add overlay for spelled players
if (Witch.witch != null && Witch.futureSpelled != null) {
foreach (PlayerVoteArea pva in __instance.playerStates) {
rend.transform.SetParent(pva.transform);
rend.gameObject.layer = pva.Megaphone.gameObject.layer;
rend.transform.localPosition = new Vector3(-0.5f, -0.03f, -1f);
+ if (CachedPlayer.LocalPlayer.PlayerControl == Swapper.swapper && isGuesser) rend.transform.localPosition = new Vector3(-0.725f, -0.15f, -1f);
rend.sprite = Witch.getSpelledOverlaySprite();
}
}
}
// Add Guesser Buttons
- bool isGuesser = HandleGuesser.isGuesser(CachedPlayer.LocalPlayer.PlayerId);
int remainingShots = HandleGuesser.remainingShots(CachedPlayer.LocalPlayer.PlayerId);
if (isGuesser && !CachedPlayer.LocalPlayer.Data.IsDead && remainingShots > 0) {
else message += p.Data.PlayerName + "\n";
}
FastDestroyableSingleton<HudManager>.Instance.Chat.AddChat(Trapper.trapper, $"{message}");
-
}
}
}
}
-
if (CachedPlayer.LocalPlayer.Data.IsDead && output != "") FastDestroyableSingleton<HudManager>.Instance.Chat.AddChat(CachedPlayer.LocalPlayer, $"{output}");
Trapper.playersOnMap = new List<PlayerControl>();
}
}
-
-
public static void trapperUpdate() {
if (Trapper.trapper == null || CachedPlayer.LocalPlayer.PlayerControl != Trapper.trapper || Trapper.trapper.Data.IsDead) return;
var (playerCompleted, _) = TasksHandler.taskInfo(Trapper.trapper.Data);
}
}
}
+
public static void Postfix(PlayerControl __instance) {
if (AmongUsClient.Instance.GameState != InnerNet.InnerNetClient.GameStates.Started || GameOptionsManager.Instance.currentGameOptions.GameMode == GameModes.HideNSeek) return;
}
static void updateReportButton(HudManager __instance) {
+ if (GameOptionsManager.Instance.currentGameOptions.GameMode == GameModes.HideNSeek) return;
if (Deputy.handcuffedKnows.ContainsKey(CachedPlayer.LocalPlayer.PlayerId) && Deputy.handcuffedKnows[CachedPlayer.LocalPlayer.PlayerId] > 0 || MeetingHud.Instance) __instance.ReportButton.Hide();
else if (!__instance.ReportButton.isActiveAndEnabled) __instance.ReportButton.Show();
}
static void Postfix(HudManager __instance)
{
- if (AmongUsClient.Instance.GameState != InnerNet.InnerNetClient.GameStates.Started) return;
+ if (AmongUsClient.Instance.GameState != InnerNet.InnerNetClient.GameStates.Started || GameOptionsManager.Instance.currentGameOptions.GameMode == GameModes.HideNSeek) return;
EventUtility.Update();
updateUseButton(__instance);
updateMapButton(__instance);
if (!MeetingHud.Instance) __instance.AbilityButton?.Update();
+
+ // Fix dead player's pets being visible by just always updating whether the pet should be visible at all.
+ foreach (PlayerControl target in CachedPlayer.AllPlayers) {
+ var pet = target.GetPet();
+ if (pet != null) {
+ pet.Visible = (PlayerControl.LocalPlayer.Data.IsDead && target.Data.IsDead || !target.Data.IsDead) && !target.inVent;
+ }
+ }
}
}
}
public static void erasePlayerRoles(byte playerId, bool ignoreModifier = true) {
PlayerControl player = Helpers.playerById(playerId);
- if (player == null) return;
+ if (player == null || !player.canBeErased()) return;
// Crewmate roles
if (player == Mayor.mayor) Mayor.clearAndReload();
public static void arsonistWin() {
Arsonist.triggerArsonistWin = true;
foreach (PlayerControl p in CachedPlayer.AllPlayers) {
- if (p != Arsonist.arsonist) p.Exiled();
+ if (p != Arsonist.arsonist) {
+ p.Exiled();
+ overrideDeathReasonAndKiller(p, DeadPlayer.CustomDeathReason.Arson, Arsonist.arsonist);
+ }
}
}
}
public static void defuseBomb() {
- SoundEffectsManager.playAtPosition("bombDefused", Bomber.bomb.bomb.transform.position, range: Bomber.hearRange);
+ try {
+ SoundEffectsManager.playAtPosition("bombDefused", Bomber.bomb.bomb.transform.position, range: Bomber.hearRange);
+ } catch { }
Bomber.clearBomb();
bomberButton.Timer = bomberButton.MaxTimer;
bomberButton.isEffectActive = false;
roleName = roleName + Helpers.cs(Arsonist.color, $" ({CachedPlayer.AllPlayers.Count(x => { return x.PlayerControl != Arsonist.arsonist && !x.Data.IsDead && !x.Data.Disconnected && !Arsonist.dousedPlayers.Any(y => y.PlayerId == x.PlayerId); })} left)");
if (p == Jackal.fakeSidekick)
roleName = Helpers.cs(Sidekick.color, $" (fake SK)") + roleName;
+
// Death Reason on Ghosts
if (p.Data.IsDead) {
string deathReasonString = "";
case DeadPlayer.CustomDeathReason.Bomb:
deathReasonString = $" - bombed by {Helpers.cs(killerColor, deadPlayer.killerIfExisting.Data.PlayerName)}";
break;
+ case DeadPlayer.CustomDeathReason.Arson:
+ deathReasonString = $" - burnt by {Helpers.cs(killerColor, deadPlayer.killerIfExisting.Data.PlayerName)}";
+ break;
}
roleName = roleName + deathReasonString;
}
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
- <Version>4.3.2</Version>
+ <Version>4.3.3</Version>
<Description>TheOtherRoles</Description>
<Authors>Eisbison</Authors>
<LangVersion>latest</LangVersion>
</ItemGroup>
<ItemGroup>
- <PackageReference Include="AmongUs.GameLibs.Steam" Version="2023.03.28" />
- <PackageReference Include="BepInEx.Unity.IL2CPP" Version="6.0.0-be.664" />
- <PackageReference Include="BepInEx.IL2CPP.MSBuild" Version="2.0.1" />
- <PackageReference Include="Reactor" Version="2.1.0" />
+ <PackageReference Include="AmongUs.GameLibs.Steam" Version="2023.7.11" />
+ <PackageReference Include="BepInEx.Unity.IL2CPP" Version="6.0.0-be.670" />
+ <PackageReference Include="BepInEx.IL2CPP.MSBuild" Version="2.1.0-rc.1" />
+ <PackageReference Include="Reactor" Version="2.2.0-ci.235" />
</ItemGroup>
-
+
<Target Name="Date" BeforeTargets="BeforeBuild"> <!--Will make the compile time available s.t. we can let betas expire-->
<WriteLinesToFile File="$(IntermediateOutputPath)gen.cs" Lines="static partial class Builtin { public static long CompileTime = $([System.DateTime]::UtcNow.Ticks) %3B }" Overwrite="true" />
<ItemGroup>
"net6.0": {
"AmongUs.GameLibs.Steam": {
"type": "Direct",
- "requested": "[2023.3.28, )",
- "resolved": "2023.3.28",
- "contentHash": "EIaXNPlV9DMxlPfrC1yGZPXUIKbN7hAbmizYoL72gmxZVWiLLiJ8VbelM86OgyLocQ8+ma/UD7laPYIbePlrxw=="
+ "requested": "[2023.7.11, )",
+ "resolved": "2023.7.11",
+ "contentHash": "e5zbU+4AYnp1zAQDizO5GRIh1kemkgCa8rFVAcr9bxeupkBu5dwwdHxArWv/pUybIJTZfOPjkOnicZ2qKWLX7g=="
},
"BepInEx.IL2CPP.MSBuild": {
"type": "Direct",
- "requested": "[2.0.1, )",
- "resolved": "2.0.1",
- "contentHash": "hUZjCV0t8dkw/Z/zq4Zl405QP7frBk/LVfMdUmUz+7XOhGd7lYPKrR48A5vbGl2QeHudMxlkXzAr9WM3Duq2SQ=="
+ "requested": "[2.1.0-rc.1, )",
+ "resolved": "2.1.0-rc.1",
+ "contentHash": "WI/7TbJwWl5P4B6UXGtKI1VMe6fA6h3fcbp3ZjJKqOBQ5MJfDMmeVB4fb+RW1tUQdxnlSWV3Ul62PHFyTqp4PA=="
},
"BepInEx.Unity.IL2CPP": {
"type": "Direct",
- "requested": "[6.0.0-be.664, )",
- "resolved": "6.0.0-be.664",
- "contentHash": "y9vnaW6q+/Y3kjStV67kY5qdT/MxoEiEYTgLegHpNrCq+tM4g2x0p2sAU59VeONrWF+h06UQ3HNeoAww5S6Gwg==",
+ "requested": "[6.0.0-be.670, )",
+ "resolved": "6.0.0-be.670",
+ "contentHash": "dhzCrem44oFxhOICCJ9eoSUbaKSsGGyBUfUQW9WFljCwIK8o4Cx5BiuXAkYoRjr2DhpzLpPDyPZDRImUqH0bwA==",
"dependencies": {
- "BepInEx.Core": "6.0.0-be.664",
- "BepInEx.Unity.Common": "6.0.0-be.664",
+ "BepInEx.Core": "6.0.0-be.670",
+ "BepInEx.Unity.Common": "6.0.0-be.670",
"HarmonyX": "2.10.1",
- "Iced": "1.17.0",
- "Il2CppInterop.Generator": "1.4.1",
- "Il2CppInterop.HarmonySupport": "1.4.1",
- "Il2CppInterop.Runtime": "1.4.1",
+ "Iced": "1.18.0",
+ "Il2CppInterop.Generator": "1.4.6-ci.354",
+ "Il2CppInterop.HarmonySupport": "1.4.6-ci.354",
+ "Il2CppInterop.Runtime": "1.4.6-ci.354",
"MonoMod.RuntimeDetour": "22.5.1.1",
- "Samboy063.Cpp2IL.Core": "2022.0.7.2"
+ "Samboy063.Cpp2IL.Core": "2022.1.0-development.866"
}
},
"Reactor": {
"type": "Direct",
- "requested": "[2.1.0, )",
- "resolved": "2.1.0",
- "contentHash": "sJaWGAn+c8efXKZS+sFcz+ybHYdp7CFJVdcX5+r0QbyPpruo/GotNdhrxvUUlCVAhhX/e0epIFKGRZJcprhp9w==",
+ "requested": "[2.2.0-ci.235, )",
+ "resolved": "2.2.0-ci.235",
+ "contentHash": "aa0VHgBs5QwuMHt7evQ/mldAHBqsWdLvnh7NS0RrVSwxi46KfTdALc1sebjzLrWs949USdwGXtFIePEMizGqrA==",
+ "dependencies": {
+ "BepInEx.Unity.IL2CPP": "6.0.0-be.670"
+ }
+ },
+ "AsmResolver": {
+ "type": "Transitive",
+ "resolved": "5.1.0",
+ "contentHash": "7PjujQzgQ3wjzqZYT4CY8SV6zx7FY6swIwj3Yk4QLolLqo9sBPb7FLF3W30QFvCsCkNfiVWXlSbeZKs4xGgQOQ=="
+ },
+ "AsmResolver.DotNet": {
+ "type": "Transitive",
+ "resolved": "5.1.0",
+ "contentHash": "oKrBU94OaSrbbTwydvpLRFalYxozrNXGkl13nIkm823ZFQtPNYOiOMJb5DQLvkCJlWyis7q865tg803T5zg9IA==",
+ "dependencies": {
+ "AsmResolver.PE": "5.1.0",
+ "System.Text.Json": "6.0.7"
+ }
+ },
+ "AsmResolver.PE": {
+ "type": "Transitive",
+ "resolved": "5.1.0",
+ "contentHash": "XD3iAgLSInJIODKUUlpHWXf8MR9H1SFMb1lsmabb4GxxxnDQRPjMxjglv2NOCjQQuNB2Oh0bvjHE7ewf82UqyQ==",
"dependencies": {
- "BepInEx.Unity.IL2CPP": "6.0.0-be.663"
+ "AsmResolver.PE.File": "5.1.0"
+ }
+ },
+ "AsmResolver.PE.File": {
+ "type": "Transitive",
+ "resolved": "5.1.0",
+ "contentHash": "YituBYe0Fh471sXQMfu+f4tWKX/JZvRwrX6g/SVsr4XkUIUzYi/aGT3/QvjHoYx19fE1KYOB6zBKqPkkOK7HPw==",
+ "dependencies": {
+ "AsmResolver": "5.1.0"
}
},
"AssetRipper.VersionUtilities": {
"type": "Transitive",
- "resolved": "1.2.1",
- "contentHash": "knQ/W1YwTZS2AbdaZh+nhyyBEZQPQDcahhSOnh88i+cdg4/FEoFJiCwaavgFvCMNuUeHTbcZc4qttF8WQ8xLIA=="
+ "resolved": "1.3.1",
+ "contentHash": "/1D18NOpqm7rS7+qVUbAReVMNWwgDuYpsnf0RkX1Aah/I0a0irqldoFJ+Kku7YdbSm0zqD+Z6iYUGKoP3GwTNQ=="
},
"BepInEx.Core": {
"type": "Transitive",
- "resolved": "6.0.0-be.664",
- "contentHash": "44xtnHIQnOYfMGpQBzaDbKosdaoDE8huf3OyfpYtlQ3rZkWU79jjUGjH5+QYg+HzBQw1kqa/mlMujr5dhpU/Tg==",
+ "resolved": "6.0.0-be.670",
+ "contentHash": "7CbbMNZfb+1VHjFKh/ErFBOOEYrVCIkng/B3/HPcbNioySC7qdT1ztfYqs6YjQia4krEic+LV3ew86B/hTg+hw==",
"dependencies": {
"HarmonyX": "2.10.1",
"MonoMod.Utils": "22.5.1.1",
},
"BepInEx.Unity.Common": {
"type": "Transitive",
- "resolved": "6.0.0-be.664",
- "contentHash": "MSA/w+6Zejm59NRjmh2tKwWOR1WPzT9PTGjGdiPzytRv9k2oA8UZsOl1N1pLNUkBrgVZJdjzSJHg61VA0eYUMg==",
+ "resolved": "6.0.0-be.670",
+ "contentHash": "FSzWILgwepZ7CpA34ew1WyO75lNjxkfX86uwo2172lbhmLkgoAdQbNun8dxKJCDlIevmTDga76yr/WPrTXELvA==",
"dependencies": {
"AssetRipper.VersionUtilities": "1.2.1",
"MonoMod.Utils": "22.5.1.1"
}
},
+ "Disarm": {
+ "type": "Transitive",
+ "resolved": "2022.1.0-master.26",
+ "contentHash": "YnZEbRGr0nG+N3G8WbRQ4Lkg8dTD3oso9iJlCVBmyhEyhLyqs+drBs1kWQbQqFPnb9mi/RJ++R9bPb+L3HF03Q=="
+ },
"HarmonyX": {
"type": "Transitive",
"resolved": "2.10.1",
},
"Iced": {
"type": "Transitive",
- "resolved": "1.17.0",
- "contentHash": "8x+HCVTl/HHTGpscH3vMBhV8sknN/muZFw9s3TsI8SA6+c43cOTCi2+jE4KsU8pNLbJ++iF2ZFcpcXHXtDglnw=="
+ "resolved": "1.18.0",
+ "contentHash": "G60lZOvbvqttA+SBSv/yY6/wUboXKJlkffhSNR9iOrx0M5gpcK1TRr6xrFR+qAhqIAhvrsPF1jkn9fYb4lEufQ=="
},
"Il2CppInterop.Common": {
"type": "Transitive",
- "resolved": "1.4.1",
- "contentHash": "Vy6m6IgyUStu5u4K1WhfmlGCrWAujwDCv/qImdVmU6EMVgOzsx8wNa/ckGIg5eKVh3GRFBhdoDy6Ej6kk3oJTA==",
+ "resolved": "1.4.6-ci.354",
+ "contentHash": "aCP3kr39YQw5GVqE9Q8c5y7f9CEKdFxpUhIqYgQBtrEz5Z/KCbHhjuOf/lSuFrjl6Vub/BKk6k+UbMRdoSvC1w==",
"dependencies": {
"Iced": "1.17.0",
"Microsoft.Extensions.Logging.Abstractions": "6.0.1",
},
"Il2CppInterop.Generator": {
"type": "Transitive",
- "resolved": "1.4.1",
- "contentHash": "KIOCVq2KM7bHMsEggghq7HWxRyZIsigfb6ZNRhyMOUwrdXCfc9YAuN2jO5ZlhN+W2ItroTEGG4xAmsKz3fJ80g==",
+ "resolved": "1.4.6-ci.354",
+ "contentHash": "y30sxc9mMv0bUzCPDr73xiI6fiu7ksmnEm6XULTGU/5JEGv2aw++/71bLOEYCscNbZTa2JT4yYrLCXCj3GSekg==",
"dependencies": {
- "Il2CppInterop.Common": "1.4.1",
+ "Il2CppInterop.Common": "1.4.6-ci.354",
"Mono.Cecil": "0.11.3"
}
},
"Il2CppInterop.HarmonySupport": {
"type": "Transitive",
- "resolved": "1.4.1",
- "contentHash": "6uvmnk1XsR6LGmZHJToxfY4IdvsjNVUr5V0mf2hLZasqXY6O25RBc6eMGC8daFuwof+sKpp4gVacoxDs4tXbZw==",
+ "resolved": "1.4.6-ci.354",
+ "contentHash": "mQV5A+B/qtI6kSXEGx/UswiqjFKw13/yyviawnStfRKbLMW+XFsdMgGSkOVZd/TiDtF9ZG4Xt7DbkbFu26WjyA==",
"dependencies": {
"HarmonyX": "2.10.0",
- "Il2CppInterop.Runtime": "1.4.1"
+ "Il2CppInterop.Runtime": "1.4.6-ci.354"
}
},
"Il2CppInterop.Runtime": {
"type": "Transitive",
- "resolved": "1.4.1",
- "contentHash": "TbEIlv7FAoKS85/290uX8MyUwuOBHXbfiP2me9+2SiL/UwqsS6r87DEAY0B+S0VJG7JnngxBTnr5yA2iruuRlg==",
+ "resolved": "1.4.6-ci.354",
+ "contentHash": "Xe5md9z+KIthdEcjfUjmoOhvM3gTI3SPyocqvuzEHoov5jQ/HhIPv5hUZzTSm+2nzn3XplENNE8vlBPvQ1o6OA==",
"dependencies": {
"Iced": "1.17.0",
- "Il2CppInterop.Common": "1.4.1"
+ "Il2CppInterop.Common": "1.4.6-ci.354"
}
},
- "IndexRange": {
- "type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "6TgS1JLSUkpmPLfXBPaAgB39ZUix8E4soXWk2XSDcscVe84i1JKzIAtA7jHbRHSkOOrcr6YA0MpLCeq98y9mYQ=="
- },
"js6pak.Gee.External.Capstone": {
"type": "Transitive",
"resolved": "2.1.0",
},
"Samboy063.Cpp2IL.Core": {
"type": "Transitive",
- "resolved": "2022.0.7.2",
- "contentHash": "e17CAhKSxdAp7vFcYEVxjSc7t7rcvVGBipGhgE9tAjRXY85wZXLlHEVO0AEvMRkLmf9U+if4wK/nZEC1AX6VqQ==",
+ "resolved": "2022.1.0-development.876",
+ "contentHash": "yomWiPcMGaQ2JmsP5C22taGSJ75IOGTDme1ysw5V4DLfIt1FBBpxC1XBom2RYG6MZ1SbI1yvEaYNCuAHLZ7+xw==",
"dependencies": {
- "HarmonyX": "2.5.5",
- "Iced": "1.11.1",
- "IndexRange": "1.0.0",
- "Mono.Cecil": "0.11.4",
- "Samboy063.LibCpp2IL": "2022.0.7.2",
- "System.Runtime.InteropServices": "4.3.0",
- "System.ValueTuple": "4.5.0",
+ "AsmResolver.DotNet": "5.1.0",
+ "Disarm": "2022.1.0-master.26",
+ "Iced": "1.18.0",
+ "Samboy063.LibCpp2IL": "2022.1.0-development.876",
+ "StableNameDotNet": "0.1.0-development.876",
"js6pak.Gee.External.Capstone": "2.1.0"
}
},
"Samboy063.LibCpp2IL": {
"type": "Transitive",
- "resolved": "2022.0.7.2",
- "contentHash": "DpVeU0dQkUJCpbw0f1xKOG8vimdK2oYhrVABC7HDE3/ikGjhnMZd3i5b1joKDHZ+AiL90TWOaEXPcy24rCZ0dA==",
+ "resolved": "2022.1.0-development.876",
+ "contentHash": "KrpK5sySZHMPdeatiCqv5Pw8F7oV4fTRfVBvzKVmRlnO7Ye6Lg6n6t/PQ7VjLH6FiF2kH3YPM2uIp4xMJhGXGg==",
"dependencies": {
- "IndexRange": "1.0.0",
- "Samboy063.WasmDisassembler": "2022.0.2"
+ "AssetRipper.VersionUtilities": "1.3.1",
+ "Samboy063.WasmDisassembler": "2022.1.0-development.876"
}
},
"Samboy063.WasmDisassembler": {
"type": "Transitive",
- "resolved": "2022.0.2",
- "contentHash": "2uu+xBb7M3HKfBx9tAY6jiDieAf0hRnQjSmGX+7IdE6i24dYsx6TYgtrLvRx5lOuF2M8DijZ5H8yQ1pcuCs2SA=="
+ "resolved": "2022.1.0-development.876",
+ "contentHash": "QDDrTjL/WoGP66Fc1HBtPXpmPn7F+0JYiV1xaZetkYtZ4UNMT7k6i2b6Ge4gq2xkK5NV0YpLyuQcVPeuy7u4XA=="
},
"SemanticVersioning": {
"type": "Transitive",
"resolved": "2.0.2",
"contentHash": "4EQgYdNZ92SyaO7YFk6olVnebF5V+jrHyMUjvPq89tLeMo8NSfgDF+6Zwq/lgh9j/0yfQp9Lkm0ZA0rUATCZFA=="
},
+ "StableNameDotNet": {
+ "type": "Transitive",
+ "resolved": "0.1.0-development.876",
+ "contentHash": "e+yo57rKEJoQmTJ8scEbt6l/bqZvZu4hZUZMau/u1tyZI1I42JiXsjcH1+gE/nSQJlKPCykUrO/h+tUVm9I2nw=="
+ },
"System.Collections": {
"type": "Transitive",
"resolved": "4.3.0",
"Microsoft.NETCore.Targets": "1.1.0"
}
},
+ "System.Runtime.CompilerServices.Unsafe": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg=="
+ },
"System.Runtime.Extensions": {
"type": "Transitive",
"resolved": "4.3.0",
"System.Runtime": "4.3.0"
}
},
+ "System.Text.Encodings.Web": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==",
+ "dependencies": {
+ "System.Runtime.CompilerServices.Unsafe": "6.0.0"
+ }
+ },
+ "System.Text.Json": {
+ "type": "Transitive",
+ "resolved": "6.0.7",
+ "contentHash": "/Tf/9XjprpHolbcDOrxsKVYy/mUG/FS7aGd9YUgBVEiHeQH4kAE0T1sMbde7q6B5xcrNUsJ5iW7D1RvHudQNqA==",
+ "dependencies": {
+ "System.Runtime.CompilerServices.Unsafe": "6.0.0",
+ "System.Text.Encodings.Web": "6.0.0"
+ }
+ },
"System.Threading": {
"type": "Transitive",
"resolved": "4.3.0",
"Microsoft.NETCore.Targets": "1.1.0",
"System.Runtime": "4.3.0"
}
- },
- "System.ValueTuple": {
- "type": "Transitive",
- "resolved": "4.5.0",
- "contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ=="
}
}
}