prismarine-web-client/lib/menus/components/playerlist_overlay.js
KalmeMarq ed011b07fd
UI reorganized and options (#257)
* added readme pt-pt

* ui reorganized, keybinds, foodbar, panorama, etc
2021-12-24 13:00:07 +01:00

179 lines
4.4 KiB
JavaScript

const { LitElement, html, css } = require('lit')
const MAX_ROWS_PER_COL = 10
class PlayerListOverlay extends LitElement {
static get styles () {
return css`
.playerlist-container {
position: absolute;
background-color: rgba(0, 0, 0, 0.3);
top: 9px;
left: 50%;
transform: translate(-50%);
width: fit-content;
padding: 1px;
display: flex;
flex-direction: column;
gap: 1px 0;
place-items: center;
z-index: 30;
}
.title {
color: white;
text-shadow: 1px 1px 0px #3f3f3f;
font-size: 10px;
margin: 0;
padding: 0;
}
.playerlist-entry {
overflow: hidden;
color: white;
font-size: 10px;
margin: 0px;
line-height: calc(100% - 1px);
text-shadow: 1px 1px 0px #3f3f3f;
font-family: mojangles, minecraft, monospace;
background: rgba(255, 255, 255, 0.1);
width: 100%;
}
.active-player {
color: rgb(42, 204, 237);
text-shadow: 1px 1px 0px rgb(4, 44, 67);
}
.playerlist-ping {
text-align: right;
float: right;
padding-left: 10px;
}
.playerlist-ping-value {
color: rgb(114, 255, 114);
text-shadow: 1px 1px 0px rgb(28, 105, 28);
float: left;
margin: 0;
margin-right: 1px;
}
.playerlist-ping-label {
text-shadow: 1px 1px 0px #3f3f3f;
color: white;
float: right;
margin: 0px;
}
.player-lists {
display: flex;
flex-direction: row;
place-items: center;
place-content: center;
gap: 0 4px;
}
.player-list {
display: flex;
flex-direction: column;
gap: 1px 0;
min-width: 80px;
}
`
}
static get properties () {
return {
serverIP: { type: String },
clientId: { type: String },
players: { type: Object }
}
}
constructor () {
super()
this.serverIP = ''
this.clientId = ''
this.players = {}
}
init (bot, ip) {
const playerList = this.shadowRoot.querySelector('#playerlist-container')
this.isOpen = false
this.players = bot.players
this.clientId = bot.player.uuid
this.serverIP = ip
this.requestUpdate()
const showList = (shouldShow = true) => {
playerList.style.display = shouldShow ? 'block' : 'none'
this.isOpen = shouldShow
}
document.addEventListener('keydown', e => {
e ??= window.event
if (e.key === 'Tab') {
showList(true)
e.preventDefault()
}
})
document.addEventListener('keyup', e => {
if (!this.isOpen) return
e ??= window.event
if (e.key === 'Tab') {
showList(false)
e.preventDefault()
}
})
bot.on('playerUpdated', () => this.requestUpdate()) // LitElement seems to be batching requests, so it should be fine?
bot.on('playerJoined', () => this.requestUpdate())
bot.on('playerLeft', () => this.requestUpdate())
}
render () {
const lists = []
const players = Object.values(this.players).sort((a, b) => {
if (a.username > b.username) return 1
if (a.username < b.username) return -1
return 0
})
let tempList = []
for (let i = 0; i < players.length; i++) {
tempList.push(players[i])
if ((i + 1) / MAX_ROWS_PER_COL === 1 || i + 1 === players.length) {
lists.push([...tempList])
tempList = []
}
}
return html`
<div class="playerlist-container" id="playerlist-container" style="display: none;">
<span class="title">Server IP: ${this.serverIP}</span>
<div class="player-lists">
${lists.map(list => html`
<div class="player-list">
${list.map(player => html`
<div class="playerlist-entry${this.clientId === player.uuid ? ' active-player' : ''}" id="plist-player-${player.uuid}">
${player.username}
<div class="playerlist-ping">
<p class="playerlist-ping-value">${player.ping}</p>
<p class="playerlist-ping-label">ms</p>
</div>
</div>
`)}
</div>
`)}
</div>
</div>
`
}
}
window.customElements.define('pmui-playerlist-overlay', PlayerListOverlay)