Pesquisa resultou em 4 ocorrências

por Junior_Djjr
03 Ago 2019, 16:19
Fórum: GTA3script (CLEO)
Tópico: 17. Exercício #2
Respostas: 8
Exibições: 1168
Gênero:

Re: 17. Exercício #2

nadalao escreveu:
03 Ago 2019, 14:09
Samuvtr escreveu:
03 Ago 2019, 12:40
Acho que ficou legal, ta funcionando direitinho, e sinto que eu podia ter economizado mais linhas... Mas tem de tudo ai , Armas aleatórias, (a partir da pistola até a AK-47) e um Print falando que CJ matou todos os ballas.

Obs: Foi tudo na raça , não cheguei a ler dicas, então eu sei que ta ruim, mas dá um desconto ae. 😎
da pra trocar todo o:

Código: Selecionar tudo

SWITCH model
    CASE 346
        GIVE_WEAPON_TO_CHAR ballas[a] WEAPONTYPE_PISTOL 500
        BREAK
    CASE 347
        GIVE_WEAPON_TO_CHAR ballas[a] WEAPONTYPE_PISTOL_SILENCED 500
            BREAK
    CASE 348
        GIVE_WEAPON_TO_CHAR ballas[a] WEAPONTYPE_DESERT_EAGLE 500
        BREAK
    CASE 349
        GIVE_WEAPON_TO_CHAR ballas[a] WEAPONTYPE_SHOTGUN 500
        BREAK
    CASE 350
        GIVE_WEAPON_TO_CHAR ballas[a] WEAPONTYPE_SAWNOFF_SHOTGUN 500
        BREAK
    CASE 351
        GIVE_WEAPON_TO_CHAR ballas[a] WEAPONTYPE_SPAS12_SHOTGUN 500
        BREAK
    CASE 352
        GIVE_WEAPON_TO_CHAR ballas[a] WEAPONTYPE_MICRO_UZI 500
        BREAK
    CASE 353
        GIVE_WEAPON_TO_CHAR ballas[a] WEAPONTYPE_MP5 500
        BREAK
    CASE 355
        GIVE_WEAPON_TO_CHAR ballas[a] WEAPONTYPE_AK47 500
        BREAK
ENDSWITCH
por:

GIVE_WEAPON_TO_CHAR ballas[a] model 500 
Mas como ele vai saber qual é o WEAPONTYPE?
por Junior_Djjr
03 Jun 2018, 22:05
Fórum: GTA3script (CLEO)
Tópico: 17. Exercício #2
Respostas: 8
Exibições: 1168
Gênero:

17. Exercício #2

HybridTheory escreveu:
Junior_Djjr escreveu:
03 Jun 2018, 21:56
0? :philo:
Se eu não botar isso o CJ morre na hora, pois tem 20 ballas atirando nele ao mesmo tempo :feel:  
É a diversão :fts: eu chegaria por trás com uma sniper :peepo5:
por Junior_Djjr
03 Jun 2018, 21:56
Fórum: GTA3script (CLEO)
Tópico: 17. Exercício #2
Respostas: 8
Exibições: 1168
Gênero:

17. Exercício #2

HybridTheory escreveu:
03 Jun 2018, 21:04
SET_CHAR_ACCURACY char 0
0? :philo: 
por Junior_Djjr
03 Jun 2018, 19:25
Fórum: GTA3script (CLEO)
Tópico: 17. Exercício #2
Respostas: 8
Exibições: 1168
Gênero:

17. Exercício #2

Imagem
Antes de prosseguir no tutorial, é importante que você realmente tenha aprendido tudo o que foi feito até agora.
 


Exercício
  
Faça com que, caso você chegue na Grove Street seja automaticamente criado 20 Ballas em uma coordenada aleatória.



Como fazer

Antes é necessário ler o tutorial de como criar chars e carregar modelos.

Como já mostrado, um ótimo comando para checar se o CJ chegou na coordenada, é o LOCATE_CHAR_ANY_MEANS_3D (veja também as variações de LOCATE).
A coordenada da Grove Street é 2490.0 -1670.0 13.0 — se você quiser pegar outras coordenadas, há diversas maneiras, como este mod.

Dentro do loop onde cria os chars, logo antes de criar o atual char, pegue alguma coordenada aleatória a partir desta acima. Uns 10.0 pra menos e uns 10.0 pra mais.

Código: Selecionar tudo

GENERATE_RANDOM_FLOAT_IN_RANGE 2480.0 2500.0 random_x
O mesmo com a coordenada Y.

A coordenada Z não precisa pois ela é a altura (por qual motivo você vai querer que seja criado Ballas 10 metros pra cima ou 10 metros pra baixo do chão? Nós só queremos leste/oeste (X) e norte/sul (Y)!)

