Только учусь, помогите

FelixxxShooter

Новичок
Автор темы
6
0
Пытаюсь создать клео, с помощью которого можно понять, сколько патрон в обойме пистолета.
Сначала пытался вывести в чат состояние обоймы через формат, но почему-то у меня формат не работает так как надо, и выводит вместо цифры букву.
К примеру даже после такого кода, он выведет букву:

Код:
0AD3: 0@ = format "%d" 2
0AF8: samp add_message_to_chat 0@ color 0xFFFFFF
Могли бы объяснить, почему это происходит?

Теперь к теме. Вот мой код, не ругайтесь сильно

Код:
{$CLEO}
{$NOSOURCE}
0000:

:cmd
wait 0
if and
0AFA:  is_samp_available
0B34: samp register_client_command "test" to_label @cmd_mycmd
jf @cmd
0BDE: pause_thread 0


:cmd_mycmd
0A96: 0@ = actor $PLAYER_ACTOR struct
0A8E: 1@ = 0@ + 0x0008 // int
0A8D: 2@ = read_memory 1@ size 2 virtual_protect 1

if
04A4:   2@ == 3  // @ == constant
jf 0AF8: samp add_message_to_chat "В обойме нет 7 пт" color 0xFFFFFF      
0AF8: samp add_message_to_chat "В обойме 7 пт" color 0xFFFFFF
0B43: samp cmd_ret

И вот вопрос, почему у меня крашит после ввода команды? Видимо условие не правильное, но что именно не правильно не могу пока понять, знаний не хватает.
Прошу обьяснить ошибку подробно, чтобы в будущем я знал, почему такое может произойти.
 
Решение
if and
0AFA: is_samp_available
0B34: samp register_client_command "test" to_label @cmd_mycmd
0b34 - не используется в условиях.
зарегистрировать команду можно так:
CLEO:
while not SAMP.Available()
    wait 0
end
0B34: samp register_client_command "test" to_label @cmd_mycmd
0BDE: pause_thread 0

:cmd_mycmd
chatmsg "hello" -1
cmdret

но почему-то у меня формат не работает так как надо, и выводит вместо цифры букву.
в санни билдере: F10 -> Форматирование -> Регистр букв "как есть".

jf 0AF8: samp add_message_to_chat "В обойме нет 7 пт" color 0xFFFFFF
так нельзя. параметр может содержать только указатель на метку (@имя_метки).
например:
CLEO:
if
0184:   actor $PLAYER_ACTOR health >= 50
jf @if_false
chatmsg "У меня...

astap_

Известный
Всефорумный модератор
626
597
if and
0AFA: is_samp_available
0B34: samp register_client_command "test" to_label @cmd_mycmd
0b34 - не используется в условиях.
зарегистрировать команду можно так:
CLEO:
while not SAMP.Available()
    wait 0
end
0B34: samp register_client_command "test" to_label @cmd_mycmd
0BDE: pause_thread 0

:cmd_mycmd
chatmsg "hello" -1
cmdret

но почему-то у меня формат не работает так как надо, и выводит вместо цифры букву.
в санни билдере: F10 -> Форматирование -> Регистр букв "как есть".

jf 0AF8: samp add_message_to_chat "В обойме нет 7 пт" color 0xFFFFFF
так нельзя. параметр может содержать только указатель на метку (@имя_метки).
например:
CLEO:
if
0184:   actor $PLAYER_ACTOR health >= 50
jf @if_false
chatmsg "У меня больше 50 хп." -1
cmdret

:if_false
chatmsg "У меня меньше 50 хп." -1
cmdret


04A4: 2@ == 3 // @ == constant
этот опкод проверяет значение константы. а у тебя обычная переменная целочисленного типа (int). сравнивать переменные такого типа нужно так:
CLEO:
003B:   2@ == 3  // (int)


