[actions]tutorial Prático

noobinhu
em Actions e Talkactions

noobinhu

Ex Administrador
avatar
Marquês
Marquês

INFOS

Grupo: MarquêsRegistrado: 01/03/06Posts: 1022Gênero: Masculino

Olá, meu primeiro tutorial :D

 

Vou ensinar a fazer actions, somente actions, em um próximo tuto irei ensinar talk, movements e npcs, todos práticos ...

 

Índice:

1. O Ínicio

 

2. Exemplos de ações feitas

 

3. If e Elseifs

 

4. Continuado os exemplos

 

5. Exemplos mais difíceis

 

6. Exercícios de treino

 

7. Respostas dos exercícios

 

8. Tutoriais indicados

 

 

1. O Ínicio

 

Não aprenda detalhes, aprenda fazer! :D

Então vamos lá, primeira coisa:

 

QUERO FAZER UMA ACTION!!

 

Legal, sempre é assim que começa, você quer fazer, mas que estilo de action você quer fazer?

 

Vamos por etapas...

 

QUALQUER ACTION que você for fazer, seja de quest, de leveldoor, de piscar luzinha, de virar um ET, de sumonar um vira-lata, tem que começar com essa tag:

 

function onUse(cid, item, frompos, item2, topos)

 

e logo após para finalizar esta tag usamos:

 

end

 

ficando assim:

 

function onUse(cid, item, frompos, item2, topos)

 

 

 

end

 

Certo, pelo que eu entendi em todas minhas actions, movements etc, essa tag determina 3 coisas, QUEM executa a ação, COMO e ONDE no caso:

 

CID = Você executando a ação

item, item2 = Como executar a ação

frompos, topos = posições ONDE ocorre a ação

 

Feito isso, iremos classificar essas partes:

 

function onUse(cid, item, frompos, item2, topos)

 

-- linhas em branco entre a function

 

end

 

Galera, essas classificações foi eu que inventei, nunca vi nada parecido, só to criando para ajuda-los entender...

 

TAGS - CLASSIFICAÇÃO - ENTENDIMENTO

Azul - Definido - Toda e qualquer action deve possuir essa tag

Vermelho - Indefinido - Onde todas ações devem ficar, por isso se chama 'Indefinido', sempre muda (ou quase sempre) :D

 

Pronto, você já tem a base de seu script, agora temos que pensar, que script queremos fazer?

Nos exemplos eu irei demonstrar, diversas ações...

 

2. Exemplos de ações feitas:

 

Ação de quest:

if item.itemid == <id do bau, pedra, etc> and item.uid == 9001 then

 

 

quest = getPlayerStorageValue(cid,9001)

if quest == -1 or quest == 0 then

 

doPlayerSendTextMessage(cid,22,"<msg>")

doPlayerAddItem(cid,<itemid>,1)

setPlayerStorageValue(cid,9001,1)

 

 

 

else

doPlayerSendTextMessage(cid,22,"The chest is empty.")

end

end

 

Explicação:

Leitura: SE o item de id = <id do bau, pedra, etc> Acho que nem precisa explicar né ;x

 

Leitura: E Explicação porque ressaltei o 'and': eu ressaltei porque, pra quem não tem entendimento de inglês, sempre terá erros nisso, confundindo o 'and' com o 'or', no caso se fosse or, a ação da action seria para todos os item.itemid determinados e todos item.uid determinados e não para os 2 juntos :]

 

Leitura: o unique do item usado for = <id determinado> Explicação, também acho que não é necessário

 

Leitura: então Explicação, depois de todas as condições selecionadas você coloca o then para dizer 'agora podem vir as ações :D'

 

Leitura, quest = pegaStorageValue(criatura,9001(número do storage value))

SE quest == -1 ou quest == 0 (não tiver sido feito) então... Esta parte indica se o player ja fez ou não a quest.

 

Ações que aconteceriam depois SE todas as condições forem verdadeiras

Ações: mandar a message que estivesse escrito entre as virgulas onde está '<msg>'

adcionar um item ao player de itemid determinado

adcionar storage value determinado, no caso 9001 para 1. Ou seja, estava 0 ou -1 e agora virou 1, ou seja, o player ainda n tinha feito e agora com esta tag, determina que ele já fez e nunca mais pegará este item denovo enquanto estiver com a storage value 9001 determinada 1

 

Leitura: Caso contrário, manda mensagem para o player <msg> e fecha o if do quest (storage value)

 

NOTA: Para cada IF, tem de ter um end... vou explicar melhor isso agora:

 

3. If e Elseifs:

 

Um caso para policias xD

 

Sério mesmo, pra aprender e dominar esses 2 tem que ter muito treino, eu por exemplo, divez em quando ainda tenho dúvidas, é sempre bom relembrar em alguns tutoriais...

 

Certo, a regra básica, cada IF tem um END, exemplo:

 

if item.itemid == 2506 then

if item.uid == 2506 then

quest = getPlayerStorageValue(cid,9001)

if quest == -1 or quest == 0 then

 

end

end

end

 

Senão me engano é esta ordem, de trás para frente, olhem as posições de cada um dos ends e ifs, isso é muito bom aprender bem, pra quando você for fazer um else não ficar perdido :]

Tá, essa eu já entendi, mas e quando tem elseif?

 

Quando tem elseif, é muito fácil, olhe só:

 

if item.itemid == 2506 then

if item.uid == 2506 then

quest = getPlayerStorageValue(cid,9001)

if quest == -1 then

elseif quest == 0 then

 

end

end

end

 

O elseif, é mais uma forma de não colocar muitos ends, amanhã farei o teste, mas tenho quase certeza, sempre antes de usar um elseif, tem que ter um if, olhem esse exemplo agora com um else, como ficaria:

 

 

if item.itemid == 2506 then

if item.uid == 2506 then

quest = getPlayerStorageValue(cid,9001)

if quest == -1 then

elseif quest == 0 then

 

else

-- as ações aqui encontradas seriam validas tanto para o IF quanto para o elseif :]

end

end

end

 

Essa parte, de ifs e elseifs acho que acabou, qualquer dúvida poste aqui, é muito complicadinha essa parte ;P

 

4. Continuado os exemplos então...

 

Mudando de Templo (masterpos):

 

if item.itemid == <id de uma estátua, pedra, o que quiser> and item.actionid == <id da actionid> then

 

newmasterpos = {x=158752, y=56872, z=2658}

doPlayerSetMasterPos(cid,newmasterpos)

doTeleportThing(cid,newmasterpos)

 

end

 

Item da actionid == <id> Simplesmente, mesma coisa do que os outros item, unique etc

 

primeiro indicamos, uma posição e depois, adcionamos ao player (cid) esta posição como templo

 

Teleportamos o player (cid) para o lugar determinado

 

Tendo noção de como fazer uma nova runa, no caso a clássica Mana Rune:

 

if item.itemid == <id da mana rune> then

doPlayerAddMana(cid,+9000)

end

 

Adciona mana ao player, no caso +100 de mana :], se fosse retirar colocaria -100 -50 -300 e assim por diante

 

 

Tá, dae se fala, mas pow, essa runa nunca acaba, não tem exhaust, não tem limite de lvl, não tem nada, só adciona mana, tá muito apelona...

 

E eu te respondo:

"Será o seu desafio, fazer tudo isso que você falou :D"

 

E para os espertinhos, o resultado dela feita irá estar daqui a alguns dias no final do tópico em um spoil.

 

 

5. Exemplos mais difíceis:

 

Uma quest meio tosca, possível sword of fury quest by me:

 

 

if item.uid == 30001 then

elseif getPlayerLevel(cid) == 1 then

elseif getPlayerHealth(cid) == 1 then

elseif getPlayerFood(cid) == 0 then

elseif getPlayerAccess(cid) == 0 then

 

fist = getPlayerSkill(cid,0)

club = getPlayerSkill(cid,1)

