Перейти к контенту

Редактирование движка X-Ray


Rolan

Рекомендуемые сообщения

Доброго времени суток. Пока в отпуске решился поковырять движок ЗП. Обидно, на ТЧ целую кучую полезных функций добавили (xray-extension), а ЗП видимо забросили совсем. Прочитал тему, пару дней изучал xray-extension с имеющимеся комментариями. И вроде понял посделовательность действий, но вот отсутствие навыков програмиирования на ассемблере берёт своё. Целю себе поставил добавить колбэки on_slot_callback, on_belt_collback, on_ruck_collback. Начал с on_slot_callback.

Сперва нашёл функцию Inventory_Slot, вроде бы она:

 

 

.text:102A7F33 loc_102A7F33:						   ; CODE XREF: Inventory_Slot+23Fj
.text:102A7F33				 mov	 ecx, ds:?Debug@@3VxrDebug@@A ; xrDebug Debug
.text:102A7F39				 push    offset byte_1064EA55
.text:102A7F3E				 push    offset aCinventorySlot ; "CInventory::Slot"
.text:102A7F43				 push    163h
.text:102A7F48				 push    offset asc_10552A40 ; "D:\\prog_repository\\sources\\trunk\\xrGame"...
.text:102A7F4D				 push    eax
.text:102A7F4E				 push    offset aGetownerObject ; "GetOwner()->object_id() == real_parent"
.text:102A7F53				 call    ds:?fail@xrDebug@@QAEXPBD00H0AA_N@Z ; xrDebug::fail(char const *,char const *,char const *,int,char const *,bool &)
.text:102A7F59				 lea	 edx, [esp+2Ch+var_8]
.text:102A7F5D				 cmp	 [esp+2Ch+var_4], edx
.text:102A7F61				 jz	  short loc_102A7F98
.text:102A7F63				 mov	 eax, [esp+2Ch+var_18]
.text:102A7F67				 test    eax, eax
.text:102A7F69				 jz	  short loc_102A7F98
.text:102A7F6B				 mov	 ecx, ds:?Memory@@3VxrMemory@@A ; xrMemory Memory
.text:102A7F71				 push    eax
.text:102A7F72				 call    ds:?mem_free@xrMemory@@QAEXPAX@Z ; xrMemory::mem_free(void *)
.text:102A7F78				 jmp	 short loc_102A7F98
.text:102A7F7A ; ---------------------------------------------------------------------------
.text:102A7F7A
.text:102A7F7A loc_102A7F7A:						   ; CODE XREF: Inventory_Slot+11Aj
.text:102A7F7A				 cmp	 ecx, ebp
.text:102A7F7C				 jz	  short loc_102A7F8A
.text:102A7F7E				 push    ecx			 ; Dst
.text:102A7F7F				 mov	 ecx, ebx
.text:102A7F81				 call    sub_1007B680
.text:102A7F86				 mov	 eax, [esp+2Ch+item__111]
.text:102A7F8A
.text:102A7F8A loc_102A7F8A:						   ; CODE XREF: Inventory_Slot+28Cj
.text:102A7F8A				 cmp	 eax, [esi+20h]
.text:102A7F8D				 jz	  short loc_102A7F98
.text:102A7F8F				 push    eax			 ; Dst
.text:102A7F90				 lea	 ecx, [esi+1Ch]
.text:102A7F93				 call    sub_1007B680
.text:102A7F98
.text:102A7F98 loc_102A7F98:						   ; CODE XREF: Inventory_Slot+133j
.text:102A7F98										 ; Inventory_Slot+140j ...
.text:102A7F98				 movzx   eax, word ptr [edi+0A0h]
.text:102A7F9F				 mov	 ebx, [esp+2Ch+arg_0]
.text:102A7FA3				 lea	 ebp, [edi+0A0h]
.text:102A7FA9				 mov	 cl, al
.text:102A7FAB				 and	 cl, 0Fh
.text:102A7FAE				 cmp	 cl, 1
.text:102A7FB1				 jnz	 short loc_102A7FE7
.text:102A7FB3				 shr	 eax, 4
.text:102A7FB6				 and	 eax, 3Fh
.text:102A7FB9				 cmp	 ax, bx
.text:102A7FBC				 jz	  short loc_102A7FE7
.text:102A7FBE				 cmp	 [esi+40h], ax
.text:102A7FC2				 jnz	 short loc_102A7FCF
.text:102A7FC4				 push    0
.text:102A7FC6				 push    0
.text:102A7FC8				 mov	 ecx, esi
.text:102A7FCA				 call    sub_102A8070
.text:102A7FCF
.text:102A7FCF loc_102A7FCF:						   ; CODE XREF: Inventory_Slot+2D2j
.text:102A7FCF				 movzx   eax, word ptr [ebp+0]
.text:102A7FD3				 shr	 eax, 4
.text:102A7FD6				 and	 eax, 3Fh
.text:102A7FD9				 lea	 edx, [eax+eax*2]
.text:102A7FDC				 mov	 eax, [esi+34h]
.text:102A7FDF				 mov	 dword ptr [eax+edx*4+4], 0
.text:102A7FE7
.text:102A7FE7 loc_102A7FE7:						   ; CODE XREF: Inventory_Slot+2C1j
.text:102A7FE7										 ; Inventory_Slot+2CCj
.text:102A7FE7				 movzx   eax, word ptr [esi+40h]
.text:102A7FEB				 cmp	 ax, bx
.text:102A7FEE				 jz	  short loc_102A7FFB
.text:102A7FF0				 test    ax, ax
.text:102A7FF3				 jnz	 short loc_102A800C
.text:102A7FF5				 cmp	 [esi+42h], ax
.text:102A7FF9				 jnz	 short loc_102A800C
.text:102A7FFB
.text:102A7FFB loc_102A7FFB:						   ; CODE XREF: Inventory_Slot+2FEj
.text:102A7FFB				 cmp	 [esp+2Ch+arg_8], 0
.text:102A8000				 jnz	 short loc_102A800C
.text:102A8002				 push    0
.text:102A8004				 push    ebx
.text:102A8005				 mov	 ecx, esi
.text:102A8007				 call    sub_102A8070
.text:102A800C
.text:102A800C loc_102A800C:						   ; CODE XREF: Inventory_Slot+303j
.text:102A800C										 ; Inventory_Slot+309j ...
.text:102A800C				 movzx   ecx, word ptr [ebp+0]
.text:102A8010				 mov	 esi, [esi+48h]
.text:102A8013				 mov	 word ptr [esp+2Ch+var_1C], cx
.text:102A8018				 mov	 edx, [esi]
.text:102A801A				 mov	 eax, [edx+0B8h]
.text:102A8020				 push    ebp
.text:102A8021				 push    edi
.text:102A8022				 mov	 ecx, esi
.text:102A8024				 call    eax
.text:102A8026				 movzx   ecx, word ptr [ebp+0]
.text:102A802A				 and	 ebx, 3Fh
.text:102A802D				 and	 cx, 0FC01h
.text:102A8032				 shl	 ebx, 4
.text:102A8035				 or	  bx, cx
.text:102A8038				 or	  bx, 1
.text:102A803C				 mov	 [ebp+0], bx
.text:102A8040				 mov	 edx, [edi]
.text:102A8042				 mov	 edx, [edx+98h]
.text:102A8048				 lea	 eax, [esp+2Ch+var_1C]
.text:102A804C				 push    eax
.text:102A804D				 mov	 ecx, edi
.text:102A804F				 call    edx
.text:102A8051				 mov	 ecx, [edi+0D4h]
[b].text:102A8057				 call    ds:?processing_activate@CObject@@QAEXXZ ; CObject::processing_activate(void)[/b]
.text:102A805D				 pop	 ebp
.text:102A805E				 pop	 edi
.text:102A805F				 pop	 esi
.text:102A8060				 mov	 al, 1
.text:102A8062				 pop	 ebx
.text:102A8063				 add	 esp, 1Ch
.text:102A8066				 retn    10h
.text:102A8066 Inventory_Slot  endp

 

 