Você também pode pegar um número entre -10.0 e 10.0 e somar na variável da coordenada de origem para ter uma nova coordenada aleatória num raio de 10 metros.

Após pegar as coordenadas aleatórias, crie o char também com um modelo aleatório dos Ballas.

Os IDs dos modelos dos Ballas são 102, 103 e 104. Mas no comando GENERATE_RANDOM_INT_IN_RANGE você terá que enviar "entre 102 e 105", pois o comando pega do primeiro ao penúltimo (ele não vai pegar o 105, só até 104).

Os Ballas são a gang1, ou seja PEDTYPE_GANG1.

Vamos ao trabalho!

Depois de conseguir fazer o básico, também adicione uma arma neles e faça com que ele ataque o CJ.
Lembra do meu exemplo no fim da parte sobre GOSUB/CLEO_CALL? É sua chance de botar em prática! Tente.

Tente caprichar nisso, vá criando as coisas aos poucos, e implementando e melhorando cada vez mais. Tente até mesmo checar se todos eles morreram, ou o CJ morreu, e assim marque eles como não mais necessário. Este é um bom exercício para treinar!


Dúvidas?

Se não conseguiu/entendeu, abra os spoilers abaixo para ver os códigos prontos.
Quanto mais você abre, mais você vai tendo o código pronto.
SpoilerAbrir

Código: Selecionar tudo

IF LOCATE_CHAR_ANY_MEANS_3D scplayer (2490.0 -1670.0 13.0) (100.0 100.0 100.0) FALSE

    REQUEST_MODEL BALLAS1 //102
    REQUEST_MODEL BALLAS2 //103
    REQUEST_MODEL BALLAS3 //104
    LOAD_ALL_MODELS_NOW

    REPEAT 20 n
       GENERATE_RANDOM_FLOAT_IN_RANGE (2480.0 2500.0) random_x
       GENERATE_RANDOM_FLOAT_IN_RANGE (-1660.0 -1680.0) random_y
       GENERATE_RANDOM_INT_IN_RANGE (102 105) random_model
       CREATE_CHAR PEDTYPE_GANG1 random_model (random_x random_y 13.0) chars[n]
    ENDREPEAT

    MARK_MODEL_AS_NO_LONGER_NEEDED BALLAS1
    MARK_MODEL_AS_NO_LONGER_NEEDED BALLAS2
    MARK_MODEL_AS_NO_LONGER_NEEDED BALLAS3

    //...
SpoilerAbrir
Também poderia ter sido feito assim:
(neste exemplo está mais organizado: você pode facilmente alterar a coordenada para usar o mesmo script em outro local do mapa)

Código: Selecionar tudo

x = 2490.0
y = -1670.0
z = 13.0

main_loop:
WAIT 0

IF LOCATE_CHAR_ANY_MEANS_3D scplayer (x y z) (100.0 100.0 100.0) FALSE

    REQUEST_MODEL BALLAS1 //102
    REQUEST_MODEL BALLAS2 //103
    REQUEST_MODEL BALLAS3 //104
    LOAD_ALL_MODELS_NOW

    REPEAT 20 n
       GENERATE_RANDOM_FLOAT_IN_RANGE -10.0 10.0 random
       new_x = x + random
       GENERATE_RANDOM_FLOAT_IN_RANGE -10.0 10.0 random
       new_y = y + random
       GENERATE_RANDOM_INT_IN_RANGE 102 105 random_model
       CREATE_CHAR PEDTYPE_GANG1 random_model (new_x new_y z) chars[n]
    ENDREPEAT

    MARK_MODEL_AS_NO_LONGER_NEEDED BALLAS1
    MARK_MODEL_AS_NO_LONGER_NEEDED BALLAS2
    MARK_MODEL_AS_NO_LONGER_NEEDED BALLAS3

    //...
Entre outras que você também possa ter imaginado. Vamos continuar neste segundo pois ele ficou mais organizado e dinâmico.

Você também pode usar -100.0 na coordenada z do CREATE_CHAR para ele ser criado corretamente na coordenada do chão, como já explicado no tutorial de criar chars.

SpoilerAbrir
Aqui um código básico completo:

Código: Selecionar tudo