sword = getPlayerSkill(cid,2)

axe = getPlayerSkill(cid,3)

 

elseif fist > club then

elseif fist > sword then

elseif fist > axe then

 

sworfoffury = getPlayerStorageValue(cid,30001)

 

if swordoffury == -1 or swordoffury == 0 then

 

doPlayerSendTextMessage(cid,22,"You have found the sword of fury.")

doPlayerSendTextMessage(cid,22,"Congratulations!")

doPlayerAddItem(cid,<sword of valor item id>,1)

setPlayerStorageValue(cid,30001,1)

 

else

doPlayerSendCancel(cid,"You already did it.")

end

else

doPlayerSendCancel(cid,"Only the humble can do it.")

end

 

Tá fico meio tosca, mas deu pra mostrar grande parte dos comandos e dar uma noção melhor ^.-

 

Explicações:

 

Leitura: Se o level for == 1 então...

 

Leitura: Se o seu hp for == 1 então ...

 

Leitura: Se você não tiver mais efeito de foods então...

 

Leitura: Se o seu acesso for 0, ou seja, um player ...

 

Determinando todas skills, para fazer as comparações...

 

Leitura: Se o fist skill for maior do que todas skills melee então...

 

Aqui só tem uma coisa nova, que é o doPlayerSendCancel, é estilo uma mensagem, mas aparece em cima do default, em branco.

 

Ídem a última explicação :}

 

Último exemplo, script de uma door, normal... e depois umas modificações na mesma ...

 

Door normal:

 

if item.itemid == <id da porta fechada> then

 

doTransformItem(item.uid,item.itemid-1)

 

end

 

if item.itemid == <id da porta aberta> then

 

doTransformItem(item.uid,item.itemid+1)

 

end

 

Explicações:

 

Neste script só temos essa tag diferente, o que ela faz, do geito que foi estruturada ela iria pegar o número do id do item iria subtrair a 1 e transformar a porta no item do resultado da subtração... no caso ali teria que editar pro id certo de uma porta aberta

 

Mesma coisa, mas aqui é uma SOMA, ou seja, o item que for resultado na soma será o item que será re-colocado no lugar da porta

 

 

Agora algumas modificações, nesta porta:

 

Voc door:

 

if item.itemid == <id da porta fechada> then

if getPlayerVocation(cid) == 1 or getPlayerVocation(cid) == 2 or getPlayerVocation(cid) == 5 or getPlayerVocation(cid) == 6 then

 

doTransformItem(item.uid,item.itemid-1)

 

else

doPlayerSendCancel(cid,"Only sorcerers and druids can enter this door.")

end

end

 

if item.itemid == <id da porta aberta> then

doTransformItem(item.uid,item.itemid+1)

 

end

 

 

Só essa nova tag, ela checa a vocação do player, no caso, se o player fosse voc 1, 2, 5 ou 6, ele conseguiria abrir, caso contrário não... Vocês devem ter percebido que esta não é uma porta adequada para o caso, porque depois qualquer um passaria nela, nos próximos tutoriais iremos aprender fazer umas coisinhas mais legais com isso ^.-

 

Guild Door...

 

if item.itemid == <id da porta fechada> then

if getPlayerGuildId(cid) > 0 then

 

doTransformItem(item.uid,item.itemid-1)

 

else

doPlayerSendCancel(cid,"Only guild members can enter this door.")

end

end

 

if item.itemid == <id da porta aberta> then

doTransformItem(item.uid,item.itemid+1)

 

end

 

Checa se o player é ou não de uma guild, sendo 0 para pessoas sem guild ... PS: Denovo só essa action não seria a ideal para colcoar a um server, pois só um player de guild poderá abrir a porta, porém... todos poderam passar se ela estiver aberta.

 

6. Exercícios de treino:

 

Vou passar alguns exercícios bons para treinar tudo isso, que você acabou de ler:

 

1. Faça a continuação daquela mana rune, visitem outros tópicos para ter mais informações e etc... ai vai o script inicial:

 

