Перейти к содержанию

Garik66

Помогаторы
  • Постов

    5 750
  • Зарегистрирован

  • Победитель дней

    292

Весь контент Garik66

  1. Повторюсь, а то чёй-то никто не отвечает: По второй задаче кое-что нашёл: luacall(showMessage("ВНИМАНИЕ!!! Статы могут иметь значения от 1 до 10 включительно.")) Но: 1. В самом коде русский язык не воспринимается (неужели нету поддержки русского языка в СЕ). Приходится, чтобы можно было прочитать, перед командой ставить //. 2. Вставил эту команду куда мне нужно, но окошко с сообщением выскакивает только при активации скрипта, а не когда я специально делаю ошибку. Так что вопрос пока не решён. Подскажите. Всё-таки интересно, как можно вызвать в ассемблерском скрипте, написанным в СЕ, вызвать когда мне нужно вставку LUA-скрипта (не писав при этом полностью скрипт на LUA, так как пока его не изучал)?
  2. С первой задачей справился сам: Что нужно: 1. Добавить дополнительные условия (защита от непонятливых). {см. скрипт} РЕШЕНО. Смотрите скрипт. Что было не правильно, а точнее что сделал, чтобы заработало: 1. Был прыжок не туда. Поэтому добавил новую метку (TStat -> см. скрипт). 2. Оказалось несмотря на то, что вроде бы прописал размеры Переменных (db 0), нужно было всё-таки указать размеры данных везде. После этого всё заработало. Изменённый скрипт: [ENABLE]aobscan(AdresInGame8, 8axxxxxxc2xxxxxxxxxxxxxx80xxxxxxxx8a)alloc(newMem8, 2048)label(returnHere8)label(OK)label(TStat) // Добавил меткуlabel(TStat1)label(TStat2)label(TStat3)label(TStat4)label(TStat5)label(TStat6)label(TStat7)label(MenjaemStat)label(MStat)label(MaxStat)registersymbol(MaxStat)label(NaStat1)label(Stat1)registersymbol(Stat1)label(NaStat2)label(Stat2)registersymbol(Stat2)label(NaStat3)label(Stat3)registersymbol(Stat3)label(NaStat4)label(Stat4)registersymbol(Stat4)label(NaStat5)label(Stat5)registersymbol(Stat5)label(NaStat6)label(Stat6)registersymbol(Stat6)label(NaStat7)label(Stat7)registersymbol(Stat7)registersymbol(AdresInGame8)newMem8:mov al,[eax+ecx-01]cmp byte ptr [MaxStat],1je MStatcmp byte ptr [MaxStat],2Je MenjaemStatTStat: // Добавил метку, на которую прыгаем если Игрок ввёл цифру > 10 или < 1cmp edx,5je TStat1cmp edx,6je TStat2cmp edx,7je TStat3cmp edx,8je TStat4cmp edx,9je TStat5cmp edx,aje TStat6cmp edx,bje TStat7MenjaemStat:cmp edx,5je NaStat1cmp edx,6je NaStat2cmp edx,7je NaStat3cmp edx,8je NaStat4cmp edx,9je NaStat5cmp edx,aje NaStat6cmp edx,bje NaStat7OK:ret 0004jmp returnHere8TStat1:mov byte ptr [Stat1],aljmp OKTStat2:mov byte ptr [Stat2],aljmp OKTStat3:mov byte ptr [Stat3],aljmp OKTStat4:mov byte ptr [Stat4],aljmp OKTStat5:mov byte ptr [Stat5],aljmp OKTStat6:mov byte ptr [Stat6],aljmp OKTStat7:mov byte ptr [Stat7],aljmp OKNaStat1:cmp byte ptr [Stat1],1 //(Выполняется условие, чтоjb TStat // меньше 1 Стат быть не может)// jmp Message (сюда хочу вставить сообщение об ошибке)cmp byte ptr [Stat1],a //(Выполняется условие, чтоja TStat // больше 10 Стат быть не может)// jmp Message (сюда хочу вставить сообщение об ошибке)mov al,byte ptr [Stat1]jmp OKNaStat2:cmp byte ptr [Stat2],1jb TStatcmp byte ptr [Stat2],aja TStatmov al,byte ptr [Stat2]jmp OKNaStat3:cmp byte ptr [Stat3],1jb TStatcmp byte ptr [Stat3],aja TStatmov al,byte ptr [Stat3]jmp OKNaStat4:cmp byte ptr [Stat4],1jb TStatcmp byte ptr [Stat4],aja TStatmov al,byte ptr [Stat4]jmp OKNaStat5:cmp byte ptr [Stat5],1jb TStatcmp byte ptr [Stat5],aja TStatmov al,byte ptr [Stat5]jmp OKNaStat6:cmp byte ptr [Stat6],1jb TStatcmp byte ptr [Stat6],aja TStatmov al,byte ptr [Stat6]jmp OKNaStat7:cmp byte ptr [Stat7],1jb TStatcmp byte ptr [Stat7],aja TStatmov al,byte ptr [Stat7]jmp OKMStat:mov byte ptr [Stat1],a // изменил, чтобы в таблице СЕ значения тоже поменялисьmov byte ptr [Stat2],amov byte ptr [Stat3],amov byte ptr [Stat4],amov byte ptr [Stat5],amov byte ptr [Stat6],amov byte ptr [Stat7],ajmp MenjaemStat // Поэтому изменил безусловный переход.Stat1:db 0Stat2:db 0Stat3:db 0Stat4:db 0Stat5:db 0Stat6:db 0Stat7:db 0MaxStat:db 0AdresInGame8:jmp newMem8nopnopreturnHere8:[DISABLE]AdresInGame8: // Fallout3.exe+516D4mov al,[eax+ecx-01]ret 0004unregistersymbol(MaxStat)unregistersymbol(Stat1)unregistersymbol(Stat2)unregistersymbol(Stat3)unregistersymbol(Stat4)unregistersymbol(Stat5)unregistersymbol(Stat6)unregistersymbol(Stat7)unregistersymbol(AdresInGame8)dealloc(newMem8) luacall(showMessage("ВНИМАНИЕ!!! Статы могут иметь значения от 1 до 10 включительно."))
  3. МАСТЕРА опять без Вас не обойтись. Написал (рабочий) скрипт на основные Статы для Fallout 3. В кратце, что делает скрипт: 1. Получает текущее значение Статов из игры. 2. Позволяет Геймеру менять значения Статов: 2.1 Сразу все на MAX или 2.2 на выбор игрока. 3. При отключении скрипта - возвращает значения Статов, соответствующих игре. Более подробно опишу работу скрипта, при выкладывании в соответствующей теме. Что нужно: 1. Добавить дополнительные условия (защита от непонятливых). {см. скрипт} 2. Добавить сообщение об ошибке (для тех же непонятливых).{см. скрипт} 3. Так как в скрипте много повторяющихся элементов, я думаю его можно записать более компактно и корректно. МАСТЕРА, если возможно то с пояснениями. За помощь заранее Болшой Спасыб!!! Сам скрипт: [ENABLE]aobscan(AdresInGame8, 8axxxxxxc2xxxxxxxxxxxxxx80xxxxxxxx8a)alloc(newMem8, 2048)label(returnHere8)label(OK)label(TStat1)label(TStat2)label(TStat3)label(TStat4)label(TStat5)label(TStat6)label(TStat7)label(MenjaemStat)label(MStat)label(MaxStat)registersymbol(MaxStat)label(NaStat1)label(Stat1)registersymbol(Stat1)label(NaStat2)label(Stat2)registersymbol(Stat2)label(NaStat3)label(Stat3)registersymbol(Stat3)label(NaStat4)label(Stat4)registersymbol(Stat4)label(NaStat5)label(Stat5)registersymbol(Stat5)label(NaStat6)label(Stat6)registersymbol(Stat6)label(NaStat7)label(Stat7)registersymbol(Stat7)registersymbol(AdresInGame8)newMem8:mov al,[eax+ecx-01]cmp [MaxStat],1je MStatcmp [MaxStat],2Je MenjaemStatcmp edx,5je TStat1cmp edx,6je TStat2cmp edx,7je TStat3cmp edx,8je TStat4cmp edx,9je TStat5cmp edx,aje TStat6cmp edx,bje TStat7MenjaemStat:cmp edx,5je NaStat1cmp edx,6je NaStat2cmp edx,7je NaStat3cmp edx,8je NaStat4cmp edx,9je NaStat5cmp edx,aje NaStat6cmp edx,bje NaStat7OK:ret 0004jmp returnHere8TStat1:mov [Stat1],aljmp OKTStat2:mov [Stat2],aljmp OKTStat3:mov [Stat3],aljmp OKTStat4:mov [Stat4],aljmp OKTStat5:mov [Stat5],aljmp OKTStat6:mov [Stat6],aljmp OKTStat7:mov [Stat7],aljmp OKNaStat1:// cmp [Stat1],1 (сюда нужно вставить условие, что// jb OK меньше 1 Стат быть не может)// jmp Message (сюда хочу вставить сообщение об ошибке)// cmp [Stat1],a (сюда нужно вставить условие, что// ja OK больше 10 Стат быть не может)// jmp Message (сюда хочу вставить сообщение об ошибке)mov al,[Stat1]jmp OKNaStat2:mov al,[Stat2]jmp OKNaStat3:mov al,[Stat3]jmp OKNaStat4:mov al,[Stat4]jmp OKNaStat5:mov al,[Stat5]jmp OKNaStat6:mov al,[Stat6]jmp OKNaStat7:mov al,[Stat7]jmp OKMStat:mov al,ajmp OKStat1:db 0Stat2:db 0Stat3:db 0Stat4:db 0Stat5:db 0Stat6:db 0Stat7:db 0MaxStat:db 0AdresInGame8:jmp newMem8nopnopreturnHere8:[DISABLE]AdresInGame8: // Fallout3.exe+516D4mov al,[eax+ecx-01]ret 0004unregistersymbol(MaxStat)unregistersymbol(Stat1)unregistersymbol(Stat2)unregistersymbol(Stat3)unregistersymbol(Stat4)unregistersymbol(Stat5)unregistersymbol(Stat6)unregistersymbol(Stat7)unregistersymbol(AdresInGame8)dealloc(newMem8) NaStat1:// cmp [Stat1],1 (сюда нужно вставить условие, что// jb OK меньше 1 Стат быть не может)// jmp Message (сюда хочу вставить сообщение об ошибке)// cmp [Stat1],a (сюда нужно вставить условие, что// ja OK больше 10 Стат быть не может)// jmp Message (сюда хочу вставить сообщение об ошибке)mov al,[Stat1]jmp OK
  4. Конечно это я попробовал в первую очередь, т.к. MOV - пожалуй первая инструкция, с которой я познакомился. Но она записывает не правильное значение (почему - не разобрался). Со своей проблемой я уже разобрался (как оказалось я написал абсолютно верный скрипт и он работал, только я тогда не понял как). Разъяснение и готовый скрипт читайте в теме.: этом посте.
  5. Если я правильно понял, то именно такую инструкцию я выбрал и сделал фильтр в ней, но почему скрипт не работает? Посмотрите скрипт и если в нём есть ошибка (так как я в первый раз пишу скрипт, где Игрок может вводить сам своё значение, то возможно она есть), объясните где она.
  6. У меня вопрос, этот пример только для статического адреса или можно скрипт как-то для динамического адреса написать. Вот я попробовал несколько вариантов. Пере пишите пожалуйста, если всё-таки пример возможен и для динамического адреса, мой скрипт: [ENABLE]aobscan(address23, 8D B4 10 B8 0D 00 00 F3 A5 E8 FD 82 2E 00)alloc(newMem23, 1024)alloc(x,364)label(Istochnik)label(returnHere23)registersymbol(address23)registersymbol(Istochnik)newMem23:lea esi,[eax+edx+00000DB8]repe movsdmov [eax+ea4],femov [eax+ea8],felea Istochnik,[eax+dbc]push ebx // Сохраняемpush ecx // регистрыmov ebx,[x] // адрес источника [eax+dbc] -> xmov ecx,[x+45ec] // адрес приёмника [eax+53a8]-> x+(53a8-dbc)-> x+45ECret // копируем памятьpop ecx // Восстанавливаемpop ebx // регистрыx:readmem(Istochnik,364)Istochnik:dd 0jmp returnHere23address23:jmp newMem23db 90 90 90 90returnHere23:[DISABLE]address23: {TH.exe+20CB5:}lea esi,[eax+edx+00000DB8] // Собственно копируем полностьюrepe movsd // характеристики предметаunregistersymbol(Istochnik) // положенного 1 в рюкзак поверхunregistersymbol(address23) // характеристик взятого предметаdealloc(x,364)dealloc(newMem23)
  7. Т.е. игроку нужно будет, чтобы записать новое значение, идти и воровать что-нибудь (либо другое кармическое действие) - это неинтересно.
  8. Перепробовал всё, думал сам справлюсь. Нет всё-таки не обойтись, без совета опытных. Пишу скрипт на изменение Кармы (по желанию игрока) для Fallout 3. Адрес Кармы [[0107a104]+380]. Пишет в адрес одна инструкция (пока проверял только на воровстве, но думаю, что будет отвечать эта же инструкция за любые кармические действия в игре) 1. Fallout3.exe+36E616 fstp dword ptr [edi+esi*4+00000324] Использовал её при написании скрипта, чтобы не падала Карма.Доступ к адресу имеют две инструкции:2.Fallout3.exe+36E28Bfld dword ptr [ecx+eax*4+00000288] (очень частое обращение к этой инструкции)3.Fallout3.exe+36E304 fld dword ptr [ecx+eax*4+00000288](очень редкое обращение к этой инструкции 2/3 -> 700/1, где то так различается частота обращения.)Причём 3. инструкцию плагин (Сканер сигнатур на Lua), скачанный отсюда, не находит. Написал скрипт, опирающийся на 2. инструкцию:[ENABLE]aobscan(AdresInGame4_1, D9xxxxxxxxxxxxD9xxxx74xxD9xxxxxxxxxxxxEBxxD9xxxxxxxxxx8BxxD9xxxxxxxxxx8BxxFFxxD9xxxxxx8BxxE8xxxxxxxxD9xxxxxx)alloc(newMem4_1, 64)label(returnHere4_1)Label(MenjaemKarmu4_1)label(Karma4_1)registersymbol(Karma4_1)registersymbol(AdresInGame4_1)newMem4_1:cmp eax,17 // Вводим фильтр чтобы работать конкретно с Кармой.je MenjaemKarmu4_1fld dword ptr [ecx+eax*4+00000288]jmp returnHere4_1 // Изменяем Карму (до -750 - очень злой;MenjaemKarmu4_1: // от -750 до -250 - элой; от -250 до 250 -fld dword ptr [Karma4_1] // нейтральный; от 250 до 750 - добрый иjmp returnHere4_1 // от 750 - очень добрый.Karma4_1: // Добавляем адрес в таблицу с адресомdd 0 // "Karma4_1" (без кавычек) и названием, // допустим "Карма" и вписываем нужноеAdresInGame4_1: // нам значение.jmp newMem4_1nopnopreturnHere4_1:[DISABLE]AdresInGame4_1: //Fallout3.exe+36E28Bfld dword ptr [ecx+eax*4+00000288]unregistersymbol(Karma4_1)unregistersymbol(AdresInGame4_1)dealloc(newMem4_1)
  9. Огромное спасибо! Переделал заодно и свой первый скрипт, теперь работает именно как я задумывал. Результаты обсуждения, если кто читал см. в моей теме Тему можно закрыть.
  10. Вроде бы разобрался как сделать это при помощи ввода переменной. [ENABLE]alloc(Primer, 64)label(Vozvrat)label(Konctanta)registersymbol(Konctanta)Primer:mov [eax+000000060],[Konctanta] // #100mov [eax+000000064],[Konctanta] // #100mov [eax+000000068],[Konctanta] // #100mov [eax+04],edxmov eax,[esi+08]jmp VozvratKonctanta:db 64AdresInGame:jmp PrimernopVozvrat:[DISABLE]AdresInGame://mov [eax+000000060],0 // Так конечно нельзя делать.//mov [eax+000000064],0//mov [eax+000000068],0mov [eax+04],edxmov eax,[esi+08]unregistersymbol(Konctanta)dealloc(Primer)
  11. Yuriko33 игры у меня нет. Если инструкции и ID героя в скрипте найдены правильно, то по идее всё должно работать. Попробуй так: [ENABLE]aobscan(address0, D9 xx xx 8B xx xx xx xx xx)alloc(newMem, 512)label(returnHere)registersymbol(address0)label(hit)label(god)newMem:cmp [esi+84],0je godjne hitgod:mov [esi+78],(float)100fld dword ptr [esi+78]mov eax,[esi+000000AC]jmp returnHerehit:mov [esi+78],(float)0fld dword ptr [esi+78]mov eax,[esi+000000AC]jmp returnHereaddress0:jmp newMemdb 90 90 90 90returnHere:[DISABLE]address0:fld dword ptr [esi+78]mov eax,[esi+000000AC]dealloc(newMem)unregistersymbol(address0)
  12. "Как обычно"? Я этого пока ещё ни разу не делал, хотя и предполагал, что именно так и нужно будет сделать. Чтобы я разобрался в вопросе, давайте на примере попробуем: Допустим я написал рабочий скрипт: [ENABLE]alloc(Primer, 64)label(Vozvrat)Primer:mov [eax+000000060],#100mov [eax+000000064],#100mov [eax+000000068],#100mov [eax+04],edxmov eax,[esi+08]jmp VozvratAdresInGame:jmp PrimernopVozvrat:[DISABLE]AdresInGame:mov [eax+04],edxmov eax,[esi+08]dealloc(Primer) [ENABLE]alloc(Primer, 64)label(Vozvrat)Primer:mov [eax+000000060],#100mov [eax+000000064],#100mov [eax+000000068],#100mov [eax+04],edxmov eax,[esi+08]jmp VozvratAdresInGame:jmp PrimernopVozvrat:[DISABLE]AdresInGame:mov [eax+000000060],0mov [eax+000000064],0mov [eax+000000068],0mov [eax+04],edxmov eax,[esi+08]dealloc(Primer)
  13. Допустим при активации скрипта я записываю по адресу [x] значение b. Изначально в [x] было a. Как при выключении скрипта вернуть в [x] значение a?
  14. Тогда да. В скрипте, видно что сигнатура (aobscan(address0, D9 46 78 8B 86)) набрана вручную. У Вас скорее всего не сходятся версии игры. Нужно либо скачать туже версию игры, либо попросить lamalamaz В личных сообщениях прислать адрес инструкции.(будет выглядеть, типа так (FEAR.exe+36E4E0) В скрипте удалить строчку Аобскана "(aobscan(address0, D9 46 78 8B 86)" и заменить все строки "address0:" на полученный адрес "FEAR.exe+36E4E0:" Либо, что ещё сложнее, поискать сами инструкции в игре, эти (fld dword ptr [esi+78] mov eax,[esi+000000AC]). Ещё вариант (если в версиях отличаются только регистры в инструкциях), попробуйте Вариант 1: Замените (aobscan(address0, D9 46 78 8B 86) на (aobscan(address0, D9 xx xx 8B xx AC 00 00 00) Вариант 2: на (aobscan(address0, D9 xx xx 8B xx xx xx xx xx) Может что-то сработает
  15. Скорее всего Вы не запустили игру. Нужно запустить CE, запустить игру, в СЕ выбрать процесс Вашей игры, скопировать скрипт в свою таблицу в СЕ. После этого должно быть всё нормально.
  16. Для тех, кто читал: Решение проблемы и полный рабочий скрипт выложен в форуме "Скрипты и таблицы": http://forum.gamehacklab.ru/topic/3010-skripty-dlia-fallout-3-ot-garik66/?p=20478 Эту тему можно закрыть.
  17. NullAlexБольшое спасибо за помощь. Я уже разобрался в чём дело, вот рабочий код (на 100 . Подробнее опишу в чём дело и выложу уже готовый код в форуме "скрипты и таблицы" и сюда выложу ссылку. alloc(newMem, 128)label(returnHere)label(Razdet_1)label(Razdet_2)label(Razdet_3)label(Razdet_4)label(_Razdet)registersymbol(_Razdet)newMem:cmp [_Razdet],3je Razdet_4cmp [_Razdet],2je Razdet_3cmp [_Razdet],1je Razdet_2cmp [_Razdet],0je Razdet_1Razdet_1:mov dword ptr [esi+00000280],(float)100mov [_Razdet],1jmp returnHereRazdet_2:mov [_Razdet],2jmp returnHereRazdet_3:mov dword ptr [esi+00000280],(float)0mov [_Razdet],3jmp returnHereRazdet_4:mov [_Razdet],0jmp returnHere_Razdet:dd 0Fallout3.exe+36E4E0:jmp newMemnopnopreturnHere:[DISABLE]Fallout3.exe+36E4E0:fstp dword ptr [esi+edi*4+00000200]unregistersymbol(_Razdet)dealloc(newMem)
  18. NullAlex К сожалению тоже не работает. Я уже перепробовал кучу разных прыжков, пока не получается. В твоём скрипте, даже, если убрать: originalcode: fstp dword ptr [esi+edi*4+00000200] // не забываем про оригинальный код и добавить в: cmp........ [esi+00000280],(float)100 - dword ptr. всё равно (float)100 не записывается по нужному адресу.
  19. Да. И я об этом уже писал. А что, в этом случае нельзя объединить в один код? Главная проблема не в том, что один адрес отвечает за 2 скрипта, а в том, что тип float. Если бы были целые, давно бы уже подобрал переходы (прыжки).
  20. Не понимаю зачем нужно это: 1. load: mov dword ptr [esi+00000280],(float)100 jmp returnHere если есть это: sto: mov dword ptr [esi+00000280],(float)100 jmp returnHere И здесь: 2. cmp dword ptr [esi+00000280],(float)0 значение dword ptr [esi+00000280], в игре может быть и выше 0 и при этом не равняться 100. НО идею использовать две метки и два сравнения сейчас попробую. Спасибо. Прежде чем кидаете ссыль, почитайте её сами. В моём случае от одной инструкции идут два взаимоисключающих кода.
  21. Да, инструкция разовая - срабатывает, в моём случае когда одеваешь или снимаешь шмотку с героя.
  22. Видать уже парюсь , никак не могу объединить два рабочих кода в один. 1. [ENABLE]alloc(newMem,64)label(returnHere)newMem:mov dword ptr [esi+00000280],(float)100//fstp dword ptr [esi+edi*4+00000200]jmp returnHereFallout3.exe+36E4E0:jmp newMemnopnopreturnHere:[DISABLE]Fallout3.exe+36E4E0:fstp dword ptr [esi+edi*4+00000200]dealloc(newMem)2. [ENABLE]alloc(newMem,64)label(returnHere)newMem:mov dword ptr [esi+00000280],(float)0//fstp dword ptr [esi+edi*4+00000200]jmp returnHereFallout3.exe+36E4E0:jmp newMemnopnopreturnHere:[DISABLE]Fallout3.exe+36E4E0:fstp dword ptr [esi+edi*4+00000200]dealloc(newMem)2 запускаю после выключения 1 (Оба работают: 1 прописывает 100, где мне нужно, 2 - 0.) Уже по-моему все варианты переходов (прыжков) перепробовал: В начале сравнивал с 100 (сотней): [ENABLE]alloc(newMem,64)label(returnHere)label(Razdet)newMem:cmp dword ptr [esi+00000280],(float)100jbe Razdetmov dword ptr [esi+00000280],(float)100 //Эта часть работаетjmp returnHereRazdet:mov dword ptr [esi+00000280],(float)0 //Эта не работаетjmp returnHereFallout3.exe+36E4E0:jmp newMemnopnopreturnHere:[DISABLE]Fallout3.exe+36E4E0:fstp dword ptr [esi+edi*4+00000200]dealloc(newMem)Затем попытался с помощью флага, но здесь вообще ничего не получается: [ENABLE]alloc(newMem, 128)label(returnHere)label(Razdet)label(_Razdet)registersymbol(_Razdet)newMem:cmp [_Razdet],1jne Razdetmov dword ptr [esi+00000280],(float)0mov [_Razdet],0jmp returnHereRazdet:mov dword ptr [esi+00000280],(float)100mov [_Razdet],1jmp returnHere_Razdet:dd 0Fallout3.exe+36E4E0:jmp newMemnopnopreturnHere:[DISABLE]Fallout3.exe+36E4E0:fstp dword ptr [esi+edi*4+00000200]unregistersymbol(_Razdet)dealloc(newMem)Мастера подскажите пжлста, где ошибаюсь. Заранее Болшой СПАСЫБ!!!
  23. Может мой пример подойдёт: Тоже хотел организовать создание любого предмета с нужными мне характеристиками в игре "TheHell" (мод для "Diablo - Hellfire"). Со встроенной функцией спавна разобраться не сумел (знаний не хватает). Но организовал подмену (сделал две опции для будущего трейнера), вспомнив, что ещё в Diablo можно было делать копии предметов с помощью игрового бага (Кстати нашёл этот баг и повторял его программно), копии при кидании их на землю уничтожались (Видать Разработчики так решили бороться с этим багом). Обе сделаны на использовании ID предмета: 1. Если кладём предмет в инвентарь, то через 5 секунд (медленно, но таймер не стал менять, за одно можно посмотреть характеристики предмета) он меняет предмет на следующий в игре, поднимаем вновь созданный предмет, кладём в инвентарь - следующий предмет, ну и т.д. Всего в "TheHell" 399 предмета (не волшебных, от ID=0 (Золото) и до 398, в "Diablo - Hellfire" было гораздо меньше). Если ID становилось равным 399, то происходил вылет из игры, поэтому зациклил опцию, т.е., если вы положите вновь созданный предмет, то на 400 раз получите предмет с которого начали (например - 1 золотой, 2 - ножик - 399 итераций - 1 золотой). На любом понравившемся предмете можно остановиться и оставить себе. Новые предметы, при кидании на землю, не уничтожаются. 2. Работает по принципу - предмет тот же, но меняются его волшебные свойства (подробно описывать не буду). Технология та же - поднял предмет, положил в инвентарь - через 5 секунд новый предмет. Сочетая обе опции получаем почти любой предмет в игре. Ну вот, как делал: 1. Находил адрес любой характеристики предмета. 2. Из этого адреса смотрел регион памяти, в нём находил ID предмета. (В моём случае у предмета два ID - 1. ID. который я описал выше (назвал его ID вида)и 2. ID, отвечает за уникальность предмета (на основе него Разрабы игры например уничтожали предметы, брошенные на землю) (Его назвал, не мудрствуя ID уникальности). 3. Ставя бряки на запись и на чтение, в зависимости от ситуации (превый, когда меняется ID; второй, когда меняется что-то, но ID остаётся прежним), нашёл нужные мне инструкции. Как-то так.
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.