Página 1 de 1

17. Exercício #2

Enviado: 03 Jun 2018, 19:25
por Junior_Djjr
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

17. Exercício #2

Enviado: 03 Jun 2018, 21:04
por HybridTheory
:feel:

SpoilerAbrir

Código: Selecionar tudo

SCRIPT_START
{

LVAR_INT scplayer hChar[20] iCharModel a 
LVAR_FLOAT fXCoord fYcoord

GET_PLAYER_CHAR 0 (scplayer)

main_loop:
WAIT 0

IF LOCATE_CHAR_ANY_MEANS_3D scplayer 2490.0 -1670.0 13.0 76.0 76.0 76.0 0
    GOSUB load_models
    GOSUB create_chars
ENDIF

GOTO main_loop

load_models:
REQUEST_MODEL 102
REQUEST_MODEL 103
REQUEST_MODEL 104
LOAD_ALL_MODELS_NOW

RETURN

create_chars:
REPEAT 20 a
    GENERATE_RANDOM_FLOAT_IN_RANGE 2470.0 2510.0 (fXcoord)
    GENERATE_RANDOM_FLOAT_IN_RANGE -1650.0 -1690.0 (fYcoord)
    GENERATE_RANDOM_INT_IN_RANGE 102 105 (iCharModel)
    CREATE_CHAR PEDTYPE_GANG1 iCharModel fXcoord fYcoord 13.0 hChar[a]
    CLEO_CALL SetCharAttributes 0 (hChar[a]) (hChar[a])
    TASK_KILL_CHAR_ON_FOOT hChar[a] (scplayer)
ENDREPEAT

WHILE LOCATE_CHAR_ANY_MEANS_3D scplayer 2490.0 -1670.0 13.0 76.0 76.0 76.0 0
    WAIT 0
ENDWHILE

REPEAT 20 a
    DELETE_CHAR hChar[a]
ENDREPEAT

MARK_MODEL_AS_NO_LONGER_NEEDED 102
MARK_MODEL_AS_NO_LONGER_NEEDED 103
MARK_MODEL_AS_NO_LONGER_NEEDED 104

RETURN

}
SCRIPT_END

{
LVAR_INT char
LVAR_INT iWeaponModel

SetCharAttributes:
GENERATE_RANDOM_INT_IN_RANGE 346 353 (iWeaponModel)

SWITCH iWeaponModel
    CASE 346
        REQUEST_MODEL iWeaponModel
        LOAD_ALL_MODELS_NOW
        GIVE_WEAPON_TO_CHAR char WEAPONTYPE_PISTOL 999
        MARK_MODEL_AS_NO_LONGER_NEEDED iWeaponModel
        BREAK
    CASE 347
        REQUEST_MODEL iWeaponModel
        LOAD_ALL_MODELS_NOW
        GIVE_WEAPON_TO_CHAR char WEAPONTYPE_PISTOL_SILENCED 999
        MARK_MODEL_AS_NO_LONGER_NEEDED iWeaponModel
        BREAK
    CASE 348
        REQUEST_MODEL iWeaponModel
        LOAD_ALL_MODELS_NOW
        GIVE_WEAPON_TO_CHAR char WEAPONTYPE_PISTOL 999
        MARK_MODEL_AS_NO_LONGER_NEEDED iWeaponModel
        BREAK
    CASE 349
        REQUEST_MODEL iWeaponModel
        LOAD_ALL_MODELS_NOW
        GIVE_WEAPON_TO_CHAR char WEAPONTYPE_SHOTGUN 999
        MARK_MODEL_AS_NO_LONGER_NEEDED iWeaponModel
        BREAK
    CASE 350
        REQUEST_MODEL iWeaponModel
        LOAD_ALL_MODELS_NOW
        GIVE_WEAPON_TO_CHAR char WEAPONTYPE_SAWNOFF_SHOTGUN 999
        MARK_MODEL_AS_NO_LONGER_NEEDED iWeaponModel
        BREAK
    CASE 351
        REQUEST_MODEL iWeaponModel
        LOAD_ALL_MODELS_NOW
        GIVE_WEAPON_TO_CHAR char WEAPONTYPE_SPAS12_SHOTGUN 999
        MARK_MODEL_AS_NO_LONGER_NEEDED iWeaponModel
        BREAK
    CASE 352
        REQUEST_MODEL iWeaponModel
        LOAD_ALL_MODELS_NOW
        GIVE_WEAPON_TO_CHAR char WEAPONTYPE_MICRO_UZI 999
        MARK_MODEL_AS_NO_LONGER_NEEDED iWeaponModel
        BREAK
    CASE 353
        REQUEST_MODEL iWeaponModel
        LOAD_ALL_MODELS_NOW
        GIVE_WEAPON_TO_CHAR char WEAPONTYPE_MP5 999
        MARK_MODEL_AS_NO_LONGER_NEEDED iWeaponModel
        BREAK
ENDSWITCH

SET_CHAR_ACCURACY char 0

CLEO_RETURN 0 (char)
}