SCRIPT_START
{
LVAR_INT scplayer n random_model
LVAR_FLOAT random x y z new_x new_y
LVAR_INT chars[20]

GET_PLAYER_CHAR 0 scplayer

x = 2490.0
y = -1670.0
z = 13.0

main_loop:
WAIT 0

IF LOCATE_CHAR_ANY_MEANS_3D scplayer (x y z) (100.0 100.0 100.0) FALSE

    REQUEST_MODEL BALLAS1 //102
    REQUEST_MODEL BALLAS2 //103
    REQUEST_MODEL BALLAS3 //104
    LOAD_ALL_MODELS_NOW

    REPEAT 20 n
        GENERATE_RANDOM_FLOAT_IN_RANGE -10.0 10.0 random
        new_x = x + random
        GENERATE_RANDOM_FLOAT_IN_RANGE -10.0 10.0 random
        new_y = y + random
        GENERATE_RANDOM_INT_IN_RANGE 102 105 random_model
        CREATE_CHAR PEDTYPE_GANG1 random_model (new_x new_y z) chars[n]
    ENDREPEAT

    MARK_MODEL_AS_NO_LONGER_NEEDED BALLAS1
    MARK_MODEL_AS_NO_LONGER_NEEDED BALLAS2
    MARK_MODEL_AS_NO_LONGER_NEEDED BALLAS3

    WHILE LOCATE_CHAR_ANY_MEANS_3D scplayer (x y z) (110.0 110.0 110.0) FALSE
        WAIT 0
    ENDWHILE

    REPEAT 20 n
        REMOVE_CHAR_ELEGANTLY chars[n]
    ENDREPEAT

ENDIF

GOTO main_loop
}
SCRIPT_END
No WHILE LOCATE_CHAR_ANY_MEANS_3D scplayer (x y z) (110.0 110.0 110.0) FALSE, onde espera o scplayer sair do local, perceba que usei 110.0 110.0 110.0, pois assim o mod se ativará num raio de 100 metros, mas se desativará em 110 metros. Isto evita que o mod fique ativando e desativando enquanto você estiver andando na borda dos 100 metros (você terá que andar 10 metros para fora para desativar, sacou?). Se não usar essa margem, basta 1 milímetro para dentro e para fora para o mod ativar-desativar-ativar-desativar...

Em vez de REMOVE_CHAR_ELEGANTLY chars[n], você pode usar MARK_CHAR_AS_NO_LONGER_NEEDED, assim o char não é apagado caso sair dos 110 metros. No entanto, se você sair e voltar pro local, criará outros 20 chars, assim criando uma overdose de tanto char. Neste caso eu recomendo colocar mais limites, por exemplo esperar alguns minutos antes de poder voltar no local, esperar até o próximo dia (usando GET_CURRENT_DAY_OF_WEEK) ou outra maneira que você imaginar.

SpoilerAbrir
E aqui o nosso exercício completo!
Acredito ter muitos modelos sendo carregados ao mesmo tempo, e este é um mod que se ativa no gameplay, portanto não usaremos LOAD_ALL_MODELS para evitar freeze:

Código: Selecionar tudo

SCRIPT_START
{
LVAR_INT scplayer n random_model
LVAR_FLOAT random x y z new_x new_y
LVAR_INT chars[20]

GET_PLAYER_CHAR 0 scplayer

x = 2490.0
y = -1670.0
z = 13.0

main_loop:
WAIT 0

IF LOCATE_CHAR_ANY_MEANS_3D scplayer (x y z) (100.0 100.0 100.0) FALSE

    REQUEST_MODEL BALLAS1 //102
    REQUEST_MODEL BALLAS2 //103
    REQUEST_MODEL BALLAS3 //104
    REQUEST_MODEL COLT45 // WEAPONTYPE_PISTOL

    WHILE NOT HAS_MODEL_LOADED BALLAS1
    OR NOT HAS_MODEL_LOADED BALLAS2
    OR NOT HAS_MODEL_LOADED BALLAS3
    OR NOT HAS_MODEL_LOADED COLT45
        WAIT 0
    ENDWHILE

    REPEAT 20 n
        GENERATE_RANDOM_FLOAT_IN_RANGE -10.0 10.0 random
        new_x = x + random
        GENERATE_RANDOM_FLOAT_IN_RANGE -10.0 10.0 random
        new_y = y + random
        GENERATE_RANDOM_INT_IN_RANGE 102 105 random_model
        CREATE_CHAR PEDTYPE_GANG1 random_model (new_x new_y z) chars[n]
    ENDREPEAT

    REPEAT 20 n
        GENERATE_RANDOM_FLOAT_IN_RANGE -10.0 10.0 random
        new_x = x + random
        GENERATE_RANDOM_FLOAT_IN_RANGE -10.0 10.0 random
        new_y = y + random
        GENERATE_RANDOM_INT_IN_RANGE 102 105 random_model
        CREATE_CHAR PEDTYPE_GANG1 random_model (new_x new_y z) chars[n]
    ENDREPEAT

    MARK_MODEL_AS_NO_LONGER_NEEDED BALLAS1
    MARK_MODEL_AS_NO_LONGER_NEEDED BALLAS2
    MARK_MODEL_AS_NO_LONGER_NEEDED BALLAS3

    REPEAT 20 n
        GIVE_WEAPON_TO_CHAR chars[n] WEAPONTYPE_PISTOL 100
        TASK_KILL_CHAR_ON_FOOT chars[n] scplayer
    ENDREPEAT

    MARK_MODEL_AS_NO_LONGER_NEEDED COLT45

    WHILE LOCATE_CHAR_ANY_MEANS_3D scplayer (x y z) (110.0 110.0 110.0) FALSE
        WAIT 0
    ENDWHILE

    REPEAT 20 n
        REMOVE_CHAR_ELEGANTLY chars[n]
    ENDREPEAT
ENDIF

GOTO main_loop
}
SCRIPT_END
Também fica ótimo caso usar subtarefas:

