public static void initStateMaps(MazeTower tower) {
    if (rawMaps != null && rawMaps.containsKey(tower.wallBlock_external)) {
      final EnumDyeColor[] dyeColors = tower.getDyeColors();
      final IBlockState air2 = Blocks.AIR.getDefaultState();
      final IBlockState wall = tower.wallBlock_external;
      final IBlockState wall2 = tower.wallBlock;
      final IBlockState c = tower.floorBlock;
      final IBlockState window = Blocks.GLASS_PANE.getDefaultState();
      final IBlockState[] carpet =
          new IBlockState[] {
            tower.getColourBlockState(Blocks.CARPET, dyeColors[0]),
            tower.getColourBlockState(Blocks.CARPET, dyeColors[1]),
            tower.getColourBlockState(Blocks.CARPET, dyeColors[2])
          };
      final IBlockState[] g =
          new IBlockState[] {
            tower.getColourBlockState(Blocks.STAINED_GLASS, dyeColors[0]),
            tower.getColourBlockState(Blocks.STAINED_GLASS, dyeColors[1]),
            tower.getColourBlockState(Blocks.STAINED_GLASS, dyeColors[2])
          };
      final IBlockState lamp = Blocks.REDSTONE_LAMP.getDefaultState();
      final IBlockState wire = Blocks.REDSTONE_WIRE.getDefaultState();

      for (EnumFacing dir : dirs) {
        maps.get(tower.wallBlock_external)[EnumStateMap.MINI_TOWER_CEILING_1.ordinal()].put(
            dir, getCeiling(air2, wall, wall2, c, g[0], lamp));
        maps.get(tower.wallBlock_external)[EnumStateMap.MINI_TOWER_CEILING_2.ordinal()].put(
            dir, getCeiling(air2, wall, wall2, c, g[1], lamp));
        maps.get(tower.wallBlock_external)[EnumStateMap.MINI_TOWER_CEILING_3.ordinal()].put(
            dir, getCeiling(air2, wall, wall2, c, g[2], lamp));
      }
    } else {
      final IBlockState[][][][] towerRawMaps;
      final Map<EnumFacing, IBlockState[][][]>[] towerMaps;

      if (rawMaps == null) {
        rawMaps = new HashMap<IBlockState, IBlockState[][][][]>();
        maps = new HashMap<IBlockState, Map<EnumFacing, IBlockState[][][]>[]>();
      }
      towerRawMaps = getRawMapsForTower(tower);
      rawMaps.put(tower.wallBlock_external, towerRawMaps);
      towerMaps = new Map[EnumStateMap.values().length];

      for (EnumStateMap map : EnumStateMap.values()) {
        final int mapIndex = map.ordinal();
        towerMaps[mapIndex] = new HashMap<EnumFacing, IBlockState[][][]>();
        for (EnumFacing dir : dirs) {
          final EnumFacing checkDir = EnumFacing.NORTH;
          if (dir == EnumFacing.SOUTH) towerMaps[mapIndex].put(dir, towerRawMaps[mapIndex]);
          else {
            if (mapIndex != 1)
              towerMaps[mapIndex].put(
                  dir, MTHelper.getRotatedStateMap(towerRawMaps[mapIndex], checkDir, dir, true));
            else
              towerMaps[mapIndex].put(
                  dir,
                  MTHelper.getRotatedStateMap(
                      MTHelper.getStairRotatedStairsMap(
                          towerRawMaps[mapIndex], EnumFacing.SOUTH, dir, tower.stairsBlock, torch),
                      checkDir,
                      dir,
                      true));
          }
        }
      }

      maps.put(tower.wallBlock_external, towerMaps);
    }
  }
  public static IBlockState[][][][] getRawMapsForTower(MazeTower tower) {
    final EnumDyeColor[] dyeColors = tower.getDyeColors();
    final IBlockState air = tower.air,
        air2 = Blocks.AIR.getDefaultState(),
        wall = tower.wallBlock_external,
        wall2 = tower.wallBlock,
        floor = tower.floorBlock,
        c = tower.ceilBlock,
        fence = tower.fenceBlock,
        floor2 =
            !(wall.getBlock() instanceof BlockPrismarine)
                ? floor
                : Blocks.SEA_LANTERN.getDefaultState();
    final IBlockState[]
        carpet =
            new IBlockState[] {
              tower.getColourBlockState(Blocks.CARPET, dyeColors[0]),
              tower.getColourBlockState(Blocks.CARPET, dyeColors[1]),
              tower.getColourBlockState(Blocks.CARPET, dyeColors[2])
            },
        g =
            new IBlockState[] {
              tower.getColourBlockState(Blocks.STAINED_GLASS, dyeColors[0]),
              tower.getColourBlockState(Blocks.STAINED_GLASS, dyeColors[1]),
              tower.getColourBlockState(Blocks.STAINED_GLASS, dyeColors[2])
            },
        window =
            new IBlockState[] {
              tower.getColourBlockState(Blocks.STAINED_GLASS_PANE, dyeColors[0]),
              tower.getColourBlockState(Blocks.STAINED_GLASS_PANE, dyeColors[1]),
              tower.getColourBlockState(Blocks.STAINED_GLASS_PANE, dyeColors[2])
            };
    final IBlockState lever = Blocks.LEVER.getStateFromMeta(7),
        lamp = Blocks.REDSTONE_LAMP.getDefaultState(),
        wire = Blocks.REDSTONE_WIRE.getDefaultState();
    final IBlockState[] stairs = tower.stairsBlock;
    final IBlockState[][][][] rawMaps =
        new IBlockState[][][][] {
          {
            {
              {null, null, null, wall, wall, wall, null, null, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, wall, floor, floor, floor, floor, floor, wall, null},
              {wall, wall2, floor, floor, floor, floor, floor, wall2, wall},
              {wall, wall2, floor, floor, floor2, floor, floor, wall2, wall},
              {wall, wall2, floor, floor, floor, floor, floor, wall2, wall},
              {null, wall, floor, floor, floor, floor, floor, wall, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, null, null, wall, wall, wall, null, null, null}
            }
          },
          {
            {
              {null, null, null, wall, wall, wall, null, null, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, wall, wall, air, air, air, air, wall, null},
              {wall, wall2, wall, air, air, air, air, wall2, wall},
              {wall, wall2, wall, air, air, air, air, wall2, wall},
              {wall, wall2, stairs[2], air, air, air, air, wall2, wall},
              {null, wall, air, air, air, air, air, wall, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, null, null, wall, wall, wall, null, null, null}
            },
            {
              {null, null, null, wall, wall, wall, null, null, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, wall, wall, air, air, air, air, wall, null},
              {wall, wall2, wall, air, air, air, air, wall2, wall},
              {wall, wall2, stairs[2], air, air, air, air, wall2, wall},
              {wall, wall2, air, air, air, air, air, wall2, wall},
              {null, wall, torch[3], air, air, air, air, wall, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, null, null, wall, wall, wall, null, null, null}
            },
            {
              {null, null, null, wall, wall, wall, null, null, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, wall, floor, floor, floor, floor, floor, wall, null},
              {wall, wall2, stairs[2], floor, floor, floor, floor, wall2, wall},
              {wall, wall2, air, floor, floor2, floor, floor, wall2, wall},
              {wall, wall2, air, floor, floor, floor, floor, wall2, wall},
              {null, wall, air, floor, floor, floor, floor, wall, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, null, null, wall, wall, wall, null, null, null}
            },
            {
              {null, null, null, wall, wall, wall, null, null, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, wall, air, stairs[3], wall, wall, wall, wall, null},
              {wall, wall2, air, air, air, air, air, wall2, wall},
              {wall, wall2, air, air, air, air, air, wall2, wall},
              {wall, wall2, air, air, air, air, air, wall2, wall},
              {null, wall, air, air, air, air, air, wall, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, null, null, wall, wall, wall, null, null, null}
            },
            {
              {null, null, null, wall, wall, wall, null, null, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, wall, torch[0], air, stairs[3], wall, wall, wall, null},
              {wall, wall2, air, air, air, air, air, wall2, wall},
              {wall, wall2, air, air, air, air, air, wall2, wall},
              {wall, wall2, air, air, air, air, air, wall2, wall},
              {null, wall, air, air, air, air, air, wall, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, null, null, wall, wall, wall, null, null, null}
            },
            {
              {null, null, null, wall, wall, wall, null, null, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, wall, air, air, air, stairs[3], floor, wall, null},
              {wall, wall2, floor, floor, floor, floor, floor, wall2, wall},
              {wall, wall2, floor, floor, floor2, floor, floor, wall2, wall},
              {wall, wall2, floor, floor, floor, floor, floor, wall2, wall},
              {null, wall, floor, floor, floor, floor, floor, wall, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, null, null, wall, wall, wall, null, null, null}
            },
            {
              {null, null, null, wall, wall, wall, null, null, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, wall, air, air, air, air, air, wall, null},
              {wall, wall2, air, air, air, air, stairs[0], wall2, wall},
              {wall, wall2, air, air, air, air, wall, wall2, wall},
              {wall, wall2, air, air, air, air, wall, wall2, wall},
              {null, wall, air, air, air, air, wall, wall, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, null, null, wall, wall, wall, null, null, null}
            },
            {
              {null, null, null, wall, wall, wall, null, null, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, wall, air, air, air, air, torch[1], wall, null},
              {wall, wall2, air, air, air, air, air, wall2, wall},
              {wall, wall2, air, air, air, air, stairs[0], wall2, wall},
              {wall, wall2, air, air, air, air, wall, wall2, wall},
              {null, wall, air, air, air, air, wall, wall, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, null, null, wall, wall, wall, null, null, null}
            },
            {
              {null, null, null, wall, wall, wall, null, null, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, wall, floor, floor, floor, floor, air, wall, null},
              {wall, wall2, floor, floor, floor, floor, air, wall2, wall},
              {wall, wall2, floor, floor, floor2, floor, air, wall2, wall},
              {wall, wall2, floor, floor, floor, floor, stairs[0], wall2, wall},
              {null, wall, floor, floor, floor, floor, floor, wall, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, null, null, wall, wall, wall, null, null, null}
            },
            {
              {null, null, null, wall, wall, wall, null, null, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, wall, air, air, air, air, air, wall, null},
              {wall, wall2, air, air, air, air, air, wall2, wall},
              {wall, wall2, air, air, air, air, air, wall2, wall},
              {wall, wall2, air, air, air, air, air, wall2, wall},
              {null, wall, wall, wall, wall, stairs[1], air, wall, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, null, null, wall, wall, wall, null, null, null}
            },
            {
              {null, null, null, wall, wall, wall, null, null, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, wall, air, air, air, air, air, wall, null},
              {wall, wall2, air, air, air, air, air, wall2, wall},
              {wall, wall2, air, air, air, air, air, wall2, wall},
              {wall, wall2, air, air, air, air, air, wall2, wall},
              {null, wall, wall, wall, stairs[1], air, torch[2], wall, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, null, null, wall, wall, wall, null, null, null}
            },
            {
              {null, null, null, wall, wall, wall, null, null, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, wall, floor, floor, floor, floor, floor, wall, null},
              {wall, wall2, floor, floor, floor, floor, floor, wall2, wall},
              {wall, wall2, floor, floor, floor2, floor, floor, wall2, wall},
              {wall, wall2, floor, floor, floor, floor, floor, wall2, wall},
              {null, wall, floor, stairs[1], air, air, air, wall, null},
              {null, null, wall, wall2, wall2, wall2, wall, null, null},
              {null, null, null, wall, wall, wall, null, null, null}
            }
          },
          getRoofWire(air2, wall, wire, wire),
          getRoof(fence, Blocks.GLASS.getDefaultState(), g[0], g[1], g[2]),
          getTopMap(air2, wall2, carpet[0], floor, window[0], lever, null, null),
          getTopMap(air2, wall2, carpet[1], floor, window[1], lever, null, null),
          getTopMap(air2, wall2, carpet[2], floor, window[2], lever, null, null),
          getCeiling(air2, wall, wall2, c, g[0], lamp),
          getCeiling(air2, wall, wall2, c, g[1], lamp),
          getCeiling(air2, wall, wall2, c, g[2], lamp), /*,
			{
			  {
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c }
			  }, {
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c },
				  { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c }
				}
			}*/
        };

    rawMaps[EnumStateMap.MINI_TOWER_TOP_2.ordinal()][2] =
        rawMaps[EnumStateMap.MINI_TOWER_TOP_1.ordinal()][2];
    rawMaps[EnumStateMap.MINI_TOWER_TOP_3.ordinal()][2] =
        rawMaps[EnumStateMap.MINI_TOWER_TOP_1.ordinal()][2];

    return rawMaps;
  }