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);
        }