Código: Selecionar tudo

SCRIPT_START
{
LVAR_INT scplayer n random_model
LVAR_FLOAT random x y z new_x new_y
LVAR_INT chars[20]

GET_PLAYER_CHAR 0 scplayer

x = 2490.0
y = -1670.0
z = 13.0

main_loop:
WAIT 0

IF LOCATE_CHAR_ANY_MEANS_3D scplayer (x y z) (100.0 100.0 100.0) FALSE

    GOSUB load_models

    GOSUB create_chars

    GOSUB mark_models_as_no_longer_needed

    WHILE LOCATE_CHAR_ANY_MEANS_3D scplayer (x y z) (110.0 110.0 110.0) FALSE
        WAIT 0
    ENDWHILE

    GOSUB remove_chars

ENDIF

GOTO main_loop

/////////////////////////////////////////////////

load_models:
REQUEST_MODEL BALLAS1 //102
REQUEST_MODEL BALLAS2 //103
REQUEST_MODEL BALLAS3 //104
REQUEST_MODEL COLT45 // WEAPONTYPE_PISTOL

WHILE NOT HAS_MODEL_LOADED BALLAS1
OR NOT HAS_MODEL_LOADED BALLAS2
OR NOT HAS_MODEL_LOADED BALLAS3
OR NOT HAS_MODEL_LOADED COLT45
    WAIT 0
ENDWHILE
RETURN

create_chars:
REPEAT 20 n
    GENERATE_RANDOM_FLOAT_IN_RANGE -10.0 10.0 random
    new_x = x + random
    GENERATE_RANDOM_FLOAT_IN_RANGE -10.0 10.0 random
    new_y = y + random
    GENERATE_RANDOM_INT_IN_RANGE 102 105 random_model
    CREATE_CHAR PEDTYPE_GANG1 random_model (new_x new_y z) chars[n]
ENDREPEAT
REPEAT 20 n
    GIVE_WEAPON_TO_CHAR chars[n] WEAPONTYPE_PISTOL 100
    TASK_KILL_CHAR_ON_FOOT chars[n] scplayer
ENDREPEAT
RETURN

mark_models_as_no_longer_needed:
MARK_MODEL_AS_NO_LONGER_NEEDED BALLAS1
MARK_MODEL_AS_NO_LONGER_NEEDED BALLAS2
MARK_MODEL_AS_NO_LONGER_NEEDED BALLAS3
MARK_MODEL_AS_NO_LONGER_NEEDED COLT45
RETURN

remove_chars:
REPEAT 20 n
    REMOVE_CHAR_ELEGANTLY chars[n]
ENDREPEAT
RETURN

}
SCRIPT_END
Ok, acho que já está bem assim, né?

Eaí? Conseguiu fazer? Responda esse tópico mostrando como você fez esse código! Use a tag [spoiler] para enviar o código na mensagem:

Imagem

Em WYSIWYG fica assim:
Imagem

Após conseguir fazer o exercício, leia as dicas para aprender diferentes maneiras e novas utilidades que você provavelmente não sabia.

Mas você ainda pode fazer mais: você consegue variar as armas? (você provavelmente precisará usar SWITCH com IDs de weapontypes)
Também pode adicionar mais atributos aos chars, como SET_CHAR_SHOOT_RATE, SET_CHAR_WEAPON_SKILL, SET_CHAR_KINDA_STAY_IN_SAME_PLACE etc.....

Se você não conseguiu fazer o exercício ou precisou das dicas acima para conseguir, possivelmente você precisa reler o tutorial inteiro ou algumas partes que você acha que não entendeu bem e que está com dificuldades.

Evite prosseguir o tutorial com falta de conhecimento pois é sempre bom ir devagar conhecendo cada pedaço do caminho para não se perder — ao invés de sair correndo.


Próxima parte:
18. Tipos de entidades

Voltar para “17. Exercício #2”