Olá, meu primeiro tutorial
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!
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)
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 '
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 thenif 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 thenif 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 thenif 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> thendoPlayerAddMana(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 "
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 thenelseif 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> thenif 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> thenif 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> thendoPlayerAddMana(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 = 1numero = 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:

8. Tutoriais indicados:
Tutorial Sobre Actions
Caso houver alguma dúvida sobre os exercícios, ou tenham idéias para novos exercícios podem postar aqui... :}
Créditos: Yunie ~~
//Yunie~