Initial commit

This commit is contained in:
Red Duck 2021-11-01 12:08:11 +02:00
commit c27332b8bd
15 changed files with 3891 additions and 0 deletions

89
.gitignore vendored Normal file
View file

@ -0,0 +1,89 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
.DS_Store
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# TypeScript v1 declaration files
typings/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
.env.test
# parcel-bundler cache (https://parceljs.org/)
.cache
# next.js build output
.next
# nuxt.js build output
.nuxt
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# Webpack
.webpack/
# Electron-Forge
out/

59
package.json Normal file
View file

@ -0,0 +1,59 @@
{
"name": "minequack",
"productName": "minequack",
"version": "1.0.0",
"licence": "The Unlicense",
"description": "My Electron application description",
"main": "src/index.js",
"scripts": {
"start": "electron-forge start",
"package": "electron-forge package",
"make": "electron-forge make",
"publish": "electron-forge publish",
"lint": "echo \"No linting configured\""
},
"keywords": [],
"author": {
"name": "TheRedX",
"email": "56270596+TheRedXD@users.noreply.github.com"
},
"license": "MIT",
"config": {
"forge": {
"packagerConfig": {},
"makers": [
{
"name": "@electron-forge/maker-squirrel",
"config": {
"name": "minequack"
}
},
{
"name": "@electron-forge/maker-zip",
"platforms": [
"darwin"
]
},
{
"name": "@electron-forge/maker-deb",
"config": {}
},
{
"name": "@electron-forge/maker-rpm",
"config": {}
}
]
}
},
"dependencies": {
"electron-squirrel-startup": "^1.0.0"
},
"devDependencies": {
"@electron-forge/cli": "6.0.0-beta.52",
"@electron-forge/maker-deb": "6.0.0-beta.52",
"@electron-forge/maker-rpm": "6.0.0-beta.52",
"@electron-forge/maker-squirrel": "6.0.0-beta.52",
"@electron-forge/maker-zip": "6.0.0-beta.52",
"electron": "15.3.0"
}
}

0
src/app/game.js Normal file
View file

304
src/app/render.js Normal file
View file