код не полностью, а с момента xrDebug, по которой я решил, что это то что я ищу ("CInventory::Slot")

102A805D - адрес, куда мне нужно врезаться (Это я по врезке для ТЧ определил)

И тут как бы тупик. Я на 99% был уверен, что врезка для ТЧ не проканает, но выбора не было, в итоге заменил только то, что "вырезал":


on_slot_callback proc ; esi == item, ebx == this
;item = dword ptr 4
;jmp exit
; вызываем колбек
mov ecx, g_Actor
cmp [ecx+298h], ebx ; ebx == this
jnz short exit ; Actor()->m_inventory == this
mov ebx, esi
test ebx, ebx
jnz short lab2
xor edi, edi ; edi = 0
jmp short lab3
lab2:
mov edx, [ebx]
mov eax, [edx+12Ch]
mov ecx, ebx
call eax
mov edi, eax
lab3:
call CGameObject__lua_game_object
push eax

push 132 ; type = ???
mov ecx, g_Actor
call CGameObject__callback ; eax = callback
push eax ; callback
call script_use_callback
exit:
; делаем то, что вырезали
pop ebp
pop edi
pop esi
mov al, 1
pop ebx
add esp, 1Ch
retn 10h
; обратно идти не надо
on_slot_callback endp

 

 

 

