GTA Vice City > Идеи

Смена текстур транспорта

(1/5) > >>

xanser:
Предлагаю запилить мод для смены скинов машин или поделиться соображениями, возможно это или нет. Вот, что мне удалось. Во вложении вторая текстура для танка rhino2.txd для gta3.img и тестовая asi-шка, которая меняет скин танка до его первого появления нажатием на Tab, для проверки после этого можно ввести например чит-код panzer. Проблема в том, что текстуру танка пока удалось сменить только до появления первой модели, потом все модели создаются такие же. Если первым создать стандартный танк, то мой код уже не оказывает эффекта. Нужна помощь в поиске причины. Хотелось бы сделать смену на лету.



Почему это кажется возможным. Я позаимствовал функции из этого блока: 0x40AA60 CStreaming::RequestSpecialModel, здесь меняются модели и текстуры для специальных актеров для миссий:
109, special01, generic, CIVMALE, STAT_STD_MISSION, man, 0, null, 9,9
110, special02, generic, CIVMALE, STAT_STD_MISSION, man, 0, null, 9,9
......................................
129, special21, generic, CIVMALE, STAT_STD_MISSION, man, 0, null, 9,9

Получается, что можно на один id вешать любые модели и текстуры, в перспективе кажется возможным таким способом расширить количество транспортных средств, используя одни и те же номера.
Что касается скинов, то мне видится возможным внедрение кода с чередующимися текстурами до отрисовки отдельной машины в функцию 0x589AE0 CAutomobile::PreRender

Вот примеры практического применения с использованием этого кода, но пока неодновременные полуфейки:

kenking:
Мне тоже интересно можно ли нормально реализовать возможность установки скинов на транспорт в VC и GTA3.
Протестировал плагин, перенёс код для своих экспериментов на основу plugin-sdk. Что интересно - значение m_nTxdIndex перезаписывается при нажатии клавиш, а скин устанавливается только один. Первоначальный опять не поставить.

--- Код: C++ ---#include "plugin_vc.h"#include "extensions\KeyCheck.h"#include "game_vc\CModelInfo.h"#include "game_vc\CFont.h" using namespace plugin; class MyPlugin {public:    MyPlugin() {         Events::drawingEvent += [] {            CFont::SetScale(0.5f, 1.0f);            CFont::SetColor(CRGBA(255, 255, 255, 255));            CFont::SetJustifyOn();            CFont::SetFontStyle(2);            CFont::SetPropOn();            CFont::SetWrapx(600.0f);            wchar_t text[32];            swprintf(text, L"TxdIndex %d", CModelInfo::ms_modelInfoPtrs[162]->m_nTxdIndex);            CFont::PrintString(10.0f, 30.0f, text);        };                Events::gameProcessEvent += [] {            KeyCheck::Update();            if (KeyCheck::CheckWithDelay(VK_TAB, 1000)) {                CModelInfo::ms_modelInfoPtrs[162]->ClearTexDictionary();                CModelInfo::ms_modelInfoPtrs[162]->SetTexDictionary("rhino2");            }            if (KeyCheck::CheckWithDelay(110, 1000)) {                CModelInfo::ms_modelInfoPtrs[162]->ClearTexDictionary();                CModelInfo::ms_modelInfoPtrs[162]->SetTexDictionary("rhino");            }        };    }} myPlugin;

DK:
Вариант с эвентом CVehicle::Render не прокатит - прозрачные части транспорта рендерятся дополнительно, позже (думаю, понятно, почему). Такой себе отложенный рендер.
Но можно внедриться чуть "глобальнее", и отловить момент когда все части транспорта уже отрендерены.
Либо внедриться в рендер атомика (но тогда надо будет как-то сохранять указатель на авто в атомике, а для этого надо будет создавать своё расширение для атомика).
Другая проблема - для того, чтобы текстура нормально выглядела на транспорте, надо заранее подготовить хорошую развертку (UV координаты). Вроде оригинальные авто используют текстуру white, и я не уверен, что там вменяемая развертка.

Кстати, динамические текстуры есть в San Andreas - вспомните покраски или то же переключение текстуры vehiclelights_on/off (этот метод был успешно использован и в ImVehFt).

xanser:
Может тогда поэкспериментировать пока на спец. актерах с id 109-129, посоздавать одновременно на один номер разные модели или текстуры. Как поведет себя игра, создаст разных или одинаковых, и что нужно, чтобы происходила смена. Между миссиями это же как-то происходит. Возможно придется удалить созданные модели, чтобы появилась новая, тогда это поставит крест на всей задумке. А может достаточно поменять какой-то флаг или что-то переинициализировать.

DK:
Зачем делать наугад? Надеяться, что сработает?

Вот небольшой пример - показывает, как динамически менять текстуры трансорта.


--- Код: C++ ---#include "plugin.h"#include "common.h"#include <map> using namespace plugin; class VehicleTextures {public:    VehicleTextures() {        static CdeclEvent<AddressList<0x4C9ED1, H_CALL, 0x4C9F23, H_CALL, 0x4CA10D, H_CALL, 0x5813D1, H_CALL>,            PRIORITY_BEFORE, ArgPickN<CEntity*, 0>, void(CEntity*)> myOnRenderOneNonRoad;         static std::map<RpMaterial*, RwTexture *> originalTextures;         myOnRenderOneNonRoad.before += [](CEntity *entity) {            if (KeyPressed('Z') && entity == FindPlayerVehicle()) {                CVehicle *vehicle = reinterpret_cast<CVehicle *>(entity);                RpClumpForAllAtomics(vehicle->m_pRwClump, [](RpAtomic *atomic, void *data) {                    RpGeometryForAllMaterials(atomic->geometry, [](RpMaterial *material, void *data) {                        if (originalTextures.find(material) == originalTextures.end())                            originalTextures[material] = material->texture;                        material->texture = *reinterpret_cast<RwTexture **>(0x77FA58);                        return material;                    }, nullptr);                    return atomic;                }, nullptr);            }        };         myOnRenderOneNonRoad.after += [](CEntity *) {            if (originalTextures.size() > 0) {                for (auto &i : originalTextures)                    i.first->texture = i.second;                originalTextures.clear();            }        };    }} vehicleTextures;
По нажатию на Z транспорт игрока будет использовать текстуру waterclear256 (0x77FA58).

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии