Ir para conteúdo
  • 0

Dúvida De Scripter Iniciante


WillOliveira

Pergunta

Bem pessoal, comecei a aprender Lua essa semana e estou com dúvidas:

 

- Ainda não entendi pra que serve o comando return (sejam claros na hora de explicar por favor, não se esqueçam que sou um scripter iniciante).

- Notei que em todos os scripts, ao declarar a função tem que colocar os parâmetros dentro dos parênteses, como vou saber que parâmetros colocar?

 

Exemplo:

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

 

Como o cara que fez esse script sabia que os parâmetros que ele tinha que colocar são "cid, item, frompos, item2, topos"? E se ele colocasse outros parâmetros? E se ele mudasse a ordem dos parâmetros? Afinal, pra que servem os parâmetros da função e como saber quais parâmetros colocar no script?? Obrigado!!

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

6 respostass a esta questão

Posts Recomendados

  • 0

CARA A FUNÇAO QUE VC CITOU function onUse(cid, item, frompos, item2, topos) É UMA FUNÇAO EXECULTADA EM QUASE TODA ACTION NO CASO FUNCTION ONUSE SIGNIFICA APOS USAR ALGUM ITEM// E CID = O PLAYER QUE ESTA USANDO O ITEM// ITEM E ITEMEX SAO OS IDS DO ITEM QUE SERAO USADOS //FROM POSOTION E TOPOSITION É AS POSIÇOES QUE A ACTION ACONTECERA.

INTAO ESSA FUNÇAO SIGNIFICARIA (QUANDO O PLAYER "X" USAR "X" ITEM EM "X" POSIÇAO ACONTECERA "X" COISA.

 

NAO SEI SE EXPLIQUEI BEM MAIS É ISSO.

 

VLW SHADOWNZINHO

Link para o comentário
Compartilhar em outros sites

  • 0

Esse é o problema, já vi functios onUse com parâmetros diferentes desse... Por exemplo: function onUse(cid, item1, fromPosition, itemEx, toPosition), os parâmetros são os mesmos mas escritos de forma diferente, tipo, (???)

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

  • 0

return acaba o a função e retorna os valores que vem depois dele

exemplo:

function getkkk()
return "sauhasuhsasahu" -- retorna essa string
end
print(getkkk())

printaria : sauhasuhsasahu

 

e quanto as funções como onUse o nome dos parametros n muda nada a ordem e sem pre a mesma,vc poderia colocar

on Use(item1,item2,item3,item4,item5)

item1 seria o cid do player

item2 seria o item(n o itemId)

item3 seria o frompos(da onde foi usado)

item4 seria o itemEx (objeto em que foi usado item ou creatura)

item5 seria o topos(a onde o player clico com aquela mirinha)

 

o nome dos parametros n importa,só onde eles estão poderia ser

onUse(qualquercoisa,kk,demonb,vodkart,ali)

vc só precisar usar com o mesmo nome depois

Link para o comentário
Compartilhar em outros sites

  • 0

primeira coisa que você precisa saber pra entender esse meu tutorialzinho, é que tudo que é antecedido por "--" (dois traços) no script é um comentário, e não é lido pelo servidor, servem apenas para auxiliar os programadores a entenderem o que o código faz

 

isso você entende quando você estuda o código fonte do seu servidor, lua é apenas um sistema de scripting, algo auxiliar que você consegue manipular sem ter que recompilar o servidor.

 

function onUse(p1, p2, p3, p4, p5)

 

percebe que chamei os parâmetros de p1 até p5, o que o código em c++ faz quando vai ler esse script, é declarar o p1 como o ID da criatura que está usando o item, p2 como as informações sobre o item usado, p3 sobre a posição e assim vai, o outro usuário postou o que cada parâmetro faz. Resumindo, o código seria lido assim:

 

function onUse()

local p1 = ID_DA_CRIATURA

local p2 = TABELA_COM_INFO_DO_ITEM

local p3 = POSICAO_DA_CRIATURA

 

você não precisa declarar todos os parâmetros, mas se não o fizer, também não vai ser declarado aquele parâmetro pra ser usado no script

 

você poderia fazer assim:

 

function onUse(_, __, ___, ____, _____)

 

o problema é que o código ia ficar difícil de ser lido por humanos, por exemplo:

 

 

function onUse(_, __, ___, ____, _____)

   doCreatureAddHealth(_, 50) -- adiciona 50 de hp em quem usou o item

   doRemoveItem(__.uid) -- remove o item

return true

end

 

 

fica muito mais fácil de ser lido assim (o mesmo código):

 

 

function onUse(criatura, item_usado, posicao_da_criatura, item_secundario, posicao_do_item2)

   doCreatureAddHealth(criatura, 50) -- adiciona 50 de hp para criatura

   doRemoveItem(item_usado.uid) -- remove o item usado

return true

end

 

 

O fato de ser sempre "cid, item, frompos, item2, topos" ou então "cid, item, fromPosition, itemEx, toPosition" é mera convenção, o primeiro é apenas abreviação do segundo (não tem que ficar digitando as coisas com letra maiúscula e os nomes são menores e mais rápidos de se escrever)

 

cid = creature id

 

frompos = fromPosition

 

topos = toPosition

 

item2 = itemEx (itemEx é o item que você escolhe com o "use with" do tibia, por exemplo, você usa a corda, e com aquele negócio de selecionar você aperta em cima do buraco, assim o buraco é o itemEx)

 

O uso do return é o seguinte:

 

toda e qualquer função em lua retorna algum valor, mesmo se você não escrever return <algo>, a função vai retornar null.

 

primeira coisa a se entender de return, é que ele para de executar a script, um exemplo de como pode ser útil em tornar scripts mais fáceis de serem lidas:

 

Sem uso do return:

 

 

function onUse(cid)

   if getPlayerLevel(cid) < 10 then

    doPlayerSendCancel(cid, "Você precisa ser level 10 ou maior para usar esse item!")

   else

    doCreatureAddHealth(cid, 100)

   end

return true

end

 

 

 

function onUse(cid)

   if getPlayerLevel(cid) < 10 then

    doPlayerSendCancel(cid, "Você precisa ser level 10 ou maior para usar esse item!")

   return true -- se o level do player for menor que 10, o return aqui será lido e o resto do script vai ser ignorado

   end

   doCreatureAddHealth(cid, 100)

return true

end

 

 

Você pode até estar pensando que isso apenas aumentou o tamanho da script, mas em scripts muito longas, em que se abre muitos ifs dentro de ifs, fica chato de ler, exemplo:

 

 

function onUse(cid)

   if getPlayerLevel(cid) > 10 then

    if getPlayerStorageValue(cid, 1000) == -1 then

	    if getPlayerItemCount(cid, 2500) >= 1 then

		    doCreatureAddHealth(cid, 50)

		    setPlayerStorageValue(cid, 1000, 1)

	    else

		    doPlayerSendCancel(cid, "Você não tem o item necessário.")

	    end

    else

	    doPlayerSendCancel(cid, "Você já usou esse item antes e não pode mais usá-lo.")

    end

   else

    doPlayerSendCancel(cid, "Você precisa ser level 10 ou maior para usar esse item.")

   end

return true

end

 

 

Ficou chatinho de ler, certo? isso porque foi identado, agora um script sem identeção nenhuma (não há espaços que separam os blocos dentro dos ifs) fica impossível de ler, olhe dessa outra forma:

 

 

function onUse(cid)

   if getPlayerLevel(cid) < 10 then

    doPlayerSendCancel(cid, "Você precisa ser level 10 ou maior!")

   return true

   end

   if getPlayerStorageValue(cid, 1000) ~= -1 then

    doPlayerSendCancel(cid, "Você já usou esse item antes e não pode mais usá-lo.")

   return true

   end

   if getPlayerItemCount(cid, 2500) <= 0 then

    doPlayerSendCancel(cid, "Você não tem o item necessário.")

   return true

   end

   doCreatureAddHealth(cid, 50)

   setPlayerStorageValue(cid, 1000, 1)

return true

end

 

 

Agora saber qual valor colocar após o return, é uma questão de prática. Daqui a pouco vou mostrar seu uso em funções e algoritmos, mas em eventos pré-estabelecidos no código fonte (como function onUse, onSay, onStepIn), o servidor lê o que está escrito no seu script, e dependendo do valor que você retornar para o servidor, ele vai tomar uma determinada ação.

 

Os caras que programaram o código fonte, fizeram com que se o que você retornou for uma condição verdadeira, nada vai acontecer, mas se for uma condição falsa, vai aparecer "You cannot use this object." no cliente.

 

Quando eu digo condição verdadeira/falso, você tem que ter em mente os data types:

 

strings sempre são verdadeiros, ou seja, se você escrever return "olá", não vai aparecer "You cannot use this object."

 

números são basicamente a mesma ideia, sempre são verdadeiros, a diferença é que em c++, linguagem nativa do seu server, false é a mesma coisa que 0 e true é a mesma coisa que 1, portanto return 0 = return false, e return 1 = return true, qualquer outro número (se não me engano) também será considerado como return true.

 

true é verdadeiro e false é falso.

 

Olha suas diferentes utilidades em certos eventos:

 

 

function onUse - true não faz nada, false aparece "You cannot use this object."

function onSay - true cancela a mensagem que foi dita pelo player (não aparece no cliente), false faz aparecer o que o player digitou

function onCastSpell - true faz gastar mana etc, false é como se o cara não tivesse usado a magia

function onStepIn - true/false, não importa, não muda nada

 

 

o resto você vai descobrindo por conta própria, agora uma função com return ue é boa como exemplo é o doPlayerRemoveMoney:

 

 

function onUse(cid)

   if doPlayerRemoveMoney(cid, 500) then

    -- esse é o bloco 1, será lido caso a condição do if seja verdadeira

    -- removeu o dinheiro, a função acima retornou true

   else

    -- esse é o bloco 2, será lido caso a condição do if não seja verdadeira

    -- o player não tem dinheiro, a função não remove dinheiro do player e retorna false

    -- como retornou false, o bloco 1 não é lido, mas devido ao "else", o bloco 2 é lido.

   end

return true

end

 

 

Outro exemplo de return, mas dessa vez em uma função que não foi feita em lua, mas sim em c++, a doCreateMonster:

 

essa função retorna o unique id (mesma coisa que cid) do monstro criado:

 

 

function onUse(cid, _, __, ___, toPosition)

-- perceba que as variáveis que não vou usar no script, eu simplesmente declarei elas como _, não faz diferença alguma

   local meu_monstro = doCreateMonster("Rat", toPosition)

   -- a função cria um Rat na posição toPosition, se conseguiu criar sem problemas, meu_monstro será declarado como o UID do monstro criado

   -- se houve algum problema na hora de criar (por exemplo, tentar criar monstro em PZ), meu_monstro será declarado como false

   if meu_monstro then

    -- nessa checagem, o script avalia se "meu_monstro" é uma variável válida, se o monstro foi criado sem problemas, essa variável será-

    -- um número, e número sempre são verdadeiros, portanto esse bloco será lido

    doPlayerSendCancel(cid, "O monstro foi criado!")

   else

    -- se o monstro não foi criado sucessivamente, meu_monstro será falso, dessa forma o bloco acima não será lido pois a condição avaliada-

    -- não é válida, ela é falsa, mas devido ao else, esse bloco aqui é lido

    doPlayerSendCancel(cid, "O monstro não pôde ser criado.")

   end

return true

end

 

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

  • 0

não, em lua, única coisa que é considerado falso é nil, null e false.

em c++, o data type boolean, vai de 0 a 1, é como se fosse um int, só que o range do int é muito maior.

0 é expressado como false e 1 é expressado como true

 

qualquer número/string em lua é considerado verdadeiro

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...