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

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


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

Никто не задумывался, как-бы сделать перемещение всех предметов одного типа из рюкзака в контейнер или торговцу за раз? Ведь правая кнопка мыши при продаже предметов не задействована, можно например на неё повесиить функцию продать(переместить) всё одним кликом или при нажатии высвечивается меню "продать всё". Я не понимаю, чем разработчики думали? Неужели так трудно было добавить эту функцию? Приходится, после очередного рейда по несколько тысяч раз кликать мышкой, чтобы продать всё, что нужно. Одну кнопку я уже из-за этого убил. Ладно хоть был запас старых мышек доноров. :)

  • Не нравится 1
Ссылка на комментарий

Разработчики никак не думали, что их идею сирурвариума, где приходится дорожить лутом и просчитывать носимый вес испоганят солянками до степени "продать пару сотнет артов, полтинник автоматов и 3 килопатрона, принеся это в экзоскелете бандита к торговцу" который этот товар себе разве что в карман засунуть может.

Изменено пользователем Igor88.89
  • Нравится 2
Ссылка на комментарий

Igor88.89, я понимаю твою иронию и полностью с тобой согласен :) Но все-таки, было бы не плохо, чтобы это кто-нибудь реализовал :rolleyes: Эту функцию явно с помощью скриптов не сделать, надо в движке копаться, а с ассемблером я не дружу.

Изменено пользователем SGV
Ссылка на комментарий

Igor88.89,

испоганят солянками до степени "продать пару сотнет артов, полтинник автоматов и 3 килопатрона,

Справедливости ради замечу, что описание вполне соответствует балансу чистой игры. Так что вряд ли можно объяснить отсутствие искомых фич неким глубоким замыслом. Скорее, создатели не предполагали, что народ будет играть в игру в стиле фриплея, даже проходя основной сюжет =)

 

SGV,

для начала имеет смысл как минимум задействовать перепаковщики пачек патронов, что несколько снижает остроту проблемы. Затем, приложить усилия по выправлению баланса.

 

К сожалению, изменения движка в части окошек/кнопочек по ряду причин крайне муторное дело. Теоретически можно, но лично я бы раньше балансом занялся, нежели такой фичей.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

А ограничение инвентаря по ячейкам движковым способом никак не реализуемо? Скажем к примеру - заключением вылета при заполнении инвентаря, имеющего в конфиге статус (ограничено) в безопасный код, препятствующий вылету?

Изменено пользователем Ирбис

Замедляю полураспад души стержнями музыки

Ссылка на комментарий
Так что вряд ли можно объяснить отсутствие искомых фич неким глубоким замыслом. Скорее, создатели не предполагали, что народ будет играть в игру в стиле фриплея, даже проходя основной сюжет =)

Во всех рпг есть возможность перемещать все предметы одного типа за раз - тот же обливион, например.

А ведь все разрабы живут в своём мирке, оторванном от игроков. Дать широкие возможности для моддинга и не включить такую фичу ни в одной из 3-х частей сталкера, по меньшей мере странно. Принудительное отключение теней от травы в 4-том и последующих патчах, лишний раз доказывает, что им на нас по барабану...

Скажите, зачем полностью убирать тени от травы, когда в меню и так кому надо, мог их отключить?

Как разрабы хвастали, что им удалось повысить производителность на 25% в 4-ом патче - это за счёт теней что-ли? Я когда патч 4-й поставил обрадовался, что даже на глаз тормозов меньше стало. Потом не много поиграв, смотрю, что-то не то... Графика как-то бедней что-ли стала выглядеть, чем на 3-м патче, как-будто чего-то не хватает. Долго доперал что к чему... Так и играл до сего момента с патчем 1.0003, пока хорошие люди не исправили этот недостаток.

 

Авторам правленного рендера особая благодарность!!!

Ссылка на комментарий

Вы видимо не знакомы с разработкой игр. Дело в том что в игре то все зацеплено и из-за не правильной архитектуры может получиться что исправив одно, ты получаешь баг в другом. Баг с травой был как раз в этом. Исправив одно разработчики случайно (!) прикончили другое

 

И не надо на них сливать весь негатив

 

И я, как и разработчики не думал о том что нужно сделать ту фишку, о которой ты говорил. Ну не приходила она мне в голову, а в игры я особо не играю

Freedom

Ссылка на комментарий

Скажите, зачем полностью убирать тени от травы, когда в меню и так кому надо, мог их отключить?

Никто не убирал. Это баг появился в связи с тем, что разрабы перенесли некоторую работу с детейлами во второй поток. В результате они не учли некоторые моменты после этого переноса: после отрисовки теней травы, тени сразу же удаляются из буфера. "Поторопились с патчем", как сказал Deathdoor :)

 

Как разрабы хвастали, что им удалось повысить производителность на 25% в 4-ом патче - это за счёт теней что-ли?

 

Как раз из-за переноса во второй поток.

