// Cloned by Goobs on 30 Nov 2022 from World "First Person Controls (clone by David L)" by David L
// Please leave this clone trail here.
AB.clockTick=1,AB.maxSteps=65545,AB.screenshotStep=50,AB.drawRunControls=!1,threeworld.drawCameraControls=!1;const MUSICFILE="/uploads/goobert/minemusic.mp3",FOOTSTEPS="/uploads/goobert/minecraft-footsteps.mp3";AB.backgroundMusic(MUSICFILE);const floorTextureFile="/uploads/goobert/grass2.png";var MOVESPEED=3,GRAVITY=6,FogDistance=3e3,FOV=90;function World(){var e,t,o,n=[],r=!1,a=!1,c=!1,i=!1,s=!1,E=performance.now(),d=new THREE.Vector3,m=new THREE.Vector3;new THREE.Vector3,new THREE.Color;this.newRun=function(){e=new THREE.PerspectiveCamera(FOV),threeworld.camera=e,threeworld.init3d(0,0,8306926);var n=new THREE.HemisphereLight(15658751,7829384,.75);n.position.set(.5,1,.75),threeworld.scene.add(n),threeworld.scene.fog=new THREE.Fog(16777215,0,FogDistance),t=new THREE.PointerLockControls(e),threeworld.scene.add(t.getObject()),document.addEventListener("keyup",function(e){switch(e.keyCode){case 38:case 87:r=!1;break;case 38:case 16:MOVESPEED=3;break;case 37:case 65:c=!1;break;case 40:case 83:a=!1;break;case 39:case 68:i=!1}},!1),document.addEventListener("keydown",function(e){switch(e.keyCode){case 38:case 87:r=!0;break;case 38:case 16:MOVESPEED=7;break;case 37:case 65:c=!0;break;case 40:case 83:a=!0;break;case 39:case 68:i=!0;break;case 32:!0===s&&(d.y+=350),s=!1}},!1),o=new THREE.Raycaster(new THREE.Vector3,new THREE.Vector3(0,-1,0),0,10),$("#user_span1").html("Use <b>WASD</b> or <b>Arrows</b> to move and <b>shift</b> to run any direction."),$("#user_span2").html("<p><b>Click screen to enable mouse controls</b></p>");var E="pointerLockElement"in document||"mozPointerLockElement"in document||"webkitPointerLockElement"in document;if(console.log(E),E){var m=document.body,u=function(e){document.pointerLockElement===m||document.mozPointerLockElement===m||document.webkitPointerLockElement===m?(t.enabled=!0,$("#user_span2").html("")):(t.enabled=!1,$("#user_span2").html("<p><b>Click onto the game to return playing.</b></p>"))},l=function(e){console.error("pointerlockerror")};document.addEventListener("pointerlockchange",u,!1),document.addEventListener("mozpointerlockchange",u,!1),document.addEventListener("webkitpointerlockchange",u,!1),document.addEventListener("pointerlockerror",l,!1),document.addEventListener("mozpointerlockerror",l,!1),document.addEventListener("webkitpointerlockerror",l,!1),document.addEventListener("click",function(e){m.requestPointerLock=m.requestPointerLock||m.mozRequestPointerLock||m.webkitRequestPointerLock,m.requestPointerLock()},!1)}else $("#user_span1").html("<p>Your browser doesn't seem to support Pointer Lock API</p>");var p=new THREE.PlaneBufferGeometry(1e4,1e4);p.rotateX(-Math.PI/2);var b=new THREE.ImageUtils.loadTexture(floorTextureFile);b.minFilter=THREE.LinearFilter,b.wrapS=b.wrapT=THREE.RepeatWrapping,b.offset.set(0,0),b.repeat.set(200,200);var k=new THREE.Mesh(p,new THREE.MeshBasicMaterial({map:b}));k.position.set(0,-20,0),threeworld.scene.add(k)},this.nextStep=function(){o.ray.origin.copy(t.getObject().position),o.ray.origin.y-=10;var e=o.intersectObjects(n).length>0,u=performance.now(),l=(u-E)/1e3;d.x-=10*d.x*l,d.z-=10*d.z*l,d.y-=GRAVITY,m.z=Number(r)-Number(a),m.x=Number(c)-Number(i),m.normalize(),(r||a)&&(d.z-=400*m.z*MOVESPEED*l),(c||i)&&(d.x-=400*m.x*MOVESPEED*l),!0===e&&(d.y=Math.max(0,d.y),s=!0),t.getObject().translateX(d.x*l),t.getObject().translateY(d.y*l),t.getObject().translateZ(d.z*l),t.getObject().position.y<10&&(d.y=0,t.getObject().position.y=10,s=!0),E=u}}THREE.PointerLockControls=function(e){var t=this,o=new THREE.Object3D;o.add(e);var n=new THREE.Object3D;n.position.y=10,n.add(o);var r=Math.PI/2,a=function(e){if(!1!==t.enabled){var a=e.movementX||e.mozMovementX||e.webkitMovementX||0,c=e.movementY||e.mozMovementY||e.webkitMovementY||0;n.rotation.y-=.002*a,o.rotation.x-=.002*c,o.rotation.x=Math.max(-r,Math.min(r,o.rotation.x))}};this.dispose=function(){document.removeEventListener("mousemove",a,!1)},document.addEventListener("mousemove",a,!1),this.enabled=!1,this.getObject=function(){return n},this.getDirection=(new THREE.Vector3(0,0,0),void new THREE.Euler(0,0,0))};const REQUESTWORLDSTATE=0,SENDWORLDSTATE=1;var joined=!1,data=[0,null];AB.socketOut(data),AB.socketIn=function(e){if(joined&&0==e[0])e=[1,t],AB.socketOut(e);else if(!joined&&1==e[0]){var t=e[1];joined=!0}};