Работа с компонентами моделей - Страница 11 - Форум
Понедельник, 05.12.2016, 15:31
Качественные скрипты, моды и дополнения для GTA без регистрации
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 11 из 11«1291011
Форум » Игры серии ГТА » Работа с памятью, exe » Работа с компонентами моделей
Работа с компонентами моделей
ILYALIONДата: Четверг, 07.06.2012, 20:26 | Сообщение # 151
Группа: Проверенные
Сообщений: 325
Статус: Offline
DK22Pac, Вы на прошлой странице писали, что смогли открыть окна. А можно ли заменить текстуру окна на другую?
 
DK22PacДата: Пятница, 06.07.2012, 01:08 | Сообщение # 152
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
В принципе можно. Но текстура привязана к материалу. Для одной модели существует только один набор материалов. Поэтому придёться писать инжект перед рендером, подмену текстуры, а потом, после рендера - её "восстановление".

Я помню, я раньше говорил о том, что атомики (RpAtomic) общие для авто с одной моделью. Но это не так. Даже не помню как тогда получилось так, что у всех авто пропала дверь) Видать, начудил с кодом... Каждое авто имеет набор "своих" RwFrame, RpAtomic.
Исходя из этого, мы можем контроллировать не только frame'ы автомобиля (как я их любил называть - дамми), но и то, что находиться "под контролем" этих дамми.
Флаги RpAtomic:
0x0 Collision
0x4 IsVisible

Для того, чтобы добавить в игру некоторый стафф, связанный с атомиками (повреждения _ok/_dam, окна) R* добавили плагин к структуре (Класс, который контроллирует этот плагин - CVisibilityPlugins).
RpAtomic + *(DWORD*)0x8D6088 - Начало плагина в структуре (адрес хранит статическое смещение, обычно это +0x7C). Насколько я понял, по этому смеению размещён RwObject, со своим набором флагов (смещение к флагам - RwObject +0x2 ).
Флаги RpAtomicVisibilityPlugin
0x1000 HideGeometryWithTransparentMaterials // используется, чтобы "спрятать" окна
0x4000 IgnoreLighting // игнорируется освещение
Большинство других флагов связаны с настройками рендера (например: рендерится/не рендерится геометрия из этого клампа за атомиком)

Добавлено (06.07.2012, 01:08)
---------------------------------------------
Все возможные компоненты транспорта в иерархии


Сообщение отредактировал DK22Pac - Пятница, 06.07.2012, 02:47
 
Den_spbДата: Суббота, 07.07.2012, 18:49 | Сообщение # 153
Создатель сайта
Группа: Администраторы
Сообщений: 1536
Статус: Offline
Quote (DK22Pac)
Все возможные компоненты транспорта в иерархии

Хороший справочник, молодец.
А ты не выяснял, как получить доступ к компонентам объекта (CObject)? Может в структуре объекта есть смещение, содержащее указатель на корневой компонент объекта?
 
DK22PacДата: Среда, 15.08.2012, 10:38 | Сообщение # 154
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
Через RpClump (CEntity+0x18), как и для транспорта.

Чтобы получить "корневой" RwFrame,:
vehicle->physical.entity.m_pRWObject->object.parent
Дальше можно использовать RwFrameForAllChildren.
Мне кажется, что такие компоненты, как headlights, taillights, exhaust, и т.д. нельзя найти в иерархии, потому что игра их удаляет (После того, как запишет их локальные координаты в CVehicleModelInfo). Действительно, как компоненты они автомобилю не нужны.

0x4C8F6E Занопить 5 байт, чтобы игра не удаляла эти компоненты.

Обновил информацию обо всех дотупных компонентов для автомобиля.
Смотреть

По флагам:

0000 0000 0000 0000 0000 0000 0000 1000 (3ий бит) - компонент - дамми. Инфа о позиции записывается в VehicleModelInfo.VehicleStruct.DummyPos[], а фрейм удаляется. Как я и предполагал)
0000 0000 0000 0000 0000 0010 0000 0000 (9ый бит) - компонент - экстра. Атомик удаляется из клампа и записывается в VehicleModelInfo.VehicleStruct.Extras[] .
0000 0000 0000 0010 0000 0000 0000 0000 (17ый бит) - апгрейд-компонент. Инфа записывается в VehicleModelInfo.VehicleStruct.UpgradeComponent[].

Добавлено (15.08.2012, 10:38)
---------------------------------------------
0x4C8E53 Занопить 5 байт, чтобы игра не удаляла _ok, _dam, а с ними и другие компоненты. Вот только атомики там перезначаются родительскому фрейму...


Сообщение отредактировал DK22Pac - Среда, 15.08.2012, 10:42
 
Den_spbДата: Четверг, 16.08.2012, 19:42 | Сообщение # 155
Создатель сайта
Группа: Администраторы
Сообщений: 1536
Статус: Offline
Quote (DK22Pac)
0000 0000 0000 0000 0000 0000 0000 1000 (3ий бит) - компонент - дамми.

Я бы уточнил - "стандартный дамми, удаляемый игрой", потому что если в модель с помощью 3ds max добавить какой-нибудь новый дамми, то игрой он удалён не будет.
 
DK22PacДата: Пятница, 17.08.2012, 23:52 | Сообщение # 156
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
Процесс повреждения открываемых компонентов автомобиля.