17. Exercício #2

Enviado: 03 Jun 2018, 21:56
por Junior_Djjr
HybridTheory escreveu:
03 Jun 2018, 21:04
SET_CHAR_ACCURACY char 0
0? :philo: 

17. Exercício #2

Enviado: 03 Jun 2018, 22:03
por HybridTheory
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:

17. Exercício #2

Enviado: 03 Jun 2018, 22:05
por Junior_Djjr
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:

Re: 17. Exercício #2

Enviado: 17 Jun 2019, 21:49
por Such02
SpoilerAbrir

Código: Selecionar tudo

SCRIPT_START
{
LVAR_INT scplayer
LVAR_INT char ballas
LVAR_INT n

LVAR_FLOAT random_x random_y

GET_PLAYER_CHAR 0 scplayer

main_loop:
WAIT 0

IF GOSUB coords
    IF GOSUB model_chars
        GOSUB chars
    ENDIF
ENDIF

GOTO main_loop

coords:
LOCATE_CHAR_ANY_MEANS_3D scplayer (2490.0 -1670.0 13.0) (5.0 5.0 2.0) TRUE
RETURN

model_chars:
REQUEST_MODEL BALLAS1
REQUEST_MODEL BALLAS2
REQUEST_MODEL BALLAS3

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

chars:
REPEAT 20 n
    GENERATE_RANDOM_FLOAT_IN_RANGE (2480.0, 2500.0) random_x
    GENERATE_RANDOM_FLOAT_IN_RANGE (-1680.0, -1660.0) random_y
    GENERATE_RANDOM_INT_IN_RANGE (102, 105) ballas
    CREATE_CHAR PEDTYPE_GANG1 ballas (random_x, random_y, 13.0) char
    CLEO_CALL SetupChar 0 (char)
    TASK_KILL_CHAR_ON_FOOT char scplayer
ENDREPEAT

MARK_MODEL_AS_NO_LONGER_NEEDED BALLAS1
MARK_MODEL_AS_NO_LONGER_NEEDED BALLAS2
MARK_MODEL_AS_NO_LONGER_NEEDED BALLAS3
RETURN_TRUE
}
SCRIPT_END

{
LVAR_INT char // In
LVAR_INT weapon

SetupChar:
REQUEST_MODEL MICRO_UZI
REQUEST_MODEL COLT45
REQUEST_MODEL AK47

GENERATE_RANDOM_INT_IN_RANGE 1 4 weapon

WHILE NOT HAS_MODEL_LOADED MICRO_UZI
OR NOT HAS_MODEL_LOADED AK47
OR NOT HAS_MODEL_LOADED COLT45
    WAIT 0
ENDWHILE

SWITCH weapon
    CASE 1
        GIVE_WEAPON_TO_CHAR char WEAPONTYPE_MICRO_UZI 999
        BREAK
    CASE 2
        GIVE_WEAPON_TO_CHAR char WEAPONTYPE_PISTOL 999
        BREAK
    CASE 3
        GIVE_WEAPON_TO_CHAR char WEAPONTYPE_AK47 999
        BREAK
ENDSWITCH

SET_CHAR_WEAPON_SKILL char 2
SET_CHAR_ACCURACY char 0

MARK_MODEL_AS_NO_LONGER_NEEDED AK47
MARK_MODEL_AS_NO_LONGER_NEEDED COLT45
MARK_MODEL_AS_NO_LONGER_NEEDED MICRO_UZI
CLEO_RETURN 0
}

👆  Ta ae.

Re: 17. Exercício #2

Enviado: 03 Ago 2019, 12:40
por Samuvtr
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. 😎

SpoilerAbrir

Código: Selecionar tudo

