Garik66 Опубликовано 17 декабря, 2014 Поделиться Опубликовано 17 декабря, 2014 МАСТЕРА опять без Вас не обойтись. Написал (рабочий) скрипт на основные Статы для Fallout 3. В кратце, что делает скрипт:1. Получает текущее значение Статов из игры.2. Позволяет Геймеру менять значения Статов: 2.1 Сразу все на MAX или 2.2 на выбор игрока.3. При отключении скрипта - возвращает значения Статов, соответствующих игре. Более подробно опишу работу скрипта, при выкладывании в соответствующей теме. Что нужно:1. Добавить дополнительные условия (защита от непонятливых). {см. скрипт}2. Добавить сообщение об ошибке (для тех же непонятливых).{см. скрипт}3. Так как в скрипте много повторяющихся элементов, я думаю его можно записать более компактно и корректно. МАСТЕРА, если возможно то с пояснениями. За помощь заранее Болшой Спасыб!!! Сам скрипт: Небольшое уточнениеПерепробовал наверное все варианты прыжков:Использование JB (и его аналогов) допускает изменение Стата, но само условие не работает.Использование JA (и его аналогов) не допускает изменение Стата, т.е. код не переходит на строчку - mov al,[stat1]. Скорее всего где-то принципиально в коде нужно что-то поменять, чтобы заработали доп. условия.[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 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 18 декабря, 2014 Автор Поделиться Опубликовано 18 декабря, 2014 С первой задачей справился сам:Что нужно:1. Добавить дополнительные условия (защита от непонятливых). {см. скрипт} РЕШЕНО.Смотрите скрипт.Что было не правильно, а точнее что сделал, чтобы заработало:1. Был прыжок не туда. Поэтому добавил новую метку (TStat -> см. скрипт).2. Оказалось несмотря на то, что вроде бы прописал размеры Переменных (db 0), нужно было всё-таки указать размеры данных везде.После этого всё заработало.Изменённый скрипт:Остаются ещё две задачи:2. Добавить сообщение об ошибке (для тех же непонятливых).{см. скрипт}3. Так как в скрипте много повторяющихся элементов, я думаю его можно записать более компактно и корректно.По второй задаче кое-что нашёл:Но:1. В самом коде русский язык не воспринимается (неужели нету поддержки русского языка в СЕ). Приходится, чтобы было понятно, перед командой ставить //. 2. Вставил эту команду куда мне нужно, но окошко с сообщением выскакивает только при активации скрипта, а не когда я специально делаю ошибку.Так что вопрос пока не решён. Подскажите. [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 включительно.")) Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 20 декабря, 2014 Автор Поделиться Опубликовано 20 декабря, 2014 Повторюсь, а то чёй-то никто не отвечает: По второй задаче кое-что нашёл:luacall(showMessage("ВНИМАНИЕ!!! Статы могут иметь значения от 1 до 10 включительно.")) Но:1. В самом коде русский язык не воспринимается (неужели нету поддержки русского языка в СЕ). Приходится, чтобы можно было прочитать, перед командой ставить //. 2. Вставил эту команду куда мне нужно, но окошко с сообщением выскакивает только при активации скрипта, а не когда я специально делаю ошибку.Так что вопрос пока не решён. Подскажите. Всё-таки интересно, как можно вызвать в ассемблерском скрипте, написанным в СЕ, вызвать когда мне нужно вставку LUA-скрипта (не писав при этом полностью скрипт на LUA, так как пока его не изучал)? Ссылка на комментарий Поделиться на другие сайты Поделиться
lamalamaz Опубликовано 21 декабря, 2014 Поделиться Опубликовано 21 декабря, 2014 Автоасемблер и сам lua разные вещи. Автоасемблер это инжектор в код программы своего кода...То есть надо отталкиваться от lua и приходить к ассемблерным вставкам а не наоборот отталкиваться от инжектора и приходить к вставкам lua. Придется подучить Lua благо не сложный язык. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 21 декабря, 2014 Автор Поделиться Опубликовано 21 декабря, 2014 Автоасемблер и сам lua разные вещи. Автоасемблер это инжектор в код программы своего кода...То есть надо отталкиваться от lua и приходить к ассемблерным вставкам а не наоборот отталкиваться от инжектора и приходить к вставкам lua. Придется подучить Lua благо не сложный язык.Жаль, а можно компактней записать мой скрипт, не посмотрите? Ссылка на комментарий Поделиться на другие сайты Поделиться
lamalamaz Опубликовано 21 декабря, 2014 Поделиться Опубликовано 21 декабря, 2014 По поводу сокращений и компактности это не ко мне. Я сам люблю все расписывать чтобы мне было нагляднее.вот пример моего кода который можно сократить в разы, но тогда читабельность(лично для меня) упадет во много раз.[ENABLE]//code from here to '[DISABLE]' will be used to enable the cheatalloc(newmem,2048)label(returnhere)label(orig)label(orig2)label(orig3)label(orig4)label(orig5)label(orig6)label(orig7)label(ss)label(zed)newmem: //this is allocated memory, you have read,write,execute accesscmp [ecx+00000148],2je ssjmp origss:mov dx,[esp+04]push axmov ax,[ecx+000007F6]sub ax,dxmov [zed],dxsub [zed],axsub [zed],axsub [zed],axsub [zed],axsub [zed],axsub [zed],axcmp word ptr [zed],1jle orig2mov dx,[zed]pop axjmp returnhereorig:mov dx,[esp+04]jmp returnhereorig2:mov [zed],dxsub [zed],axsub [zed],axsub [zed],axsub [zed],axsub [zed],axcmp word ptr [zed],1jle orig3mov dx,[zed]pop axjmp returnhereorig3:mov [zed],dxsub [zed],axsub [zed],axsub [zed],axsub [zed],axcmp word ptr [zed],1jle orig4mov dx,[zed]pop axjmp returnhereorig4:mov [zed],dxsub [zed],axsub [zed],axsub [zed],axcmp word ptr [zed],1jle orig5mov dx,[zed]pop axjmp returnhereorig5:mov [zed],dxsub [zed],axsub [zed],axcmp word ptr [zed],1jle orig6mov dx,[zed]pop axjmp returnhereorig6:mov [zed],dxsub [zed],axcmp word ptr [zed],1jle orig7mov dx,[zed]pop axjmp returnhereorig7:pop axjmp returnherezed:dd 0"Freedom.exe"+9FCB0:jmp newmemreturnhere: [DISABLE]//code from here till the end of the code will be used to disable the cheatdealloc(newmem)"Freedom.exe"+9FCB0:mov dx,[esp+04]//Alt: db 66 8B 54 24 04 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 21 декабря, 2014 Автор Поделиться Опубликовано 21 декабря, 2014 (изменено) Ну раз сообщение вызвать при ошибке нельзя, а компактней записать смысла нету, выложу скрипт в таком виде, в своей теме.в этом сообщении. Изменено 19 февраля, 2015 пользователем garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 февраля, 2016 Автор Поделиться Опубликовано 10 февраля, 2016 (изменено) В 21.12.2014в10:03, lamalamaz сказал: То есть надо отталкиваться от lua и приходить к ассемблерным вставкам а не наоборот отталкиваться от инжектора и приходить к вставкам lua. Утверждение не верное, пример показан в последнем скрипте 4. Скрипт по заданию "Timer Mission v. Sound" моей статьи - Работа с игровыми таймерами. Изменено 10 февраля, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения