Belle-Ve Bricks

Your Imagination

TOP  LEGO MOCs for

Top 5 LEGO® MOCs of 2021

Create Your

We help you from start to finish to create and deliver your tailor-made custom model.
Custom model
Continue

It’s the end of 2021 and I thought it would be fitting to recap on some of the LEGO® MOCs that have been shared on Belle-Ve Bricks. We have had hundreds of new designs added to the LEGO® MOC catalogue, I would love to share them all on this blog but it would be a very long read! We have run the analytics and pulled out the top 5 performing LEGO® MOCs for 2021!

5. Bride of Frankenstein by Sky Captain

LEGO and Halloween go together very well, we have seen some really great LEGO® MOCs released around this time but Sky Captain’s Bride of Frankenstein was a real hit this year.

Any owners of the official LEGO® Frankenstein BrickHeadz set (40422) would love this MOC, Frankenstein’s monster and his bride standing side by side in your Halloween themed LEGO® display would look perfectly spooktacular!

Bride of Frankenstein LEGO® MOCs

4. Castle in a Dome by Zilmrud Creations

Some of you may recognise the name Peter Ilmrud from the Swedish LEGO® Masters, he is the man behind Zilmrud Creations, you can see how he managed to get a spot on the show can’t you?

The Castle in a Dome LEGO® MOC was one of the first LEGO® MOCs that was added to the Belle-Ve Bricks website, it has been popular from the first day it was posted and has been (and I think will continue to be) a favourite amongst the LEGO® MOC community.

The castle sits snuggly within a glass dome that is available from IKEA, there’s no much more to say, the MOC speaks for itself!

3. Tiki Surf Bar by LEGO® Artisan

If you have seen his work you would know that LEGO® Artisan has a special talent for creating Alternate Builds and the Tiki Surf Bar is a prime example of this.

Made from two of the official LEGO® Surfer Beach House (31118) sets this is an easy LEGO® MOC to source the bricks for with an end result that you are proud of.

Product description below.

The Tiki Surf Bar is a combination of 2 sets of the official LEGO® set 31118. No other parts were used aside to complete the MOC. It is a modular building with 3 floors.

The ground floor is a diving equipment rental and shop. The second and third floors is a bar/lounge that serves food and beverage for all beach goers and visitors.

The footprint of the whole MOC is 16×32 studs; So as an option, the MOC can be built on top of a 16×32 base plate (base plate to be acquired separately).

2. Stormtrooper Mega Figure (fits official LEGO® Helmet) by Albo.LEGO

Albo.LEGO has set himself a name on Belle-Ve Bricks as a LEGO® Mega Figure Master! This Stormtrooper Mega Figure looks spectacular, the official LEGO® Star Wars Stormtrooper Helmet (75276) fits perfectly on the Mega Figure structure.

Albo.LEGO has done a whole line of Mega Figures, ranging from Batman, Iron Man to Darth Vader. If you haven’t seen his work your should check them out, especially if you are a minifigure fan!

Stormtrooper LEGO® MOCs

1. Friends Apartment by LEGO® Artisan

When this MOC was released it hit the LEGO® community by storm, Kim Plata AKA LEGO® Artisan had built the groundworks for something incredible.

The initial release featured three floors which were designed using official LEGO® sets such as Central Perk (21319) and Friends Apartment (10292), but LEGO® Artisan soon saw the potential and started adding on more floors. We started seeing apartments for HIMYM, Bing Bang Theory and Seinfeld being created and from there the Sit-Complex was born!

This is a MOC that is so versatile that it will be hard for LEGO® Artisan to stop adding more and more apartments, what I love the most about this is that you can pick and choose who you want to be in your apartment block. I am looking forward to see what the future holds for the most famous LEGO® Apartment Block in the world!

Product description below.

The MOC Friends Apartment is the combination of the official sets 21319 (Central Perk) and 10292 (F.R.I.E.N.D.S. apartment). It requires a total number of 4,656 pieces, of which 3,556 come from 2 sets of 21319 and 1 set of 10292. The remaining 1,100 are individual pieces that would need to be acquired separately.

The ground floor is the Central Perk Cafe & Pub which is a modification of set 21319. It now includes a portion of a pub with a pool table and a toilet in the corner. The design stays true to the details of the official set but enlarges the footprint to accommodate the apartments on the upper levels.

