From 3754ecf4a151e6f0716647db0d07d604d7478842 Mon Sep 17 00:00:00 2001 From: min Date: Mon, 15 Jun 2026 00:53:53 +0300 Subject: [PATCH] =?UTF-8?q?fix(skin):=20=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D1=81=D0=BA=D0=B8=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B2=20=D0=BA=D0=B0=D1=80=D1=82=D0=BE=D1=87=D0=BA=D0=B0=D1=85?= =?UTF-8?q?=20=D0=B8=D0=B3=D1=80=D0=BE=D0=BA=D0=BE=D0=B2=20(legacy=20bacon?= =?UTF-8?q?=20=E2=86=92=20y-bot)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit В меню «На сервере» аватарка бралась по player.skin. Если в БД legacy skin_bacon-hair (которого нет) — показывался бекон. Теперь невалидный скин (не в MIXAMO_SKINS) → аватар skin_y-bot, как и 3D-модель в игре. Co-Authored-By: Claude Opus 4.7 --- src/KubikonPlayer/GameMenu.jsx | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) 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:')