internal static bool Prefix(Factory __instance, ref string objectId, ref Action <UnityDisplayNode> onComplete) { var id = objectId; var action = onComplete; if (ResourceHandler.Prefabs.ContainsKey(objectId) && !ResourceHandler.Prefabs[objectId].isDestroyed) { onComplete.Invoke(ResourceHandler.Prefabs[objectId]); return(false); } if (ResourceHandler.resources.GetValueOrDefault(objectId) is byte[] bytes && ModTowerHelper.Tower2DScales.ContainsKey(objectId)) { objectId = "9dccc16d26c1c8a45b129e2a8cbd17ba"; onComplete = new System.Action <UnityDisplayNode>(node => { var udn = Object.Instantiate(node, __instance.PrototypeRoot); udn.name = id + "(Clone)"; var texture = new Texture2D(2, 2); ImageConversion.LoadImage(texture, bytes); udn.isSprite = true; udn.RecalculateGenericRenderers(); var spriteRenderer = udn.genericRenderers.GetItemOfType <Renderer, SpriteRenderer>(); var scale = ModTowerHelper.Tower2DScales.GetValueOrDefault(id, 5f); spriteRenderer.sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f), scale, 0, SpriteMeshType.Tight); udn.towerPlacementPreCalcOffset = new Vector3(0, 2f, 0); action.Invoke(udn); ResourceHandler.Prefabs[id] = udn; //__instance.active.Add(udn); } ); return(true); } if (ModDisplay.Cache.GetValueOrDefault(objectId) is ModDisplay modDisplay) { try { if (modDisplay is ICustomDisplay customDisplay) { var assetBundle = ModContent.GetBundle(modDisplay.mod, customDisplay.AssetBundleName); var udn = Object.Instantiate(assetBundle.LoadAsset(customDisplay.PrefabName).Cast <GameObject>(), __instance.PrototypeRoot).AddComponent <UnityDisplayNode>(); udn.Active = false; udn.transform.position = new Vector3(-3000, 0); var material = assetBundle.LoadAsset(customDisplay.MaterialName).Cast <Material>(); udn.genericRenderers[0].SetMaterial(material); SetupUDN(udn, modDisplay, onComplete); return(false); } objectId = modDisplay.BaseDisplay; onComplete = new System.Action <UnityDisplayNode>(node => { var udn = Object.Instantiate(node, __instance.PrototypeRoot); SetupUDN(udn, modDisplay, action); }); } catch (Exception e) { MelonLogger.Error($"Failed to load display for {modDisplay.Name}"); MelonLogger.Error(e); } } return(true); }