魔改Minecraft Classic网页重制版的地形生成器 II

最近又想起了Mojang的2020愚人节更新20w14infinite,就翻了翻反混淆后的彩蛋维度代码,发现原理很简单,效果却很有趣,所以又把之前玩过的Minecraft Classic重制版又拿出来,用JavaScript实现一下我比较喜欢的几个维度的生成。为了方便各位读者自行尝试,我将修改后的版本放在了Gitee Pages上托管(https://devbobcorn.gitee.io/minecraft-classic),修改版本添加了一个启动器,便于玩家修改材质和世界生成代码。


下面是我写的两个例子,在启动器设置里把自定义世界生成代码(Custom World Generator Code)选成自定义(Custom),然后在代码框中插入下列片段即可在线体验(仅限电脑)。

彩虹球 Rainbow Balls

// This is an example of custom world generation.
// Note that the names of variables differ from those in preset code.
function checkPos(x,y,z){
	return (x >= 0 && x < xSize && y > 0 && y < ySize && z >= 0 && z < zSize);
}

for (var i = 1;i <= 20;i++){
	var ballx = Math.ceil(Math.random() * 200);
	var ballz = Math.ceil(Math.random() * 200);
	var bally = Math.ceil(Math.random() * 15) + 32;
	var radius = 3 + Math.ceil(Math.random() * 12);
	for (var x1 = ballx - radius - 1;x1 <= ballx + radius + 1;x1++)
		for (var z1 = ballz - radius - 1;z1 <= ballz + radius + 1;z1++)
			for (var y1 = bally - radius - 1;y1 <= bally + radius + 1;y1++)
				if (checkPos(x1,y1,z1) && ((x1-ballx)**2+(z1-ballz)**2+(y1-bally)**2 <= radius**2)){
					tiles[parseInt((y1 * zSize + z1) * xSize + x1)] = (y1 + z1 + x1) % 13 + 24;
				}
}
tiles; // This will serve as the return value of eval function.

BASIC迷宫 Basic Maze

// This is an example of custom world generation.
// Note that the names of variables differ from those in preset code.
function checkPos(x,y,z){
	return (x >= 0 && x < xSize && y > 0 && y < ySize && z >= 0 && z < zSize);
}
for (var l = 0; l < xSize; ++l) {
	for (var i1 = 0; i1 < zSize; ++i1) {
		tiles[parseInt((1 * zSize + i1) * xSize + l)] = 31; //You can find the ID list on Minecraft Wiki.
	}
}
// Make some glass planes...
for (var i = 0;i <= 25;i++){
	var planex = Math.ceil(Math.random() * 200);
	var planez = Math.ceil(Math.random() * 200);
	var planey = Math.ceil(Math.random() * 10) + 50;
	var side = Math.ceil(Math.random() * 7) + 4;
	
	for (var x = planex - side;x <= planex + side;x++)
		for (var z = planez - side;z <= planez + side;z++)
			if (checkPos(x,planey,z))
				tiles[parseInt((planey * zSize + z) * xSize + x)] = 23;
				
}

var X = 30;
var O = 0;

var LEFT = new Array(X, X, O, O, O, O, O, O, X, X, X, O, O, O, O, O, O, X, X, X, O, O, O, O, O, O, X, X, X, O, O, O, O, O, O, X, X, X, O, O, O, O, O, O, X, X, X, O, O, O, O, O, O, X, X, X, O, O, O, O, O, O, X, X);
var RIGHT = new Array(O, O, O, O, O, O, X, X, O, O, O, O, O, X, X, X, O, O, O, O, X, X, X, O, O, O, O, X, X, X, O, O, O, O, X, X, X, O, O, O, O, X, X, X, O, O, O, O, X, X, X, O, O, O, O, O, X, X, O, O, O, O, O, O);

for (var cx = 0;cx < 20;cx++)
	for (var cz = 0;cz < 20;cz++) {
		var slash = Math.random() > .5;
		for (var x = 0;x <= 7;x++)
			for (var z = 0;z <= 7;z++) {
				for (var y = 2;y <= 7;y++) {
					if (checkPos(cx * 8 + x,y,cz * 8 + z))
						tiles[parseInt((y * zSize + cz * 8 + z) * xSize + cx * 8 + x)] = (slash ? LEFT[x * 8 + z] : RIGHT[x * 8 + z]);
				}
			}
	}

tiles; // This will serve as the return value of eval function.


附20w14infinite介绍:20w14infinite - Minecraft Wiki

posted @ 2021-01-05 00:23  DevBobcorn  阅读(564)  评论(0编辑  收藏  举报