#1626 08-11-2009 08:30

GTASA
Registered: 13-09-2008
Posts: 476

Re: Один вопрос

Не нашел того, что нужно.

И еще кое-что. Как сделать так, чтобы актер целился в землю? То есть дуло в низ. Надо такое положение ему задать.

Offline

#1627 08-11-2009 09:52

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: Один вопрос

Gyr wrote:

@GTASA - Насчет анимаций - зайди на сайт Рюосоке, он там выкладывал нужную тебе прогу.

Так я ему про тоже и говорил. Ты уж определись, что тебе нужно, а что нет.

Offline

#1628 08-11-2009 15:51

WinuX
Registered: 06-03-2009
Posts: 138

Re: Один вопрос

Код:

{$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

#1629 08-11-2009 16:31

Gyr
From: Серпухов
Registered: 03-02-2009
Posts: 246
Website

Re: Один вопрос

@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

#1630 08-11-2009 18:51

WinuX
Registered: 06-03-2009
Posts: 138

Re: Один вопрос

ну вот код, ну всё должно работать, декомпилированный такой же!

// 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

#1631 08-11-2009 19:27

Alien
Registered: 12-10-2008
Posts: 564

Re: Один вопрос

"Пользуйся метками".

Вредные советы давать не надо. Тогда точно запутается.
Ошибка в этом опкоде:

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

#1632 09-11-2009 21:12

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: Один вопрос

допустим я записал в файл 10 чесел dword
как мне прочитать скажем 6 число из файла


I know everything and nothing...

Offline

#1633 09-11-2009 21:59

3Doomer
From: КаZан
Registered: 14-05-2008
Posts: 659
Website

Re: Один вопрос

в каком порядке писал, в таком и считывай


GIMS developer

Offline

#1634 09-11-2009 23:03

Alien
Registered: 12-10-2008
Posts: 564

Re: Один вопрос

этими клео-опкодами для работы с файлами мало что можно сделать. Проще наверное вызывать функции из библиотек времени выполнения C++ (fopen, fclose, fread, fwrite, fgets, fscanf, fprintf, fseek). Кстати, это вопрос обещает быть довольно актуальным. Надо будет поэкспериментировать.

Offline

#1635 10-11-2009 06:08

3Doomer
From: КаZан
Registered: 14-05-2008
Posts: 659
Website

Re: Один вопрос

я вполне нормально ими обхожусь:):)


GIMS developer

Offline

#1636 10-11-2009 10:09

GTASA
Registered: 13-09-2008
Posts: 476

Re: Один вопрос

Возвращаюсь к эмуляции нажатия. У меня надо эмулировать бег вперед, но там в списке бег вперед и назад - одна кнопка. Но я все равно попробовал, и у меня имулируется хотьба назад. А мне надо сделать вперд. Как быть?

(на странице 63 велось обсуждение эмуляции кнопок)

Offline

#1637 11-11-2009 07:34

Alien
Registered: 12-10-2008
Posts: 564

Re: Один вопрос

3Doomer wrote:

я вполне нормально ими обхожусь:):)

а вот мне форматного ввода-вывода не хватает. Зато теперь можно по нормальному парсить файлы в текстовом формате. Типа вот этого:

1.6e2 12 18.0

И это без подключения чего-либо.

Offline

#1638 11-11-2009 08:29

WinuX
Registered: 06-03-2009
Posts: 138

Re: Один вопрос

Но в нем нарушена логика
Должно быть что-то вроде этого.

Спасибо большое, так и должно было быть.
Кстати, как может убираться оружие, кроме опкода 0555? Хочу сделать так, чтобы после прыжка с парашютом он не убирался, а вот найти строку, где он удаляется, что-то не могу.

Offline

#1639 11-11-2009 09:22

3Doomer
From: КаZан
Registered: 14-05-2008
Posts: 659
Website

Re: Один вопрос

парашют и есть оружие, потому другое из рук убирается


GIMS developer

Offline

#1640 11-11-2009 10:07

GTASA
Registered: 13-09-2008
Posts: 476

Re: Один вопрос

Alien, ты мне не ответил, как быть с эмуляцией бега?

Offline

#1641 11-11-2009 13:45

Alien
Registered: 12-10-2008
Posts: 564

Re: Один вопрос

GTASA wrote:

Alien, ты мне не ответил, как быть с эмуляцией бега?

а должен был?
Там все просто. Если по тому адресу памяти записать значение меньше нуля, будет эмулироваться нажатие клавиши ВВЕРХ, если больше, то ВНИЗ. Ну, или наоборот.

Offline

#1642 11-11-2009 14:00

3Doomer
From: КаZан
Registered: 14-05-2008
Posts: 659
Website

Re: Один вопрос

128 и -128 будет более правильно


GIMS developer

Offline

#1643 11-11-2009 14:19

Alien
Registered: 12-10-2008
Posts: 564

Re: Один вопрос

до кучи. Если записать нон-зеро по адресу памяти (0xB73458 +  2*<номер клавиши>) и по адресу
(0xB73458 +  2*<номер клавиши> +0x30), то будет эмулироваться двойное нажатие клавиши. Можно эмулировать быструю езду на байке.

ЗЫ. В этом топике собралось много материалов, которые надо бы как-то оформить в справку или статейник. Или на gtamoding запостить. Может кто-то хочет заняться? я бы и сам сделал, но времени маловато...

Offline

#1644 12-11-2009 14:22

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: Один вопрос

@Alien

А ты бы пример не показал бы, как не перебирая, считыванием именно, например, 6 число считать.


I know everything and nothing...

Offline

#1645 12-11-2009 19:00

Alien
Registered: 12-10-2008
Posts: 564

Re: Один вопрос

простейший пример получился жжжуткий.

{$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

#1646 13-11-2009 03:34

GTASA
Registered: 13-09-2008
Posts: 476

Re: Один вопрос

Скажите пожалуйста, как занести в переменную количество патрон игрока, только не всех патрон, а лишь обоймы? Это такое число, стоит после точки.

И еще. А как записать по адресу памяти значение меньше нуля?

Last edited by GTASA (13-11-2009 03:56)

Offline

#1647 13-11-2009 07:43

Alien
Registered: 12-10-2008
Posts: 564

Re: Один вопрос

GTASA wrote:

И еще. А как записать по адресу памяти значение меньше нуля?

0A8C: write_memory 0xC0BC15 size 2 value -0x80 virtual_protect 0
или (что то же самое)
0A8C: write_memory 0xC0BC15 size 2 value 0xFF80 virtual_protect 0

Offline

#1648 13-11-2009 08:21

Kostyan
Registered: 27-09-2009
Posts: 94

Re: Один вопрос

Где узнать какой флаг за что отвечает и чем отличаются опкоды со словом unknown от обычных опкодов
например 0A3E:  от  08E5:

Offline

#1649 13-11-2009 11:20

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: Один вопрос

Спасибо Alien.
Да, приемчик то действительно жжжутковат.


I know everything and nothing...

Offline

#1650 13-11-2009 14:02

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Один вопрос

Kostyan wrote:

Где узнать какой флаг за что отвечает и чем отличаются опкоды со словом unknown от обычных опкодов
например 0A3E:  от  08E5:

Что-то можно почерпнуть из справки, что-то выясняется в результате тестирования. Если в опкоде есть unknown, значит не всё с ним ясно (например, неизвестный параметр в опкоде или весь опкод).

Last edited by Den_spb (13-11-2009 14:05)

Offline

Board footer

Powered by FluxBB