Mostrando postagens com marcador vJASS. Mostrar todas as postagens
Mostrando postagens com marcador vJASS. Mostrar todas as postagens

sexta-feira, 1 de junho de 2012

Atualização: Blog com syntax highlighter

Syntax highlighter para quem não conhece é uma maneira melhor de visualizar um código. Ele colore palavras importantes do código, facilitando assim a leitura. Sem falar que deixa o código bem mais bonito.

Então, existe um syntax highlighter na internet muito bom, porém como não tinha para "jass" eu improvisei uma.

Um exemplo de código com SH:

struct Bar
 method foo takes nothing returns boolean
  call KillUnit(GetTriggerUnit())
  return false
 endmethod
endstruct

Agora quando eu voltar a fazer as aulas de vjass os códigos estarão bonitinhos.

Até mais galera!

Leia Mais...

segunda-feira, 19 de setembro de 2011

3ª Aula de vJass - Aprendo mais sobre struct

Primeiramente, desculpa pela demora da 3ª aula. Nem ia dar ela tão cedo, ando muito ocupado com java e faculdade, até esqueço do resto do mundo (nerdisse do caramba). Mas um colega meu (Victor) conseguiu arrumar o JNGP no computador dele. Então vou dar essa aula nova, que pretendo ensinar sobre structs, methods e variaveis. Vamos lá, né?

Quem leu a segunda aula viu que mostrei um exemplo de struct e expliquei sobre structs e o method onInit. Vamos relembra-lo:
library Exemplo1
 struct MyStruct
  // Meu primeiro código
  static method onInit takes nothing returns nothing
   call BJDebugMsg("Hello World!")
  endmethod
 endstruct
endlibrary
Então essa nossa struct apenas mostrava uma mensagem ("Hello World") quando o jogo começava. Vamos ir além dessa vez. Antes de prosserguimos gostaria que vocês entendessem que uma struct é um "objeto". Um objeto pode ter caracteristicas e comportamentos e além disso um objeto é um tipo de dado (assim como unit, effect, player, group, etc). O method onInit, por exemplo, é um "comportamento inicial" da nossa struct. Veja:

library Exemplo2
 struct Object
  // Agora nossa struct chama Object
  // nosso Object tem um comportamento (method) stop.
  method stop takes nothing returns nothing
   call BJDebugMsg("object paused")
   call TriggerSleepAction(10)
   call BJDebugMsg("object unpaused!")
  endmethod

  static method onInit takes nothing returns nothing
   local Object obj = Object.create() // cria um objeto do tipo Object
   call obj.stop()
   call obj.destroy() //destroi o objeto
  endmethod
 endstruct
endlibrary
No código acima a struct Object tem um method (comportamento) chamado stop. Esse method faz a mensagem object paused aparecer na tela e executa uma function chamada TriggerSleepAction, essa function é o famoso wait do GUI. O numero 10 indicado entre parenteses é o numero de segundos que pausará, no caso 10 segundos. Logo depois dos 10 segundos do wait, mostra a mensagem object unpaused. Percebeu que aquele method não tem static na declaração dele? Isso quer dizer que aquele method só pode ser executado de um Object "criado" ou como dizemos em programação instanciado.
No method onInit (o que sempre executa quando o jogo começa) nós criamos um Object:
local Object obj = Object.create()
O que fizemos ali foi criar uma variável para guardar o Object que criamos. O local significa que aquela variavel só vai existir dentro daquele method (no caso, o onInit). Object é o tipo da variável (lembra que as struct são tipos?) e por ultimo, obj é apenas o nome da nossa variável local. Agora sim, Object.create() isso é que cria um objeto (instancia uma struct). Voce poderia chamar isso sem colocar numa variavel:
call Object.create()
Mas voce não poderia acessar aquele objeto, pois ele não teria um registro (uma variável). Quando executamos obj.stop(), fizemos o objeto criado que estava guardado na variavel obj chamar o method stop dele. O ponto final entre o nome e o method é importante, nunca esqueçam dele. Logo em seguida, destruímos nosso objeto com o obj.destroy(). O comando destroy libera o espaço daquela instancia da struct. "Cada struct" só pode ter 8190 instancias, ou seja, só pode ser criada 8190 vezes de uma vez. Então Para completar a aula ensinarei a criar variáveis locais. É facil:
local tipo-da-variavel nome-da-variavel
Exemplos:
local unit caster
local effect efeito
local timer tempo
local player jogador1
local integer i
Voce pode "setar" o valor dela na criação ou durante o method, como qualquer variável:
set caster = GetTriggerUnit()
set i = 1348
Mas cuidado, as variáveis locais podem causar leak quando você não remover o conteúdo delas. Apenas as variaveis do tipo handle podem causar leak. Handle é tudo que não é integer, real, boolean e string. Ou seja, unit, effect, timer, group, force, etc. Dê uma olhada no documento Common.j dentro do MPQ do war3 para saber mais. E qualquer variável do tipo de uma struct também não causa leak, voce só precisa destruir aquela instancia quando não precisa mais dela. Mas como remove um conteudo de uma handle? Apenas no final seu method dê set para null. Veja:

