UNPKG

mineflayer-voxel

Version:

A plugin to give you a web-based view of your mineflayer bot.

297 lines (240 loc) 8.26 kB
// "{"memory":{"programs":2,"geometries":1386,"textures":66},"render":{"calls":722,"vertices":212202,"faces":70734,"points":0}}" var createGame = require('voxel-engine'); var highlight = require('voxel-highlight') var skin = require('minecraft-skin'); var vec3 = require('vec3'); var io = window.io , socket = io.connect(undefined, {reconnect:false}) , botEntity , entities = {} , players = {} window.players= players; var blocks; socket.on('blockData', function(blockData) { blocks = blockData; }) function materialIndex(name) { if (typeof name === 'number') { return materialIndex(blocks[name].name); } var mat = { 'air':0, 'snow':0, 'rose':0, 'flower':0, 'sapling':0, 'mushroom':0, 'tallgrass':0, 'stone': 1, 'grass': 2, 'dirt': 3, 'stonebrick': 4, 'wood': 5, 'bedrock': 7, 'sand': 8, 'gravel': 9, 'oreGold': 10, 'oreIron': 11, 'oreCoal': 12, 'oreLapis': 13, 'oreDiamond': 14, 'log': 15, 'leaves': 16, // 'glass': 17, // 'tallgrass': 18, // 'flower': 19, // 'rose': 20, // 'mushroom': 21, // 'torch': 22, // 'workbench': 22, 'furnace': 23 }[name] return mat !== undefined ? mat : 1; } socket.on('spawn', function(position) { pixelPosition = position.map(function(v) { return v*25; }) pixelPosition[1] += 1.62*25; console.log('spawn:', position, pixelPosition); if (!window.game) { var game = createGame({ generateVoxelChunk: voxelChunk_chuckCache, startingPosition: pixelPosition, worldOrigin: pixelPosition, texturePath: './textures/blocks/', materials: ['stone', ['grass_top', 'dirt', 'grass_side'], 'dirt', 'stonebrick', 'wood', 'sapling', 'bedrock', 'sand', 'gravel', 'oreGold', 'oreIron', 'oreCoal', 'oreLapis', 'oreDiamond', ['tree_top', 'tree_top', 'tree_side'], 'leaves', 'glass', 'tallgrass', 'flower', 'rose', 'mushroom_brown', 'torch', ['workbench_top', 'workbench_top', 'workbench_side'], ['furnace_top', 'furnace_side', 'furnace_front']], mesher: require('./transgreedy').mesher, }) window.game = game; var container = document.querySelector('#gameCanvas') game.appendTo(container); // Blend top of grass with green color var biomeGreen = new game.THREE.Color(8368696); game.materials.get('grass_top')[2].color = new game.THREE.Color(8368696) game.materials.get('leaves').forEach(function(material) { material.color = biomeGreen; material.ambient = biomeGreen; material.transparent = true; }) highlight(game); game.on('mousedown', function (pos) { console.log(pos, game.getBlock(pos)) }); game.renderer.sortObjects = false; } }) function lookAt(x, y, z) { var playerPosition = getPlayerPosition(); var target = vec3(x, y, z); var delta = target.minus(playerPosition); // var delta = playerPosition.minus(target) // var delta = point.minus(bot.entity.position.offset(0, bot.entity.height, 0)); var yaw = Math.atan2(-delta.x, -delta.z); var groundDistance = Math.sqrt(delta.x * delta.x + delta.z * delta.z); var pitch = Math.atan2(delta.y, groundDistance); lookIn(yaw, pitch) } function lookIn(yaw, pitch) { game.controls.yawObject.rotation.y = yaw; game.controls.pitchObject.rotation.x = pitch; } function setCameraPosition(controls, entity) { controls.pitchObject.rotation.x = entity.pitch; controls.yawObject.rotation.y = entity.yaw; var newPosition = vec3(entity.position).offset(0, game.playerHeight, 0).scaled(game.cubeSize); controls.yawObject.position.copy(newPosition); } window.vec3 = vec3 window.lookAt = lookAt window.getPlayerPosition = getPlayerPosition socket.on('entity', function onEntity(entity) { if (!window.bot) { console.log('Need to create me!') window.bot = createPlayer(entity); // Control the bot. // game.control(window.bot) // mountPoint = window.bot.avatar.cameraOutside // mountPoint.add(game.camera) // -- control other object var cameraGroup = new game.THREE.Object3D(); cameraGroup.position.copy(vec3(entity.position).offset(0,2,0).scaled(game.cubeSize)); var cameraEyes = new game.THREE.Object3D(); cameraEyes.name = 'eyes'; cameraEyes.position.set(0, 150, 0); cameraEyes.rotation.x = -0.5 cameraGroup.add(cameraEyes); cameraEyes.add(game.camera); var physicalCamera = game.makePhysical(cameraGroup); physicalCamera.subjectTo(new game.THREE.Vector3(0, -0.00009, 0)); physicalCamera.yaw = cameraGroup; physicalCamera.pitch = cameraEyes; game.scene.add(cameraGroup); game.addItem(physicalCamera); game.control(physicalCamera); // -- disconnected camera // game.camera.position.copy(vec3(entity.position).offset(0,10,0).scaled(game.cubeSize)); // game.camera.rotation.x = -1.0; } else { setMobPosition(window.bot.avatar, entity); } // botEntity = newEntity; // setCameraPosition(game.controls, botEntity); }); window.skin = skin; function createPlayer(entity) { if (!game) return; console.log('Creating '+entity.username); var player = skin(game.THREE, '/skin/'+entity.username+'.png').createPlayerObject(); player.scale.set(1.4, 1.4, 1.4); var playerPhysics = game.makePhysical(player); setMobPosition(player, entity); game.scene.add(player); game.addItem(playerPhysics); playerPhysics.yaw = player; playerPhysics.pitch = player.head; // playerPhysics.subjectTo(new game.THREE.Vector3(0, -0.00009, 0)); players[entity.id] = playerPhysics; return playerPhysics; } function setMobPosition(mob, entity) { mob.position.copy(vec3(entity.position).scaled(game.cubeSize)); // mob.rotation.y = entity.yaw+(Math.PI/2); mob.rotation.y = entity.yaw; } socket.on('entitySpawn', function onEntitySpawn(entity) { entities[entity.id] = entity; if (entity.type === 'player') { createPlayer(entity) } }); socket.on('entityMoved', function onEntityMoved(entity) { if (entity.type === 'player') { var player = players[entity.id]; if (!player) { player = createPlayer(entity) } setMobPosition(player.avatar, entity); // console.log(entity.username+' moved to '+vec3(player.avatar.position)) } entities[entity.id] = entity; }); socket.on('entityGone', function onEntityGone(entity) { delete entities[entity.id]; var player = players[entity.id]; if (player) { console.log('Removing '+entity.username) game.removeItem(player) game.scene.remove(player.avatar) delete players[entity.id]; } }); function generate_blockCache(x,y,z) { var cachePos = [x,y,z].join('|'); var cachedBlock = blockCache[cachePos]; var material = 0; if (cachedBlock) { material = materialIndex(cachedBlock.name); if (material === -1) material = 0; } return material; } function getPlayerPosition() { var cs = window.game.cubeSize; var pos = window.game.controls.yawObject.position; return vec3(pos.x / cs, pos.y / cs, pos.z / cs); } // New chunk loading mechanism window.chunkCache = {}; socket.on('chunkData', function(chunk) { console.log('chunkData', chunk.key, chunk.position, chunk.blocks.length); var voxels = new Int8Array(chunk.blocks.length); // var voxels = new Array(chunk.blocks.length); chunk.blocks.forEach(function(value, index) { voxels[index] = materialIndex(value); }) chunkCache[chunk.key] = { position: [chunk.position.x/32, chunk.position.y/32, chunk.position.z/32], voxels: voxels, dims: [32,32,32] }; if (window.game) { window.game.voxels.emit('missingChunk', chunk.position.x/32, chunk.position.y/32, chunk.position.z/32); } }) function voxelChunk_chuckCache(low, high, x, y, z) { // console.log('generateVoxelChunk', Array.prototype.slice.call(arguments)); var key = [x,y,z].join('|'); // console.log('key: '+key) var chunk = chunkCache[key]; if (!chunk) { // console.log('Missing chunk: '+key); socket.json.emit('missingChunk', [x,y,z]) chunk = { position:[x,y,z], voxels:new Int8Array(32*32*32), dims:[32,32,32], empty:true }; } return chunk; } function noop() {}