@ -0,0 +1,304 @@
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );
const renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
const gameStats = {
fps: 0,
playerName: 'TheRed'
}
function existCheck(id, metadata) {
let check = require('fs').existsSync(__dirname+'/app/resources/'+id+'/textures.json');
if(check) {
file = require(__dirname+'/app/resources/'+id+'/textures.json');
console.log(file);
if(file[metadata] == undefined) {
return false;
} else {
if(!require('fs').existsSync(__dirname+'/app/resources/'+id+'/'+file[metadata].f)) {
console.log('1')
return false;
} else if(!require('fs').existsSync(__dirname+'/app/resources/'+id+'/'+file[metadata].b)) {
console.log('2')
return false;
} else if(!require('fs').existsSync(__dirname+'/app/resources/'+id+'/'+file[metadata].l)) {
console.log('3')
return false;
} else if(!require('fs').existsSync(__dirname+'/app/resources/'+id+'/'+file[metadata].r)) {
console.log('4')
return false;
} else if(!require('fs').existsSync(__dirname+'/app/resources/'+id+'/'+file[metadata].u)) {
console.log('5')
return false;
} else if(!require('fs').existsSync(__dirname+'/app/resources/'+id+'/'+file[metadata].d)) {
console.log('6')
return false;
} else {
console.log('7')
return true;
}
}
} else {
return false;
};
};
/**
* @description AssembledCube creates a cube using 6 planes, which makes it easier to optimize (also applies a texture and cube size, position)
* @example new AssembledCube('stone', theTexture, 1, [0,0,0]);
*/
class AssembledCube {
constructor(id, texture, size, position) {
let x = size;
let y = size;
this.id = id;
this.texture = texture;
this.position = position;
let geometry1 = new THREE.PlaneGeometry( x, y );
let texture1 = new THREE.TextureLoader().load(__dirname+'/app/resources/'+this.id+'/'+this.texture.f);
texture1.magFilter = THREE.NearestFilter; // Makes so the texture isnt blurry, instead it becomes pixely (kinda like minecraft)
let material1 = new THREE.MeshBasicMaterial( {map: texture1, side: THREE.BackSide} );
let plane1 = new THREE.Mesh( geometry1, material1 );
let geometry2 = new THREE.PlaneGeometry( x, y );
let texture2 = new THREE.TextureLoader().load(__dirname+'/app/resources/'+this.id+'/'+this.texture.b);
texture2.magFilter = THREE.NearestFilter; // Makes so the texture isnt blurry, instead it becomes pixely (kinda like minecraft)
let material2 = new THREE.MeshBasicMaterial( {map: texture2, side: THREE.BackSide} );
let plane2 = new THREE.Mesh( geometry2, material2 );
let geometry3 = new THREE.PlaneGeometry( x, y );
let texture3 = new THREE.TextureLoader().load(__dirname+'/app/resources/'+this.id+'/'+this.texture.l);
texture3.magFilter = THREE.NearestFilter; // Makes so the texture isnt blurry, instead it becomes pixely (kinda like minecraft)
let material3 = new THREE.MeshBasicMaterial( {map: texture3, side: THREE.BackSide} );
let plane3 = new THREE.Mesh( geometry3, material3 );
let geometry4 = new THREE.PlaneGeometry( x, y );
let texture4 = new THREE.TextureLoader().load(__dirname+'/app/resources/'+this.id+'/'+this.texture.r);
texture4.magFilter = THREE.NearestFilter; // Makes so the texture isnt blurry, instead it becomes pixely (kinda like minecraft)
let material4 = new THREE.MeshBasicMaterial( {map: texture4, side: THREE.BackSide} );
let plane4 = new THREE.Mesh( geometry4, material4 );
let geometry5 = new THREE.PlaneGeometry( x, y );
let texture5 = new THREE.TextureLoader().load(__dirname+'/app/resources/'+this.id+'/'+this.texture.u);
texture5.magFilter = THREE.NearestFilter; // Makes so the texture isnt blurry, instead it becomes pixely (kinda like minecraft)
let material5 = new THREE.MeshBasicMaterial( {map: texture5, side: THREE.BackSide} );
let plane5 = new THREE.Mesh( geometry5, material5 );
let geometry6 = new THREE.PlaneGeometry( x, y );
let texture6 = new THREE.TextureLoader().load(__dirname+'/app/resources/'+this.id+'/'+this.texture.d);
texture6.magFilter = THREE.NearestFilter; // Makes so the texture isnt blurry, instead it becomes pixely (kinda like minecraft)
let material6 = new THREE.MeshBasicMaterial( {map: texture6, side: THREE.BackSide} );
let plane6 = new THREE.Mesh( geometry6, material6 );
plane1.position.x = this.position[0];
plane1.position.y = this.position[1];
plane1.position.z = this.position[2]+x/2;
plane2.position.x = this.position[0];
plane2.position.y = this.position[1];
plane2.position.z = this.position[2]-x/2;
plane3.position.x = this.position[0]+x/2;
plane3.position.y = this.position[1];
plane3.position.z = this.position[2];
plane4.position.x = this.position[0]-x/2;
plane4.position.y = this.position[1];
plane4.position.z = this.position[2];
plane5.position.x = this.position[0];
plane5.position.y = this.position[1]+x/2;
plane5.position.z = this.position[2];
plane6.position.x = this.position[0];
plane6.position.y = this.position[1]-x/2;
plane6.position.z = this.position[2];
plane1.rotation.y = 0*(Math.PI/180)
plane2.rotation.y = 180*(Math.PI/180)
plane3.rotation.y = 90*(Math.PI/180)
plane4.rotation.y = -90*(Math.PI/180)
plane5.rotation.x = -90*(Math.PI/180)
plane6.rotation.x = 90*(Math.PI/180)
this.plane1 = plane1;
this.plane2 = plane2;
this.plane3 = plane3;
this.plane4 = plane4;
this.plane5 = plane5;
this.plane6 = plane6;
}
return() {
return [this.plane1, this.plane2, this.plane3, this.plane4, this.plane5, this.plane6];
}
update(positiona) {
this.plane1.position.x = positiona[0];
this.plane1.position.y = positiona[1];
this.plane1.position.z = positiona[2]+this.size/2;
this.plane2.position.x = positiona[0];
this.plane2.position.y = positiona[1];
this.plane2.position.z = positiona[2]-this.size/2;
this.plane3.position.x = positiona[0]+this.size/2;
this.plane3.position.y = positiona[1];
this.plane3.position.z = positiona[2];
this.plane4.position.x = positiona[0]-this.size/2;
this.plane4.position.y = positiona[1];
this.plane4.position.z = positiona[2];
this.plane5.position.x = positiona[0];
this.plane5.position.y = positiona[1]+this.size/2;
this.plane5.position.z = positiona[2];
this.plane6.position.x = positiona[0];
this.plane6.position.y = positiona[1]-this.size/2;
this.plane6.position.z = positiona[2];
}
}
/**
* @description This class is used for creating players
* @example new Player("TheBlueBurger", [0, 0, 0], [0, 0])
*/
class Player {
constructor(playername, position, rotation) {
this.name = playername;
this.position = position;
this.rotation = rotation;
}
update(positiona, rotationa) {
this.position[0] = positiona[0];
this.position[1] = positiona[1];
this.position[2] = positiona[2];
this.rotation[2] = 0;
this.rotation[0] = rotationa[1];
this.rotation[1] = rotationa[0];
}
}
class World {
constructor() {
this.constants = {
g: 9.81, // meters per second squared
bs: 1 // meters
}
}
}
class Block {
constructor(position, id, metadata) {
this.position = position;
this.id = id;
this.metadata = metadata;
this.texture = getTexture(this.id, this.metadata)
}
return() {
}
}
class Skybox {
constructor(x) {
this.position = [0, 0, -x/2]; // sets the default skybox position
this.id = 'stone'; // texture id
this.metadata = 0; // metadata
this.size = x; // the size of skybox
this.texture = getTexture(this.id, this.metadata) // get the texture using id and metadata
this.cube = new AssembledCube(this.texture.id, this.texture, this.size, this.position); // create a cube (6 seperate planes instead of a whole cube so easier to optimize)
} // line 50
update(positiona) {
this.cube.update(positiona)
}
return() {
console.log(this.texture);
return this.cube; // returns our cube
}
}
let player = new Player('TheRedPotato', [0, 1, 0], [0, 0])
let i = 0;
let cube;
// setInterval(() => {i++},1000)
// setTimeout(() => {
// window.open("https://www.youtube.com/watch?v=dQw4w9WgXcQ");
// }, 50000)
function getTexture(id, metadata) {
let check = !existCheck(id, metadata);
console.log(check);
if(check) {
let texture = require(__dirname+'/app/resources/undefined/textures.json')[0];
texture.id = 'undefined';
return texture;
} else {
let texture = require(__dirname+'/app/resources/'+id+'/textures.json')[metadata];
texture.id = id;
return texture;
}
};
function genBlockArray(x, z, position) {
for(i = 0;i<z;i++) { // leave it alone, aint used for now but its just something i keep so that i can have a refference point later when i do generation
for(i2 = 0; i2<x; i2++) {
pos = [position.x+i2, position.y, position.z+i];
scene.add(new Block(pos, 'stone', 0).return());
}
}
}
function render() {
requestAnimationFrame( render );
// gameStats.fps = performance.now();
// console.log(gameStats.fps/i);
cube.rotation.y += 0.01;
cube.rotation.x += 0.0101;
// player.update(player.position, [player.rotation[0], player.rotation[1]])
camera.position.x = player.position[0]
camera.position.y = player.position[1]
camera.position.z = player.position[2]
// camera.rotation.x = player.rotation[2]
camera.rotation.y = player.rotation[1]
camera.rotation.z = player.rotation[0]
skybox.update(player.position);
renderer.render(scene, camera)
}
window.addEventListener( 'resize', onWindowResize, false );
function onWindowResize(){
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize( window.innerWidth, window.innerHeight );
}
function setup() {
document.body.appendChild( renderer.domElement );
const geometry = new THREE.BoxGeometry( 1, 1, 1 );
const material = new THREE.MeshBasicMaterial( {color: 0x00ff00} );
cube = new THREE.Mesh( geometry, material );
scene.add( cube );
cube.position.z = -10;
scene.add(skyboxobj.plane1)
scene.add(skyboxobj.plane2)
scene.add(skyboxobj.plane3)
scene.add(skyboxobj.plane4)
scene.add(skyboxobj.plane5)
scene.add(skyboxobj.plane6)
render();
}
let skybox = new Skybox(300);
let skyboxobj = new Skybox(300).return();
setup();
// can i test something? sure

