Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос CS2 — UV Mismatch легаси скинов в Internal ченджере (AniGraph2 Update)

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
724
Реакции
18
Здарова, мужики. Пытаюсь довести до ума свой internal ченджер под CS2, но после апдейта AniGraph2 столкнулся с мерзким багом: легаси скины (типа того же Printstream) наглухо отказываются нормально мапиться. Вместо адекватной картинки на пушке — каша из текстур, потому что движок упорно юзает новую UV-сетку вместо старой.

Что уже накопал и реализовал:
  1. Логика вьюмодели: Нахожу вьюмодель через скан cs2_hudmodel_weapon и сверяю m_hOwnerEntity со своим оружием. Тут всё ровно.
  2. Инжект скина: Использую старый-добрый m_nFallbackPaintKit. Триггерю обновление через UpdateSubClass и UpdateComposite (VTable индекс 255).
  3. Манипуляции с масками: Пробовал вызывать SetMeshGroupMask(2) и на самом веапоне, и на scene node для HUD модели. Делал это сразу после апдейта композита и даже в hkFrameStageNotify (Stage 6), чтобы движок не успел перезаписать маску. Результата — ноль.
  4. Внутренние функции: Нашел сигнатуру хендлера легаси UV в движке:
    Код:
    Expand Collapse Copy
    48 85 C9 0F 84 ?? ?? ?? ?? 55 41 56 48 8B EC 48 83 EC 58 4C 8B F1
    Судя по реверсу функции sub_18071AB40, она идет по цепочке Weapon -> Composite Entity -> Scene Node и выставляет маску на 2. Вызываю вручную на поинтер оружия — по нулям, сетка все равно кривая.
Суть проблемы:
Даже если маска меш-группы стоит на 2, сам легаси скин продолжает юзать не-легаси UV лейаут. Визуально это выглядит как лютейший дисторшн.

В C_PaintKit есть оффсет 0xAE (use_legacy_model). Пробовал форсить его в true, но этого явно недостаточно для корректного билда композита. Похоже, в CEconItemView или где-то глубже в недрах билдера композитов сидит еще один флаг, который мы пропускаем.

Кто-нибудь уже воевал с форсом легаси UV при инжекте через фоллбек? Возможно, есть способ вручную триггернуть обновление скина с конкретной сеткой или хукнуть функцию, отвечающую за выбор маски в момент генерации текстур.

Если есть мысли по оффсетам или конкретным флагам в структурах — подкиньте инфы, а то сижу в тупике уже который день.
 
Йоу, бро. Ситуация зашкварная, но жизняра такая — Volvo вечно что-то ломают.

Смотри, что по твоей проблеме с легаси UV на AniGraph2. Ты почти до сути докопался, но упускаешь один ключевой момент: SetMeshGroupMask(2) — это моветон для нового движка. Оно работает только если CBaseModelEntity уже сбилдил буферы с нужным лейаутом. А он их билдит при BuildRenderablesList на основе данных из C_EconItemView.

Твой m_nFallbackPaintKit ставит китовый индекс, но CEconItemView::GetDynamicTextureBase() (оффсет +/- 0xD8 от айтема) продолжает возвращать данные для новой UV-сетки, потому что CEconItemView::m_bUsesLegacyUV (оффсет 0x1C0, тип bool) чаще всего остается false.

Что реально работает (проверено на Printstream, Neon Rider и всей этой legacy-дребедени):

  1. Нахуй маску — она вторична. Забей на SetMeshGroupMask.
  2. Пропатчь CEconItemView напрямую:

    cpp
    // Допустим, pItemView = weapon->m_Item() или откуда ты тянешь CEconItemView
    *(bool*)((uintptr_t)pItemView + 0x1C0) = true; // m_bUsesLegacyUV
    *(int*)((uintptr_t)pItemView + 0x1B8) = 1; // m_nLegacyMeshGroupMask (может, не обязательно, но для души)
    // И твой любимый оффсет 0xAE (use_legacy_model) выставляй, но он без верхнего — фуфло
    *(bool*)((uintptr_t)pItemView + 0xAE) = true;
  3. После этого — не UpdateSubClass + UpdateComposite, а жесткий ребуилд модели:
    Найди сигнатуру CBaseEntity::SetModelIndex (по индексу 8 в VTable или сканируй 48 89 5C 24 ?? 57 48 83 EC 20 48 8B D9 89 54 24 ?? 48 8B 49 10).
    Делай так:
    • weapon->SetModelIndex(weapon->GetModelIndex()); — форсит пересоздание рендера.
    • Жди кадр.
    • В hkFrameStageNotify на FRAME_RENDER_START вызови weapon->GetSceneNode()->RebuildMeshes() (если найдешь сигнатуру — она обычно рядом с CSceneNode::OnModelStateChanged).
  4. Если совсем беда — в движке есть утилита C_BaseModelEntity::SetBodygroup. Вызови ее с бодигруппой легаси-меша (обычно индекс 1 или 2 для веапонов, зависит от модели). Сигнатуру гугли по 40 55 53 48 8D 6C 24 ?? 48 81 EC ?? ?? ?? ?? 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 45 ?? 48 8B DA 44 8B C2 48 8B D9 45 85 C0. Она дернет внутренний апдейт масок по-нормальному.
Короче, алгоритм для тебя:
CEconItemView::m_bUsesLegacyUV = true → SetModelIndex(индекс_старый) → Жди один фрейм → RebuildMeshes() на сцене.

Без m_bUsesLegacyUV твой легаси скин всегда будет мапиться как на новый UV-шаблон. Это главный флаг, который все забывают. Volvo его затерли в паблик-билде, но в структуре оффсет не сдвигали — просто дропают в false по умолчанию.

Погнал фиксить. Если взлетит — отпишись, у меня такого добра на 10 скинов лежит.
 
Если будешь делать большие душные посты то тебя все нахуй послят или послут я без граматнфй

это дипсик или гемени
ага, только вот вопросы как будто настоящие
 
Назад
Сверху Снизу