quinta-feira, 27 de janeiro de 2011

Library and Scope

O que é library? E scope? 
Library e scope são como ( não sei explicar isso) metodos de você poder organizar suas functions. Quem ja fez Jass no world editor sem JNPG sabe como era um saco ter que declarar uma function antes de algumas outras. Era um pé no saco! Eu tive a sorte de ficar apenas alguns dias sem conhecer o JNPG^^
Só pro pessoal menos culto entender, pra vc usar uma function A em uma function B, você precisa declarar a function A antes da function B. Caso contrario dá erro.

Qual a diferença de library e scope?
Quando você declara suas functions dentro de uma library elas sempre serão declaradas no inicio do bloco de functions. E quando você declara functions dentro de uma scope, essas são declaradas lá no final do bloco. Só pra constar, library são sempre usadas para system, pois você precisará usar as functions dele no resto dos triggers. E scope são mais usados para fazer Spells, pois você geralmente irá usar function de outros lugares (systems, por exemplo) nela.

Como eu crio uma library ou uma scope?
Pra criar uma library você digita library NOMEDALIBRARY antes de todas as functions que você queira que esteja dentro dela e quando você terminar você escreva enlibrary para fechar a library. Veja o exemplo:


library MinhaLibrary
    function A takes nothing returns nothing
    endfunction
endlibrary

E para criar uma scope é bem parecido, mas no lugar de library você escreve scope.



scope MeuScope
    function B takes nothing returns nothing
        call A()
    endfunction
endscope

Como eu sei que minha library A vai ser declarada antes da library B?
vamos imaginar que você queira usar algumas function da library A na sua library B. Você sabe que as libraries são declaradas la no inicio do bloco, mas não faz idéia de como declarar a libary A antes da B. É como se a library B dependesse da library A, certo? Então você deve usar requires e o nome da library que será a dependencia. Veja o exemplo:

library A
endlibrary

library B requires A
endlibrary

Assim elas vão ser organizadas de forma que a library seja declarada antes da B, para que a B possa usar a A. Nunca faz isso que vou mostrar:

library A requires B
endlibrary

library B requires A
endlibrary

Caso você faça algo parecido, criará um loop infinito, pois a library A precisa da B e a B da A. Na época o laiev me deu uma resposta mais legal, mas lembro mais =P

Obs: Você não pode usar o requires em uma scope, apenas em library.
Outra Obs: No lugar de requires você pode usar needs ou uses, caso prefira.

Você também pode usar a palavra initializer. Ela faz com que uma function da sua library/scope seja executada (chamada) no inicialização do jogo. Apenas digite initializer e o nome da function depois do nome da library/scope e antes dos requires (no caso de ser uma library). Veja o exemplo:

library A initializer init
    function init takes nothing returns nothing
    endlibrary
endlibrary

Obs: A function que você escolher não deve ter nenhum parametro, tanto de takes quanto returns.

Private e Public Functions
Eu ia finalizar meu tuto sem falar disso, mas vou falar sobre private e public function. Isso é importante explicar. ^^

quando você escreve uma function com private antes, quer dizer que você só poderá executa-la dentro da library e ela também só valerá lá, ou seja, você poderá criar functions com nomes iguais desde que elas sejam privates. Function public são aqueles que devem ser chamadas com um prefixo igual ao nome da library. Por exemplo:


library TEST
    public function A takes nothing returns nothing
    endfunction
endlibrary

function B takes nothing returns nothing
    call TEST_A()
endfucntion

Obs: Você pode usar o private em variables também. Assim, essas variables poderão ser usadas apenas dentro da library/scope.

Bom, espero que eu não tenha cagado nesse tutorial também. Caso gostou, não gostou ou acha que falta algo... posta ae!
Flws...


Creditos à mim e ao laiev, que me ensino essa budega um dia. XD 


Leia Mais...

sábado, 22 de janeiro de 2011

MUI: global local

Afinal, o que é MUI?
MUI significa Multi-Unit Instanceability. Uma trigger é MUI quando ela pode ser usada por duas ou mais unidades, ao mesmo tempo (sem causar bug).

Vamos aprender um pouco sobre MUI
Um bom exemplo de MUI é aquele mode do dota, -wtf. Aquele mode super fun em que suas habilidades não possuem cooldown e você fica usando a mesma habilidade toda hora. Para que você possa ter um mode daqueles em seu mapa, será preciso que todas as habilidades do seus heróis sejão MUI. =P

Vamos falar de mais alguns exemplos de MUI. Sabe aquele event response chamado Triggering Unit? Então, ele é MUI! "Como assim?" Uai, você pode usar o "Triggering Unit" até o final da trigger, sem medo dela bugar. Esse event response grava o valor da unidade até o termino do trigger e você pode usar "waits" bem longos pra comprovar isso. É bom saber que aqueles LastCreated...Restored...ReplacedUnit não são MUI, eles são global variable e por isso tem seu valor trocado toda hora.


Usando variables para fazer MUI
Antes de mais nada, você deve saber o básico sobre as variables (variáveis, em português). Existem dois tipos de variables, as global e as local. Global variables são aquelas que pode usar em todos os trigger e local variables podem ser usadas apenas na trigger em que ela foi declarada. Logo você deve entender que global variables não são MUI, à menos que você crie indexs (mas isso é outra coisa). Já as local variables são 101% MUI.

Vou ensinar a vocês a usarem as "global local variables". "Pra que serve isso?" Serve pra você torna sua global variable em local variable (ou seja, MUI). "Hmmm...E como faço isso?" Crie uma variable ( Ctrl+B ) do tipo unit chamada "Unit". Depois em seu trigger crie uma local variable usando a action Custom Script, assim:

local unit udg_Unit
 Esse udg_ antes do nome da nossa local refere-se as variables criadas em GUI, em outras palavras, criadas naquela caixinha de variables do Trigger Editor. Toda variable criada lá é global e recebe o prefixo "udg_" no nome dela.
Essa local que criamos então tem o mesmo nome da variable global que criamos antes. Ela substituirá nossa global apenas naquele trigger. veja o exemplo:

Events
    Map Initialization
Conditions
Actions
    local unit udg_Unit
    Create 1 Footman for Player 1 (Red) at (Center of (Playable map area)) facing 0.00 degrees
    Set Unit = (Last created unit)
    ...


Nesse trigger a global variable Unit irá se tornar local, ou seja, (mais uma vez) MUI. tem um probleminha com essa global local variables, elas não podem ser usadas em uma If/Then/Else’sCondition, em uma Group Condition,dentro de um Group Loop ou em um Conditional Wait. Nunca se esqueça se "setar" local variables para null, apenas faça isto no final do trigger:
Set Unit = No unit
Por rasões ainda desconhecidas, apenas uma "global local variable" de cada tipo funciona por trigger. Ou seja, você não pode usar duas varibles do tipo unit em um mesmo trigger pra fazer uma global local das duas, apenas uma funcionaria.

Por enquanto esse tutorial está muito "meio" mal explicado, mas assim que der eu melhoro ele. E futuramente eu vou fazer um exemplo de Triggered Spell MUI. Espero que não esteja assim tão escroto, como eu estou pensando.

Creditos à Tom Jones (The Helper) pelo tutorial em inglês. 


Visite nosso Forum XD

Leia Mais...

quarta-feira, 19 de janeiro de 2011

Buff v1.1

Este é o primeiro sistema que desenvolvi, criei meio por acaso. XD Acabei gostando dele e resolvi então compartilhar com a galera. ^^

Buff requer:



Buff permite a você:

  • adicionar e remover um buff quando quiser. (algo que ja é possivel)
  • escolher a duração que você quiser para um buff e pode altera-la quantas vezes quiser.
  • saber exatamente quando uma unidade recebeu ou perdeu um buff.
  • classificar seus buffs por tipos. (Atualização)


Para saber mais sobre o system clique aqui
Para saber fazer download do mapa de demonstração clique aqui




Leia Mais...

terça-feira, 18 de janeiro de 2011

Saudações Amigos!

Neste blog pretendo por todos os meus projetos de Warcraft III, também usarei para mostrar tutorials e até (bem de vez em quando) vou refletir sobre algumas idéias minhas. Pois bem é só isso por enquanto.
Em breve começarei a falar do Slayers (Meu atual projeto).

Até breve =D

Leia Mais...