The second floor is Joey & Chandler’s apartment. Aside from having the details of the original set, it also includes 2 bedrooms, 1 toilet and a balcony with stairs that lead to the third floor.

The third floor is Monica & Rachel’s apartment. It also includes 2 bedrooms and a door going to the balcony. Like the previous floors, most of the details from the original set were kept. There is also stairs that lead to the roof top.

Although the design tries to stay in line with the TV show, there were deviations that were made in order to fit all the floors together as well as make use of spaces that would otherwise be wasted if the design strictly followed the TV show’s details

.A fair warning to creators is that this MOC does require a lot of extra parts (1,106~ pieces). The design tried to use the available parts from the set as much as possible but considering that a 4th wall had to be provided for each set, it was unavoidable to use additional parts.

LEGO MOCs Friends Apartment Central Perk Alernate
<div class="badge-base LI-profile-badge" data-locale="en_US" data-size="large" data-theme="dark" data-type="HORIZONTAL" data-vanity="ferdi-vol" data-version="v1"><a class="badge-base__link LI-simple-link" href="https://www.linkedin.com/in/%E2%9C%85-ferdi-vol-corporate-gifts/?trk=profile-badge"></a></div>
/* Auto generated, hash = 5dceu9kevqjdyuy2uw1atqrsu */
//TODO: Break this file down so that we can actually unit test it.
(function(window) {
  /**
  * Renders all unrendred LinkedIn Badges on the page
  */
  window.LIRenderAll = function () {
    var CALLBACK_NAME     = 'LIBadgeCallback', //Must match callback on helpers.js
        BADGE_NAMES       = '.LI-profile-badge, .LI-entity-badge',
        // TODO -- tracking param for other badge types
        TRACKING_PARAM    = 'profile-badge',
        responsesReceived = 0, //Keeps track of number of responses recieved for proper cleanup when finished
        expectedResponses = 0, //Keeps track of number of responses to expect
        scripts           = [ ], //Keeps track of scripts added for proper cleanup when finished
        childScripts      = {}, //Keeps track of child scripts to render
        badges            = Array.prototype.slice.call(document.querySelectorAll(BADGE_NAMES));

    var i, len, badge, rendered;
    for (i = 0, len = badges.length;  i < len; i++) {
      badge    = badges[i];
      rendered =  badge.getAttribute('data-rendered');
      if (!rendered) {
        expectedResponses++;
        badge.setAttribute('data-rendered', true);
        renderBadge(badge);
      }
    }

    function isCNDomain() {
      if (typeof window !== "undefined") {
        var hostName = window.location && window.location.hostname ||  '';
        return (/linkedin(-ei)?.cn$/).test(hostName);
      }

      return false;
    }

    function generateUrl(isEI) {
      var domainPrefix = isEI ? 'https://badges.linkedin-ei' : 'https://badges.linkedin';
      if (isCNDomain()) {
        return domainPrefix + ".cn/";
      }

      return domainPrefix + ".com/";
    }

    function getBadgeKeyQueryParams(badge) {
      return Array.prototype.slice.call(badge.attributes).filter(function (attr) {
        return attr.name.lastIndexOf('data-key-', 0) !== -1;
      }).map(function (attr) {
        // Most browsers automatically lowercase the attribute name when its being read
        // We are calling lowercase on it again to ensure consistency for any browsers that are lagging behind.
        return encodeURIComponent(attr.name.replace('data-', '').toLowerCase()) + '=' + encodeURIComponent(attr.value);
      });
    }

    /*
    * Renders a single badge on the page
    * @param badge: div element of badge to render
    */
    function renderBadge(badge) {
      var size       = badge.getAttribute('data-size'),
          locale     = badge.getAttribute('data-locale'),
          type       = badge.getAttribute('data-type'),
          theme      = badge.getAttribute('data-theme'),
          vanity     = badge.getAttribute('data-vanity'),
          version    = badge.getAttribute('data-version'),
          isEI       = badge.hasAttribute('data-ei'),
          entity     = badge.getAttribute('data-entity'),
          isCreatePage = badge.hasAttribute('data-iscreate'),
          uid        = Math.round(1000000 * Math.random()),
          baseUrl = generateUrl(isEI),
          queryParams = [
            'locale=' + encodeURIComponent(locale),
            'badgetype=' + encodeURIComponent(type),
            'badgetheme=' + encodeURIComponent(theme),
            'uid=' + encodeURIComponent(uid),
            'version=' + encodeURIComponent(version)
          ],
          url;

      if (version === 'v2') {
        baseUrl += 'view';
        queryParams.push('badgesize=' + encodeURIComponent(size));
        queryParams.push('entity=' + encodeURIComponent(entity));
        queryParams = queryParams.concat(getBadgeKeyQueryParams(badge));
      } else {
        baseUrl += 'profile';
        queryParams.push('maxsize=' + encodeURIComponent(size));
        queryParams.push('trk=' + encodeURIComponent(TRACKING_PARAM));
        queryParams.push('vanityname=' + encodeURIComponent(vanity));
      }

      if (isCreatePage) {
        queryParams.push('fromCreate=true');
      }

      url = baseUrl + '?' + queryParams.join('&');
      badge.setAttribute('data-uid' , uid);
      jsonp(url); //Calls responseHandler when done
    }

    /**
    * Handles a response from the server. Finds badge matching badgeUid and inserts badgeHtml there
    * @param badgeHtml: String representing contents of the badge
    * @param badgeUid: UID of the badge to target
    **/
    function responseHandler(badgeHtml, badgeUid) {
      responsesReceived ++;

      var i, badge, uid, isCreate;
      var defaultWidth = 330 // max possible width
      var defaultHeight = 300 // max possible height

      for (i = 0, len = badges.length; i < len; i++) {
        badge = badges[i];
        // isCreate needed to prevent reloading artdeco script tag
        isCreate = badge.getAttribute('data-iscreate');
        uid   = parseInt(badge.getAttribute('data-uid'), 10);
        if (uid === badgeUid) {
          var badgeMarkup = `<body>${badgeHtml}</body>`
          var iframe = document.createElement('iframe');
          iframe.onload = function() {
            var iframeBody = iframe.contentWindow.document.body;
            // 5 px buffer to avoid the badge border being cut off.
            iframe.setAttribute('height', (iframeBody.scrollHeight || defaultHeight) + 5);
            iframe.setAttribute('width', (iframeBody.scrollWidth || defaultWidth) + 5);
          };
          iframe.setAttribute('frameBorder', '0');
          iframe.style.display = 'block';
          badge.appendChild(iframe);
          iframe.contentWindow.document.open();
          iframe.contentWindow.document.write(badgeMarkup);
          iframe.contentWindow.document.close();
          replaceScriptTags(badge, isCreate);
        }
      }
      tryClean();
    }

  // These functions are needed because badge markup is added via innerHtml property which does not run script tags
  function replaceScriptTags(node, isCreate) {
    if (shouldReplaceNode(node, isCreate)) {
      node.parentNode.replaceChild(cloneScriptNode(node), node);
      childScripts[node.src] = true;
    } else {
      var i = 0,
          children = node.childNodes;
      while (i < children.length) {
        replaceScriptTags(children[i++], isCreate);
      }
    }
    return node;
  }

  function shouldReplaceNode(node, isCreate) {
    return isScriptNode(node) && !childScripts[node.src] && (!isCreate || (isCreate && !node.getAttribute('data-isartdeco')));
  }

  function isScriptNode(node) {
    return node.tagName === 'SCRIPT';
  }

  function cloneScriptNode(node){
    var script  = document.createElement("script");
    for( var i = node.attributes.length-1; i >= 0; i-- ) {
      script.setAttribute( node.attributes[i].name, node.attributes[i].value );
    }
    return script;
  }

    // Gets all incoming responses
    window[CALLBACK_NAME] = responseHandler;

    /**
    * Tries to clean added tags
    **/
    function tryClean() {
      //Clean up after all requests are done..
      //Accounts for people including script more than once
      var done = (responsesReceived >= expectedResponses && expectedResponses > 0) || responsesReceived >= badges.length;
      if (done) {
        delete window[CALLBACK_NAME];

        // remove all script tags
        scripts.map(function(script){
          document.body.removeChild(script);
        });

      }
    }

    /*
    * Makes Jsonp request, responses handles by CALLBACK_NAME
    * @param url String: url of server to make request to
    */
    function jsonp(url) {
      var script = document.createElement('script');
      script.src = url;
      scripts.push(script);
      document.body.appendChild(script);
    }
  };

  if (document.readyState === 'complete') {
    window.LIRenderAll();
  } else {
    window.addEventListener('load', window.LIRenderAll, false);
  }

})(window);
Popular Posts