method XXX takes nothing returns nothing
 local unit u = GetTriggerUnit()
 local integer i = 12 // integer não causa leaks
 // código restante do method
 // ...
 set u = null
endmethod
Espero que essa aula tenha sido muito esclarecedora. 
Então, até breve!

Leia Mais...

quinta-feira, 28 de julho de 2011

2ª Aula de vJass - Primeiras Noções

Bom essa será nossa segunda aula, sugiro que leiam ela como muita atenção.
Antes de tudo voce deve saber que vJass é "case sensitive", ou seja, letras maiusculas e minusculas fazem diferença. Unit, é diferente de UnIt ou uNiT ou unit ou uniT e etc. Desta maneira os comandos if e loop, por exemplo, só podem ser escritos em letras minusculas senão o compilador irá interpretá-los como variaveis.

Primeiro Código

Vejamos esse código escrito em vJass:
library Exemplo1
 struct MyStruct
     // Meu primeiro código
     static method onInit takes nothing returns nothing
         call BJDebugMsg("Hello World!")
     endmethod
  endstruct
endlibrary

Este codigo exibirá a messagem Hello World! na tela quando seu mapa iniciar.

Vamos entender o codigo

    A linha library Exemplo1 cria uma library nomeada Exemplo1. Uma library é como se fosse um bloco de notas com codigos. Por enquanto é apenas isso que voce precisa saber. Caso queira saber mais leia este tutorial que eu fiz. Quando voce quiser terminar sua library, voce deve apenas escrever a linha (vista no final do código) endlibrary. Esta linha é obrigatória, nunca se pode deixar uma library aberta (sem o seu endlibrary).
    Quando fazemos um código, uma boa idéia é usar comentarios que ajudem a explicar partes dele. No nosso código temos o comentario // Meu primeiro código, viu né? O compilador desconsidera qualquer coisa que esteja escrito depois do // naquela linha.
    A linha struct MyStruct cria uma struct e nomeia ela de MyStruct. Uma struct é um objeto e como um objeto, ela pode ter varias caracteristicas. Nas proximas aulas voces entenderam melhor. Assim como na library, o compilador precisa saber onde termina sua struct, para isso apenas escreva endstruct depois de escrever os códigos da sua struct.
    O static method onInit takes nothing returns nothing é nosso method que sempre vai iniciar junto com o mapa. O method onInit (escrito desse jeito, lembre-se do case sensitive) de uma struct sempre será executado quando seu mapa iniciar, sempre deve ser static e takes nothing returns nothing. O termo static vocês entederam mais tarde. A parte takes nothing diz que o method não precisa de nenhuma variavel para ser executado. Quando voce quiser que um method use alguma variável você pode passar o valor dela pra essa function. E returns nothing significa que esse method não retorna nenhum valor. Um method pode retornar um valor (move speed de uma unit, por exemplo) e você pode preferir guardar esse valor em uma variável. O onInit é o nome do method, esse nome pode ser qualquer um. Contando que não se repita ou comece com números. Aé, methods também precisam ser encerrados. Apenas coloque endmethod no final dele.
    Única coisa que esse código faz é exibir a messagem Hello World!. 
function BJDebugMsg takes string msg returns nothing
    Olha ai, essa function (que é quase a mesma coisa que um method) requer uma string: takes string msg. Uma string é um conjunto de caracteres, quem conhece de trigger editor sabe disso. O comando BJDebugMsg exibe a string msg na tela por um minuto. Só!
    Antes do comando pode ver que tem a palavra call, que significa chamar. Ele que chama/executa o comando. Uma string sempre deve ser escrita entre aspas (" "), sempre. Um exemplo:
Faz de conta que voce quer mostrar mostrar a messagem Game Over. Então ficaria assim:

call BJDebugMsg("Game Over")
    As coisas escritas dentro dos parenteses são os parametros do comando, o takes dela. Quando um comando tem takes nothing você precisa apenas deixar os parenteses vazios.
Exemplo:

call CreateTimer() // um comando que cria um countdown timer.
call CreateTimer // assim daria erro, faltou os parenteses.
Quando um comando tem algum returns, voce pode preferir guarda o valor do retorno dela. O comando CreateTimer, por exemplo, é takes nothing returns timer. Ou seja ele retorna um timer, um timer que acabou de ser criado. Faz de conta que voce tem uma variável chamada TempTimer e você quer guarda um novo timer nela:

set TempTimer = CreateTimer()
// O comando CreateTimer foi chamado e seu valor de retorno
// foi guardado na variavel TempTimer


Primeiramente, desculpe pelas aulas serem semanais. Tentarei faze-las em um periodo mais curto. Espero que tenham entendido sobre esse inicio, voce ainda estará confuso, mas é assim mesmo. Logo logo voce estará entendendo a sintexe do vJass.

Abraços.

Leia Mais...

quinta-feira, 21 de julho de 2011

1º Aula de vJass - INTRODUÇÃO

    Vamos, nestas lições, aprender os conceitos básicos da linguagem de programação vJass a qual é muito famosa entre os editores experientes de warcraft, devido ao seu poder.