0A96: 0@ = actor $PLAYER_ACTOR struct
0A8E: 1@ = 0@ + 0x0008 // int
для получения кол-ва патронов, смещение нужно прибавлять к структуре CWeaponSlot (CPed +0x5A0 ), а не к CPed.

0A8D: 2@ = read_memory 1@ size 2 virtual_protect 1
DWORD m_dwAmmoInClip
значение типа DWORD весит 4 байта, а не 2.
 
  • Нравится
Реакции: FelixxxShooter

FelixxxShooter

Новичок
Автор темы
6
0
для получения кол-ва патронов, смещение нужно прибавлять к структуре CWeaponSlot (CPed +0x5A0 ), а не к CPed.
Можно подробнее об этом? Не могу понять. Лучше с примером. В уроках нашел только про Cped'a, а как с CWeaponSlot работать не нашел в интернете\
 

astap_

Известный
Всефорумный модератор
626
597
Можно подробнее об этом? Не могу понять. Лучше с примером. В уроках нашел только про Cped'a, а как с CWeaponSlot работать не нашел в интернете\
CLEO:
0A96: 0@ = actor $PLAYER_ACTOR struct // CPed
0A8E: 1@ = 0@ + 0x718 // CPed + [byte] Текущий слот оружия 
0A8D: 1@ = read_memory 1@ size 1 virtual_protect 1 // currentSlot (0-12)
006A: 1@ *= 0x1C // cWeaponSlot * 28 bytes
0A8E: 2@ = 0@ + 0x5A0 // CPed + WeaponSlots
005A: 2@ += 1@ // CWeapon
005A: 2@ += 0x8 // CWeapon + dwAmmoInClip
0A8D: 2@ = read_memory 2@ size 4 virtual_protect 1 // currentAmmoInClip

chatmsg "dwAmmoInClip = %d" -1 2@
 

FelixxxShooter

Новичок
Автор темы
6
0
Все равно почему-то не работает. В общем зтея была вообще сделать клео, которое бы отменяло перезарядку, но делало бы это без палевно, с помощью бага самой гта, ну тоесть легально, как все делают на протяжении многих лет. Если вот у тебя в обойме 1 пт, ты меняешь оружие к примеру на кулак, а потом обратно на ган, то у тебя в обойме опять 7 пт. Но бывает забываешь это делать и приходится ждать перезарядку, во время которой тебя уже кильнут.

В моем коде мало того что скрипт не срабатывает, так и в чат ничего не выводится, хотя по сути должен быть спам количества пт, если я все конечно верно понимаю.
Все условия соблюдаю. Зашел на сервер, получил дигл(24), стою, стреляю, - ноль реакции
Код:


Код:
// This file was decompiled using SASCM.ini published by GTAG (http://gtag.gtagaming.com/opcode-database) on 14.6.2013
{$CLEO .cs}

//-------------MAIN---------------
0662: printstring "SYSTEMAIN.3DN.RU"
wait 0
thread "$PLAYER_ACTOR"

:auto
wait 0
if and
0AFA:  is_samp_available
Player.Defined($PLAYER_CHAR)
key_down 49
Actor.HasWeapon($PLAYER_ACTOR, 24)
jf @auto

:menyaem_gun
wait 0
0A96: 0@ = actor $PLAYER_ACTOR struct // CPed
0A8E: 1@ = 0@ + 0x718 // CPed + [byte] ??????? ???? ??????
0A8D: 1@ = read_memory 1@ size 1 virtual_protect 1 // currentSlot (0-12)
006A: 1@ *= 0x1C // cWeaponSlot * 28 bytes
0A8E: 2@ = 0@ + 0x5A0 // CPed + WeaponSlots
005A: 2@ += 1@ // CWeapon
005A: 2@ += 0x8 // CWeapon + dwAmmoInClip
0A8D: 2@ = read_memory 2@ size 4 virtual_protect 1 // currentAmmoInClip

