You are not logged in.
Не нашел того, что нужно.
И еще кое-что. Как сделать так, чтобы актер целился в землю? То есть дуло в низ. Надо такое положение ему задать.
Offline
@GTASA - Насчет анимаций - зайди на сайт Рюосоке, он там выкладывал нужную тебе прогу.
Так я ему про тоже и говорил. Ты уж определись, что тебе нужно, а что нет.
Offline
Код:
{$CLEO} 0000: wait 1000 :noname454878 while true wait 0 if and 0256: player $PLAYER_CHAR defined 010F: player $PLAYER_CHAR wanted_level > 0 then 0@ = marker.CreateIconWithoutSphere(30, 2743.0, 1316.0, 8.0) 1@ = marker.CreateIconWithoutSphere(30, 2168.66, 2267.96, 15.34) ... 25@ = marker.CreateIconWithoutSphere(30, -2657.0, -144.0, 4.0) 26@ = marker.CreateIconWithoutSphere(30, -2454.0, -166.0, 35.0) else if and 0256: player $PLAYER_CHAR defined 010F: player $PLAYER_CHAR wanted_level == 0 then marker.Disable(0@) marker.Disable(1@) ... marker.Disable(25@) marker.Disable(26@) end end end end_thread
должен при уровне розыска выводить значки, а при его снижении до нуля удалять их, но они не удаляются. В чём причина?
Offline
@WinuX - Я же тебе говорил: "Пользуйся метками".
Вот твой скрипт:
{$VERSION 3.1.0027} {$CLEO .cs} //-------------MAIN--------------- 0000: NOP 0001: wait 1000 ms :Noname_7 0001: wait 0 ms 00D6: if and 0256: player $PLAYER_CHAR defined 010F: player $PLAYER_CHAR wanted_level > 0 004D: jump_if_false @Noname_129 04CE: 0@ = create_icon_marker_without_sphere 30 at 2743.0 1316.0 8.0 04CE: 1@ = create_icon_marker_without_sphere 30 at 2168.66 2267.96 15.34 ... 04CE: 25@ = create_icon_marker_without_sphere 30 at -2657.0 -144.0 4.0 04CE: 26@ = create_icon_marker_without_sphere 30 at -2454.0 -166.0 35.0 0002: jump @Noname_172 :Noname_129 00D6: if and 0256: player $PLAYER_CHAR defined 010F: player $PLAYER_CHAR wanted_level > 0 004D: jump_if_false @Noname_172 0164: disable_marker 0@ 0164: disable_marker 1@ ... 0164: disable_marker 25@ 0164: disable_marker 26@ :Noname_172 0002: jump @Noname_7 004E: end_thread
А в чем ошибка, ты уже сам разберешься.
Специально для тех, кто не умеет читать по английски. Мой ник читается как "ГИР"!!!
Народная мудрость:
Прежде чем задавать вопросы,ПОЧИТАЙ СПРАВКУ!!!!
Offline
ну вот код, ну всё должно работать, декомпилированный такой же!
// This file was decompiled using sascm.ini published by Seemann (http://sannybuilder.com/files/SASCM.rar) on 13.10.2007 {$VERSION 3.1.0027} {$CLEO .cs} //-------------MAIN--------------- 0000: NOP wait 1000 32@ = 0 :Noname_14 wait 10 31@ = Player.WantedLevel($PLAYER_CHAR) if and 31@ > 0 not 32@ > 0 jf @Noname_652 32@ = 1 0@ = Marker.CreateIconWithoutSphere(30, 2743.0, 1316.0, 8.0) 1@ = Marker.CreateIconWithoutSphere(30, 2168.66, 2267.96, 15.34) 2@ = Marker.CreateIconWithoutSphere(30, 2408.0, 1389.0, 22.0) 3@ = Marker.CreateIconWithoutSphere(30, 2034.0, 842.0, 10.0) 4@ = Marker.CreateIconWithoutSphere(30, 2096.0, 1287.0, 10.8) 5@ = Marker.CreateIconWithoutSphere(30, 1987.0, 1543.0, 16.0) 6@ = Marker.CreateIconWithoutSphere(30, 1854.0, 912.0, 10.8) 7@ = Marker.CreateIconWithoutSphere(30, 2540.38, 2527.85, 10.39) 8@ = Marker.CreateIconWithoutSphere(30, 1548.02, 1024.47, 10.39) 9@ = Marker.CreateIconWithoutSphere(30, 1592.91, 2053.83, 10.26) 10@ = Marker.CreateIconWithoutSphere(30, 1971.29, 2330.26, 10.41) 11@ = Marker.CreateIconWithoutSphere(30, 1700.74, 1792.7, 10.41) 12@ = Marker.CreateIconWithoutSphere(30, 2581.0, -1491.0, 24.0) 13@ = Marker.CreateIconWithoutSphere(30, 2296.0, -1696.0, 14.0) 14@ = Marker.CreateIconWithoutSphere(30, 2273.0, -1099.0, 38.0) 15@ = Marker.CreateIconWithoutSphere(30, 2716.0, -1048.0, 66.0) 16@ = Marker.CreateIconWithoutSphere(30, 2614.0, -2496.0, 33.0) 17@ = Marker.CreateIconWithoutSphere(30, 1183.85, -1250.68, 14.7) 18@ = Marker.CreateIconWithoutSphere(30, 1970.0, -1158.0, 21.0) 19@ = Marker.CreateIconWithoutSphere(30, 734.0, -1137.0, 18.0) 20@ = Marker.CreateIconWithoutSphere(30, 2553.76, -2464.31, 13.62) 21@ = Marker.CreateIconWithoutSphere(30, 1204.06, -1613.89, 13.28) 22@ = Marker.CreateIconWithoutSphere(30, 611.21, -1459.63, 14.01) 23@ = Marker.CreateIconWithoutSphere(30, 1116.67, -719.91, 100.17) 24@ = Marker.CreateIconWithoutSphere(30, -1903.1, -466.44, 25.18) 25@ = Marker.CreateIconWithoutSphere(30, -2657.0, -144.0, 4.0) 26@ = Marker.CreateIconWithoutSphere(30, -2454.0, -166.0, 35.0) :Noname_652 wait 10 31@ = Player.WantedLevel($PLAYER_CHAR) if and 31@ == 0 32@ > 0 jf @Noname_14 32@ = 0 Marker.Disable(0@) Marker.Disable(1@) Marker.Disable(2@) Marker.Disable(3@) Marker.Disable(4@) Marker.Disable(5@) Marker.Disable(6@) Marker.Disable(7@) Marker.Disable(8@) Marker.Disable(9@) Marker.Disable(10@) Marker.Disable(11@) Marker.Disable(12@) Marker.Disable(13@) Marker.Disable(14@) Marker.Disable(15@) Marker.Disable(16@) Marker.Disable(17@) Marker.Disable(18@) Marker.Disable(19@) Marker.Disable(20@) Marker.Disable(21@) Marker.Disable(22@) Marker.Disable(23@) Marker.Disable(24@) Marker.Disable(25@) Marker.Disable(26@) jump @Noname_14
что тут неправильно? Хоть убейте, не вижу.
Offline
"Пользуйся метками".
Вредные советы давать не надо. Тогда точно запутается.
Ошибка в этом опкоде:
010F: player $PLAYER_CHAR wanted_level == 0
То, что ты поменял ">" на "==" сути опкода не изменило. Надо так:
810F: not player $PLAYER_CHAR wanted_level > 0
(меньше нуля-то быть все равно не может)
И второе. Не надо комбинировать проверку player.Defined() с другими проверками. Если игрока не существует, то и уровня розыска у него нет. При попытке проверки второго условия при ложном первом может быть крах игры. Смысл в первой проверке пропадает.
Наверное так должен был выглядеть скрипт.
{$CLEO} 0000: wait 1000 while true wait 0 if player.Defined($PLAYER_CHAR) then if 010F: player $PLAYER_CHAR wanted_level > 0 then 0@ = marker.CreateIconWithoutSphere(30, 2743.0, 1316.0, 8.0) 1@ = marker.CreateIconWithoutSphere(30, 2168.66, 2267.96, 15.34) ... 25@ = marker.CreateIconWithoutSphere(30, -2657.0, -144.0, 4.0) 26@ = marker.CreateIconWithoutSphere(30, -2454.0, -166.0, 35.0) else if 810F: not player $PLAYER_CHAR wanted_level > 0 then marker.Disable(0@) marker.Disable(1@) ... marker.Disable(25@) marker.Disable(26@) end end end end
Но в нем нарушена логика
Должно быть что-то вроде этого.
{$CLEO} 0000: wait 1000 while true wait 0 if player.Defined($PLAYER_CHAR) then if 010F: player $PLAYER_CHAR wanted_level > 0 then 0@ = marker.CreateIconWithoutSphere(30, 2743.0, 1316.0, 8.0) 1@ = marker.CreateIconWithoutSphere(30, 2168.66, 2267.96, 15.34) ... 25@ = marker.CreateIconWithoutSphere(30, -2657.0, -144.0, 4.0) 26@ = marker.CreateIconWithoutSphere(30, -2454.0, -166.0, 35.0) //пока есть уровень розыка ждать while true if player.Defined($PLAYER_CHAR) then //если уровень розыска нулевой, преркатить ждать if 810F: not player $PLAYER_CHAR wanted_level > 0 then break end end wait 250 end //почистить за собой marker.Disable(0@) marker.Disable(1@) ... marker.Disable(25@) marker.Disable(26@) end end //и снова во все повторить end
Выравнивание скрипта табуляцией по уровням (как и отказ от меток и переходов) улучшает структурированность программы, ее становится легче читать.
Offline
этими клео-опкодами для работы с файлами мало что можно сделать. Проще наверное вызывать функции из библиотек времени выполнения C++ (fopen, fclose, fread, fwrite, fgets, fscanf, fprintf, fseek). Кстати, это вопрос обещает быть довольно актуальным. Надо будет поэкспериментировать.
Offline
Возвращаюсь к эмуляции нажатия. У меня надо эмулировать бег вперед, но там в списке бег вперед и назад - одна кнопка. Но я все равно попробовал, и у меня имулируется хотьба назад. А мне надо сделать вперд. Как быть?
(на странице 63 велось обсуждение эмуляции кнопок)
Offline
я вполне нормально ими обхожусь:):)
а вот мне форматного ввода-вывода не хватает. Зато теперь можно по нормальному парсить файлы в текстовом формате. Типа вот этого:
1.6e2 12 18.0
И это без подключения чего-либо.
Offline
Но в нем нарушена логика
Должно быть что-то вроде этого.
Спасибо большое, так и должно было быть.
Кстати, как может убираться оружие, кроме опкода 0555? Хочу сделать так, чтобы после прыжка с парашютом он не убирался, а вот найти строку, где он удаляется, что-то не могу.
Offline
Alien, ты мне не ответил, как быть с эмуляцией бега?
Offline
Alien, ты мне не ответил, как быть с эмуляцией бега?
а должен был?
Там все просто. Если по тому адресу памяти записать значение меньше нуля, будет эмулироваться нажатие клавиши ВВЕРХ, если больше, то ВНИЗ. Ну, или наоборот.
Offline
до кучи. Если записать нон-зеро по адресу памяти (0xB73458 + 2*<номер клавиши>) и по адресу
(0xB73458 + 2*<номер клавиши> +0x30), то будет эмулироваться двойное нажатие клавиши. Можно эмулировать быструю езду на байке.
ЗЫ. В этом топике собралось много материалов, которые надо бы как-то оформить в справку или статейник. Или на gtamoding запостить. Может кто-то хочет заняться? я бы и сам сделал, но времени маловато...
Offline
простейший пример получился жжжуткий.
{$CLEO} //открыть файл для чтения 0AB1: call_scm_func @__LabelToOffset 1 @FILENAME 0@ //получить уазатель на имя файла 0AB1: call_scm_func @__LabelToOffset 1 @MODE 1@ //и на режим открытия 0AA7: call_function 0x8232D8 num_params 2 pop 2 mode 1@ filename 0@ store_to 0@ //fopen("test.bin", "rb"); if 0@ == 0 then 0a93: //файл не найден end //передвинуть указатель на 6-й DWORD относительно начала файла //* Seek method constants */ const SEEK_CUR = 1 //относительно текущей позиции указателя SEEK_END = 2 //относительно конца файла SEEK_SET = 0 //относительно начала файла end 0AA7: call_function 0x82374F num_params 3 pop 3 origin SEEK_SET offset 0x14 stream 0@ result 1@ //fseek(file, 0x14, SEEK_SET); if 1@ <> 0 then 0a93: //неудача end //получить уазатель на 1@ 0AB1: call_scm_func @__VarToOffset 1 varnumber 1 result 2@ //прочитать 4 байта из файла в массив 1@ 0AA7: call_function 0x823521 num_params 4 pop 4 PFILE 0@ count 1 size 4 buffer 2@ result 2@ //fread(&buf, 4, 1, file); if 2@ ==0 then 0a93: //неудача end //вывести результат на экран 0513: show_text_box_1number 'SLOT_02' number 1@ //закрыть файл 0AA7: call_function 0x82318B num_params 1 pop 1 PFILE 0@ result 0@ //fclose(file); 0a93: //имя файла :FILENAME hex "test.bin" 00 end {режим открытия файла: r - открыть для чтения w - открыть для записи a - открыть для дозаписи (при открыти указатель ставится в конец файла). t - открыть текстовый файл b - открыть бинарный файл + - если файла нет, создать - - не создавать } :MODE hex "rb" 00 //открыть бинарный файл для чтения, не создавать файл, если его не существует. (Для виндовс нет разницы, бинарный файл или текстовый) end :__LabelToOffset if 0@ == 0 then 0AB2: ret 1 0 end 0A9F: 1@ = current_thread_pointer 1@ += 0x10 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 // baseIP 0062: 1@ -= 0@ // label address 0AB2: ret 1 1@ :__VarToOffset 0A9F: 1@ = current_thread_pointer 0A8E: 2@ = 1@ + 0xDC // mission Flag 0A8D: 2@ = read_memory 2@ size 1 virtual_protect 0 if 2@ == 1 then 1@ = 0x00A48960 // mission locals else 1@ += 0x3C end 0@ *= 4 005A: 1@ += 0@ // address of the local variable 0AB2: ret 1 1@
Да и задача не оправдывает старания. Для работы с бинарными файлами действительно легче воспользоваться cleo-опкодами. Пожалуй, единственная полезная вещь в этом методе - это возможность преобразовывать число в строку и наоборот.
Описания функций можно найти в любом справочнике по C++.
Вот адреса некоторых функций:
Работа с файлами: fopen - 0x8232D8 fclose - 0x82318B fread - 0x823521 fwrite - 0x823674 fgets - 0x823798 fgetc - 0x8231DC fprintf - 0x0823A30 fscanf - не нашел fputs - 0x8262B8 fflush - 0x823E86 Работа со строками: atoi - 0x82258E atol - 0x822506 atoi64 - 0x822593 atof - 0x823CEE sprintf - 0x821BB5 sscanf - 0x8220AD strcpy - 0x69F910 strcat - 0x8265A0 strstr - 0x822650 strcmp - 0x8263C0 strtok - 0x82244B strlen - 0x826330 Работа с кучей: malloc - 0x824257 calloc - 0x824416 free - 0x82413F
Offline
Скажите пожалуйста, как занести в переменную количество патрон игрока, только не всех патрон, а лишь обоймы? Это такое число, стоит после точки.
И еще. А как записать по адресу памяти значение меньше нуля?
Last edited by GTASA (13-11-2009 03:56)
Offline
И еще. А как записать по адресу памяти значение меньше нуля?
0A8C: write_memory 0xC0BC15 size 2 value -0x80 virtual_protect 0
или (что то же самое)
0A8C: write_memory 0xC0BC15 size 2 value 0xFF80 virtual_protect 0
Offline
Где узнать какой флаг за что отвечает и чем отличаются опкоды со словом unknown от обычных опкодов
например 0A3E: от 08E5:
Offline
Где узнать какой флаг за что отвечает и чем отличаются опкоды со словом unknown от обычных опкодов
например 0A3E: от 08E5:
Что-то можно почерпнуть из справки, что-то выясняется в результате тестирования. Если в опкоде есть unknown, значит не всё с ним ясно (например, неизвестный параметр в опкоде или весь опкод).
Last edited by Den_spb (13-11-2009 14:05)
Offline