var cloneCanvas = function(self) { var c = document.createElement('canvas'); c.width = self.width; c.height = self.height; var cxt = c.getContext('2d'); cxt.drawImage(self,0,0); return c; }; function blitImage(ctx, image, sx ,sy, sw, sh, dx, dy, dw, dh) { var x; var y; for (x=0;x<dw;x++) { for (y=0;y<dh;y++) { ctx.drawImage(image,Math.floor(sx+x*(sw/dw)),Math.floor(sy+y*(sw/dw)),1,1,dx+x,dy+y,1,1); } } } function createMinecraftHead(player,completed,failed) { var skinImage = new Image(); skinImage.onload = function() { var headCanvas = document.createElement('canvas'); headCanvas.width = 8; headCanvas.height = 8; var headContext = headCanvas.getContext('2d'); blitImage(headContext, skinImage, 8,8,8,8, 0,0,8,8); blitImage(headContext, skinImage, 40,8,8,8, 0,0,8,8); completed(headCanvas); }; skinImage.onerror = function() { if (skinImage.src == '//www.minecraft.net/img/char.png') { failed(); } else { skinImage.src = '//www.minecraft.net/img/char.png'; } }; skinImage.src = '//s3.amazonaws.com/MinecraftSkins/' + player + '.png'; } function resizeImage(img,size) { var canvas = document.createElement('canvas'); canvas.width = size; canvas.height = size; var ctx = canvas.getContext('2d'); blitImage(ctx, img, 0,0,img.width,img.height, 0,0,size,size); return canvas; } var playerHeads = {}; function getMinecraftHead(player,size,completed) { var head = playerHeads[player]; // Synchronous if (!completed) { return (!head || head.working) ? null : head; } // Asynchronous if (!head) { playerHeads[player] = { working: true, hooks: [{f:completed,s:size}] }; //console.log('Creating head for ',player,'...'); createMinecraftHead(player, function(head) { //console.log('Created head for ',player,': ', head); hooks = playerHeads[player].hooks; playerHeads[player] = head; var i; for(i=0;i<hooks.length;i++) { hooks[i].f(resizeImage(head,hooks[i].s)); } }, function() { }); } else if (head.working) { //console.log('Other process working on head of ',player,', will add myself to hooks...'); head.hooks[head.hooks.length] = {f:completed,s:size}; } else { completed(resizeImage(head,size)); } } function getMinecraftTime(servertime) { servertime = parseInt(servertime); var day = servertime >= 0 && servertime < 13700; return { servertime: servertime, days: parseInt((servertime+8000) / 24000), // Assuming it is day at 8:00 hours: (parseInt(servertime / 1000)+8) % 24, minutes: parseInt(((servertime / 1000) % 1) * 60), seconds: parseInt(((((servertime / 1000) % 1) * 60) % 1) * 60), day: day, night: !day }; }