Другое Полезные сниппеты и SCM-функции

MISTER_GONWIK

Всефорумный гонщик
Автор темы
Всефорумный модератор
1,259
1,737
Код:
//call @convert_string 1 1@
:convert_string
var
    1@: int
    2@: int
    3@: int
    4@: int
    5@: int
end
0C17: 1@ = strlen 0@
dec(1@)
for 2@ = 0 to 1@
    0A8D: 3@ = read_memory 0@ size 1 virtual_protect 0
    if and
    3@ > 191
    3@ < 256
    then
        3@ -= 192
        0AC6: 5@ = label @chars offset
        0C0C: 4@ = struct 5@ offset 3@ size 1
        0A8C: write_memory 0@ size 1 value 4@ virtual_protect 0
    else if 3@ == 168
    then 0A8C: write_memory 0@ size 1 value 69 virtual_protect 0
    else if 3@ == 184
    then 0A8C: write_memory 0@ size 1 value 101 virtual_protect 0
    else if 3@ == 97
    then 0A8C: write_memory 0@ size 1 value 97 virtual_protect 0                   
    end                                           
    end   
    end
    end
    inc(0@)
end 
ret 0
 
:chars                               
hex
    41 80 8B 82 83 45 84 88 85 86 4B 87 4D AD 4F 8C 50 43 8F 59 81 58 89 8D 8E 8A 90 91 92 93 94 95 61 97 A2 99 9A 65 9B 9F 9C 9D 6B 9E AF AE 6F A3 70 63 A6 79 98 78 A0 A4 A5 A1 A7 A8 A9 AA AB AC 00
end
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,447
Получение цвета строки:
Код:
:getChatEntryColor
// 0AB1: @getChatEntryColor 1 id 0@ to 1@
1@ = SAMP.Base() // SAMP Base
1@ += 0x212A6C // stChatInfo
0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
1@ += 310 // stChatEntry
0@ *= 252 // sizeof stChatEntry
005A: 1@ += 0@ //
1@ += 240 // Color
0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 // HEX Color
0AB2: ret 1 1@

Код:
{$CLEO}
 
0000:
 
wait 2000
while true
    wait 0
    0AB1: @getChatEntryColor 1 id 99 to 1@
    0AF8: samp add_message_to_chat "Color ARGB: 0x%X" color 1@ 1@
    wait 1500
end
 
:getChatEntryColor
// 0AB1: @getChatEntryColor 1 id 0@ to 1@
1@ = SAMP.Base() // SAMP Base
1@ += 0x212A24 // stChatInfo
0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
1@ += 306 // stChatEntry
0@ *= 252 // sizeof stChatEntry
005A: 1@ += 0@ //
1@ += 244 // Color
0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 // HEX Color
0AB2: ret 1 1@
 
Последнее редактирование:

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,447
Проверяет игрока(локального, т.е. Вас) на активность(заспавнились ли Вы или ещё "застряли" на авторизации):
Код:
:IsActive
0@ = SAMP.GetSAMPPlayerIDByActorHandle($PLAYER_ACTOR)
0@ = SAMP.GetPlayerStruct(0@)
0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0
if 0@ == 1
then 0485:  return_true
else 059A:  return_false
end
0AB2: 0

Возвращает 1(true), если Вы заспавнились, иначе 0(false).
Работает как условие.

Код:
{$CLEO}
 
0000:
 
while true
    wait 0
    if 0AB1: call @IsActive 0
    then
        0ACD: show_text_highpriority "You are spawned!" time 2000
        wait 2001
        0A93: end_custom_thread
    end
end

P.S. Что-то типо Player.Defined :D
P.S.S. Узнал, что является ещё и проверкой на то, мертвы Вы или нет.
 
Последнее редактирование:
  • Нравится
Реакции: luckyFOX и MogAika

gcode