if item.itemid == <id da mana rune> then

doPlayerAddMana(cid,+9000)

end

 

Restrições:

Adcionará 200 de mana;

Terá exhaust;

Adciona um efeito mágico;

Adciona uma mensagem.

 

PS: Sistema de exhaust by colex:

 

Adcione isto em data ~> actions ~> lib ~> actions.lua

function getPlayerExhaust(player,number,time)

 

now = os.time()

before = getPlayerStorageValue(player,number)

 

exhaust = os.difftime(now,before)

 

if before == -1 then

setPlayerStorageValue(player,number,now)

return -1

else

if exhaust >= time then

setPlayerStorageValue(player,number,now)

return -1

else

return 1

end

end

end

 

Exemplo de action, com ele:

 

tempo = 1

numero = 1540

 

if getPlayerExhaust(cid,numero,tempo) == -1 then

-- ações

end

 

Neste exemplo terás 1 segundo de exhaust.

 

Exercício 2. Construa um sistema de mining.

 

Restrições:

Terá que usar o item2.itemid

O item.itemid tem de ser um machado

O item2.itemid tem de ser pedras, rochas...

Terá que ter 3 tipos de loots...

E ser baseado em skill...

 

 

Exercício 3. Faça uma quest.

 

Restrições:

Terá que usar storage values...

Cada voc, 2 chances de loots...

Level mínimo...

 

 

 

Acabou os exercícios...

 

7. Respostas dos exercícios:

 

Semana que vem, eu adciono, safadinho :D

 

 

8. Tutoriais indicados:

 

Tutorial Sobre Actions

Link do Tutorial

 

 

Caso houver alguma dúvida sobre os exercícios, ou tenham idéias para novos exercícios podem postar aqui... :}

 

 

Créditos: Yunie ~~ :D

 

 

//Yunie~

teres

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 31/10/06Posts: 77Char no Tibia: Elite Lord Paladin

Ta bem legal ate q é dificil fazer tuto sobre actions ..

 

Naum sou dessa aera por isso naum possu afirmar c esta perfeito mas..

 

Pelo q sei ta Tudo rox

 

=P

Melhor Naum..
Piorr Naum...
Diferente Naum..


Apenas eu e nada mas ..

Assinatura em construçao..









=D

Meu Time De Coraçao!





C vc gostou do meu Trabalho Vire meu Fan




Sou fan dessa galera aki.. o:



Frases Para Ela =* ( Naum seja curioso )

É mais fácil uma estrela cair do céu com o vento, do que você sair do meu pensamento.

Outra?


Você não morre quando deixa de viver, mas sim quando deixa de amar

=P

Addict

Ex-Diretor de Equipe
avatar
Conde
Conde

INFOS

Grupo: CondeRegistrado: 12/10/05Posts: 568Gênero: MasculinoChar no Tibia: Homao Dapoha

Movido para seção correta.

matheusbm

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 29/01/08Posts: 71Char no Tibia: Knight of Fortune

Fiko legal me ajudo tb parabens

Gostou de min use meu fan bar


Meu Ot

ip:otbm.no-ip.org
rate:1000
skill:1000
mana:1000


Minhas metas


[x]1post
[x]5 posts SERVO
[x]10 posts CAMPONÊS
[x]25 posts CAÇADOR
[x]50 posts CAVALEIRO
[x]100 posts BARONETE
[ ]200 posts BARÃO
[ ]300 posts VISCONDE
[ ]400 posts DUQUE
[ ]600 posts ARQUEDUQUE
[ ]800 posts ARISTOCRATA
[ ]1000 posts REGENTE
[ ]1400 posts SÁBIO
[ ]1800 posts SACERDOTE
[ ]2500 posts PRÍNCIPE


Meus trabalhos

noobinhu

Ex Administrador
avatar
Marquês
Marquês

INFOS

Grupo: MarquêsRegistrado: 01/03/06Posts: 1022Gênero: Masculino

Canso pra escrever tudo isso, umas 5h escrevendo xD

 

