/* global loadCSSModule, SBdispatcher, getModuleUrl */ ;(function () { const DEFAULT_DELAY_SECONDS = 12; const MAX_ITEMS = 8; const MODULE_ID = 'killfeed-container'; const moduleUrl = window.getModuleUrl ? window.getModuleUrl() : ''; loadCSSModule('overlay-killfeed-css', moduleUrl + '/css/killfeed.css'); // ==== Init DOM ==== function initModule() { if (document.getElementById(MODULE_ID)) return; const root = document.createElement('div'); root.id = MODULE_ID; const list = document.createElement('ul'); list.id = 'killfeed-list'; root.appendChild(list); document.body.appendChild(root); } // Construit un LI de killfeed function buildKillItem(p1Name, p1Img, p2Name, p2Img, eventName) { const li = document.createElement('li'); li.className = 'killfeed-item'; // Zone gauche (joueur 1) const left = document.createElement('div'); left.className = 'kf-left'; const leftName = document.createElement('span'); leftName.className = 'kf-name kf-name-left'; leftName.textContent = p1Name || ''; const leftImg = document.createElement('img'); leftImg.className = 'kf-avatar kf-avatar-left'; if (p1Img) leftImg.src = p1Img; leftImg.alt = p1Name ? `Avatar ${p1Name}` : 'Avatar joueur 1'; left.append(leftName, leftImg); // Zone centrale (event) const center = document.createElement('div'); center.className = 'kf-center'; const evtImg = document.createElement('img'); evtImg.className = 'kf-event'; if (eventName) evtImg.src = `${moduleUrl}/assets/${eventName}.png`; evtImg.alt = eventName || 'Event'; center.appendChild(evtImg); // Zone droite (joueur 2) const right = document.createElement('div'); right.className = 'kf-right'; const rightImg = document.createElement('img'); rightImg.className = 'kf-avatar kf-avatar-right'; if (p2Img) rightImg.src = p2Img; rightImg.alt = p2Name ? `Avatar ${p2Name}` : 'Avatar joueur 2'; const rightName = document.createElement('span'); rightName.className = 'kf-name kf-name-right'; rightName.textContent = p2Name || ''; right.append(rightImg, rightName); li.append(left, center, right); return li; } // Ajoute un event (kill) function addKill(p1Name, p1Img, p2Name, p2Img, eventName, delaySeconds) { const list = document.getElementById('killfeed-list'); if (!list) return; const li = buildKillItem(p1Name, p1Img, p2Name, p2Img, eventName); li.classList.add('appearing'); // ✅ AJOUT EN DESSOUS (fin de liste) list.appendChild(li); // Auto-disparition const ms = (isFinite(delaySeconds) && delaySeconds > 0) ? delaySeconds * 1000 : DEFAULT_DELAY_SECONDS * 1000; const fadeRemove = () => { li.style.opacity = '0'; setTimeout(() => { if (li.parentElement === list) list.removeChild(li); }, 500); }; setTimeout(fadeRemove, ms); // Limite par nombre (supprime en haut) while (list.children.length > MAX_ITEMS) { list.removeChild(list.firstElementChild); } // Limite par hauteur (supprime en haut tant que ça dépasse) const container = document.getElementById('killfeed-container'); if (container) { while (list.scrollHeight > container.clientHeight && list.firstElementChild) { list.removeChild(list.firstElementChild); } } setTimeout(() => li.classList.remove('appearing'), 400); } // Expose globalement window.Killfeed = { addKill }; // === SBdispatcher Listener === // wsParam1 = pseudo joueur 1 // wsParam2 = image joueur 1 // wsParam3 = pseudo joueur 2 // wsParam4 = image joueur 2 // wsParam5 = eventName // wsParam6 = délai (secondes) if (window.SBdispatcher) { SBdispatcher.on('killfeed-add', data => { addKill( data.param1, // Joueur 1 data.param2, // Avatar joueur 1 data.param3, // Joueur 2 data.param4, // Avatar joueur 2 data.param5, // Nom de l'event (image) parseFloat(data.param6) // Délai (optionnel) ); }); } initModule(); })();