diff --git a/src/KubikonPlayer/GameMenu.jsx b/src/KubikonPlayer/GameMenu.jsx index 884d443..c020e61 100644 --- a/src/KubikonPlayer/GameMenu.jsx +++ b/src/KubikonPlayer/GameMenu.jsx @@ -1,6 +1,7 @@ import React, { useEffect, useState, useRef, useCallback } from 'react'; import Icon from '../editor-shared/Icon'; import { STORYS_addres, USER_addres } from '../api/API'; +import { MIXAMO_SKINS } from '../engine/PlayerController'; const getToken = () => { try { @@ -608,19 +609,18 @@ function PlayerCard({ player, isMe, isFriend, isPending, onAddFriend }) { let avatarUrl = null; let isSkin = false; if (player.skin && typeof player.skin === 'string') { - const isLegacy = LEGACY_SKINS.has(player.skin); - if (!isLegacy && player.skin.startsWith('skin_')) { - // Mixamo: PNG на rublox-site (на проде rublox.pro, - // локально localhost:3000) рядом с GLB. - const base = (typeof window !== 'undefined' - && window.location.hostname === 'localhost') - ? 'http://localhost:3000' - : 'https://rublox.pro'; - avatarUrl = `${base}/character-assets/skins/${player.skin}.png?v=20260614`; - } else { - // Legacy R15: путь по старому шаблону. - avatarUrl = `/kubikon-assets/characters/${player.skin}/avatar.png?v=2026_05_27`; + // ВАЛИДАЦИЯ: legacy R15-скины (bacon-hair и пр.) больше не существуют. + // Если скин НЕ в наборе валидных Mixamo (80 шт) — показываем аватар + // дефолтного skin_y-bot (как и в самой игре 3D-модель валидируется). + let skinId = player.skin; + if (!MIXAMO_SKINS.has(skinId) && !skinId.startsWith('customskin:')) { + skinId = 'skin_y-bot'; } + const base = (typeof window !== 'undefined' + && window.location.hostname === 'localhost') + ? 'http://localhost:3000' + : 'https://rublox.pro'; + avatarUrl = `${base}/character-assets/skins/${skinId}.png?v=20260614`; isSkin = true; } else if (player.photo_thumb_b64) { avatarUrl = player.photo_thumb_b64.startsWith('data:')