[GTA3script] Checar Tasks
Enviado: 08 Set 2019, 01:17
Em determinados momentos quanto você está trabalhando com tarefas (TASKs) ou até sequencias delas em seu script, é crucial que você saiba se sua entidade esteja realizando uma determinada tarefa ou não, por isso eu vou ensinar a você a como checa-las e até te mostrar o que fazer, e o que não fazer quanto você estiver trabalhando com
O comando é
Basta preencher o comando com estes argumentos:
Entendendo:
ped: É a entidade que você deseja saber se está realizando ou não uma
1465: Este é o opcode em decimal da
retorno: Qualquer LVAR_INT, nela será retornado o valor
Isso é muito importante para quando você precisar checar várias vezes alguma coisa e não aplicar a tarefa quando não necessário, evitando a sobrecarga de tarefas, fazendo a entidade ficar parada, um exemplo certo:
Eu quero que o ped entre no carro caso ele não esteja dentro de algum veículo
Já que está em loop, sem esta checagem, o ped teria um ataque epilético e não se moveria devido a quantidade de tarefas que seu programador mandou ele fazer de acordo com FPS do jogo! #CharsTambemSaumGent..
Isso também vale para
Com isso você pode parar de usar uma
TASKS
ou SEQUENCE_TASKS
O comando é
GET_SCRIPT_TASK_STATUS
com ele você pode checar se uma TASK
ou SEQUENCE_TASK
está ou não sendo executada através de seu opcode.Basta preencher o comando com estes argumentos:
Código: Selecionar tudo
GET_SCRIPT_TASK_STATUS ped 1465 retorno
ped: É a entidade que você deseja saber se está realizando ou não uma
TASK
1465: Este é o opcode em decimal da
TASK
, no caso do comando TASK_PAUSE
é 0x5B9 (ou 05B9)
, você pode obter ele através desta lista ou no aquivo "scrlog.ini" do mod.. "Scrlog" '-'.. Então basta usar um conversor ou a própria calculadora no modo programador para converter o opcode que é em hexadecimal para decimal, ou seja: sendo 0x5B9 (hex) = 1465 (dec)
, você pode usar constantes para não se perder com os números!retorno: Qualquer LVAR_INT, nela será retornado o valor
7
caso não esteja fazendo determinada TASK
Isso é muito importante para quando você precisar checar várias vezes alguma coisa e não aplicar a tarefa quando não necessário, evitando a sobrecarga de tarefas, fazendo a entidade ficar parada, um exemplo certo:
Eu quero que o ped entre no carro caso ele não esteja dentro de algum veículo
Código: Selecionar tudo
CONST_INT TASK_PASSENGER 1482 //Opcode convertido para decimal
WHILE TRUE
WAIT 0
IF NOT IS_CHAR_IN_ANY_CAR ped
GET_SCRIPT_TASK_STATUS ped TASK_PASSENGER retorno
IF retorno = 7 //Caso não esteja realizando esta tarefa de ir até o carro, abrir a porta e entrar
TASK_ENTER_CAR_AS_PASSENGER ped car -1 -1 //faça isso
ENDIF
ENDIF
ENDWHILE
Isso também vale para
SEQUENCE_TASK
basta pegar o opcode do comando PERFORM_SEQUENCE_TASK
, que é 0x618 (ou 0618)
que em decimal é 1560
:Código: Selecionar tudo
CONST_INT PERFORM_TASK 1560 //Opcode convertido para decimal
OPEN_SEQUENCE_TASK task_1
TASK_LOOK_ABOUT -1 3000
TASK_ENTER_CAR_AS_DRIVER ped car -1
CLOSE_SEQUENCE_TASK task_1
WHILE TRUE
WAIT 0
IF NOT IS_CHAR_IN_ANY_CAR ped
GET_SCRIPT_TASK_STATUS ped PERFORM_TASK retorno
IF retorno = 7
PERFORM_SEQUENCE_TASK ped task_1
ENDIF
ENDIF
ENDWHILE
Com isso você pode parar de usar uma
SEQUENCE_TASK
para cada tarefa simples que precise ser aplicada em loop, pois apesar de funcionar, não é uma boa prática, além de aumentar o número de variáveis em determinadas situações em seu script.