000162. Используем scm-функции в качестве проверок

Используем scm-функции в качестве проверок|Вроде нигде не видел подобного урока, поэтому решил написать о использовании scm-функции в качестве проверок.|BoPoH|BoPoH||||Впрочем, тут и писать особо нечего. Например, вам нужно сделать scm-функцию поиска педа в радиусе с определённым ID модели. Выглядеть она будет примерно так:

:SearchPedWithModel
/*
 0AB1: @SearchPedWithModel 5 point 0@ 1@ 2@ radius 40.0 model 7 get_handle 5@
*/

if
0AE1: 5@ = random_actor_near_point 0@ 1@ 2@ in_radius 3@ find_next 0 pass_deads 0
then
 if
 02F2: actor 5@ model == 4@
 then
 0AB2: ret 1 5@
 end
 
 while 0AE1: 5@ = random_actor_near_point 0@ 1@ 2@ in_radius 3@ find_next 1 pass_deads 0
 if
 02F2: actor 5@ model == 4@
 then
 0AB2: ret 1 5@
 end
 end
end
0AB2: ret 1 0

В основном коде вы можете сделать так:

0AB1: @SearchPedWithModel 5 point 0@ 1@ 2@ radius 40.0 model 7 get_handle 5@
if
056D: actor 5@ defined
then
 // выполняем действие
end

Но, согласитесь, было бы гораздо удобнее иметь такую конструкцию:

if
0AB1: @SearchPedWithModel 5 point 0@ 1@ 2@ radius 40.0 model 7 get_handle 5@
then
 // выполняем действие
end

Для того, чтобы такая конструкция сработала, нам необходимо вставить следующие строки в функцию перед возвратом значения:

0A9F: 0@ = current_thread_pointer
0AA6: call_method 0x4859D0 struct 0@ num_params 1 pop 0 return 0xFF

Вместо переменной 0@ здесь можно использовать любую удобную переменную, главное заменить её в обеих строках. Значение 0xFF в конце означает возвращаемое булевое значение: если вы укажете 0xFF, то функция вернёт true, а если укажете 0, то функция вернёт false.

Однако, если мы захотим использовать несколько проверок в основном коде сразу ( if and или if or ), то нашу функцию нужно ставить в самое начало проверок. К тому же, если мы захотим использовать сразу несколько функций-проверок, то они будут работать только если внутри функций нет проверок/циклов. Короче говоря, лучше всего использовать такие проверки поодиночке. В конечном счёте, наша функция будет выглядеть так:

:SearchPedWithModel
/*
 0AB1: @SearchPedWithModel 5 point 0@ 1@ 2@ radius 40.0 model 7 get_handle 5@
*/

if
0AE1: 5@ = random_actor_near_point 0@ 1@ 2@ in_radius 3@ find_next 0 pass_deads 0
then
 if
 02F2: actor 5@ model == 4@
 then
 0A9F: 30@ = current_thread_pointer
 0AA6: call_method 0x4859D0 struct 30@ num_params 1 pop 0 return 0xFF
 0AB2: ret 1 5@
 end
 
 while 0AE1: 5@ = random_actor_near_point 0@ 1@ 2@ in_radius 3@ find_next 1 pass_deads 0
 if
 02F2: actor 5@ model == 4@
 then
 0A9F: 30@ = current_thread_pointer
 0AA6: call_method 0x4859D0 struct 30@ num_params 1 pop 0 return 0xFF
 0AB2: ret 1 5@
 end
 end
end
0A9F: 30@ = current_thread_pointern
0AA6: call_method 0x4859D0 struct 30@ num_params 1 pop 0 return 0x0
0AB2: ret 1 0

|1421|315|0|69473416png793510400`257``||ispolzuem_scm_funkcii_v_kachestve_proverok|1504601800

Last updated