Valeu pelos comments, antes mesmo deu acabar ...

Lordice

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 04/07/07Posts: 8

Ficou muito bem detalhado, bem explicado; ate um spriter/mapper como eu pode se tornar profissional estudando um tuto destes :)





matheusbm

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 29/01/08Posts: 71Char no Tibia: Knight of Fortune

fiko legal Xd!!

Gostou de min use meu fan bar


Meu Ot

ip:otbm.no-ip.org
rate:1000
skill:1000
mana:1000


Minhas metas


[x]1post
[x]5 posts SERVO
[x]10 posts CAMPONÊS
[x]25 posts CAÇADOR
[x]50 posts CAVALEIRO
[x]100 posts BARONETE
[ ]200 posts BARÃO
[ ]300 posts VISCONDE
[ ]400 posts DUQUE
[ ]600 posts ARQUEDUQUE
[ ]800 posts ARISTOCRATA
[ ]1000 posts REGENTE
[ ]1400 posts SÁBIO
[ ]1800 posts SACERDOTE
[ ]2500 posts PRÍNCIPE


Meus trabalhos

Felipets

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 13/11/05Posts: 19

Caro mto bom da pra ajudar mtas pessoas

É meu fan? Use isto \/

Sou fan:


Pedretz

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 20/12/07Posts: 95

Muito bom mesmo o tutorial!

Só evite usar cores claras como o amarelo.

Abraços.

Olá, meu nome é Pedro, e eu planejo criar um OT diferente. Eu, assim como muitos deste fórum, conheço o Tibia desde os meus 12 anos. Depois desses muitos anos jogando e parando de jogar, vivenciei muitas mudanças extremas na base do jogo, tanto do Tibia "RL" quanto dos OTs. E por que eu parava de jogar tibia? Porque eu me cansava de ficar frustado. Frustação que vinha do meu desejo de fazer meu próprio OT que era impedido pela minha falta de tempo. Pois bem, a partir do ano que vem, começo a cursar Ciência da Computação. Esse curso vai me dar a base necessária para que eu entenda todo o funcionamento do OT e para que eu(e outros que forem competentes e estiverem interessados) construir(mos) um OT conceitual. Agora, por que esse OT seria diferente? Bem, eu serei detalhista ao extremo, me esforçando ao máximo para entregar a melhor experiência possível para todos aqueles que quiserem se divertir; também, eu e minha equipe, seguiremos sempre nosso grande mestre

Dieter Rams, adaptando seus grandes princípios ao design do OT e até à jogabilidade. Basicamente, esse OT será bem feito, esteticamente agradável e sempre preoucupado com a experiência final do jogador. Os que estiverem interessados em se juntar a minha equipe e tentar achar a fórmula mágica que fará o nosso OT realmente diferente podem me mandar mensagens particulares. Estamos procurando principalmente jogadores de tibia experientes, quem entende de design e criadores de RPG. E lembrem-se, esse é um projeto movido à paixão por desenvolver, não espere se juntar a minha equipe para ganhar dinheiro, porque, se o dinheiro vier, vai ser por consequência do nosso bom trabalho. O servidor provavelmente será de minha propriedade e dedicado para rodar o OT. Ou, será alugado, se eu não conseguir liberar uma máquina. Também abrirei um projeto em paralelo para a criação de um servidor de Ragnarok em parceria com alguns designers conhecidos. Neste, a equipe já está meio formada e eu só estou avisando aqui que esse servidor também seguirá os mesmos princípios do OT. E se alguém estiver interessado em ajudar por lá, também me mande mensagem particular.

Agradeço a atenção,

Pedro

noobinhu

Ex Administrador
avatar
Marquês
Marquês

INFOS

Grupo: MarquêsRegistrado: 01/03/06Posts: 1022Gênero: Masculino

É eu sabia, mas tem que usar cores que são visivelmente diferentes e eu já tinha suado todas, caso não consiga ler é melhor selecionar as partes claras e ler normal :} ou colar em um editor de texto...