Binary file not shown.

After

Width:  |  Height:  |  Size: 559 B

View file

@ -0,0 +1,12 @@
[
{
"f": "1.png",
"b": "1.png",
"l": "1.png",
"r": "1.png",
"u": "1.png",
"d": "1.png",
"t": false,
"m": "inner"
}
]

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 B

View file

@ -0,0 +1,12 @@
[
{
"f": "1.png",
"b": "1.png",
"l": "1.png",
"r": "1.png",
"u": "1.png",
"d": "1.png",
"t": false,
"m": "outer"
}
]

Binary file not shown.

After

Width:  |  Height:  |  Size: 571 B

View file

@ -0,0 +1,12 @@
[
{
"f": "1.png",
"b": "1.png",
"l": "1.png",
"r": "1.png",
"u": "1.png",
"d": "1.png",
"t": false,
"m": "both"
}
]

4
src/index.css Normal file
View file

@ -0,0 +1,4 @@
* {
padding: 0 auto;
margin: 0 auto;
}

15
src/index.html Normal file
View file

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Minequack 1.0</title>
<link rel="stylesheet" href="index.css">
</head>
<body>
<script src="libs/three.min.js"></script>
<script src="app/game.js"></script>
<script src="app/render.js"></script>
</body>
</html>

50
src/index.js Normal file
View file

@ -0,0 +1,50 @@
const { app, BrowserWindow } = require('electron');
const path = require('path');
// Handle creating/removing shortcuts on Windows when installing/uninstalling.
if (require('electron-squirrel-startup')) { // eslint-disable-line global-require
app.quit();
}
const createWindow = () => {
// Create the browser window.
const mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true,
contextIsolation: false,
allowRunningInsecureContent: true
}
});
// and load the index.html of the app.
mainWindow.loadFile(path.join(__dirname, 'index.html'));
mainWindow.setMenuBarVisibility(false);
// Open the DevTools.
};
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', createWindow);
// Quit when all windows are closed, except on macOS. There, it's common
// for applications and their menu bar to stay active until the user quits
// explicitly with Cmd + Q.
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit();
}
});
app.on('activate', () => {
// On OS X it's common to re-create a window in the app when the
// dock icon is clicked and there are no other windows open.
if (BrowserWindow.getAllWindows().length === 0) {
createWindow();
}
});
// In this file you can include the rest of your app's specific main process
// code. You can also put them in separate files and import them here.

6
src/libs/three.min.js vendored Normal file

File diff suppressed because one or more lines are too long

3328
yarn.lock Normal file

File diff suppressed because it is too large Load diff