нестандартное звание звание звание звание звани...
Друг
789
357
CLEO:
:msToTime
/*
Параметры:
  Вход: 0@ - количество миллисекунд
  Выход: 1@ - строка формата HH:MM:SS
Использование:
  0AB1: call @msToTime 1 ms 0@ to 1@
 
  За оптимизацию спасибо M_G
*/
0@ /= 1000
2@ = 0@
2@ /= 3600 // H
3@ = 2@
3@ *= 60
4@ = 0@
4@ /= 60
3@ *= -1
3@ += 4@ // M
4@ = 3@
4@ *= 60
5@ = 2@
5@ *= 3600
4@ += 5@
5@ = 0@
4@ *= -1
4@ += 5@ // S
0AC8: 1@ = allocate_memory_size 9
0AD3: 1@ = format "%02d:%02d:%02d" 5@ 6@ 7@
0AB2: ret 1 1@
 

MISTER_GONWIK

Всефорумный гонщик
Автор темы
Всефорумный модератор
1,259
1,737
PHP:
:msToTime
/*
Параметры:
  Вход: 0@ - количество миллисекунд
  Выход: 1@ - строка формата HH:MM:SS
Использование:
  0AB1: call @msToTime 1 ms 0@ to 1@
*/
0@ /= 1000
2@ = 0@
2@ /= 3600 // H
3@ = 2@
3@ *= 60
4@ = 0@
4@ /= 60
3@ *= -1
3@ += 4@ // M
4@ = 3@
4@ *= 60
5@ = 2@
5@ *= 3600
4@ += 5@
5@ = 0@
4@ *= -1
4@ += 5@ // S
0AC8: 5@ = allocate_memory_size 2
0AC8: 6@ = allocate_memory_size 2
0AC8: 7@ = allocate_memory_size 2
if
    2@ > 9
then
    0AD3: 5@ = format "%d" 2@
else
    0AD3: 5@ = format "0%d" 2@
end
if
    3@ > 9
then
    0AD3: 6@ = format "%d" 3@
else
    0AD3: 6@ = format "0%d" 3@
end
if
    4@ > 9
then
    0AD3: 7@ = format "%d" 4@
else
    0AD3: 7@ = format "0%d" 4@
end
0AC8: 1@ = allocate_memory_size 8
0AD3: 1@ = format "%s:%s:%s" 5@ 6@ 7@
0AC9: free_allocated_memory 5@
0AC9: free_allocated_memory 6@
0AC9: free_allocated_memory 7@
0AB2: ret 1 1@

должно быть вот так
PHP:
:msToTime
0@ /= 1000
0085: 2@ = 0@
2@ /= 3600      // H
0085: 3@ = 2@
3@ *= 60
0085: 4@ = 0@
4@ /= 60
3@ *= -1
005A: 3@ += 4@  // M
0085: 4@ = 3@
4@ *= 60
0085: 5@ = 2@
5@ *= 3600
005A: 4@ += 5@
0085: 5@ = 0@
4@ *= -1
005A: 4@ += 5@  // S
0AC8: 1@ = allocate_memory_size 9
0AD3: 1@ = format "%02d:%02d:%02d" 2@ 3@ 4@
0AB2: ret 1 1@
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,447
Так даже лучше :D :
CLEO:
:msToTime
0A91: 1@ = 0@ DIV 3600000 // H
 
0B14: 20@ = 0@ MOD 3600000
0A91: 2@ = 20@ DIV 60000 // M
 
0B14: 20@ = 0@ MOD 60000
0A91: 3@ = 20@ DIV 1000 // S
0AB2: ret 3 1@ 2@ 3@
 

MISTER_GONWIK

Всефорумный гонщик
Автор темы
Всефорумный модератор
1,259
1,737
PHP:
2@ = 7
//создание нового текстдрава (если изначально не создан)
call @new_td 1 2@

//изменение/получение активности TextDraw'а
call @get_td_status 1 2@ // IF
call @set_td_status 2@ 1/0

