Skip to content

Commit d978f5c

Browse files
committed
add code
1 parent d186c09 commit d978f5c

File tree

11 files changed

+434
-56
lines changed

11 files changed

+434
-56
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
node_modules/
22
package-lock.json
3-
.vscode
3+
.vscode
4+
public

README.md

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,33 @@
1-
# prismarine-template
2-
[![NPM version](https://img.shields.io/npm/v/prismarine-template.svg)](http://npmjs.com/package/prismarine-template)
3-
[![Build Status](https://github.com/PrismarineJS/prismarine-template/workflows/CI/badge.svg)](https://github.com/PrismarineJS/prismarine-template/actions?query=workflow%3A%22CI%22)
1+
# prismarine-web-client
2+
[![NPM version](https://img.shields.io/npm/v/prismarine-web-client.svg)](http://npmjs.com/package/prismarine-web-client)
3+
[![Build Status](https://github.com/PrismarineJS/prismarine-web-client/workflows/CI/badge.svg)](https://github.com/PrismarineJS/prismarine-web-client/actions?query=workflow%3A%22CI%22)
44
[![Discord](https://img.shields.io/badge/chat-on%20discord-brightgreen.svg)](https://discord.gg/GsEFRM8)
5-
[![Gitter](https://img.shields.io/badge/chat-on%20gitter-brightgreen.svg)](https://gitter.im/PrismarineJS/general)
6-
[![Irc](https://img.shields.io/badge/chat-on%20irc-brightgreen.svg)](https://irc.gitter.im/)
7-
[![Try it on gitpod](https://img.shields.io/badge/try-on%20gitpod-brightgreen.svg)](https://gitpod.io/#https://github.com/PrismarineJS/prismarine-template)
5+
[![Try it on gitpod](https://img.shields.io/badge/try-on%20gitpod-brightgreen.svg)](https://gitpod.io/#https://github.com/PrismarineJS/prismarine-web-client)
86

9-
A template repository to make it easy to create new prismarine repo
7+
A minecraft client running in a web page.
108

11-
## Usage
9+
It runs mineflayer in the browser which connects to a websocket minecraft server.
10+
It provides a simple websocket to tcp proxy as a backend to make it possible to connect to any minecraft server.
1211

13-
```js
14-
const template = require('prismarine-template')
12+
## Features
13+
14+
* display blocks
15+
* display entities as colored rectangles
16+
* movement sync
17+
18+
## Roadmap
19+
20+
* chat
21+
* block placing and breaking
1522

16-
template.helloWorld()
23+
## Run
24+
25+
```js
26+
npm install
27+
npm run build-start
1728
```
1829

19-
## API
30+
Then connect to http://localhost:8080
31+
2032

21-
### helloWorld()
2233

23-
Prints hello world

dns.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/* global XMLHttpRequest */
2+
3+
// Custom DNS resolver made by SiebeDW. Powered by google dns.
4+
// Supported: SRV (not all errors support)
5+
module.exports.resolveSrv = function (hostname, callback) {
6+
const Http = new XMLHttpRequest()
7+
const url = `https://dns.google.com/resolve?name=${hostname}&type=SRV`
8+
Http.open('GET', url)
9+
Http.responseType = 'json'
10+
Http.send()
11+
12+
Http.onload = function () {
13+
const response = Http.response
14+
if (response.Status === 3) {
15+
const err = new Error('querySrv ENOTFOUND')
16+
err.code = 'ENOTFOUND'
17+
callback(err)
18+
return
19+
}
20+
if (!response.Answer || response.Answer.length < 1) {
21+
const err = new Error('querySrv ENODATA')
22+
err.code = 'ENODATA'
23+
callback(err)
24+
return
25+
}
26+
const willreturn = []
27+
response.Answer.forEach(function (object) {
28+
const data = object.data.split(' ')
29+
willreturn.push({
30+
priority: data[0],
31+
weight: data[1],
32+
port: data[2],
33+
name: data[3]
34+
})
35+
})
36+
console.log(willreturn)
37+
callback(null, willreturn)
38+
}
39+
}

example.js

Lines changed: 0 additions & 3 deletions
This file was deleted.

index.html

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title>Prismarine Viewer</title>
5+
<style type="text/css">
6+
html {
7+
overflow: hidden;
8+
}
9+
10+
html, body {
11+
height: 100%;
12+
13+
margin: 0;
14+
padding: 0;
15+
}
16+
17+
canvas {
18+
height: 100%;
19+
width: 100%;
20+
font-size: 0;
21+
22+
margin: 0;
23+
padding: 0;
24+
}
25+
</style>
26+
</head>
27+
<body>
28+
<script type="text/javascript" src="index.js"></script>
29+
</body>
30+
</html>

index.js

Lines changed: 130 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,132 @@
1-
if (typeof process !== 'undefined' && parseInt(process.versions.node.split('.')[0]) < 14) {
2-
console.error('Your node version is currently', process.versions.node)
3-
console.error('Please update it to a version >= 14.x.x from https://nodejs.org/')
4-
process.exit(1)
5-
}
1+
/* global THREE, prompt */
2+
3+
// Workaround for process.versions.node not existing in the browser
4+
process.versions.node = '14.0.0'
5+
6+
const mineflayer = require('mineflayer')
7+
const { WorldView, Viewer } = require('prismarine-viewer/viewer')
8+
global.THREE = require('three')
9+
10+
async function main () {
11+
const viewDistance = 6
12+
const host = prompt('Host', '95.111.249.143')
13+
const port = parseInt(prompt('Port', '10000'))
14+
const username = prompt('Username', 'pviewer_person')
15+
let password = prompt('Password (blank for offline)')
16+
password = password === '' ? undefined : password
17+
console.log(`connecting to ${host} ${port} with ${username}`)
18+
19+
const bot = mineflayer.createBot({
20+
host,
21+
port,
22+
username,
23+
password
24+
})
25+
26+
bot.on('end', () => {
27+
console.log('disconnected')
28+
})
29+
30+
bot.once('spawn', () => {
31+
console.log('bot spawned - starting viewer')
32+
33+
const version = bot.version
34+
35+
const center = bot.entity.position
36+
37+
const worldView = new WorldView(bot.world, viewDistance, center)
38+
39+
// Create three.js context, add to page
40+
const renderer = new THREE.WebGLRenderer()
41+
renderer.setPixelRatio(window.devicePixelRatio || 1)
42+
renderer.setSize(window.innerWidth, window.innerHeight)
43+
document.body.appendChild(renderer.domElement)
44+
45+
// Create viewer
46+
const viewer = new Viewer(renderer)
47+
viewer.setVersion(version)
48+
49+
worldView.listenToBot(bot)
50+
worldView.init(bot.entity.position)
51+
52+
function botPosition () {
53+
viewer.setFirstPersonCamera(bot.entity.position, bot.entity.yaw, bot.entity.pitch)
54+
worldView.updatePosition(bot.entity.position)
55+
}
56+
57+
bot.on('move', botPosition)
58+
59+
// Link WorldView and Viewer
60+
viewer.listen(worldView)
61+
viewer.camera.position.set(center.x, center.y, center.z)
62+
63+
function moveCallback (e) {
64+
bot.entity.pitch -= e.movementY * 0.01
65+
bot.entity.yaw -= e.movementX * 0.01
66+
viewer.setFirstPersonCamera(bot.entity.position, bot.entity.yaw, bot.entity.pitch)
67+
}
68+
function changeCallback () {
69+
if (document.pointerLockElement === renderer.domElement ||
70+
document.mozPointerLockElement === renderer.domElement ||
71+
document.webkitPointerLockElement === renderer.domElement) {
72+
document.addEventListener('mousemove', moveCallback, false)
73+
} else {
74+
document.removeEventListener('mousemove', moveCallback, false)
75+
}
76+
}
77+
document.addEventListener('pointerlockchange', changeCallback, false)
78+
document.addEventListener('mozpointerlockchange', changeCallback, false)
79+
document.addEventListener('webkitpointerlockchange', changeCallback, false)
80+
renderer.domElement.requestPointerLock = renderer.domElement.requestPointerLock ||
81+
renderer.domElement.mozRequestPointerLock ||
82+
renderer.domElement.webkitRequestPointerLock
83+
document.addEventListener('mousedown', (e) => {
84+
renderer.domElement.requestPointerLock()
85+
})
86+
87+
document.addEventListener('contextmenu', (e) => e.preventDefault(), false)
88+
document.addEventListener('keydown', (e) => {
89+
console.log(e.code)
90+
if (e.code === 'KeyW') {
91+
bot.setControlState('forward', true)
92+
} else if (e.code === 'KeyS') {
93+
bot.setControlState('back', true)
94+
} else if (e.code === 'KeyA') {
95+
bot.setControlState('right', true)
96+
} else if (e.code === 'KeyD') {
97+
bot.setControlState('left', true)
98+
} else if (e.code === 'Space') {
99+
bot.setControlState('jump', true)
100+
} else if (e.code === 'ShiftLeft') {
101+
bot.setControlState('sneak', true)
102+
} else if (e.code === 'ControlLeft') {
103+
bot.setControlState('sprint', true)
104+
}
105+
}, false)
106+
document.addEventListener('keyup', (e) => {
107+
if (e.code === 'KeyW') {
108+
bot.setControlState('forward', false)
109+
} else if (e.code === 'KeyS') {
110+
bot.setControlState('back', false)
111+
} else if (e.code === 'KeyA') {
112+
bot.setControlState('right', false)
113+
} else if (e.code === 'KeyD') {
114+
bot.setControlState('left', false)
115+
} else if (e.code === 'Space') {
116+
bot.setControlState('jump', false)
117+
} else if (e.code === 'ShiftLeft') {
118+
bot.setControlState('sneak', false)
119+
} else if (e.code === 'ControlLeft') {
120+
bot.setControlState('sprint', false)
121+
}
122+
}, false)
6123

7-
module.exports.helloWorld = function () {
8-
console.log('Hello world !')
124+
// Browser animation loop
125+
const animate = () => {
126+
window.requestAnimationFrame(animate)
127+
renderer.render(viewer.scene, viewer.camera)
128+
}
129+
animate()
130+
})
9131
}
132+
main()

package.json

Lines changed: 48 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,50 @@
11
{
2-
"name": "prismarine-template",
3-
"version": "1.0.0",
4-
"description": "A template repository to make it easy to create new prismarine repo",
5-
"main": "index.js",
6-
"scripts": {
7-
"test": "jest --verbose",
8-
"pretest": "npm run lint",
9-
"lint": "standard",
10-
"fix": "standard --fix"
11-
},
12-
"repository": {
13-
"type": "git",
14-
"url": "git+https://github.com/PrismarineJS/prismarine-template.git"
15-
},
16-
"keywords": [
17-
"prismarine",
18-
"template"
19-
],
20-
"author": "Romain Beaumont",
21-
"license": "MIT",
22-
"bugs": {
23-
"url": "https://github.com/PrismarineJS/prismarine-template/issues"
24-
},
25-
"homepage": "https://github.com/PrismarineJS/prismarine-template#readme",
26-
"devDependencies": {
27-
"jest": "^26.1.0",
28-
"prismarine-template": "file:.",
29-
"standard": "^16.0.1"
30-
}
2+
"name": "web_client",
3+
"private": true,
4+
"version": "1.0.0",
5+
"description": "web_client",
6+
"main": "index.js",
7+
"scripts": {
8+
"prepare": "webpack",
9+
"start": "webpack serve",
10+
"prod-start": "node server.js",
11+
"build-start": "npm run prepare && npm run prod-start",
12+
"lint": "standard",
13+
"fix": "standard --fix",
14+
"test": "npm run lint && mocha"
15+
},
16+
"dependencies": {
17+
"assert": "^2.0.0",
18+
"browserify-zlib": "^0.2.0",
19+
"buffer": "^6.0.3",
20+
"clean-webpack-plugin": "^3.0.0",
21+
"compression": "^1.7.4",
22+
"constants-browserify": "^1.0.0",
23+
"copy-webpack-plugin": "^7.0.0",
24+
"crypto-browserify": "^3.12.0",
25+
"events": "^3.2.0",
26+
"express": "^4.17.1",
27+
"http-browserify": "^1.7.0",
28+
"https-browserify": "^1.0.0",
29+
"memfs": "^3.2.0",
30+
"mineflayer": "^2.39.2",
31+
"net-browserify": "^0.2.4",
32+
"os-browserify": "^0.3.0",
33+
"path-browserify": "^1.0.1",
34+
"prismarine-viewer": "^1.14.0",
35+
"process": "^0.11.10",
36+
"request": "^2.88.2",
37+
"stream-browserify": "^3.0.0",
38+
"three": "^0.124.0",
39+
"timers-browserify": "^2.0.12",
40+
"webpack": "^5.11.0",
41+
"webpack-cli": "^4.2.0",
42+
"webpack-dev-server": "^3.11.0"
43+
},
44+
"devDependencies": {
45+
"http-server": "^0.12.3",
46+
"lodash-webpack-plugin": "^0.11.6",
47+
"mocha": "^8.3.0",
48+
"standard": "^16.0.3"
49+
}
3150
}

perf_hooks_replacement.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports.performance = window.performance

0 commit comments

Comments
 (0)