Решил написать статью о том, как правильно скрипты писать. Она не призвана научить вас писать скрипты с нуля "шоб работало". Пишу лишь для того, чтоб народ понял как грамотно делать ту или иную функцию, и выглядело это красиво. И так - по порядку: 1. Бессмертие. В большенстве случаев, когда люди пишут скрипты на бессмертие, они отлавливают функцию, которая работает с адресом здоровья (не важно какого она типа), и присваивают значению здоровья какое-то астрономическое число, мотивируя это тем, что "наверняка, чтоб точно не убило", или просто ленятся подумать. Очень любит подобными вещами заниматься Grom-Skynet, из-за чего его функции выглядят слегка "колхозно".  mov [eax+смещение]#999999 //а то и больше девяток, сколько смелость позволит ))) Так делать не правильно, т.к. в большенстве случаев из-за таких вот "здоровий" игра по-просту вылетает, игра не может такие цифры воспринять (и это ясно, таким здоровье быть и не может) Грамотнее всего в данном случае либо найти максимум здоровья и присвоить его текущему здоровью (не полиниться и найти есть ли такой), или просто занопить. Поверьте, визуально это будет выглядеть более эстетично. Если есть максимум здоровья, то сделать чит с его помощью проще простого. Предположим, что текущее значение здоровья это еах+04, а максимальное значение еах+08, тогда:   push [eax+08] //запоминаем значение максимума pop [eax+04] //восстанавливаем его в текущее здоровье  Бывают случаи, когда здоровье типа float. Тогда подгрузить максимум здоровья можно лишь одной опирацией.  fst [eax+08] если значения максимума нет, то нопить функции можно таким способом   [enable] db 90,90,90,90 //в зависимости от того, сколько байт занимает исходная инструкция [disable] db 45,FA,25,65 // просто оригинальные байты  2. Стрельба без перезарядки В данной ситуации ищется кол-во патронов в обоиме и изменяется, но опять таки не на 999 (и снова Grom-Skynet здесь мастак это делать). От такого кол-ва патронов игра так же начнёт тупить и думать, а можно ли перезарядку делать или нет (обоимы то разные). Такая функция делается следующим образом, предположим, что кол-во патронов это еах+10. Вот так делать НЕ ПРАВИЛЬНО:   mov esi,#999 mov [eax+10],esi //родной кусок кода  А вот так ПРАВИЛЬНО:   inc esi //увеличивает значение esi на 1 mov [eax+10],esi //родной кусок кода  ИЛИ   add esi,1 //в данном случае нужно указывать на сколько увеличить esi mov [eax+10],esi //родной кусок кода  Значение патронов в обоиме будет всегда максимально и гемора будет меньше в будущем. 3. Деньги (или ещё какой-нить шмот) И опять сами-знаете-кто любит присвоить деньгам значение 9999999 (денег же много не бывает). В принципе можно и так делать, но впечатление складыватся, что без "читов" тут дело не обошлось. Если глаз не мозолит, то ничего страшного, пусть будет 999999 денег. Я предпочитаю в данном случае либо морозить значение денег на определённой отметке, чтоб ниже его не опускалось (например денег может быть и 51862, и 56923, но ниже 50000 не опустится), либо просто функцию добавления денег (+1000 золотый например). Если хотите, чтоб значение не опускалось ниже 50000, то нужно отлавливать функцию, которая записывает новое значение в адрес денег. Пусть еах+65 это деньги.   mov [eax+65],ebx //именно так эти функции выглядят.  то скрипт в данном случае будет выглядеть так:   cmp ebx,#50000 jge originalcode mov ebx,#50000 originalcode: mov [eax+65],ebx  Т.о. меньше, чем 50000 денег не станет как ни старайтесь... Если хотите добавлять 1000 денег, то нужно отлавливать функцию, которая чаще всех будет получать доступ к деньгам.  mov ebx,[eax+65] //функция доступа выглядит примерно так... Далее нужно ввести некую переменную (пусть будет _money), и навесить на неё хоткей чтоб тот присваивал переменной значение 1. Скрипт будет выглядеть так.   cmp dword ptr [_money],1 jne originalcode add [eax+65],#1000 mov [_money],0 //чтоб бесконечного цикла не получилось... originalcode: mov ebx,[eax+65]  на нажатию хоткея добавится 1000 денег (как резко зависит от того, как часто инструкция получает доступ к деньгам) 4. Прыжки Чем меньше флагов в скрипте - тем лучше, но полностью от них отказаться не возможно. По-этому свидём использование их к минимуму. Тут уже сам Dark Byte зачем-то в стандартном шаблоне навтыкал ненужные флаги - а именно exit и originalcode. Покажу вам наглядно как обойтись без них. Подопытным кроликом я использовал игру The Elder Scrolls 3: Morrowind (не кидайтесь плз фикалиями, знаю что старьё). По-мимо прыжков на флаги можно использовать прыжки через байты.   jmp +3 je +3 jne +3  Как видите синтаксис тот же, но изменилось то, что прыгаем через некое колличество байт (указывается в шестнадцатиричной системе счисления) И так, я написал скрипт, который сделает здоровье, ману и выносливость бесконечными.   [ENABLE] alloc(newmem,2048) label(returnhere)  newmem: fstp dword ptr [ecx+08] push [ecx+04] pop [ecx+08] ret 0010 jmp returnhere  "Morrowind.exe"+122F: jmp newmem nop returnhere:   [DISABLE] dealloc(newmem) "Morrowind.exe"+122F: fstp dword ptr [ecx+08] ret 0010 //Alt: db D9 59 08 C2 10 00  и знаю, что в ecx+0c хранится идентификатор героя 746464. Но не знаю через сколько байт нужно прыгнуть, чтобы вразу не приписывалось здоровье и тд. Вычисляется кол-во байт следующим образом. в данном случае мне нужно перепрыгнуть push [ecx+04] и pop [ecx+08]. 1. Активируем скрипт каков он есть. 2. смотрим в отладчике что скрипт делает теперь и замечаем байты нужных нам строк.  Я обвёл красным те байты, которые мне нужно перепрыгнуть. Судя по картинке их 6 (шесть круглешков) Следовательно мне нужно перептыгнуть 6 байт, и мой скрипт будет выглядеть теперь вот так.   [ENABLE] alloc(newmem,2048) label(returnhere)  newmem: fstp dword ptr [ecx+08] cmp [ecx+0C],746464 jne +6 // если не равно перепрыгнуть через 6 байт. push [ecx+04] pop [ecx+08] ret 0010 jmp returnhere  "Morrowind.exe"+122F: jmp newmem nop returnhere:   [DISABLE] dealloc(newmem) "Morrowind.exe"+122F: fstp dword ptr [ecx+08] ret 0010 //Alt: db D9 59 08 C2 10 00  как видите обошёлся двумя флагами (один из которых и флаг и выделение памяти под скрипт).