//скопировать структуру TextDraw'a #1 в #2
call @copy_td_to_td 2 _id 2 _id 2@

//получить текст из текстдрава
call @get_td_text 1 1@ return: 2@ //возвращает указатель либо 0

//параметры текстдрава
call @set_td_text 2 _id 2@ _text 1@
call @set_td_status 2 _id 2@ _status 1
call @set_td_pos 3 _id 2@ _fx 250.0 _fy 250.0
call @set_td_usebox 2 _id 2@ _status 1
call @set_td_fontstyle 2 _id 2@ _style 3
call @set_td_lettersize 3 _id 2@ _flx 2.0 _fly 3.0
call @set_td_color 2 _id 2@ _color 0xFFFFFFFF
call @set_td_boxcolor 2 _id 2@ _color 0x6000FF60
call @set_td_shadowcolor 2 _id 2@ _color 0xFF000000

PHP:
//////////////////////////////////  GET/SET PARAMS FUNCS  ///////////////////////////////
:new_td
var
    0@: int // id
end
    call @_get_td_ptr 1 0@ return: 1@
    0AC8: 2@ = 3189
    0A8C: write_memory 1@ size 4 value 2@ virtual_protect 0
ret 0

:get_td_text
var
    0@: int // id
end
    call @_get_td_struct 1 0@ return: 1@
    0A8D: 2@ = read_memory 1@ size 1 virtual_protect 0
    if 2@ > 0
    then ret 1 1@   
    end
ret 1 0

:set_td_color
var
    0@: int //id
    1@: int //color
end
    call @_get_td_struct 1 0@ return 2@
    0C0D: struct 2@ offset 3083 size 4 = 1@
ret 0

:set_td_boxcolor
var
    0@: int //id
    1@: int //color
end
    call @_get_td_struct 1 0@ return 2@
    0C0D: struct 2@ offset 3098 size 4 = 1@
ret 0

:set_td_shadowcolor
var
    0@: int //id
    1@: int //color
end
    call @_get_td_struct 1 0@ return 2@
    0C0D: struct 2@ offset 3103 size 4 = 1@
ret 0

:set_td_text
var
    0@: int //id
    1@: int //text
end
    call @_get_td_struct 1 0@ return 2@
    0C13: strcpy destination 2@ source 1@
ret 0

:set_td_lettersize
var
    0@: int    //id
    1@: float  //X
    2@: float  //Y
end
    call @_get_td_struct 1 0@ return 3@
    0C0D: struct 3@ offset 3075 size 4 = 1@
    0C0D: struct 3@ offset 3079 size 4 = 2@
ret 0

:set_td_usebox
var
    0@: int //id
    1@: int //status
end
    call @_get_td_struct 1 0@ return 3@
    0C0D: struct 3@ offset 3089 size 1 = 1@
ret 0

:set_td_pos
var
    0@: int    //id
    1@: float  //X
    2@: float  //Y
end
    call @_get_td_struct 1 0@ return 3@
    0C0D: struct 3@ offset 3115 size 4 = 1@
    0C0D: struct 3@ offset 3119 size 4 = 2@
ret 0

:set_td_fontstyle
var
    0@: int //id
    1@: int //style
end
    call @_get_td_struct 1 0@ return 2@
    0C0D: struct 2@ offset 3111 size 1 = 1@
ret 0

//////////////////////////////  GET/SET STATUS FUNCS  ///////////////////////////////
:get_td_status
var
    0@: int
end
    1@ = SAMP.Base()
    1@ += 2173496
    0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
    1@ += 979
    0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
    1@ -= 18440
    call @_add_offset 2 1@ 0@ return: 2@
    0A8D: 2@ = read_memory 2@ size 4 virtual_protect 0
    if 2@ == 0
    then ret_false
    else ret_true
    end
ret 0

:set_td_status
var
    0@: int // id
    1@: int // status
end
    2@ = SAMP.Base()
    2@ += 2173496
    0A8D: 2@ = read_memory 2@ size 4 virtual_protect 0
    2@ += 979
    0A8D: 2@ = read_memory 2@ size 4 virtual_protect 0
    2@ -= 18440
    call @_add_offset 2 2@ 0@ return: 3@
    0A8C: write_memory 3@ size 4 value 1@ virtual_protect 1
ret 0

//////////////////////////////  COPY STRUCT #1 to #2  ///////////////////////////////
:copy_td_to_td
var
    0@: int // id - in
    1@: int // id - out
end
    call @_get_td_struct 1 0@ return: 2@
    call @_get_td_struct 1 1@ return: 3@
    0C10: memcpy destination 3@ source 2@ size 3189
ret 0

//////////////////////////////////OTHER///////////////////////////////
:_get_td_struct
var
    0@: int // id
end
    1@ = SAMP.Base()
    1@ += 2173496
    0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
    1@ += 979
    0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
    1@ -= 9224
    call @_add_offset 2 1@ 0@ return: 2@
    0A8D: 3@ = read_memory 2@ size 4 virtual_protect 0
ret 1 3@

:_get_td_ptr
var
    0@: int // id
end
    1@ = SAMP.Base()
    1@ += 2173496
    0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
    1@ += 979
    0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
    1@ -= 9224
    call @_add_offset 2 1@ 0@ return: 2@
ret 1 2@

:_add_offset
var
    0@: int // start pool
    1@: int // id
end
    2@ = 4
    006A: 2@ *= 1@
    005A: 0@ += 2@
ret 1 0@

//////////////////////////////////////////////////////////////////////////////////////////////
 
  • Нравится
Реакции: hnnssy

_DK

Новичок
7
20
MISTER_GONWIK написал(а):
:msToTime
0@ /= 1000
0085: 2@ = 0@2@ /= 3600 // H0085: 3@ = 2@3@ *= 60
0085: 4@ = 0@4@ /= 60
3@ *= -1
005A: 3@ += 4@ // M0085: 4@ = 3@4@ *= 60
0085: 5@ = 2@5@ *= 3600
005A: 4@ += 5@0085: 5@ = 0@4@ *= -1
005A: 4@ += 5@ // S0AC8: 1@ = allocate_memory_size 9
0AD3: 1@ = format "%02d:%02d:%02d" 2@ 3@ 4@
0AB2: ret 1 1@
Так нельзя делать. Память ты выделяешь, а где удаление?
MISTER_GONWIK написал(а):
0AC8: 5@ = allocate_memory_size 2
0AC8: 6@ = allocate_memory_size 2
0AC8: 7@ = allocate_memory_size 2if
2@ > 9
then
0AD3: 5@ = format "%d" 2@
else
0AD3: 5@ = format "0%d" 2@
end
Для записи числа здесь ("%d") надо выделить 4 байта на число. Если нужно получить указатль на 4 байта, можно обойтись
Код:
0AC7: 1@ = var 0@ offset

Чую, щас пойдут оправдания "Шо ты хочешь, и так всё работёт!"...
 

_DK

Новичок
7
20
Не совсем правильно поставлен вопрос, но суть понятна. Да, сразу после удаления к строке уже лучше не обращаться.
В данной ситуации лучше передавать в функцию указатель уже на выделенную память:
Код:
:msToTime // 0AB1: call_scm_func @msToTime 1 _src 0@
 
0085: 31@ = 0@
// ...
0AD3: 31@ = format "%02d:%02d:%02d" 2@ 3@ 4@
0AB2: ret 0
Или использовать для записи строки буфер:
Код:
:msToTime
// ...
0AC6: 31@ = label @msToTime_data offset
0AD3: 31@ = format "%02d:%02d:%02d" 2@ 3@ 4@
goto @msToTime_retn
:msToTime_data
hex
00000000 00000000 00000000 00000000
end
:msToTime_retn
0AB2: ret 1 31@
 