Если убрать проверку rand & 7, у авто намного чаще будут отваливаться двери.
Code
0A8C: 0x6C2383 2 0x9090 1
 
DK22PacДата: Пятница, 31.08.2012, 00:43 | Сообщение # 157
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
Ещё немного по флагам.
Прикрепления: VehicleFramesFl.txt(2Kb)
 
Den_spbДата: Пятница, 31.08.2012, 13:50 | Сообщение # 158
Создатель сайта
Группа: Администраторы
Сообщений: 1536
Статус: Offline
Спасибо за информацию.
Можешь напомнить, какая стандартная функция gta_sa.exe получает адрес компонента по его имени?
 
DK22PacДата: Суббота, 06.10.2012, 21:26 | Сообщение # 159
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
0x4C5400. Если надо найти много компонентов, рациональнее будет написать свою функцию поиска с применением RwFrameForAllChildren. Так сделано в ImVehLM.

http://gtamodding.ru/wiki/Структура_модели_транспорта_(SA)

Добавлено (03.10.2012, 14:43)
---------------------------------------------
Нашёл интересную функцию.
0x6DBA30 RwFrame *__stdcall RwFrameRotate(RwFrame *frame, int axis, float angle, char type)
frame - компонент
axis - ось (0 - X, 1 - Y, 2 - Z)
angle - угол (в радианах)
type - 0 - без учёта смещения компонента, 1 - с учётом.

Добавлено (06.10.2012, 21:24)
---------------------------------------------
0x6D3830 RwFrame *__thiscall CVehicle::ReplaceComponent(CVehicle *this, int modelId, int nodeId)
Можно заменять компоненты на любые обьекты)


Добавлено (06.10.2012, 21:26)
---------------------------------------------
Quote (DK22Pac)
Для того, чтобы добавить в игру некоторый стафф, связанный с атомиками (повреждения _ok/_dam, окна) R* добавили плагин к структуре (Класс, который контроллирует этот плагин - CVisibilityPlugins).

Создал статью на английской вики.
http://www.gtamodding.com/index.php?title=Atomic_Visibility_Distance_(RW_Section)


Сообщение отредактировал DK22Pac - Вторник, 09.10.2012, 20:39
 
Den_spbДата: Суббота, 06.10.2012, 23:47 | Сообщение # 160
Создатель сайта
Группа: Администраторы
Сообщений: 1536
Статус: Offline
Quote (DK22Pac)
0x6D3830 RwFrame *__thiscall CVehicle::ReplaceComponent(CVehicle *this, int modelId, int nodeId) Можно заменять компоненты на любые обьекты)

Интересная возможность. Можешь привести пример кода?
 
DK22PacДата: Вторник, 09.10.2012, 20:35 | Сообщение # 161
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
Code
{$CLEO}
{$I stdc}
{$I inloop}
     {$I forplayercar}
         0A97: s = car veh struct
         model.Load(1318)         
         038B:
         0AA6: call_method 0x6D3830 struct s num_params 2 pop 0 2 1318
         0AA6: call_method 0x6D3830 struct s num_params 2 pop 0 4 1318
         0AA6: call_method 0x6D3830 struct s num_params 2 pop 0 5 1318
         0AA6: call_method 0x6D3830 struct s num_params 2 pop 0 7 1318
         0A93:
     {$I for_end}
{$I end}
 
kenkingДата: Четверг, 08.11.2012, 18:04 | Сообщение # 162
Группа: Проверенные
Сообщений: 22
Статус: Offline
Quote (Den_spb)
какая стандартная функция gta_sa.exe получает адрес компонента по его имени?

Quote (DK22Pac)
0x4C5400

Если не затруднит, то пример кода в CLEO можно привести?
 
Den_spbДата: Понедельник, 12.11.2012, 23:09 | Сообщение # 163
Создатель сайта
Группа: Администраторы
Сообщений: 1536
Статус: Offline
Code
{$CLEO}
wait 0
while true
     wait 0
     if
         player.Defined($player_char)
     then
         if
             actor.Driving($player_actor)
         then
             03C0: 0@ = actor $PLAYER_ACTOR car  
             0A97: 0@ = car 0@ struct
             0@ += 0x18
             0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0
             0AC6: 1@ = label @Name offset

             0AA7: call_function 0x4C5400 num_params 2 pop 2 1@ 0@ 2@  // поиск компонента

             if
                 2@ > 0 // если компонент существует, то производим действия над ним
             then
                 2@ += 0x50
                  
                 0A8E: 3@ = 2@ + 0x30 // int
                 0A8E: 4@ = 2@ + 0x34 // int
                 0A8E: 5@ = 2@ + 0x38 // int
                  
                 0A8D: 3@ = read_memory 3@ size 4 virtual_protect 0
                 0A8D: 4@ = read_memory 4@ size 4 virtual_protect 0
                 0A8D: 5@ = read_memory 5@ size 4 virtual_protect 0

                 04D5: create_corona_at 3@ 4@ 5@ radius 1.0 type 2 flare 2 RGB 0 255 0  
             end
         end
     end
end

:Name
hex
     "boot_dummy" 00
end
 
kenkingДата: Вторник, 13.11.2012, 18:48 | Сообщение # 164
Группа: Проверенные
Сообщений: 22
Статус: Offline
Спасибо большое.
 
Форум » Игры серии ГТА » Работа с памятью, exe » Работа с компонентами моделей
Страница 11 из 11«1291011
Поиск: