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

hnnssy

Известный
Друг
2,684
2,751
Вообщем, захотел я FPS Counter перевести с textdraw в render, но так как render не поддерживает форматирование, я сделал вот так:
CLEO:
0B6D: render 0@ = create_font "Arial" height 11 flags 5
wait 2000
const
TIMER_OFFSET = 0xB7CB84
end
:FPSON
wait 0
0AB0: 79  
0AC8: 0@ = allocate_memory_size 100
0AD3: 0@ = format "FPS %s" 1@
while true
call @FPS 7 in 0@ 1@ 2@ 3@ 4@ 5@ 6@ out 0@ 1@ 2@ 3@ 4@ 5@ 6@
0092: 8@ = float 6@ to_integer
0AD3: 8@ = format "FPS %s" 1@
0B6F: render font 8@ draw_text "FPS %d" pos 100 100 color 0xFFff0000
end

0@ = 0.0
1@ = 0.0
2@ = 0.0
3@ = 0.0
4@ = 0.0
5@ = 0
6@ = 0.0

:FPS
// in: 0@ - frameCounter, 1@, 2@, 3@, 4@ - fpsBuf, 5@ - fpsTime, 6@ - fpsDisplay. out: 0@ - frameCounter, 1@, 2@, 3@, 4@ - fpsBuf, 5@ - fpsTime, 6@ - fpsDisplay
0@ += 1.0 // fpsFrameCounter++;
0A8D: 7@ = read_memory TIMER_OFFSET size 4 virtual_protect 0 // GetTickCount
0085: 8@ = 7@ // (int)
0062: 7@ -= 5@ // (int)
if 7@ > 240 // if ( (GetTickCount() - 250) > fps_time )
then
0087: 4@ = 3@ // fpsBuf4 = fpsBuf3;
0087: 3@ = 2@ // fpsBuf3 = fpsBuf2;
0087: 2@ = 1@ // fpsBuf2 = fpsBuf1;

// fpsBuf1 = ( fpsFrameCounter * 4 );
0087: 1@ = 0@
1@ *= 4.0

// fpsDisplay = ( fpsBuf1 + fpsBuf2 + fpsBuf3 + fpsBuf4 ) / 4.0;
0087: 6@ = 1@
005B: 6@ += 2@ // (float)
005B: 6@ += 3@ // (float)
005B: 6@ += 4@ // (float)
6@ /= 4.0

// fpsFrameCounter = 0;
0@ = 0.0

// fps_time = GetTickCount();
0085: 5@ = 8@
end
ret 7 0@ 1@ 2@ 3@ 4@ 5@ 6@
Ну активация должна быть на букву O, даже не нажимая на неё, появляется три сиджея, и игра начинает бесоёбить
while true
call @fps 7 in 0@ 1@ 2@ 3@ 4@ 5@ 6@ out 0@ 1@ 2@ 3@ 4@ 5@ 6@
0092: 8@ = float 6@ to_integer
0AD3: 8@ = format "FPS %s" 1@
0B6F: render font 8@ draw_text "FPS %d" pos 100 100 color 0xFFff0000
end

Тут бесконечный цикл, wait 0 нужен. И для 8@ не выделена память. Да и вообще бред какой-то. Смысл получать в 8@ переведённую в интеджер 6@ и сразу же перезаписывать?
 

hnnssy

Известный
Друг
2,684
2,751
CLEO:
:FPSON 
wait 0
0AB0: 79   
0AC8: 0@ = allocate_memory_size 100
0AC8: 8@ = allocate_memory_size 100
0AD3: 0@ = format "FPS %s" 1@
while true
wait 0
call @FPS 7 in 0@ 1@ 2@ 3@ 4@ 5@ 6@ out 0@ 1@ 2@ 3@ 4@ 5@ 6@
0AD3: 8@ = format "FPS %s" 1@
0B6F: render font 8@ draw_text "FPS %d" pos 100 100 color 0xFFff0000
end

0@ = 0.0
1@ = 0.0
2@ = 0.0
3@ = 0.0
4@ = 0.0
5@ = 0
6@ = 0.0

:FPS
// in: 0@ - frameCounter, 1@, 2@, 3@, 4@ - fpsBuf, 5@ - fpsTime, 6@ - fpsDisplay. out: 0@ - frameCounter, 1@, 2@, 3@, 4@ - fpsBuf, 5@ - fpsTime, 6@ - fpsDisplay
0@ += 1.0 // fpsFrameCounter++;
0A8D: 7@ = read_memory TIMER_OFFSET size 4 virtual_protect 0 // GetTickCount
0085: 8@ = 7@ // (int)
0062: 7@ -= 5@ // (int)
if 7@ > 240 // if ( (GetTickCount() - 250) > fps_time )
then
0087: 4@ = 3@ // fpsBuf4 = fpsBuf3;
0087: 3@ = 2@ // fpsBuf3 = fpsBuf2;
0087: 2@ = 1@ // fpsBuf2 = fpsBuf1;

// fpsBuf1 = ( fpsFrameCounter * 4 );
0087: 1@ = 0@
1@ *= 4.0

// fpsDisplay = ( fpsBuf1 + fpsBuf2 + fpsBuf3 + fpsBuf4 ) / 4.0;
0087: 6@ = 1@
005B: 6@ += 2@ // (float)
005B: 6@ += 3@ // (float)
005B: 6@ += 4@ // (float)
6@ /= 4.0

// fpsFrameCounter = 0;
0@ = 0.0

// fps_time = GetTickCount();
0085: 5@ = 8@
end
ret 7 0@ 1@ 2@ 3@ 4@ 5@ 6@
jump @FPSON
Где создание шрифта? Что за говно ты вообще рендеришь? Ты задавал формат переменной просто так? И зачем 0AD3: 0@ = format "FPS %s" 1@? И ФПС в %d, а не %s.
 

DubStep_

Известный
292
52
Посоны что сдесь не так? Вроде беру онфутку, вставляю байт с хп там же uint8_t это по идее целое число.. Так вот.. Крашит почему-то... гляньте что не так
Код:
:src
wait 0
if 0@ == true
jf @src
0B2B: samp 1@ = get_player_id_by_actor_handle $Player_Actor
0BBA: samp store_player 1@ onfoot_data 2@
alloc 2@ 68
0C0D: struct 2@ offset 34 size 1 = 50
0BC0: samp send_onfoot_data 2@
free 2@
wait 100
jump @src
Тип | Размер
float, dword | 4
int32, word | 2
byte, bool | 1
 

hnnssy

Известный
Друг
2,684
2,751
Посоны что сдесь не так? Вроде беру онфутку, вставляю байт с хп там же uint8_t это по идее целое число.. Так вот.. Крашит почему-то... гляньте что не так
Код:
:src
wait 0
if 0@ == true
jf @src
0B2B: samp 1@ = get_player_id_by_actor_handle $Player_Actor
0BBA: samp store_player 1@ onfoot_data 2@
alloc 2@ 68
0C0D: struct 2@ offset 34 size 1 = 50
0BC0: samp send_onfoot_data 2@
free 2@
wait 100
jump @src
Сначала выделяешь память, и после этого записываешь в неё онфут данные.
Я хотел просканировать рендер как строку, потом вывести фпс на экран
Шрифт я создал в самом начале кода
0B6F: render font 8@ draw_text "FPS %d" pos 100 100 color 0xFFff0000
Ты вместо шрифта используешь стринг, а вместо нужного стринга неведомую хуйню.
 

AWRage

Активный
642
141
Почему не работает? :с
CLEO:
{$CLEO}
0000: 'AW_Rage'

const
  script = 20@
end

repeat
wait 0
until samp.available
0B34: samp register_client_command "son" to_label @ScriptON
0B34: samp register_client_command "soff" to_label @ScriptOFF
alloc 10@ 128

while true
if script == true
then
  if 0@ > 999
  then
    0@ = -1
  end
  0@ += 1
  if
  0B23: is_player_connected 0@
  then
    0B20: 1@ = actor_handle_by_samp_player_id 0@
    if
    056D: actor 1@ defined
    then
      0B25: 2@ = get_player_health 0@
      0AD3: 10@ = format "Êîë-âî ÕÏ: %i" 2@
      04C4: store_coords_to 3@ 4@ 5@ from_actor 1@ with_offset 0.0 0.0 1.0
      0C45: samp create_3d_text id 0 text 10@ color 0xFFFFFF position 3@ 4@ 5@ view_distance 100.0 show_behind_walls 1 attached_to_player -1 attached_to_vehicle -1
    end
  end
end   
wait 0
end

:ScriptON
script = true
cmdret

:ScriptOFF
script = false
cmdret
 

DubStep_

Известный
292
52
Почему не работает? :с
CLEO:
{$CLEO}
0000: 'AW_Rage'

const
  script = 20@
end

repeat
wait 0
until samp.available
0B34: samp register_client_command "son" to_label @ScriptON
0B34: samp register_client_command "soff" to_label @ScriptOFF
alloc 10@ 128

while true
if script == true
then
  if 0@ > 999
  then
    0@ = -1
  end
  0@ += 1
  if
  0B23: is_player_connected 0@
  then
    0B20: 1@ = actor_handle_by_samp_player_id 0@
    if
    056D: actor 1@ defined
    then
      0B25: 2@ = get_player_health 0@
      0AD3: 10@ = format "Êîë-âî ÕÏ: %i" 2@
      04C4: store_coords_to 3@ 4@ 5@ from_actor 1@ with_offset 0.0 0.0 1.0
      0C45: samp create_3d_text id 0 text 10@ color 0xFFFFFF position 3@ 4@ 5@ view_distance 100.0 show_behind_walls 1 attached_to_player -1 attached_to_vehicle -1
    end
  end
end  
wait 0
end

:ScriptON
script = true
cmdret

:ScriptOFF
script = false
cmdret
Тебя крашнет полюбасу, тк стоят ограничения на 3Д тексты, и код не проверял, возможно не рабочий
 
  • Нравится
Реакции: AWRage

hnnssy

Известный
Друг
2,684
2,751
Посоны что сдесь не так? Вроде беру онфутку, вставляю байт с хп там же uint8_t это по идее целое число.. Так вот.. Крашит почему-то... гляньте что не так
Код:
:src
wait 0
if 0@ == true
jf @src
0B2B: samp 1@ = get_player_id_by_actor_handle $Player_Actor
0BBA: samp store_player 1@ onfoot_data 2@
alloc 2@ 68
0C0D: struct 2@ offset 34 size 1 = 50
0BC0: samp send_onfoot_data 2@
free 2@
wait 100
jump @src
Сначала выделяешь память, и после этого записываешь в неё онфут данные.
Я хотел просканировать рендер как строку, потом вывести фпс на экран
Шрифт я создал в самом начале кода
0B6F: render font 8@ draw_text "FPS %d" pos 100 100 color 0xFFff0000
Ты вместо шрифта используешь
Так то я выделил если ты не заметил... alloc 2@ 68
Дебил? СНАЧАЛА ВЫДЕЛЯЕШЬ ПАМЯТЬ, ПОТОМ ЗАПИСЫВАЕШЬ В НЕЁ ОНФУТ. У тебя наоборот.
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,462
CLEO:
{$CLEO}

0000:

0B6D: render 0@ = create_font "Arial" height 11 flags 5
alloc 1@ 128

while true
    wait 0
    format 1@ = "FPS %d" 65535
    0B6F: render font 0@ draw_text 1@ pos 100 100 color 0xffff0000
end
 

hnnssy

Известный
Друг
2,684
2,751
При запуске игры запускается клео в котором выводится рендер, и плюс две команды регистрируются, всё нормально. При вводе команды рендер пропадает, и его никак не вернуть. Как исправить? Если ввожу jump на рендер, после cmdret (или до cmdret), то игра вылетает.
CLEO:
{$CLEO}
0000:
wait 2000

reg_cmd "cmd1" @cmd1
reg_cmd "cmd2" @cmd2

while true
wait 0
// тут рендер
end

:cmd1
// код команды
cmd_ret

:cmd2
// код команды
cmd_ret
 

DubStep_

Известный
292
52
CLEO:
{$CLEO}
{$INCLUDE SF}
0000:
// KYRLYK_DEV TOOLS 0.3.7
0B34: samp register_client_command "sinfo" to_label @Help
0B34: samp register_client_command "ppos" to_label @ppos
0B34: samp register_client_command "sbar" to_label @FPSON
0B6D: render 0@ = create_font "Arial" height 11 flags 5
wait 2000
0B78: log "[KYRLYK] sInfo Loaded!"
0AF8: samp add_message_to_chat "[KYRLYK] sInfo çàïóùåí!" color 0xFF0000
0AF8: samp add_message_to_chat "[KYRLYK] Äëÿ ïðîñìîòðà êîìàíä ââåäèòå /sinfo" color 0xFF0000

:FPSON 
alloc 1@ 128
alloc 5@ 128
while true
    wait 0
    actor.StorePos($PLAYER_ACTOR, 2@, 3@, 4@)
    0B2B: samp 6@ = get_player_id_by_actor_handle $PLAYER_ACTOR
    0B36: samp 7@ = get_player_nickname 6@
    format 1@ = "| X: %G | Y: %G | Z: %G |" 2@ 3@ 4@
    0B6F: render font 0@ draw_text 1@ pos 300 0 color 0xffff0000
    format 5@ = "| Nick: %s | ID: %d |" 7@ 6@
    0B6F: render font 0@ draw_text 5@ pos 14 388 color 0xffff0000
end



:Help
0AF8: samp add_message_to_chat "sInfo êîìàíäû:" color 0x00FF00
0AF8: samp add_message_to_chat "/ppos <id> - Óçíàòü êîîðäèíàòû èãðîêà" color 0xFF0000
samp.CmdRet

:ppos
0B35: samp 0@ = get_last_command_params
if 0AD4: 1@ = scan_string 0@ format "%d" 2@
then
    0B20: samp 3@ = actor_handle_by_samp_player_id 2@
    if 0B23:  samp is_player_connected 2@
    then
        if 056D:  actor 3@ defined
        then
            actor.StorePos(3@, 4@, 5@, 6@)
            0AF8: samp add_message_to_chat "[pPos] Êîîðäèíàòû èãðîêà: {00FF00}| X: %G | Y: %G | Z: %G |" color 0xFF00FF 4@ 5@ 6@
            else 0AF8: samp add_message_to_chat "[pPos] Èãðîê íå íàéäåí!" color 0xFF0000
        end
        else 0AF8: samp add_message_to_chat "[pPos] Èãðîê íå ïîäêëþ÷åí!" color 0xFF0000
    end
    else 0AF8: samp add_message_to_chat "[pPos] /ppos <playerid>" color 0xFF0000
end
samp.CmdRet
%G на %.2f
 

ArtyomG

Известный
21
0
Почему при использовании этой функции компилятор выдает ошибку:
Неверное выражение 1@ = Memory.Read(1@,4,0).
Одна из переменных имеет неизвестный тип, либо их типы несовместимы.
Функция:
CLEO:
:Noname_473
1@ = SAMP.Base()
1@ += 2173476
1@ = Memory.Read(1@, 4, 0)
1@ += 310
0@ *= 252
005A: 1@ += 0@ // (int)
1@ += 28
0AB2: ret 1 1@
 

Dark_Knight

Me, me and me.
Друг
4,067
2,081
Почему при использовании этой функции компилятор выдает ошибку:
Неверное выражение 1@ = Memory.Read(1@,4,0).
Одна из переменных имеет неизвестный тип, либо их типы несовместимы.
Функция:
CLEO:
:Noname_473
1@ = SAMP.Base()
1@ += 2173476
1@ = Memory.Read(1@, 4, 0)
1@ += 310
0@ *= 252
005A: 1@ += 0@ // (int)
1@ += 28
0AB2: ret 1 1@
Замени на опкод.