matrix-engine-wgpu
Version:
Networking implemented - based on kurento openvidu server. fix arcball camera,instanced draws added also effect pipeline blend with instancing option.Normalmap added, Fixed shadows casting vs camera/video texture, webGPU powered pwa application. Crazy fas
511 lines (469 loc) • 17.5 kB
JavaScript
import {byId, isMobile, jsonHeaders, mb} from "../../../src/engine/utils.js";
/**
* @description This is clone from hang3d.
* @author Nikola Lukic
* @email zlatnaspirala@gmail.com
* @website https://maximumroulette.com
*/
export class RCSAccount {
email = null;
token = null;
constructor(apiDomain) {
this.apiDomain = apiDomain;
this.visitor()
addEventListener('F12', (e) => {
console.log(`%c[Debbuger] ${e.detail}`, REDLOG)
localStorage.removeItem("visitor");
this.visitor(e.detail)
})
// this.leaderboardBtn = document.createElement('div')
// this.leaderboardBtn.id = 'leaderboard';
// this.leaderboardBtn.innerHTML = `
// <button id="leaderboardBtn" class="btn">Leaderboard</button>
// `;
// document.body.appendChild(this.leaderboardBtn);
// this.leaderboardBtn = document.getElementById('leaderboardBtn');
// this.leaderboardBtn.addEventListener("click", this.getLeaderboard)
}
createDOM = (hideLoginForm) => {
if (typeof hideLoginForm === 'undefined') hideLoginForm = false;
var parent = document.createElement('div');
this.parent = parent;
//parent.classList.add('')
parent.id = 'myAccountLoginForm';
if (hideLoginForm == true) parent.style.display = 'none';
var logo = document.createElement('img');
logo.id = 'logologin';
logo.setAttribute('alt', 'Login');
logo.style = 'width: 100px;border-radius: 10px;padding: 6px;'
logo.src = './res/icons/512.png';
var title = document.createElement('div');
title.style.display = 'flex';
title.innerHTML = `
<div style='width:100%; margin: 5px 5px;'> <h2 style='margin: 5px 5px;'>Rocket GamePlay Login Form</h2>
Maximumroulette.com</div>
`;
title.appendChild(logo)
var content = document.createElement('div');
content.style.display = 'flex';
content.style.flexDirection = 'column';
content.style.background = 'transparent';
var emailLabel = document.createElement('label');
emailLabel.id = 'emailLabel';
emailLabel.innerHTML = `Email:`;
emailLabel.setAttribute('for', 'arg-email');
var email = document.createElement('input');
// email.classList.add('myInput')
email.id = 'arg-email';
var passLabel = document.createElement('label');
passLabel.id = 'passLabel';
passLabel.innerHTML = `Passw:`;
passLabel.setAttribute('for', 'arg-pass');
var pass = document.createElement('input');
pass.id = 'arg-pass';
// pass.classList.add('myInput')
var loginBtn = document.createElement('button');
loginBtn.id = 'loginRCSBtn'
loginBtn.innerHTML = `LOGIN`;
loginBtn.classList.add('btn')
loginBtn.classList.add('btnMargin')
loginBtn.addEventListener('click', this.login)
var gotoRegisterMyAccount = document.createElement('button');
gotoRegisterMyAccount.id = 'registerBtn';
gotoRegisterMyAccount.classList.add(`btn`);
gotoRegisterMyAccount.classList.add(`btnMargin`);
gotoRegisterMyAccount.innerHTML = `REGISTER`;
gotoRegisterMyAccount.addEventListener('click', this.register)
var hideLoginMyAccount = document.createElement('button');
hideLoginMyAccount.classList.add(`btn`);
hideLoginMyAccount.classList.add(`btnMargin`);
hideLoginMyAccount.innerHTML = `NO LOGIN -> INSTANT PLAY`;
hideLoginMyAccount.addEventListener('click', () => {
byId('myAccountLoginForm').remove();
})
if(isMobile() == false) {
var descText = document.createElement('div');
descText.id = 'descText';
descText.style = 'font-size:smaller;'
descText.innerHTML = `<span style="width:45%" >Welcome to rocketCraftingServer platform, enjoy in 'Forest Of Hollow Blood' lets magic begin.</span>`;
// <span style="width:45%;" >Add Url params '?video=false&audio=false' to disable streaming</span>
}
parent.appendChild(title)
parent.appendChild(content)
content.appendChild(emailLabel)
content.appendChild(email)
content.appendChild(passLabel)
content.appendChild(pass)
content.appendChild(loginBtn)
content.appendChild(gotoRegisterMyAccount)
content.appendChild(hideLoginMyAccount)
// content.appendChild(logo)
if(isMobile() == false) content.appendChild(descText);
document.body.appendChild(parent)
}
createLeaderboardDOM = (data) => {
if(byId('leaderboard') != null) {
byId('leaderboard').style.display = 'block';
return;
}
// console.log('TEST MOBILE +++')
var parent = document.createElement('div');
parent.style = ``;
parent.classList.add('leaderboard')
// if(isMobile() == true) {
// parent.style = `
// position: absolute;
// border-radius: 4px;
// top: 10%;
// left: 0%;
// width: 95%;
// padding: 10px;`;
// }
parent.id = 'leaderboard';
var title = document.createElement('div');
title.innerHTML = `<h3>Top 10 leaderboard [RocketCraftingServer]</h3>`;
parent.appendChild(title)
var tableLabel = document.createElement('div');
tableLabel.style.display = 'flex';
tableLabel.style.flexDirection = 'row';
var nicklabel = document.createElement('div');
nicklabel.innerText = 'Nickname';
nicklabel.style.width = '100%';
var pointslabel = document.createElement('div');
pointslabel.innerText = 'Points';
pointslabel.style.width = '100%';
tableLabel.appendChild(nicklabel)
tableLabel.appendChild(pointslabel)
parent.appendChild(tableLabel)
var parentForTable = document.createElement('div');
parentForTable.style.height = '70vh';
parentForTable.style.overflow = 'scroll';
parentForTable.style.overflowX = 'hidden';
data.forEach((element, index) => {
var table = document.createElement('div');
table.style.display = 'flex';
table.style.flexDirection = 'row';
table.style.justifyContent = 'center';
table.style.alignItems = 'center';
table.style.boxShadow = 'none';
var nick = document.createElement('div');
nick.innerText = element.nickname;
nick.style.width = '100%';
if(index == 0) {
nick.style.boxShadow = '0px 7px 2px -1px #ffe100';
} else if(index == 1) {
nick.style.boxShadow = '0px 7px 2px -1px white';
} else if(index == 2) {
nick.style.boxShadow = '0px 7px 2px -1px #a01010';
} else {
nick.style.boxShadow = '0px 7px 2px -1px #757471';
}
var points = document.createElement('div');
points.innerText = element.points;
points.style.width = '100%';
if(index == 0) {
points.style.boxShadow = '0px 7px 2px -1px #ffe100';
} else if(index == 1) {
points.style.boxShadow = '0px 7px 2px -1px white';
} else if(index == 2) {
points.style.boxShadow = '0px 7px 2px -1px #a01010';
} else {
points.style.boxShadow = '0px 7px 2px -1px #757471';
}
// var medal = document.createElement('img');
// medal.id = 'medal';
// logo.src = './assets/icons/icon96.png';
table.appendChild(nick)
table.appendChild(points)
table.innerHTML += (ROCK_RANK.getRankMedalImg(ROCK_RANK.getRank(element.points)))
parentForTable.appendChild(table)
});
parent.appendChild(parentForTable)
var hideBtn = document.createElement('button');
hideBtn.classList = 'btn';
hideBtn.style.marginTop = '7px';
hideBtn.innerText = 'HIDE';
hideBtn.addEventListener('click', () => {
parent.style.display = 'none';
})
parent.appendChild(hideBtn)
document.body.appendChild(parent)
}
register = () => {
this.register_procedure(this)
}
async register_procedure() {
let route = this.apiDomain || location.origin;
byId('loginRCSBtn').disabled = true;
byId('registerBtn').disabled = true;
let args = {
emailField: (byId('arg-email') != null ? byId('arg-email').value : null),
passwordField: (byId('arg-pass') != null ? byId('arg-pass').value : null)
}
if(args.emailField == null || args.passwordField == null) {
mb.show('Please fill up email and passw for login or register.')
}
fetch(route + '/rocket/register', {
method: 'POST',
headers: jsonHeaders,
body: JSON.stringify(args)
}).then((d) => {
return d.json();
}).then((r) => {
mb.error(`${r.message}`)
if(r.message == "Check email for conmfirmation key.") {
this.email = byId('arg-email').value;
sessionStorage.setItem('email', byId('arg-email').value)
byId('emailLabel').remove();
byId('loginRCSBtn').remove();
byId('arg-email').remove();
byId("passLabel").innerHTML = 'ENTER CONFIRMATION CODE';
byId('arg-pass').value = "";
byId('registerBtn').removeEventListener('click', this.register)
byId('registerBtn').disabled = false;
byId('registerBtn').innerHTML = 'CONFIRM CODE FROM EMAIL';
byId('registerBtn').id = 'CC';
byId('CC').addEventListener('click', () => {
this.confirmation()
})
sessionStorage.setItem('RocketAcountRegister', 'Check email for conmfirmation key.')
} else {
setTimeout(() => {
mb.show("Next Register/Login call try in 5 secounds...")
this.preventDBLOG = false;
this.preventDBREG = false;
byId('loginRCSBtn').disabled = false;
byId('registerBtn').disabled = false;
}, 5000)
}
}).catch((err) => {
console.log('[My Account Error]', err)
mb.show("Next Register call try in 5 secounds...")
setTimeout(() => {
this.preventDBLOG = false;
this.preventDBREG = false;
byId('loginRCSBtn').disabled = false;
byId('registerBtn').disabled = false;
}, 5000)
return;
})
}
confirmation = async () => {
let route = this.apiDomain;
const args = {
emailField: this.email,
tokenField: byId('arg-pass').value,
}
fetch(route + '/rocket/confirmation', {
method: 'POST',
headers: jsonHeaders,
body: JSON.stringify(args)
}).then((d) => {
return d.json();
}).then((r) => {
if(r.message == "Wrong confirmation code.") {
} else if(r.message == "Confirmation done.") {
alert(r.message)
this.parent.innerHTML = '';
// ----
this.createDOM();
}
mb.error(`${r.message}`)
})
}
gameStarted = async () => {
let route = this.apiDomain || location.origin;
let args = {
username: 'guest'
}
fetch(route + '/rocket/fohbstart', {
method: 'POST',
headers: jsonHeaders,
body: JSON.stringify(args)
}).then((d) => {
return d.json();
}).then((r) => {
console.log(r.message);
mb.show(`${r.message}`)
if(r.message == "User logged") { }
}).catch((err) => {
console.log('[RCS Error]', err)
return;
})
}
login = async () => {
let route = this.apiDomain || location.origin;
byId('loginRCSBtn').disabled = true;
byId('registerBtn').disabled = true;
let args = {
emailField: (byId('arg-email') != null ? byId('arg-email').value : null),
passwordField: (byId('arg-pass') != null ? byId('arg-pass').value : null)
}
fetch(route + '/rocket/login', {
method: 'POST',
headers: jsonHeaders,
body: JSON.stringify(args)
}).then((d) => {
return d.json();
}).then((r) => {
console.log(r.message);
mb.show(`${r.message}`)
if(r.message == "User logged") {
this.email = byId('arg-email').value;
byId('myAccountLoginForm').style.display = 'none';
sessionStorage.setItem('RocketAcount', JSON.stringify(r.flag))
}
}).catch((err) => {
console.log('[My Account Error]', err)
mb.show("Next Login call try in 5 secounds...")
setTimeout(() => {
this.preventDBLOG = false;
this.preventDBREG = false;
byId('registerBtn').disabled = false;
byId('loginRCSBtn').disabled = false;
}, 5000)
return;
})
}
async visitor(isRegular) {
if(typeof isRegular === 'undefined') isRegular = 'Yes';
if(localStorage.getItem("visitor") == 'welcome') return;
let route = this.apiDomain;
let args = {
email: (byId('arg-email') != null ? byId('arg-email').value : 'no-email'),
userAgent: navigator.userAgent.toString(),
fromUrl: location.href.toString(),
isRegular: isRegular
}
fetch(route + '/rocket/visitors', {
method: 'POST',
headers: jsonHeaders,
body: JSON.stringify(args)
}).then((d) => {
return d.json();
}).then(() => {
localStorage.setItem("visitor", "welcome")
}).catch((err) => {console.log('ERR', err)})
}
getLeaderboard = async (e) => {
e.preventDefault();
byId('netHeaderTitle').click();
// this.leaderboardBtn.disabled = true;
fetch(this.apiDomain + '/rocket/public-leaderboard', {
method: 'POST',
headers: jsonHeaders,
body: JSON.stringify({})
}).then((d) => {
return d.json();
}).then((r) => {
mb.error(`${r.message}`)
if(r.message == "You got leaderboard data.") {
this.leaderboardData = r.leaderboard;
this.createLeaderboardDOM(r.leaderboard);
}
// setTimeout(() => {this.leaderboardBtn.disabled = false}, 5000)
}).catch((err) => {
console.log('[Leaderboard Error]', err)
mb.show("Next call try in 5 secounds...")
// setTimeout(() => {this.leaderboardBtn.disabled = false}, 5000)
return;
})
}
getLeaderboardFor3dContext = async (e) => {
// e.preventDefault();
fetch(this.apiDomain + '/rocket/public-leaderboard', {
method: 'POST',
headers: jsonHeaders,
body: JSON.stringify({})
}).then((d) => {
return d.json();
}).then((r) => {
mb.error(`${r.message}`)
if(r.message == "You got leaderboard data.") {
this.leaderboardData = r.leaderboard;
console.log('PREPARE FOR 3d context', this.leaderboardData)
}
setTimeout(() => {this.leaderboardBtn.disabled = false}, 5000)
}).catch((err) => {
console.log('[Leaderboard Error]', err)
mb.show("Next call try in 5 secounds...")
setTimeout(() => {this.leaderboardBtn.disabled = false}, 5000)
return;
})
}
async points10() {
let route = this.apiDomain;
if(sessionStorage.getItem('RocketAcount') != null && JSON.parse(sessionStorage.getItem('RocketAcount')).token) {
console.log("NO ACCOUNT USER", sessionStorage.getItem('RocketAcount'))
return;
}
let args = {
email: (byId('arg-email') != null ? byId('arg-email').value : 'no-email'),
userAgent: navigator.userAgent.toString(),
fromUrl: location.href.toString(),
token: JSON.parse(sessionStorage.getItem('RocketAcount')).token,
mapName: 'FOHB',
}
fetch(route + '/rocket/point-plus10', {
method: 'POST',
headers: jsonHeaders,
body: JSON.stringify(args)
}).then((d) => {
return d.json();
}).then(() => {
localStorage.setItem("visitor", "welcome")
}).catch((err) => {console.log('ERR', err)})
}
async dead() {
let route = this.apiDomain;
if(sessionStorage.getItem('RocketAcount') != null && JSON.parse(sessionStorage.getItem('RocketAcount')).token) {
console.log("NO ACCOUNT USER", sessionStorage.getItem('RocketAcount'))
return;
}
let args = {
email: (byId('arg-email') != null ? byId('arg-email').value : 'no-email'),
userAgent: navigator.userAgent.toString(),
fromUrl: location.href.toString(),
token: JSON.parse(sessionStorage.getItem('RocketAcount')).token,
mapName: 'FOHB',
}
fetch(route + '/rocket/point-plus10', {
method: 'POST',
headers: jsonHeaders,
body: JSON.stringify(args)
}).then((d) => {
return d.json();
}).then(() => {
localStorage.setItem("visitor", "welcome")
}).catch((err) => {console.log('ERR', err)})
}
}
export var ROCK_RANK = {
getRank: (points) => {
points = parseInt(points);
if(points < 1001) {
return "junior";
} else if(points < 2000) {
return "senior";
} else if(points < 3000) {
return "captain";
} else if(points < 5000) {
return "general";
} else {
return "ultimate-killer";
}
},
getRankMedalImg: (rank) => {
if(rank == 'junior') {
return `<img style="height: 60px" src="./res/icons/medals/1.png" />`;
} else if(points == 'senior') {
return `<img style="height: 60px" src="./res/icons/medals/2.png" />`;
} else if(points == 'captain') {
return `<img style="height: 60px" src="./res/icons/medals/3.png" />`;
} else if(points == 'general') {
return `<img style="height: 60px" src="./res/icons/medals/4.png" />`;
} else {
return `<img style="height: 60px" src="./res/icons/medals/5.png" />`;
}
}
};