Вопросы по CLEO-скриптингу

OWSLA

Новичок
32
0
Не получается сделать поиск маркера.
Под рукой был исходник бота by MogAika и его же гайд, только на другом сайте.
Делал прямо все так, как и было в теме.
Вылезает ошибка:
s4M5Ka6a.jpg

Как я понял, нужно объявить все переменные в var, но не понимаю по какому типу.
Код:
PHP:
{$CLEO}
 
0000: NOP
Thread "Buldozer"
 
:start
wait 0
if and
  0AB0: key_precced 105 // np 9
  0AB0: key_precced 104 // np 8
jf @start
 
Actor.StorePos($PLAYER_ACTOR, 10@, 11@, 12@) // Находит позицию игрока и записывает в 0, 1, 2
 
30@ = 5000.0 // Далность нахождения маркера
31@ = -1 // Номер блока ближайшего маркера
 
for 0@ = 0 to 32
1@ = 0@
1@ *= 56
1@ += 0xC7F158
0A8E: 2@ = 1@ + 16 // Нахождение X координаты
0A8D: 20@ = read_memory 2@ size 4 virtual_protect 0
0A8E: 2@ = 1@ + 20 // Нахождение Y координаты
0A8D: 21@ = read_memory 2@ size 4 virtual_protect 0
0A8E: 2@ = 1@ + 24 // Нахождение Z координаты
0A8D: 22@ = read_memory 2@ size 4 virtual_protect 0
0509: 32@ = distance_between_XY 10@ 11@ and_XY 20@ 21@
0A8E: 2@ = 1@ + 4
0A8D: 8@ = read_memory 2@ size 4 virtual_protect 0
 
if and
32@ < 30@
8@ <> 0
then
30@ = 32@
31@ = 0@
end
 
if
31@ <> -1
jf @end
1@ = 31@
1@ *= 56
1@ += 0xC7F158
0A8E: 2@ = 1@ + 16 // Нахождение X координаты
0A8D: 20@ = read_memory 2@ size 4 virtual_protect 0
0A8E: 2@ = 1@ + 20 // Нахождение Y координаты
0A8D: 21@ = read_memory 2@ size 4 virtual_protect 0
0A8E: 2@ = 1@ + 24 // Нахождение Z координаты
0A8D: 22@ = read_memory 2@ size 4 virtual_protect 0

* Пытался найти гоночные чекпоинты.
 

Dark_Knight

Me, me and me.
Друг
4,083
2,110
PHP:
{$CLEO}

if
not 29@ = samp.Base()
then
end_thread
end

repeat
wait 400
until samp.Available()

03F0: enable_text_draw 1 

while true
wait 0
//:getHandlePlayers
var
1@ : handle
$players_handle : array 1000 of handle
end
2@ = 0
for 0@ = 0 to 1000
if SAMP.IsPlayerConnected(0@)
then
1@ = SAMP.GetActorHandleByPlayerID(0@)
if Actor.Defined(1@)
then
$players_handle[2@] = 1@
2@ += 1
actor.StorePos($players_handle[2@], 3@, 4@, 6@)
9@ = samp.GetSAMPPlayerIDByActorHandle($players_handle[2@])
9@ = samp.GetPlayerPing(9@)
call @getScreenXYFrom3DCoords 3 PosX 3@ PosY 4@ PosZ 6@ to posX 7@ posY 8@
0342: set_text_draw_centered 1
081C: draw_text_outline 1 RGBA 0 0 0 255
033F: set_text_draw_letter_size 0.3 1.1
045A: draw_text_1number 7@ 8@ GXT 'NUMBER' number 9@ 
end
end
end
end

:getScreenXYFrom3DCoords
0AA7: call_function 0x70CE30 num_params 6 pop 6 clipNear 1 clipFar 1 yMult 7@s xMult 6@s outVector 2@s inVector 0@s result 29@
0073: 2@ /= 6@
0073: 2@ /= 4@
0073: 3@ /= 7@
0073: 3@ /= 4@
2@ *= 640.0
3@ *= 448.0
0AB2: ret 2 2@ 3@
Из-за чего может крашить?
 

Избранный

Новичок
198
30
PHP:
{$CLEO}
 
if
not 29@ = samp.Base()
then
end_thread
end
 
repeat
wait 400
until samp.Available()
 
03F0: enable_text_draw 1
 
while true
wait 0
//:getHandlePlayers
var
1@ : handle
$players_handle : array 1000 of handle
end
2@ = 0
for 0@ = 0 to 1000
if SAMP.IsPlayerConnected(0@)
then
1@ = SAMP.GetActorHandleByPlayerID(0@)
if Actor.Defined(1@)
then
$players_handle[2@] = 1@
2@ += 1
actor.StorePos($players_handle[2@], 3@, 4@, 6@)
9@ = samp.GetSAMPPlayerIDByActorHandle($players_handle[2@])
9@ = samp.GetPlayerPing(9@)
call @getScreenXYFrom3DCoords 3 PosX 3@ PosY 4@ PosZ 6@ to posX 7@ posY 8@
0342: set_text_draw_centered 1
081C: draw_text_outline 1 RGBA 0 0 0 255
033F: set_text_draw_letter_size 0.3 1.1
045A: draw_text_1number 7@ 8@ GXT 'NUMBER' number 9@
end
end
end
end
 
:getScreenXYFrom3DCoords
0AA7: call_function 0x70CE30 num_params 6 pop 6 clipNear 1 clipFar 1 yMult 7@s xMult 6@s outVector 2@s inVector 0@s result 29@
0073: 2@ /= 6@
0073: 2@ /= 4@
0073: 3@ /= 7@
0073: 3@ /= 4@
2@ *= 640.0
3@ *= 448.0
0AB2: ret 2 2@ 3@
Из-за чего может крашить?
из за этого мб
var
1@ : handle
$players_handle : array 1000 of handle
end
 