Изменено пользователем SkyLoader
Ссылка на комментарий
Это баг появился в связи с тем, что разрабы перенесли некоторую работу с детейлами во второй поток. В результате они не учли некоторые моменты после этого переноса: после отрисовки теней травы, тени сразу же удаляются из буфера

Но ведь после этого было 2 патча ТЧ, 10 патчей ЧН и 2 патча ЗП, где это не было поправлено, если это баг. Мб убрали осознанно?

Ссылка на комментарий

Но ведь после этого было 2 патча ТЧ, 10 патчей ЧН и 2 патча ЗП, где это не было поправлено, если это баг. Мб убрали осознанно?

Они просто не заметили этого бага. Комьюнити опомнилось, когда уже было все выпущено в свет

Ссылка на комментарий
Они просто не заметили этого бага. Комьюнити опомнилось' date=' когда уже было все выпущено в свет[/quote']

Откуда у вас такая информация? У вас есть связи в комьюнити?

Ссылка на комментарий

SGV, а у вас есть информация, что это было сделано осознанно?

На то могло быть 100500 причин. И в конце концов, какая разница теперь?

Давайте еще вспомним самую первую версию сталкера и все, что было вырезано -_-

Изменено пользователем volazar
Ссылка на комментарий

Используя Lua-Перехватчик от alpet-а можно считывать\изменять значение в памяти игры, и назрела такая идея, о реализации которой я бы хотел уточнить. (ЧН)

 

Цель: через запись значений в память заменять путь к модели текущего оружия в руках ГГ, чтобы можно было прямо во время игры изменять модель в руках игрока на другую.

 

Вопрос: насколько реализуема такая задумка (спрашиваю у тех, кто глубоко ковырял движок, вдруг что заметили)

И второй вопрос: если первая задумка не реализуема, есть ли способ как то окольными путями изменять модель в руках игрока. Например в расширении движка от malandrinus-а для ТЧ есть возможность скрывать произвольные кости у оружия, можно ли такое реализовать изменением памяти?

Интересует реализация именно через изменение значений в памяти, т.к изменение движка не подходит.(хотя теоретически можно дописать dll-ку с нужным кодом и вживлять в процесс игры через перехватчик, правда опыта у меня в этом пока мало)

Изменено пользователем *Shoker*

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий

Вряд ли.

Дело в том, что путь к модели считывается один раз, после чего модель подгружается и отображается. И будешь ты менять путь во время игры или нет - разницы не будет. Можно конечно заменить в памяти загруженную модель, но это уже больше похоже на мазохизм.

Тут нужно как минимум вызывать функцию для загрузки модели по предоставленному тобой пути. Но это уже другой разговор, т.к. вызов не сделаешь, просто копаясь в памяти (тут я немного вру, ибо костылями можно сделать все)

Изменено пользователем _Призрак_

Freedom

Ссылка на комментарий

*Shoker*, помимо уже сказанного про подгрузку модели, есть еще один немаловажный нюанс:

То, что "валяется на земле" иль держит в руках кто-то, т.е. собственно модель оружия и то, что "держит в руках актор при виде от 1-го лица" - не одно и то же.

Визуал (т.е. модель) для оружия пишется не в секции самого оружия, а в подсекции его худа. К чему это приводит?

К тому, что даже если объекту оружия после его спана заменить путь к иной модели и даже, сохранив это значение в сэйв, перезапустить игру - в руках актор (при виде от 1-го лица!) будет продолжать держать прежнюю модель (визуал) оружия! Т.е. путь к модели, которую держит в руках актор, каждый раз при загрузке игры читается не из объекта оружия, а по прежнему из секции худа, т.е. из исходного конфига данного оружия.

Итого, не знаю что ты там задумал фокусничать с оружием в руках, но искать в памяти придется именно путь для худа оружия (как минимум)... , и каждый раз менять его.

Подчеркиваю, что визуал оружия именно при виде от 1-го лица берется из текущего конфига и может быть отличен от того, что приписан в самом объекте оружия, т.е. , например был при спавне оружия, и/или был изменен каким-либо способом.

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Задумано в принципе ничего не обычного, просто хочется реализовать визуальное отображение каких либо аддонов в произвольной комбинации на оружии. Сейчас у меня такой механизм основан на подмене секции, но этот метод, само собой, заставляет плодить кучу моделей и главное секций под каждую комбинацию всевозможных аддонов. А эти секции потом надо прописывать в торговлю, mp_ranks... Сейчас думаю как можно переделать этот механизм наименее затратным способом.

 

За ответы спасибо, тогда попробую глянуть функцию по скрыванию костей в расширении движка и вырезать её в отдельную dll-ку.

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий

Доброго времени суток. Пока в отпуске решился поковырять движок ЗП. Обидно, на ТЧ целую кучую полезных функций добавили (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-ку получилось, но результата нет. Игра не вылетает, но и колбэк не срабатывает. Так вот прошу знаюших людей поделиться мыслями по этой проблеме, буду очень благодарен.

Ссылка на комментарий

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

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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