azures04 26e78a82c0 Add game frame UI with play button and styling
Introduced a new 'game' frame in logged.html with a title and play button. Added corresponding CSS for layout and button styling in logged.css. Updated JS to show the game frame by default.
2026-01-24 23:50:28 +01:00

247 lines
8.1 KiB
JavaScript

const buttons = document.querySelectorAll("button[frame]")
const dynmapFrame = document.querySelector("article.frame.dynmap > iframe")
const capesSelector = document.querySelector("article.capes > div.capes")
const logsContainer = document.querySelector("div.container.logs")
let viewerInstance = new skinview3d.SkinViewer({
canvas: document.getElementById("skin"),
width: 390,
height: 490,
skin: "https://yggdrasil.azures.fr/textures/texture/steve.png"
})
viewerInstance.animation = new skinview3d.IdleAnimation()
viewerInstance.animation.speed = 1
function wait(ms) {
return new Promise(resolve => setTimeout(resolve, ms))
}
function setActiveButton(frameIdentifier) {
for (const button of buttons) {
button.classList.remove("active")
if (button.getAttribute("frame") == frameIdentifier) {
button.classList.add("active")
}
}
}
function fixedTo(number, n) {
const k = Math.pow(10, n)
const result = (Math.round(number * k) / k)
return Number.isInteger(result) ? result.toFixed(2) : result
}
window.getPlayer = async function getPlayer() {
const result = await system.call("network::getPlayer")
console.log(result)
if (result.error) {
console.error("Impossible de récupéré le profil")
return null
}
return result
}
window.profile = await getPlayer()
window.refreshProfile = async function refreshProfile() {
window.profile = await getPlayer()
}
window.setting = {}
window.setting.set = async function settingSet(key, value) {
await system.call("settings::set", { key, value })
}
window.showPage = function showPage(frameIdentifier) {
showFrame(frameIdentifier)
setActiveButton(frameIdentifier)
}
window.initDynmap = async function initDynmap() {
const dynampUrl = await system.call("lentia::dynamp") || "http://azures.fr:8123/"
if (dynmapFrame.src != dynampUrl) {
dynmapFrame.src = dynampUrl
}
}
window.getRamInformation = async function getRamInformation() {
const $ram = await system.call("hardware::ram")
ram.setAttribute("max", Math.floor($ram.freeGb * 1024))
freeRam.innerText = `${$ram.totalGb} Gb`
totalRam.innerText = `${$ram.freeGb} Gb`
}
window.handleSettingsChanges = async function handleSettingsChanges(key, value) {
const span = document.querySelector(`span#${key.includes("ram") ? "currentRam" : key}`)
setting.set(key, value)
if (span) {
span.innerText = key.includes("ram") ? fixedTo(value / 1024, 2) + " G" : value
}
}
window.initSettings = async function initSettings() {
const settings = await system.call("settings::read")
ram.value = settings.ram.max
javaPath.value = settings.javaPath
currentRam.innerText = fixedTo(settings.ram.max / 1024, 2) + " G"
getRamInformation()
}
window.initSkin = async function initSkin() {
const container = document.querySelector(".skinview3d")
if (container.clientWidth === 0 || container.clientHeight === 0) {
requestAnimationFrame(initSkin)
return
}
viewerInstance = new skinview3d.SkinViewer({
canvas: document.getElementById("skin"),
width: container.clientWidth,
height: container.clientHeight,
skin: `https://yggdrasil.azures.fr/textures/${profile.skins.find(skin => skin.state == "ACTIVE").url.replace(/^\//, "")}`
})
const activeCape = window.profile.capes.find(s => s.state === "ACTIVE") || null
const capeUrl = activeCape == null ? null : `https://yggdrasil.azures.fr/textures/${activeCape.url.replace(/^\//, "")}?t=${Date.now()}`
viewerInstance.animation = new skinview3d.IdleAnimation()
viewerInstance.nameTag = profile.name
viewerInstance.zoom = 0.7
viewerInstance.loadCape(capeUrl)
const ro = new ResizeObserver(() => {
viewerInstance.width = container.clientWidth
viewerInstance.height = container.clientHeight
})
ro.observe(container)
}
window.selectSkin = async function selectSkin() {
const skin = await system.call("dialog::selectSkin")
if (!skin.success) {
return iziToast.error({ title: "Erreur", message: "Impossible d'envoyer le skin" })
}
return validateSkinSelection(skin.path)
}
window.validateSkinSelection = async function validateSkinSelection(localPath) {
const isSlim = confirm("Modèle Slim ?")
const variant = isSlim ? "slim" : "classic"
const result = await system.call("network::uploadSkin", {
path: localPath,
variant: variant
})
if (result.success && viewerInstance) {
await wait(500)
await refreshProfile()
const activeSkin = window.profile.skins.find(s => s.state === "ACTIVE")
const activeCape = window.profile.capes.find(s => s.state === "ACTIVE") || null
if (activeSkin) {
const skinUrl = `https://yggdrasil.azures.fr/textures/${activeSkin.url.replace(/^\//, "")}?t=${Date.now()}`
const capeUrl = activeCape == null ? null : `https://yggdrasil.azures.fr/textures/${activeCape.url.replace(/^\//, "")}?t=${Date.now()}`
await viewerInstance.loadSkin(skinUrl, {
model: variant.toLowerCase() === "slim" ? "slim" : "default"
})
await viewerInstance.loadCape(capeUrl)
}
}
}
window.initCapesSelector = async function initCapesSelector() {
capesSelector.innerHTML = ""
const blankCape = document.createElement("div")
blankCape.classList.add("cape")
blankCape.setAttribute("onclick", `hideCape()`)
blankCape.title = "Cacher ma cape"
capesSelector.appendChild(blankCape)
await viewerInstance.loadCape(null)
for (const cape of profile.capes) {
const $cape = document.createElement("div")
$cape.classList.add("cape")
$cape.setAttribute("title", cape.alias)
$cape.setAttribute("style", `background-image: url("https://yggdrasil.azures.fr/textures/${cape.url.replace(/^\//, "")}?t=${Date.now()}") !important;`)
$cape.setAttribute("onclick", `showCape("${cape.id}")`)
if (cape.state == "ACTIVE") {
$cape.classList.add("active")
await viewerInstance.loadCape(`https://yggdrasil.azures.fr/textures/${cape.url.replace(/^\//, "")}?t=${Date.now()}`)
}
capesSelector.appendChild($cape)
}
}
window.showCape = async function showCape(id) {
const result = await system.call("network::showCape", { capeId: id })
if (result.success) {
await refreshProfile()
await initCapesSelector()
if (typeof viewerInstance !== "undefined" && window.profile) {
const activeCape = window.profile.capes.find(c => c.state === "ACTIVE")
if (activeCape) {
const fullUrl = `https://yggdrasil.azures.fr/textures/${activeCape.url.replace(/^\//, "")}?t=${Date.now()}`
await viewerInstance.loadCape(fullUrl)
}
}
return result.data
} else {
alert("Erreur d'équipement : " + result.error)
}
}
window.hideCape = async function hideCape() {
const result = await system.call("network::hideCape")
if (result.success) {
await refreshProfile()
await initCapesSelector()
if (typeof viewerInstance !== "undefined") {
viewerInstance.loadCape(null)
}
return result.data
} else {
alert("Erreur lors du retrait : " + result.error)
}
}
window.changeUsername = async function changeUsername(newName) {
if (!newName || newName.length < 3) return alert("Pseudo trop court !");
const result = await system.call("network::changeUsername", {
username: newName
})
if (result.success) {
viewerInstance.nameTag = result.profile.name
window.profile = result.profile
} else {
alert("Erreur : " + result.error)
}
}
window.gamelog = {}
window.gamelog.put = async function put(log) {
const logElement = document.createElement("p")
logElement.innerText = log
logsContainer.appendChild(log)
}
window.gamelog.clear = async function clear() {
logsContainer.innerHTML = ""
}
await initSkin()
await initSettings()
await initCapesSelector()
showFrame("game")