Leia Mais...

domingo, 12 de junho de 2011

Atualizações no Buff Generator

Buff Generator atualizado pra 1.4b. Apenas poucas mudanças no codigo. E o BGType foi para a versão 1.01, agora ele tambem expecifica o buff por magico (magical) ou fisico (physical).

Abraços

Leia Mais...

segunda-feira, 6 de junho de 2011

Buff Generator

Atualizei meu system para a versão 1.4. E agora ele chama Buff Generator.

Siga o link: http://blizzeditors.com.br/topic/17-buff-generator/

Leia Mais...

domingo, 13 de fevereiro de 2011

Add Life v1.1

Esse system é bem simples e util. Para você adicionar HP (hit points) a uma unidade ao ponto que ela fique com hp completo, você deve adicionar uma habilidade que almenta a quantidade de hp dela. Para não ter o trabalho de cria aquelas functions que adicionam e removem essa habilidade, eu fiz esse system.

O system só tem uma function principal:
function UnitAddLife takes unit whichUnit, real amount returns nothing
Essa function adiciona uma quantidade de hp (amount) a unidade desejada (whichUnit). Simples!

Script do Sistema:
library AddLife
// Add Life System
// Criado por "Bills"
// Versão: 1.2
//=====================================
// Como implementar:
// Crie uma nova trigger,
// converta ela para custom script,
// salve seu mapa,
// feche-o,
// reabra-o
// e apague o ! da linha abaixo.
//! external ObjectMerger w3a AIlz ALBA anam "Life Bonus" ansf "(Bills's AddLife System)" Ilif 1 500000 aite 0
//=====================================================================
//Caso ja tenha essa native declarada, "comenta" a linha abaixo
native UnitAlive takes unit whichUnit returns boolean

private struct AL extends array // struct array não possui method create/destroy
    private static constant integer LIFE_BONUS_ABIL = 'ALBA'
    private static unit array tempUnit
    private static integer index
    private static timer timerFunc
   
    private static method removeLifeBonus takes nothing returns nothing
        loop
            exitwhen (index==0)
            call UnitRemoveAbility(tempUnit[index],LIFE_BONUS_ABIL)
            if (UnitAlive(tempUnit[index])) then
                call SetWidgetLife(tempUnit[index],GetWidgetLife(tempUnit[index]))
            endif
            set index=index-1
        endloop
    endmethod
   
    static method unitAddLife takes unit u, real amount returns nothing
        set amount=GetWidgetLife(u)+amount
        call SetWidgetLife(u,amount)
        if (GetWidgetLife(u)<amount) then
            call UnitAddAbility(u,LIFE_BONUS_ABIL)
            call SetWidgetLife(u,amount)
            set index=index+1
            set tempUnit[index]=u
            call ResumeTimer(timerFunc)
        endif
    endmethod
   
    private static method onInit takes nothing returns nothing
        set index=0
        set timerFunc=CreateTimer()
        call TimerStart(timerFunc,0.00,false,function thistype.removeLifeBonus)
    endmethod
endstruct

 function UnitAddLife takes unit u, real amount returns nothing // por compatibilidade
    call AL.unitAddLife(u,amount)
 endfunction

endlibrary

Leia Mais...

quinta-feira, 3 de fevereiro de 2011

Fear v1.0

WTF is Fear?
O.O fear? fear signica medo, se eu não estiver errado. Fear é um status comum em alguns MMORPG (eu mesmo só conheço de WoW e zOMG). 
Quando uma unidade está "feared" ela irá correr para longe do daquele que amedrontou ela.

Como usar Fear em seu mapa
- Crie uma nova trigger chamada "Fear" e converta ela para Custom Script.
- Substitua todo texto na trigger pelo script desse system.
- Salve seu mapa e feche o editor.
- Reabra seu mapa e apague o ! na segunda linha do script. Pronto!

Funtions Principais do System
function UnitFearTarget takes unit source, unit target, real duration returns nothing
Esta function adiciona fear a um alvo a sua escolha.

function UnitRemoveFear takes unit whichUnit returns nothing
Esta function remove fear da unidade.

function IsUnitFeared takes unit whichUnit returns boolean
Esta function indica se a unidade está ou não "feared".

Como usar Fear com buffs
Fear System funciona sem buff, apenas contando a duração. Caso você prefira que o fear tenha buff ele irá durar até a duração escolhida ou até o alvo perder o buff. Se você quiser usar buff siga a instruções abaixo:

- Escolha um buff padrão para o fear. Feito isso, mude o valor da variable BUFF_CHECKER para o raw-code do buff escolhido. 

private constant integer BUFF_CHECKER = 'B000'
Agora mude o valor da variable USE_BUFF_CHECKER para true.
Pronto!

Obs: use dummy para adicionar o buff escolhido, pois caso você demore a adicionar aquele buff (não pode demorar mais que 0.2 segundos) a unidade acaba perdendo o fear, pois o trigger detecta que a unidade não estava com o buff.



Leia Mais...

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...

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...