Ir para conteúdo

[actions]tutorial Prático


noobinhu

Posts Recomendados

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~

Editado por noobinhu
Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...