public static bool TryGetBlock(uint id, out CPBlock block)
        {
            if (IsValidID(id))
            {
                block = ToBlock(id);
                return(true);
            }

            block = null;
            return(false);
        }
        private static T SetupDoorBase <T>(CPBlock block, SecurityDoor door) where T : CPContext, new()
        {
            Vector3 position = door.m_bioScanAlign.position;

            if (!PhysicsUtil.SlamPos(ref position, Vector3.down, 4.0f, LayerManager.MASK_LEVELGEN, false, 0f, 1.0f))
            {
                return(null);
            }

            return(SetupBase <T>(block, door.Gate.ProgressionSourceArea, position, door.transform));
        }
        private static T SetupBase <T>(CPBlock block, LG_Area area, Vector3 position, Transform parent) where T : CPContext, new()
        {
            var context = new T()
            {
            };

            if (IsBuildDone)
            {
                CreatePuzzleInstance();
            }
            else
            {
                BuildQueue += CreatePuzzleInstance;
            }

            return(context);

            void CreatePuzzleInstance()
            {
                context.Instance = ChainedPuzzleManager.CreatePuzzleInstance(block, area, position, parent);
                context.Instance.add_OnPuzzleSolved(new Action(context.Solved_Internal));
                context.Setup(position);
            }
        }
 private static T SetupTerminalBase <T>(CPBlock block, Terminal terminal) where T : CPContext, new()
 {
     return(SetupBase <T>(block, terminal.SpawnNode.m_area, terminal.m_wardenObjectiveSecurityScanAlign.position, terminal.m_wardenObjectiveSecurityScanAlign));
 }
 public static T SetupTerminal <T>(CPBlock block, Terminal terminal) where T : CPContext, new()
 => SetupTerminalBase <T>(block, terminal);
 public static CPContext SetupTerminal(CPBlock block, Terminal terminal)
 => SetupTerminalBase <CPContext>(block, terminal);
 public static T SetupDoor <T>(CPBlock block, SecurityDoor door) where T : CPContext, new()
 => SetupDoorBase <T>(block, door);
 public static CPContext SetupDoor(CPBlock block, SecurityDoor door)
 => SetupDoorBase <CPContext>(block, door);
 private static CPBlock ToBlock(uint id) => CPBlock.GetBlock(id);
 public static bool IsValidID(uint id) => CPBlock.HasBlock(id);
 public static CPContext Setup(CPBlock block, LG_Area area, Vector3 position, Transform parent)
 => SetupBase <CPContext>(block, area, position, parent);
 /// <summary>
 /// Create ChainedPuzzle Instance
 /// </summary>
 /// <typeparam name="T">ChainedPuzzleContext Type (derived or not)</typeparam>
 /// <param name="block">Block to use for puzzle</param>
 /// <param name="area">Area for chainedpuzzle</param>
 /// <param name="position">Initial Position for spawn</param>
 /// <param name="parent">Parent</param>
 /// <returns></returns>
 public static T Setup <T>(CPBlock block, LG_Area area, Vector3 position, Transform parent) where T : CPContext, new()
 => SetupBase <T>(block, area, position, parent);