chatmsg "dwAmmoInClip = %d" -1 2@

if
    2@ == 1
jf @auto
chatmsg "îáíîâëÿåì ãàí" -1
01B9: set_actor $PLAYER_ACTOR armed_weapon_to 0
wait 500
01B9: set_actor $PLAYER_ACTOR armed_weapon_to 24
 

astap_

Известный
Всефорумный модератор
626
597
Все равно почему-то не работает. В общем зтея была вообще сделать клео, которое бы отменяло перезарядку, но делало бы это без палевно, с помощью бага самой гта, ну тоесть легально, как все делают на протяжении многих лет. Если вот у тебя в обойме 1 пт, ты меняешь оружие к примеру на кулак, а потом обратно на ган, то у тебя в обойме опять 7 пт. Но бывает забываешь это делать и приходится ждать перезарядку, во время которой тебя уже кильнут.

В моем коде мало того что скрипт не срабатывает, так и в чат ничего не выводится, хотя по сути должен быть спам количества пт, если я все конечно верно понимаю.
Все условия соблюдаю. Зашел на сервер, получил дигл(24), стою, стреляю, - ноль реакции
Код:


Код:
// This file was decompiled using SASCM.ini published by GTAG (http://gtag.gtagaming.com/opcode-database) on 14.6.2013
{$CLEO .cs}

//-------------MAIN---------------
0662: printstring "SYSTEMAIN.3DN.RU"
wait 0
thread "$PLAYER_ACTOR"

:auto
wait 0
if and
0AFA:  is_samp_available
Player.Defined($PLAYER_CHAR)
key_down 49
Actor.HasWeapon($PLAYER_ACTOR, 24)
jf @auto

:menyaem_gun
wait 0
0A96: 0@ = actor $PLAYER_ACTOR struct // CPed
0A8E: 1@ = 0@ + 0x718 // CPed + [byte] ??????? ???? ??????
0A8D: 1@ = read_memory 1@ size 1 virtual_protect 1 // currentSlot (0-12)
006A: 1@ *= 0x1C // cWeaponSlot * 28 bytes
0A8E: 2@ = 0@ + 0x5A0 // CPed + WeaponSlots
005A: 2@ += 1@ // CWeapon
005A: 2@ += 0x8 // CWeapon + dwAmmoInClip
0A8D: 2@ = read_memory 2@ size 4 virtual_protect 1 // currentAmmoInClip

chatmsg "dwAmmoInClip = %d" -1 2@

if
    2@ == 1
jf @auto
chatmsg "îáíîâëÿåì ãàí" -1
01B9: set_actor $PLAYER_ACTOR armed_weapon_to 0
wait 500
01B9: set_actor $PLAYER_ACTOR armed_weapon_to 24
CLEO:
{$CLEO}
0000:

while not SAMP.Available()
    wait 0
end

while true
    wait 0
    if Actor.HasWeapon($PLAYER_ACTOR, 24)
    then
        call @getAmmoInClip 0 5@ // 5@ - кол-во патрон в обойме  
        if 5@ == 1
        then
            01B9: set_actor $PLAYER_ACTOR armed_weapon_to 0
            wait 150
            01B9: set_actor $PLAYER_ACTOR armed_weapon_to 24     
        end
    end
end

:getAmmoInClip
3@ = 0x1C {28 bytes}
4@ = 0x8 {dwAmmoInClip offset}

0A96: 0@ = actor $PLAYER_ACTOR struct
0A8E: 1@ = 0@ + 0x718 
0A8D: 1@ = read_memory 1@ size 1 virtual_protect 1 
006A: 1@ *= 3@ 
0A8E: 2@ = 0@ + 0x5A0 
005A: 2@ += 1@ 
005A: 2@ += 4@ 
0A8D: 2@ = read_memory 2@ size 4 virtual_protect 1 
ret 1 2@
 
  • Нравится
Реакции: FelixxxShooter