Belle-Ve Bricks

Your Imagination

LEGO Warhammer Ogre Cave BardJaskier
ogre cave

The 17 Best LEGO® Warhammer MOCs

In This Article

Create Your

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

Warhammer is a popular choice for many creative people but it often leads to them wondering if there will ever be a LEGO® Warhammer theme. As a Warhammer fan myself I wanted to check this out and I was so happy with what I found, there may not be any official sets but there are a lot of custom LEGO® Warhammer MOCs out there!

Are There Any Official LEGO® Warhammer Sets?

Warhammer is incredibly popular, a niche on its own but it could be argued that the building principle behind LEGO® and Warhammer could entice a similar audience.

To date, there are no official LEGO® Warhammer sets or Minifigures. There are unofficial Warhammer MOCs instead.

There are a number of unofficial LEGO® Warhammer MOCs out there, some are done as fanart but those of you who want to build one of yourself will be pleased to know that some people have made the MOCs with instructions!

There is also the option to have one set designed for you via commission work, this way you can have your own custom LEGO® Warhammer model designed for you.

What Can I Expect to Find Online?

LEGO Warhammer MOCs

A LEGO® MOC (My Own Creation) is a design that has been made by a LEGO® fan typically using software such as Stud.io by BrickLink.

One of the things I love the most about LEGO® MOCs is that the designs are not bound to the same rules as the official LEGO® sets. if you’re interested in how to create your own MOCs we have a great post to get you started right away.

When a set is made for production they have to keep in mind things like the cost and rarity of parts but when a MOC is made (assuming the design is for fun not to be sold) all these limitations are removed!

I mentioned earlier that there are no official LEGO® Warhammer sets available but there is a good amount of LEGO® Warhammer MOCs online.

Let’s check out what LEGO® MOCs are out there…

List of LEGO® Warhammer MOCs?

1. LEGO® Warhammer Ogre Cave

LEGO Warhammer Ogre Cave BardJaskier
Credit to BardJaskier

2. LEGO® Warhammer Patriarch’s Storm Steam Tank

lego warhammer patriarchs storm steam tank jan slavinger
Credit to Jan Slavinger

3. LEGO® Warhammer WH40k Imperial Guard

lego warhammer WH40k Imperial Guard farseer eldar
Credit to Farseer Eldar

4. LEGO® Warhammer Gyrobomber

lego warhammer Gyrobomber
Credit to Dwalin Forkbeard

5. LEGO® Warhammer 40k Ultramarines

Lego Warhammer 40k Ultramarines
Credit to FunnyStuffs

6. LEGO® Warhammer Sarthorael, Lord of Change

Sarthorael Lord of Change Aaron Newman
Credit to Aaron Newman

7. LEGO® Warhammer Shadow Raven Patrol

LEGO Warhammer Shadow Raven Patrol
Credit to Lucy Caminsky

8. LEGO® Warhammer Great Unclean One, Plague Drones, & Herald of Nurgle

LEGO Warhammer the deathly halliwell
Credit to the Deathly Halliwell

9. LEGO® Warhammer Karak Kadrin

LEGO Warhammer Karak Kadrin
Credit to Dwalin Forkbeard

10. LEGO® Warhammer 40k Centurion VS Ork Warboss Duel

Lego Warhammer 40k Centurion VS Ork Warboss duel
Credit to Faber Mandragore

11. LEGO® Warhammer 40K Terminator

LEGOWarhammerKTerminator
skIpeGkN LEGO Warhammer K Terminator

12. LEGO® Warhammer 40k Terminator Squad

Lego Warhammer 40k Terminator Squad
Credit to Faber Mandragore

13. LEGO® Warhammer Rori Dulgisson, Thane from Karak Zorn

LEGO Warhammer Thane from Karak Zorn _ Dwarf Thanes
Credit to Dwalin Forkbeard

14. LEGO® Warhammer Macy’s Razorback

LEGO Warhammer Macy’s Razorback Warhammer and Nexo Knight
Credit to Simon Crocker

15. LEGO® Warhammer 40k Blood Angels Captain

LEGO Warhammer 40k Blood Angels Captain
Credit to Faber Mandragore

16. LEGO® Warhammer 40k Bolt Pistol

LEGO Warhammer wh40k Bolt Pistol
Credit to Jerac

Below you will find a video of the LEGO wh40k Bolt Pistol to watch.

YouTube video

17. LEGO® Walking Warhammer 40K Dreadnought

YouTube video

Conclusion

If you are one of the many people who are a fan of LEGO® and Warhammer I am hoping that this post has brightened your day. There are so many amazing LEGO® Warhammer MOCs online and I only expect more to come too.

I do not expect to ever see an official LEGO® Warhammer set but this post shows that this doesn’t matter when software like Stud.io exists as people just like you who want a Warhammer design will just make one!

If you are a LEGO® designer and want to learn more drop me an email at matthew@bellevebricks.com.

<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