SCRIPT_START
{
LVAR_INT ballas[19] cj a model
LVAR_FLOAT x y
GET_PLAYER_CHAR 0 cj
WHILE NOT a = 19
    WAIT 0
    IF LOCATE_CHAR_ANY_MEANS_3D cj 2490.0 -1670.0 13.0 (100.0 100.0 100.0) FALSE
        REQUEST_MODEL 102
        REQUEST_MODEL 103
        REQUEST_MODEL 104
        REQUEST_MODEL 346
        REQUEST_MODEL 347
        REQUEST_MODEL 348
        REQUEST_MODEL 349
        REQUEST_MODEL 350
        REQUEST_MODEL 351
        REQUEST_MODEL 352
        REQUEST_MODEL 353
        REQUEST_MODEL 355
        LOAD_ALL_MODELS_NOW
        REPEAT 19 a
            WAIT 0
            GENERATE_RANDOM_FLOAT_IN_RANGE 2480.0 2500.0 x
            GENERATE_RANDOM_FLOAT_IN_RANGE -1660.0 -1680.0 y
            GENERATE_RANDOM_INT_IN_RANGE 102 105 model
            GOSUB ballas
        ENDREPEAT
        a = 0 // mudei para ajudar na contagem de kills dos 20 ballas
        WHILE a < 19
            WAIT 0
            GOSUB check_kills
        ENDWHILE
        MARK_MODEL_AS_NO_LONGER_NEEDED 102
        MARK_MODEL_AS_NO_LONGER_NEEDED 103
        MARK_MODEL_AS_NO_LONGER_NEEDED 104
        MARK_MODEL_AS_NO_LONGER_NEEDED 346
        MARK_MODEL_AS_NO_LONGER_NEEDED 347
        MARK_MODEL_AS_NO_LONGER_NEEDED 348
        MARK_MODEL_AS_NO_LONGER_NEEDED 349
        MARK_MODEL_AS_NO_LONGER_NEEDED 350
        MARK_MODEL_AS_NO_LONGER_NEEDED 351
        MARK_MODEL_AS_NO_LONGER_NEEDED 352
        MARK_MODEL_AS_NO_LONGER_NEEDED 353
        MARK_MODEL_AS_NO_LONGER_NEEDED 355
        PRINT_STRING_NOW "Todos os ballas morreram" 3000
        BREAK
    ENDIF
ENDWHILE
GOTO end
ballas:
WAIT 0
CREATE_CHAR PEDTYPE_GANG1 model x y -100.0 ballas[a]
SET_CHAR_HEALTH ballas[a] 1000
SET_CHAR_WEAPON_SKILL ballas[a] 1
SET_CHAR_SHOOT_RATE ballas[a] 80
SET_CHAR_ACCURACY ballas[a] 50
GENERATE_RANDOM_INT_IN_RANGE 346 356 model
WHILE model = 354 // O modelo 354 não é uma arma que eu queria na lista dos 346 aso 355, então eu excluo ele da lista.
    WAIT 0
    GENERATE_RANDOM_INT_IN_RANGE 346 356 model
ENDWHILE
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
TASK_KILL_CHAR_ON_FOOT ballas[a] cj
RETURN
check_kills:
    WAIT 0
    SWITCH a
        CASE 0
            IF IS_CHAR_DEAD ballas[a]
                a += 1
            ENDIF
            BREAK
        CASE 1
            IF IS_CHAR_DEAD ballas[a]
                a += 1
            ENDIF
            BREAK
        CASE 2
            IF IS_CHAR_DEAD ballas[a]
                a += 1
            ENDIF
            BREAK
        CASE 3
            IF IS_CHAR_DEAD ballas[a]
                a += 1
            ENDIF
            BREAK
        CASE 4
            IF IS_CHAR_DEAD ballas[a]
                a += 1
            ENDIF
            BREAK
        CASE 5
            IF IS_CHAR_DEAD ballas[a]
                a += 1
            ENDIF
            BREAK
        CASE 6
            IF IS_CHAR_DEAD ballas[a]
                a += 1
            ENDIF
            BREAK
        CASE 7
            IF IS_CHAR_DEAD ballas[a]
                a += 1
            ENDIF
            BREAK
        CASE 8
            IF IS_CHAR_DEAD ballas[a]
                a += 1
            ENDIF
            BREAK
        CASE 9
            IF IS_CHAR_DEAD ballas[a]
                a += 1
            ENDIF
            BREAK
        CASE 10
            IF IS_CHAR_DEAD ballas[a]
                a += 1
            ENDIF
            BREAK
        CASE 11
            IF IS_CHAR_DEAD ballas[a]
                a += 1
            ENDIF
            BREAK
        CASE 12
            IF IS_CHAR_DEAD ballas[a]
                a += 1
            ENDIF
            BREAK
        CASE 13
            IF IS_CHAR_DEAD ballas[a]
                a += 1
            ENDIF
            BREAK
        CASE 14
            IF IS_CHAR_DEAD ballas[a]
                a += 1
            ENDIF
            BREAK
        CASE 15
            IF IS_CHAR_DEAD ballas[a]
                a += 1
            ENDIF
            BREAK
        CASE 16
            IF IS_CHAR_DEAD ballas[a]
                a += 1
            ENDIF
            BREAK
        CASE 17
            IF IS_CHAR_DEAD ballas[a]
                a += 1
            ENDIF
            BREAK
        CASE 18
            IF IS_CHAR_DEAD ballas[a]
                a += 1
            ENDIF
            BREAK
        CASE 19
            IF IS_CHAR_DEAD ballas[a]
                a += 1
            ENDIF
            BREAK
    ENDSWITCH
    RETURN
end:
}
SCRIPT_END

Re: 17. Exercício #2

Enviado: 03 Ago 2019, 14:09
por nadalao
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

Re: 17. Exercício #2

Enviado: 03 Ago 2019, 16:19
por Junior_Djjr
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?