1
0
mirror of https://github.com/lexogrine/dota2-react-hud.git synced 2025-12-10 01:52:49 +01:00
Hubert Walczak 52e2cd949b
init
2021-07-10 20:25:28 +02:00

133 lines
4.8 KiB
JavaScript

/* eslint-disable no-undef */
import { api } from './api.js';
let mesh = null;
// if cl_showpos 1 is 3300 -200 2100, then array should be:
// [-200, 2100, 3300]
// last element of the array is rotation in degrees
const positions = {
de_cache: [-200, 2100, 3300, 180],
de_mirage: [-2100, 159, -1970, 0],
de_dust2: [-450, 350, 727, 180],
de_inferno: [10, 141, -1866, 0],
de_train: [641, 125, -1800, 90],
de_overpass: [-1519, 475, -1105, 115],
de_nuke: [-3025, -10, 490, 90],
de_vertigo: [-615, 12605, -448, 0],
}
const startARModule = (scene, _camera, _renderer, GSI, actions) => {
let lastContent = '';
let scoreboardObject = null;
function updateScoreboard(content, map) {
if(!(map in positions)){
return;
}
const wrapper = scoreboardObject || document.createElement('div');
if(!wrapper.id){
wrapper.id = 'playerCanvas'
}
wrapper.innerHTML = content;
if (!scoreboardObject) {
scoreboardObject = wrapper;
const object = new THREE.CSS3DObject(wrapper);
mesh = object;
const position = positions[map];
object.position.set(position[0], position[1], position[2]);
object.rotateY(THREE.Math.degToRad(position[3]));
scene.add(object);
actions.on('arState', arState => {
const isHidden = arState === "hide";
wrapper.classList.toggle('hide', isHidden);
});
}
return wrapper;
}
api.match.getCurrent().then(match => {
if (!match) return;
let isReversed = false;
if (GSI.last) {
const mapName = GSI.last.map.name.substring(GSI.last.map.name.lastIndexOf('/') + 1);
const current = match.vetos.find(veto => veto.mapName === mapName);
if (current && current.reverseSide) {
isReversed = true;
}
}
api.teams.get().then(teams => {
if (match.left && match.left.id) {
const left = teams.find(team => team._id === match.left.id);
if (left) {
const gsiTeamData = { id: left._id, name: left.name, country: left.country, logo: left.logo, map_score: match.left.wins, extra: left.extra };
if (!isReversed) {
GSI.teams.left = gsiTeamData;
}
else GSI.teams.right = gsiTeamData;
}
}
if (match.right && match.right.id) {
const right = teams.find(team => team._id === match.right.id);
if (right) {
const gsiTeamData = { id: right._id, name: right.name, country: right.country, logo: right.logo, map_score: match.right.wins, extra: right.extra };
if (!isReversed) {
GSI.teams.right = gsiTeamData;
}
else GSI.teams.left = gsiTeamData;
}
}
});
});
GSI.on('data', (data) => {
if(!data || !data.map || !data.map.name) return;
const mapName = data.map.name.substring(data.map.name.lastIndexOf('/') + 1);
if(!mapName || !(mapName in positions)) return;
const { players } = data;
const playersLeft = players.filter(player => player.team.orientation === "left");
const playersRight = players.filter(player => player.team.orientation === "right");
const leftTeam = playersLeft[0].team;
const rightTeam = playersRight[0].team;
if (!leftTeam || !rightTeam) return;
let htmlEntry = ``;
htmlEntry += `<div class="teamContainer"><div class="teamName ${leftTeam.side}">${leftTeam.name}</div>${playersLeft.map(player => `
<div class="playerEntry">
<div class="playerUsername">${player.name}</div>
<div class="playerStats">${player.stats.kills}</div>
<div class="playerStats">${player.stats.assists}</div>
<div class="playerStats">${player.stats.deaths}</div>
</div>
`).join('')}</div>`;
htmlEntry += `<div class="teamContainer"><div class="teamName ${rightTeam.side}">${rightTeam.name}</div>${playersRight.map(player => `
<div class="playerEntry">
<div class="playerUsername">${player.name}</div>
<div class="playerStats">${player.stats.deaths}</div>
<div class="playerStats">${player.stats.assists}</div>
<div class="playerStats">${player.stats.kills}</div>
</div>
`).join('')}</div>`;
if (lastContent !== htmlEntry) {
lastContent = htmlEntry;
updateScoreboard(htmlEntry, mapName);
}
});
}
const cleanUpARModule = (scene, GSI) => {
if (mesh) {
scene.remove(mesh);
}
GSI.removeAllListeners("data");
}
export { startARModule, cleanUpARModule };