Dark_Knight

Me, me and me.
Друг
4,083
2,110
Та я уже нашел ошибку. Рано мне еще работать с массивами =/
 

Dark_Knight

Me, me and me.
Друг
4,083
2,110
Как найти хендл ближайшего игрока в определенном радиусе?
 

OWSLA

Новичок
32
0
Теперь все работает. Спасибо, Легенд.
Мозги кипят уже, деактивацию можешь помочь сделать? Лол.
Задолбался разбираться с одним поиском маркера.
В конец же скрипта нужно, правильно?
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,469
Никак не могу получить "здоровье" машины другого игрока(часть из кода):
Код:
const
    {COLORS}
    COLOR_WHITE = 0xFFFFFF
 
    POS_X = 0@
    POS_Y = 1@
    POS_Z = 2@
    RANDOM_ACTOR = 3@
    RANDOM_ACTOR_CAR = 4@
    RANDOM_ACTOR_CAR_H = 5@
end
 
$PLAYER_ACTOR = Actor.EmulateFromPlayer($PLAYER_CHAR)
Actor.StorePos($PLAYER_ACTOR, POS_X, POS_Y, POS_Z)
if
    0AE2: RANDOM_ACTOR_CAR = random_vehicle_near_point POS_X POS_Y POS_Z in_radius 7.0 find_next 0 pass_wrecked 1
then
    046C: RANDOM_ACTOR = RANDOM_ACTOR_CAR driver
    if and
        Actor.InCar(RANDOM_ACTOR, RANDOM_ACTOR_CAR)
        87D6: not RANDOM_ACTOR == $PLAYER_ACTOR
    then
        0227: RANDOM_ACTOR_CAR_H = RANDOM_ACTOR_CAR
        if
            RANDOM_ACTOR_CAR_H <> 1000.0
        then
            0AF8: samp add_message_to_chat "Здоровье машины: %c00FF00%c%.2f" COLOR_WHITE 123 125 RANDOM_ACTOR_CAR_H
        end
    end
end

Выводит 0.00. Формат: %.2f . Пытался и %f , но безрезультатно.

Помогите :bye:
 

spiceman

GOWNIK <3
104
35
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Там тип int, а не float.
 

OWSLA

Новичок
32
0
Опять нужна помощь. Находит и ТПшит на маркер - все отлично.
Но попадаются некоторые маркеры, на которые ТПшит в воздух и они берутся не сразу, т.е с задержкой.
Сам вопрос: Как сделать, чтобы ТПшило сразу к земле. Может быть я описал все не так корректно, как нужно, но думаю суть изъяснил.

PHP:
{$CLEO}
 
0000: NOP
Thread "Buldozer"
 
var
0@ : integer
1@ : integer
30@ : integer
31@ : integer
32@ : integer
end
 
:start
wait 0
if and
  0AB0: key_precced 105 // np 9
  0AB0: key_precced 104 // np 8
jf @start
 
:Buldozer1
wait 0
Actor.StorePos($PLAYER_ACTOR, 10@, 11@, 12@) // Находит позицию игрока и записывает в 0, 1, 2
 
30@ = 5000.0 // Далность нахождения маркера
31@ = -1 // Номер блока ближайшего маркера
 
for 0@ = 0 to 32
1@ = 0@
1@ *= 56
1@ += 0xC7F158
0A8E: 2@ = 1@ + 16 // Нахождение X координаты
0A8D: 20@ = read_memory 2@ size 4 virtual_protect 0
0A8E: 2@ = 1@ + 20 // Нахождение Y координаты
0A8D: 21@ = read_memory 2@ size 4 virtual_protect 0
0A8E: 2@ = 1@ + 24 // Нахождение Z координаты
0A8D: 22@ = read_memory 2@ size 4 virtual_protect 0
0509: 32@ = distance_between_XY 10@ 11@ and_XY 20@ 21@
0A8E: 2@ = 1@ + 4
0A8D: 8@ = read_memory 2@ size 4 virtual_protect 0
 
if and
32@ < 30@
8@ <> 0
then
30@ = 32@
31@ = 0@
end
 
:End
wait 0
if
31@ <> -1
jf @End
1@ = 31@
1@ *= 56
1@ += 0xC7F158
0A8E: 2@ = 1@ + 16 // Нахождение X координаты
0A8D: 20@ = read_memory 2@ size 4 virtual_protect 0
0A8E: 2@ = 1@ + 20 // Нахождение Y координаты
0A8D: 21@ = read_memory 2@ size 4 virtual_protect 0
0A8E: 2@ = 1@ + 24 // Нахождение Z координаты
0A8D: 22@ = read_memory 2@ size 4 virtual_protect 0
 
:Buldozer2
wait 0
Actor.PutAt($PLAYER_ACTOR, 20@, 21@, 22@)
jump @Buldozer3
 
:Buldozer3
wait 0
if and
  0AB0: key_precced 105 // np 9
  0AB0: key_precced 104 // np 8
jf @Buldozer3
jump @Buldozer1
 

MogAika

Известный
Автор темы
Друг
237
444
Опять нужна помощь. Находит и ТПшит на маркер - все отлично.
Но попадаются некоторые маркеры, на которые ТПшит в воздух и они берутся не сразу, т.е с задержкой.
Сам вопрос: Как сделать, чтобы ТПшило сразу к земле. Может быть я описал все не так корректно, как нужно, но думаю суть изъяснил.

Перед телепортацией вычитаешь из Z координаты маркера 1.0