MISTER_GONWIK

Всефорумный гонщик
Автор темы
Всефорумный модератор
1,259
1,737
Так нельзя делать. Память ты выделяешь, а где удаление?

Для записи числа здесь ("%d") надо выделить 4 байта на число. Если нужно получить указатль на 4 байта, можно обойтись
Код:
0AC7: 1@ = var 0@ offset

Чую, щас пойдут оправдания "Шо ты хочешь, и так всё работёт!"...

я ничего не имею против, в некоторых моих scm функциях именно так и делается, выделяется память и передаётся указатель на выделенную память, но видишь ли, это в клео так неудобно использовать, так и выделяется там совсем немного, ну в цикле конечно будет не очень умно использовать, верю, так что пару кб за время игры сильно не повлияют (ну я так думаю, что уйдёт пару кб)
 

gcode

нестандартное звание звание звание звание звани...
Друг
789
357
я ничего не имею против, в некоторых моих scm функциях именно так и делается, выделяется память и передаётся указатель на выделенную память, но видишь ли, это в клео так неудобно использовать, так и выделяется там совсем немного, ну в цикле конечно будет не очень умно использовать, верю, так что пару кб за время игры сильно не повлияют (ну я так думаю, что уйдёт пару кб)
В скрипте же потом можно обнулить, независимо от функции. Нет?
 

gcode

нестандартное звание звание звание звание звани...
Друг
789
357
Не тестил, должно работать по идее :)
CLEO:
:get_target_car
/*
Параметры:
  Выход: 0@ - Если нацелен на машину, то вернёт хэндл. Если машины по цели нет, то -1
Использование:
  0AB1: call @get_target_car 0 store_to 0@
*/
0@ = -1
4@ = 1.0
Actor.StorePos($PLAYER_ACTOR, 1@, 2@, 3@)
3@ += 2.0
repeat
    wait 0
    0AA6: call_method 0x514970 0xB6F028 num_params 6 pop 0 0xA49994 0xA499A0 3@ 2@ 1@ 4@
    if
        86BD:  not no_obstacles_between 1@ 2@ 3@ and $13 $14 $15 solid 0 car 1 actor 0 object 0 particle 0
    then
        0@ = 0
        Break
    end
    4@ += 1.0
until 4@ > 800.0
if
    0@ == 0
then
    if
        0AE2: 0@ = random_vehicle_near_point $13 $14 $15 in_radius 1.5 find_next 0 pass_wrecked 0
    then
        wait 0
    else
        0@ = -1
    end
end
0AB2: ret 1 0@
 

gcode

нестандартное звание звание звание звание звани...
Друг
789
357
CLEO:
:get_serial
/*
Спасибо Даниилу за функцию
Параметры:
  Выход: 0@ - Возвращает серийный номер жёсткого диска, который операционная система присваивает при форматировании.
Использование:
if
  0AB1: call @get_serial 0 store_to 0@
then
  wait 0
end
*/
if
      0AA2: 1@ = load_library "kernel32.dll"
then
    0485:  return_true
    if
        0AA4: 2@ = get_proc_address "GetVolumeInformationA" library 1@
    then
        0AC7: 0@ = var 0@ offset
        0AA5: call 2@ num_params 8 pop 0 0 0 0 0 0@ 0 0 0
    end
else
    059A:  return_false  
end
0AA3: free_library 1@
0AB2: ret 1 0@
 

MISTER_GONWIK

Всефорумный гонщик
Автор темы
Всефорумный модератор
1,259
1,737
Код:
//call @get_my_score 0 return: 0@
:get_my_score
    0@ = SAMP.Base()
    0@ += 2173496
    0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0
    0@ += 983
    0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0
    0@ += 32
    0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0
ret 1 0@
 
  • Нравится
Реакции: 1337coder и DubStep_