0014. Внешние скрипты - wmysterio/gta-script-generator GitHub Wiki

Генератор поддерживает внешние скрипты в библиотеке GTA.SA. Все внешние скрипты должны наследовать класс External:

public class EXT : External {

    public override void START( LabelJump label ) {

        and( !PlayerActor.is_dead(), delegate {
            PlayerActor.task.die();
        } );

        end_thread();
    }

}

Сам скрипт не будет работать. Сначала нам нужно загрузить скрипт и запустить его. Вот так это можно сделать:

public class TEST : Thread {

    static Int ScriptStatus;

    public override void START( LabelJump label ) {
    
        //...
        
        Jump += LOOP;
    }
    
    private void LOOP( LabelJump label ) {
        wait( 0 );            
        Script.and( PlayerChar.is_defined(), delegate {
            
            Script.get_external_script_status<EXT>( ScriptStatus);
            Script.and( ScriptStatus == 0, delegate { // если скрипт не загружен, то загружаем его
                
                Script.load_external_script<EXT>();
                Script.and( Script.is_external_script_loaded<EXT>(), delegate {
                    Script.start_new_external_script<EXT>(); // запускаем скрипт
                } );
                
            } );
            
        }, delegate { Script.remove_references_external_script<EXT>(); } ); // выгружаем сведения о скрипте
        jump( LOOP );
    }
    
}

Только классы, описывающие внешние скрипты, могут быть переданы в метода start_new_external_script между символами < и >. Всё остальное сделает за нас генератор. Мы можем передать туда параметры, если нужно. Давайте посмотрим результат:

DEFINE EXTERNAL_SCRIPTS 1 // Use -1 in order not to compile AAA script
DEFINE SCRIPT EXT AT @EXT_ERROR_SKIP			// 0

//------------- THREAD TEST ---------------
:TEST
03A4: name_thread 'TEST'

//...

0002: jump @TEST_LABEL_0

:TEST_LABEL_0
wait 0
if
0256:     player $2 defined
then
0926: $713 = external_script_status 0 (EXT)
00D6: if
0038:     $713 == 0 // $ == ? (int)
then
08A9: load_external_script 0 (EXT)
00D6: if
08AB:     external_script 0 (EXT) loaded
then
0913: run_external_script 0 (EXT)
end
end
else
090F: end_external_script 0 (EXT)
end
0002: jump @TEST_LABEL_0

//------------- EXTERNAL SCRIPT: 0 (EXT) ---------------
:EXT_ERROR_SKIP
03A4: name_thread 'EXT'

:EXT
00D6: if
8118: not actor $3 dead
then
05BE: AS_actor $3 die
end
004E: end_thread

Скрипт конечно бесполезный, но как его загрузить Вы уже знаете.


Для справки: Некоторые скрипты могут запускаться без загрузки (см. оригинальный main.scm).

⚠️ **GitHub.com Fallback** ⚠️