Shredder 49 Опубликовано 18 Декабря 2012 Доброго времени суток. Пока в отпуске решился поковырять движок ЗП. Обидно, на ТЧ целую кучую полезных функций добавили (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 lab3lab2: mov edx, [ebx] mov eax, [edx+12Ch] mov ecx, ebx call eax mov edi, eaxlab3: 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_callbackexit: ; делаем то, что вырезали 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_callbackorg 10188800h - shiftscript_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-ку получилось, но результата нет. Игра не вылетает, но и колбэк не срабатывает. Так вот прошу знаюших людей поделиться мыслями по этой проблеме, буду очень благодарен. Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 19 Декабря 2012 Спрошу что по-проще. Можно врезать код, который бы просто выводил в консоль что-нибудь? Т.е. чтобы я определил, правильно я нашёл место врезки или нет. Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 23 Декабря 2012 Что мешает использовать xray extensions? Он как раз для 1.0006 и, если я не ошибаюсь, там всё это есть. Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 5 Января 2013 По аналогии с врезкой колбэка на нажатие клавиши в xray-extension сделал колбэк на отпускание клавиши (ЗП 1.6.02). Врезку сделал по адресу 102378DE. И всё бы ничего, но для кнопок мыши код кнопки определяются не правильно, а точнее совсем не определяется, при нажатии на любую кнопку мыши получаю одно и то же длинное число. Для клавиш клавиатуры всё ок. Кто подскажет, в какую сторону копать? Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 30 Июня 2015 Уважаемые гуру 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 Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 2 Июля 2015 Наконец-то сборка прошла. Но, блин, в начале новой игры, странная ошибка: stack trace: 0023:05D106CB xrRender_R2.dll, CDetailManager::cache_Update(), e:\xray-16-clear\src\layers\xrrender\detailmanager_cache.cpp, 1640023:05D0E40D xrRender_R2.dll, CDetailManager::MT_CALC(), e:\xray-16-clear\src\layers\xrrender\detailmanager.cpp, 4250023:004369A9 xrEngine.exe, motions_value::load()0023:70F6C9FD MSVCR120.dll0023:75F4339A kernel32.dll0023:772C9EF2 ntdll.dll0023:772C9EC5 ntdll.dll Исходники брал от сюда: https://github.com/avoitishin/xray-16/tree/masterИли подскажите, где взять чистые исходники под VS13 Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 3 Июля 2015 (изменено) Сбылась мечта идиота ) Нашёл, где включить воздействие аномалий на НПС в ЗП в классе CSpaceRestrictor в методе net_Spawn убираем строчку spatial.type &= ~STYPE_VISIBLEFORAI Может, конечно, я тут Америку не открыл, но мне никто так и не подсказал. Правда после включения наблюдается интересная картина. Если сталкер после первого хита выжил, он чуть отходит назад и начинает кидать болты )) Правда не совсем туда, куда надо. Да и выглядит это кривовато, но думаю эту схему можно отключить и подключить скриптовую, например из amk для ТЧ Изменено 3 Июля 2015 пользователем Shredder 2 1 4 Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 3 Августа 2015 Твоя рыба больше на удочки похожа ))) P.S. Прошу простить за оффтоп Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 27 Августа 2015 А где можно посмотреть правку по смене модели из скрипта? 1 Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 28 Августа 2015 @HESH, конечно можно, но это не 2 строчки кода. Я тоже никогда не писал на C++, раньше на php, теперь на ruby. Но вот тоже залез в исходники. Получилось добавить слот под (нож/пистолет), (бинокль/нож/пистолет), слот под рюкзак, отдельные слоты под патроны, иконку в полный рост, как в ТЧ. Как бы там не хаили разработчиков, код вполне читабельный и разобраться можно. https://yadi.sk/i/cWE8vVEViiWdN 2 Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 28 Августа 2015 отображение в инвентаре смотри в файлах xrGame/ui/UIActorMenu* хранение предметов смотри в xrGame/Inventory.cpp 2 Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 5 Сентября 2015 Если верить: http://www.stalker-modi.ru/load/patchi/zov_pripjati/patch_1_6_03_dlja_zov_pripjati/12-1-0-3454, то: Правки в исходниках: только были убраны красные надписи и вывод на экран по середине - fps, правок больше не было сделано в исходниках ЗП Так что можете "валить" Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 5 Сентября 2015 Да, да, точно так же и в ЗП. Там разрабы изначально вынесли вызов и в скрипты. Но в ЗП после смены визуала они ещё и бессмертными становились. Возможно стоит поискать решение в классе кровососа, ведь у него же происходит замена модели при переходе в стелс и обратно? Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 9 Сентября 2015 ... Надо аналогичные виртуальные функции добавить для всех остальных объектов.Не совсем понял. Для каких ещё объектов нужно добавлять соответствующие функции? Код, что ты привёл, рабочий? Я не вижу в нём перезагрузки анимации и дамага. Поделиться этим сообщением Ссылка на сообщение
Shredder 49 Опубликовано 23 Октября 2015 Никто случаем не восстанавливал в ЗП энциклопедию? Поделиться этим сообщением Ссылка на сообщение