В corrections_list.txt добавил

0x102A805D 5 ;on_slot_item

В mydll.asm добавил

include actor_inventory_callbacks.asm

В xrgame_stubs.asm


org 102A805Dh - shift
jmp on_slot_callback
org 10188800h - shift
script_use_callback:

И ещё, как искал адрес script_use_callback. CGameObject__callback уже был прописан в xrgame_stubs.asm, я искал код, где вызывается эта функция, и чтобы перед ней было push 1Ch или 1Вh - 28(on_item_take) или 29(on_drop_item), всего таких нашлось 5, одна из них:

 

 


.text:102B1C10 XZ_DropItem proc near ; CODE XREF: sub_1005C190+Ep
.text:102B1C10 ; sub_102615C0+Fp
.text:102B1C10 ; DATA XREF: ...
.text:102B1C10
.text:102B1C10 arg_0 = dword ptr 4
.text:102B1C10
.text:102B1C10 push ebx
.text:102B1C11 push esi
.text:102B1C12 mov esi, ecx
.text:102B1C14 test esi, esi
.text:102B1C16 push edi
.text:102B1C17 jnz short loc_102B1C1D
.text:102B1C19 xor ebx, ebx
.text:102B1C1B jmp short loc_102B1C28
.text:102B1C1D ; ---------------------------------------------------------------------------
.text:102B1C1D
.text:102B1C1D loc_102B1C1D: ; CODE XREF: XZ_DropItem+7j
.text:102B1C1D push esi
.text:102B1C1E call sub_10348510
.text:102B1C23 add esp, 4
.text:102B1C26 mov ebx, eax
.text:102B1C28
.text:102B1C28 loc_102B1C28: ; CODE XREF: XZ_DropItem+Bj
.text:102B1C28 mov edi, [esp+0Ch+arg_0]
.text:102B1C2C mov ecx, [edi+0D4h]
.text:102B1C32 call CGameObject__lua_game_object
.text:102B1C37 push eax
.text:102B1C38 [b]push 1Dh[/b]
.text:102B1C3A mov ecx, ebx
.text:102B1C3C call CGameObject__callback
.text:102B1C41 mov ecx, eax
.text:102B1C43 [b]call script_use_callback[/b]
.text:102B1C48 mov eax, [esi]
.text:102B1C4A mov edx, [eax+20h]
.text:102B1C4D push edi
.text:102B1C4E mov ecx, esi
.text:102B1C50 call edx
.text:102B1C52 pop edi
.text:102B1C53 pop esi
.text:102B1C54 pop ebx
.text:102B1C55 retn 8
.text:102B1C55 XZ_DropItem endp

 

 

Собрать dll-ку получилось, но результата нет. Игра не вылетает, но и колбэк не срабатывает. Так вот прошу знаюших людей поделиться мыслями по этой проблеме, буду очень благодарен.

Поделиться этим сообщением


Ссылка на сообщение

Спрошу что по-проще. Можно врезать код, который бы просто выводил в консоль что-нибудь? Т.е. чтобы я определил, правильно я нашёл место врезки или нет.

Поделиться этим сообщением


Ссылка на сообщение

Что мешает использовать xray extensions? Он как раз для 1.0006 и, если я не ошибаюсь, там всё это есть.

Поделиться этим сообщением


Ссылка на сообщение

