You are not logged in.
Да и я хз как с лоадером сделать то что я планирую.
Планируешь что?
---
А патчить там много надо? Я только при старте миссий это находил.
Нужен патчик, небольшой инжект в тело ехе.
Можно лоадер сделать.
Я понимаю, что это команда. У меня WMYVA2 атакует PLAYER_ACTORа. Вот
А зачем тогда используешь ее в условии.
Но когда я убиваю WMYVA2, то он не исчезает, не исчезает маркер, и как следствие - WMYVA2 не появляется после смерти.
Я не могу представить чего ты хочешь добиться от этого:
if 05E2: AS_actor 2@ kill_actor $PLAYER_ACTOR else_jump @NONAME_14_112
Используй мой код. 
$SA_VASYA_FLAG == 0
Естественно я ему и аналог-то подобрать затрудняюсь. Разве что:
0489: unknown_actor $PLAYER_ACTOR flag 0
Нет, это я проверяю что актер существует.
Я только не понял, при чем здесь Sanny Builder в заголовке
Так это чтобы легче понять было. Это я так асм с sanny builder'ом сравнивал.
В Sanny Builder для хранения данных используются переменные, в ассемблере данные можно хранить непосредственно в памяти или в регистрах. Основных регистров восемь: EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP. Регистры EAX, EBX, ECX, EDX – можно использовать без ограничения для любых целей. Регистры ESI, EDI, ESP, EBP – имеют более конкретное назначение и могут применяться для хранения всевозможных переменных, только когда они не используются по назначению.
Основной ассемблерной командой является MOV (пересылка данных) ее можно сравнить с оператором присвоения. Равенство:
$a = 16 или $a = 0x10
из Sanny Builder на языке ассемблера записывается примерно так:
MOV EAX, 10 ; ассемблер использует шестнадцатеричную систему счисления
Пересылать данные также можно из регистра в регистр:
MOV EAX, EBX ; записать в регистр EAX значение регистра EBX
Если мы хотим обратится к ячейки памяти, то ее адрес нужно заключить в квадратные скобки (указатель):
MOV EAX, [402000] ; записать в регистр EAX значение по адресу 402000 MOV EAX, [EBX] ; записать в регистр EAX значение по адресу указанному в регистре EBX MOV [402000], EAX ; записать в ячейку памяти с адресом 402000 значение регистра EAX MOV [EAX], EBX ; записать в ячейку памяти с адресом указанным в регистре EAX значение регистра EBX
Если необходимо, то к указателю можно добавить смещение:
MOV EAX, [EBX + 66] ; записать в регистр EAX значение по адресу указанному в регистре EBX со смещением 66 MOV [EAX + 66], EBX ; записать в ячейку памяти с адресом указанным в регистре EAX со смещением 66 значение регистра EBX
Для более удобного хранения данных можно использовать специальную область памяти, которая называется стек. Стек можно представить в виде списка или массива данных. Класть и забирать данные можно только с вершины стека. Таким образом, если в стек положить числа 1, 2, 3, то при чтении они будут получаться в обратном порядке – 3, 2, 1. Для работы со стеком служат команды PUSH и POP. PUSH кладет данные на верхушку стека, а POP снимает их оттуда. Пример:
PUSH 1 ; положить в стек число 1 PUSH 2 ; положить в стек число 2 PUSH 3 ; положить в стек число 3
После выполнения данных команд, стек будет выглядеть так:
3 ; число положенное в стек последним стало первым 2 1 ; число положенное в стек первым стало последним
Стек позволяет сохранять данные в памяти, не заботясь об их абсолютных адресах. Теперь рассмотрим более сложный пример:
MOV EAX, 1 ; записать в регистр EAX число 1, EAX = 1 MOV ECX, 2 ; записать в регистр ECX число 2, ECX = 2 PUSH EAX ; положить в стек значение регистра EAX, т.е. 1 PUSH EСX ; положить в стек значение регистра EСX, т.е. 2 POP EAX ; снять значение с верхушки стека и положить в регистр EAX, EAX = 2 POP EСX ; снять значение с верхушки стека и положить в регистр ECX, ECX = 1
Указатель на вершину стека хранится в регистре ESP:
PUSH 123456 ; положить в стек число 123456 MOV EAX, [ESP] ; записать в регистр EAX значение с верхушки стека, т.е. EAX = 123456
Для того чтобы складывать, вычитать или производить другие действия над двумя числами, одно число необходимо загрузить в регистр, а другое может быть как в регистре, так и в памяти. Рассмотрим основные математические операции.
Для сложения чисел служит команда ADD, для вычитания SUB. Обе команды имеют одинаковый синтаксис:
ADD приемник, источник SUB приемник, источник
Команда ADD складывает источник и приемник, сумму помещает в приемник. Команда SUB вычитает источник из приемника и помещает разность в приемник. Пример:
ADD EAX, 3 ; EAX = EAX + 3 SUB ECX, 5 ; ECX = ECX - 5
В Sanny Builder это выглядит так:
$eax += 3 $ecx -= 5
Для умножения чисел служит команда MUL, для деления DIV. Команды имеют следующий синтаксис:
MUL источник DIV источник
Команда MUL умножает значение регистра EAX на источник, результат помещает в регистр EAX:
MOV EAX, 5 ; EAX = 5 MOV ECX, 7 ; ECX = 7 MUL ECX ; EAX = EAX * ECX = 5 * 7 = 23, ECX = 7
Команда DIV делит значение регистра EAX на источник, результат помещает в регистр EAX, остаток от деления в регистр EDX:
MOV EAX, 64 ; EAX = 64 MOV ECX, 3 ; ECX = 3 DIV ECX ; EAX = EAX / ECX = 64 / 3 = 21, ECX = 3, EDX = 1
Команды MUL и DIV применяются для умножения и деления чисел без знака. Источник может быть регистром, ячейкой памятью, но не может быть числом.
Теперь переедем к условным переходам. Для осуществления условного перехода необходимо сравнить данные и в зависимости от результата перейди в нужную часть программы. Для сравнения используется команда CMP:
CMP приемник, источник
Команда сравнивает приемник с источником и сохраняет результат во флагах. Флаги – это биты специального регистра. Для перехода используют команды JNE или JE. JE перейдет, если источник с приемником равны, а JNE – если неравны. Пример:
CMP EAX, 5 ; сравниваем значение регистра EAX с числом 5 JE 402000 ; если EAX равно 5, то переходим по адресу 402000 MOV EAX, 1 ; если нет, записываем в регистр EAX число 1
Безусловный переход осуществляется командой JMP:
JMP 402000 ; перейти по адресу 402000
Чтобы вызвать функцию используют команду CALL:
CALL 402000 ; вызвать функцию по адресу 402000 CALL EAX ; вызвать функцию по адресу указанному в регистре EAX CALL [EAX] ; вызвать функцию по адресу указанному в ячейки памяти
Возврат из функции осуществляется командой RET.
У меня она называется EnableCheatLegimate - выставить флаг чита, без установки статуса читера.
Это известо
вопрос вот в чем:
А есть еще call с параметром как глобальный адрес. Т.е. там значение не зависит уже от позиции команды, оно постоянно: 0x438370. Но у меня не получается заставить это работать.
1. напрямую (immediate value). Например: call 0x438370 не могу понять как сделать
05E2: AS_actor 2@ kill_actor $PLAYER_ACTOR
Это команда, а не условие.
Используй:
Actor.Dead(2@)
Я уже приводил это код, привиду еще раз, может поможет:
:EXAMPLE
var
$SA_VASYA: Actor
$SA_VASYA_MARKER: Marker
$SA_VASYA_FLAG: Integer = 0
end // var
while true
wait 0
// Создаем актера если, 25.0 < расстояние до игрока < 35.0
if and
$SA_VASYA_FLAG == 0
80FE: not actor $PLAYER_ACTOR 0 2510.2615 -1671.3036 13.4114 radius 25.0 25.0 15.0
00FE: actor $PLAYER_ACTOR 0 2510.2615 -1671.3036 13.4114 radius 35.0 35.0 15.0
then
#WMOICE.Load
while not #WMOICE.Available
wait 0
end
$SA_VASYA_FLAG = 1
$SA_VASYA.Create(CivMale, #WMOICE, 2510.2615, -1671.3036, 13.4114)
$SA_VASYA.Angle = 84.2641
$SA_VASYA_MARKER.CreateAboveActor($SA_VASYA)
end // if
// Проверка, если расстояние от игрока до актера > 35.0
if and
$SA_VASYA_FLAG == 1
80FE: not actor $PLAYER_ACTOR 0 2510.2615 -1671.3036 13.4114 radius 35.0 35.0 15.0
then
$SA_VASYA.RemoveReferences
#WMOICE.Destroy
$SA_VASYA_MARKER.Disable
$SA_VASYA_FLAG = 0
end // if
// Проверка на смерть актера
if and
$SA_VASYA_FLAG == 1
$SA_VASYA.Dead
then
$SA_VASYA.RemoveReferences
#WMOICE.Destroy
$SA_VASYA_MARKER.Disable
$SA_VASYA_FLAG = 0
end // if
// Другие проверки...
end // while
речь шла про команду GTA:LC, там в основном любители
Незнал
только не на рапиду с нее потом хрен скачаешь, а у меня модем лучше сюда через фтп залить
Хорошо
0683: attach_car 2@ to_car 1@ at_offset 3.0 0.0 0.0 rotation 0.0 0.0 0.0
Попробуй поменять оффсет, видимо они отсчитываются от центра самолета.
Думаю никому это не надо 
Завтра выложу что успел написать.
Знаю, что много. Но у меня есть преимущество - я профессионал (и вообще, старый и толстый дядька). Летом будет 15 лет, как у меня в трудовой написано "программист". И дизассемблер я увидел в первый раз почти два десятка лет назад :-) В любом случае, полезной инфы можно будет нарыть много.
Так и у R* профессионалы своего дела, а не дядьки с улицы 
Может объяснишь почему: http://www.sannybuilder.com/forums/view … d=166#p166 (#7 пост)
Могу кинуть базу. (IDA 5.0.0.879).
Выложи на рапиду. Охота посмотреть.
2Seemann:
Я имел ввиду для тех, кто вообще в этом не рубит. Для тебя это не интересно будет. Конечно можно и подробно расписать, но тогда другим будет не понятно.
Вот думаю о чем бы написать, план таков:
1. регистры (eax,ebx и т.д.)
2. стек (push\pop)
4. осн. команды (mov,jmp)
5. арифметические (add,sub,div,mul)
!!! логические (or,xor,not ) - думаю пока не надо !!!
6. условные переходы (cmp, je,jne,jb,jg,jl,ja)
7. вызов функций (call,ret)
8. Др.команды - пока непридумал.
это gta_sa_loader. Запускает игру без заставок, можно переключаться в оконный режим (если разрешение в игре не больше 800x600).
http://www.gtaforums.com/index.php?showtopic=222397
линки в теме.
Кул, теперь хоть олька заработает
, а то softice не ставится 
Основная фишка не в этом, а в том, что ключики из GXT меняются из scm, и можно любой текст выводить не зависимо от GXT.
Это как? Может расскажешь?
Если кому надо могу написать статейку об основных командах ассемблера с примерами. Если не надо, то не напишу.
ну да, только не намного проще будет. Там тогда все значения параметров придется через асм записывать, а удобнее через скм.
А если код содержал 100 строк и два тебе нужных адреса пришлось добавлять ещу 100. А так накидал в стек все параметры, адреса потом
mov eax, dword [esi+X]
а вконце выравнял стек и все
add esp, Y
качется так проще
P.S. это моя недавняя разработка, это я так, просто показать
Хорошо!!! А по каким адресам лежат координаты игрока?
На скриншоте у тебя игра запущена в окнонном режиме? Это как?
ну сам по себе асмовый код не запустится нужно еще через те же массивы запустить его.
Это я знаю
В твоем моде для каждой версии свой асмовский код, а можно все сделать в одном.
это примерно тоже самое как команду inc eax заменить на
mov edx, eax
mov ecx, 1
add edx, ecx
mov eax, edx
ты это о чем? 
зы
Почему для проверки версий используется адрес 8A6168. Можно любой адрес использовать?
Можно еще так:
hex A1 68618A00 // MOV EAX,DWORD PTR DS:[8A6168] 3D 605E4600 // CMP EAX,00465E60 74 00 // JE SHORT X ... end
только нужно вручную считать кол-во байт.
а как сделать чтоб если на него направлена пушка он не поднимал руки в верх а отаковал?
0350: unknown_actor 2@ not_scared_flag 1
как отличить условие от команды?
В OST (Opcode Search Tool):
'^' - показать условие
'-^' - показать команды
Например: 'car ^' - покажет условия, где встречается слово 'car'.
зы лучше ридми почитает там про OST подробно расписанно. 
а какая каманда заставляет актёра атаковать Актёра?
я ничего не нашол
Плохо искал 
05E2: AS_actor 65@ kill_actor 50@
Да то самое, примерно так:
0046ED92 > \32C0 XOR AL,AL ; Cases 711,712,718,71B,71C,71D,720,721,722,725,728,738,739,73A,73D,740,744,748,758,759,764,765,766 of switch 0046D076 0046ED94 . EB 02 JMP SHORT gta_sa.0046ED98 0046ED96 > 0C FF OR AL,0FF ; Default case of switch 0046D076 0046ED98 > 90 NOP 0046ED99 . 90 NOP 0046ED9A .^ E9 0695F9FF JMP gta_sa.004082A5 0046ED9F > 5F POP EDI 0046EDA0 . 5E POP ESI 0046EDA1 . 5D POP EBP 0046EDA2 . 64:890D 00000>MOV DWORD PTR FS:[0],ECX 0046EDA9 . 5B POP EBX 0046EDAA . 81C4 C4000000 ADD ESP,0C4 0046EDB0 . C2 0400 RETN 4
А чтоже опкоды 0662-0664? Они тоже ниче не делают.
Сам же писал
Кстати, все debug опкоды (0662, например) тоже пустышки.
Что в таблицу не занес?
2reinstal:
Попробуй это код (я его не тестил)
create_thread @EXAMPLE
...
// put your mods (threads) here
:EXAMPLE
var
$SA_VASYA: Actor
$SA_VASYA_MARKER: Marker
$SA_VASYA_FLAG: Integer = 0
end // var
while true
wait 0
// Создаем актера если, 25.0 < расстояние до игрока < 35.0
if and
$SA_VASYA_FLAG == 0
80FE: not actor $PLAYER_ACTOR 0 2510.2615 -1671.3036 13.4114 radius 25.0 25.0 15.0
00FE: actor $PLAYER_ACTOR 0 2510.2615 -1671.3036 13.4114 radius 35.0 35.0 15.0
then
#WMOICE.Load
while not #WMOICE.Available
wait 0
end
$SA_VASYA_FLAG = 1
$SA_VASYA.Create(CivMale, #WMOICE, 2510.2615, -1671.3036, 13.4114)
$SA_VASYA.Angle = 84.2641
$SA_VASYA_MARKER.CreateAboveActor($SA_VASYA)
end // if
// Проверка, если расстояние от игрока до актера > 35.0
if and
$SA_VASYA_FLAG == 1
80FE: not actor $PLAYER_ACTOR 0 2510.2615 -1671.3036 13.4114 radius 35.0 35.0 15.0
then
$SA_VASYA.RemoveReferences
#WMOICE.Destroy
$SA_VASYA_MARKER.Disable
$SA_VASYA_FLAG = 0
end // if
// Проверка на смерть актера
if and
$SA_VASYA_FLAG == 1
$SA_VASYA.Dead
then
$SA_VASYA.RemoveReferences
#WMOICE.Destroy
$SA_VASYA_MARKER.Disable
$SA_VASYA_FLAG = 0
end // if
end // while
end_threadтоже самое с тачками если она взорвана или на ней уехяли
чтоб она сново появлялоась
014B: $PARKED_RHINO = init_parked_car_generator #RHINO -1 -1 1 alarm 0 door_lock 0 0 10000 at 2435.3018 -1671.8482 12.8008 angle 90.0 014C: set_parked_car_generator $PARKED_RHINO cars_to_generate_to 0
Чем отличается
04A5: store_dead_actor 72@(43@,4i) position_to $TEMPVAR_FLOAT_1 $TEMPVAR_FLOAT_2 $TEMPVAR_FLOAT_3
04A5: get_actor 17@ approximate_position_3D_coord_to 0@ 1@ 2@
Sanchez wrote:В конце каждого блока идет несколько опкодов, но их нету в скм.
Не совсем понял, что конкретно ты имеешь ввиду (кусок кода)?
У меня в ольке показывается так:
Case XXX of switch 00494005
А вконце каждого блока вот так:
Case default XXX XXX XXX XXX of switch 00494005
где XXX опкоды, в разных блоках их разное кол-во, так вот этих самых опкодов нету в скм.
зы лучше ольку скачай и посмотри, она всего 1 мб
2Seemann:
068D рабочий
Это я перепутал. 
Я просмотрел все блоки вроде больше не нашел.
В конце каждого блока идет несколько опкодов, но их нету в скм.