По аналогии с врезкой колбэка на нажатие клавиши в xray-extension сделал колбэк на отпускание клавиши (ЗП 1.6.02). Врезку сделал по адресу 102378DE. И всё бы ничего, но для кнопок мыши код кнопки определяются не правильно, а точнее совсем не определяется, при нажатии на любую кнопку мыши получаю одно и то же длинное число. Для клавиш клавиатуры всё ок. Кто подскажет, в какую сторону копать?

Поделиться этим сообщением


Ссылка на сообщение

Уважаемые гуру C++, кто-нибудь уже пытался восстановить воздействие аномалий на нпс в ЗП по исходникам? Уже третий день пытаюсь найти концы, но всё безрезультатно.
И ещё вопрос, пытался сделать сборку 1.6.02 в VS2013 по https://github.com/OpenXRay/xray-16/blob/master/doc/howto/build.txt. Собралось не всё, нужный для меня xrGame.dll почему-то не появился. В логе 2 ошибки:

Ошибка 104 error LNK1104: не удается открыть файл "cximage.lib" E:\xray-16\src\xrGame\LINK xrGame
Ошибка 98 error LNK1104: не удается открыть файл "dxt.lib" E:\xray-16\src\utils\xrLC_Light\LINK xrLC_Light
Что ещё нужно установить? Собирал в режиме Debug

Поделиться этим сообщением


Ссылка на сообщение

Наконец-то сборка прошла. Но, блин, в начале новой игры, странная ошибка:

 

stack trace:



0023:05D106CB xrRender_R2.dll, CDetailManager::cache_Update(), e:\xray-16-clear\src\layers\xrrender\detailmanager_cache.cpp, 164
0023:05D0E40D xrRender_R2.dll, CDetailManager::MT_CALC(), e:\xray-16-clear\src\layers\xrrender\detailmanager.cpp, 425
0023:004369A9 xrEngine.exe, motions_value::load()
0023:70F6C9FD MSVCR120.dll
0023:75F4339A kernel32.dll
0023:772C9EF2 ntdll.dll
0023:772C9EC5 ntdll.dll

 

 

 

Исходники брал от сюда: https://github.com/avoitishin/xray-16/tree/master
Или подскажите, где взять чистые исходники под VS13

Поделиться этим сообщением


Ссылка на сообщение

Твоя рыба больше на удочки похожа )))

 

P.S. Прошу простить за оффтоп

Поделиться этим сообщением


Ссылка на сообщение

@HESH, конечно можно, но это не 2 строчки кода. Я тоже никогда не писал на C++, раньше на php, теперь на ruby. Но вот тоже залез в исходники. Получилось добавить слот под (нож/пистолет), (бинокль/нож/пистолет), слот под рюкзак, отдельные слоты под патроны, иконку в полный рост, как в ТЧ. Как бы там не хаили разработчиков, код вполне читабельный и разобраться можно.

https://yadi.sk/i/cWE8vVEViiWdN

  • Нравится 2

Поделиться этим сообщением


Ссылка на сообщение

отображение в инвентаре смотри в файлах xrGame/ui/UIActorMenu*

хранение предметов смотри в xrGame/Inventory.cpp

  • Спасибо 2

Поделиться этим сообщением


Ссылка на сообщение

Если верить: http://www.stalker-modi.ru/load/patchi/zov_pripjati/patch_1_6_03_dlja_zov_pripjati/12-1-0-3454, то:

Правки в исходниках: только были убраны красные надписи и вывод на экран по середине - fps, правок больше не было сделано в исходниках ЗП

Так что можете "валить" :)

Поделиться этим сообщением


Ссылка на сообщение

Да, да, точно так же и в ЗП. Там разрабы изначально вынесли вызов и в скрипты. Но в ЗП после смены визуала они ещё и бессмертными становились. Возможно стоит поискать решение в классе кровососа, ведь у него же происходит замена модели при переходе в стелс и обратно?

Поделиться этим сообщением


Ссылка на сообщение

... Надо аналогичные виртуальные функции добавить для всех остальных объектов.

Не совсем понял. Для каких ещё объектов нужно добавлять соответствующие функции?

Код, что ты привёл, рабочий? Я не вижу в нём перезагрузки анимации и дамага.

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...