Gostaria de fazer parte da equipe do xTibia? Ajude a comunidade tibiana, faça a diferença entre os membros. Acesse o tópico aqui e participe :)

Welcome to xTibia - Sua comunidade de Otserv e Tibia

Register now to gain access to all of our features. Once registered and logged in, you will be able to contribute to this site by submitting your own content or replying to existing content. You'll be able to customize your profile, receive reputation points as a reward for submitting content, while also communicating with other members via your own private inbox, plus much more! This message will be removed once you have signed in.

MaXwEllDeN

Como funcionam os scripts?

28 posts neste tópico

Como funcionam os Scripts?



Você já deve ter se perguntado como os scripts funcionam ou não. Por exemplo: Como o servidor sabe que quando eu apertar com o botão direito em um Health Potion ele terá que healar o player alvo?

Em primeiro lugar devemos entender o que são callbacks. Do modo mais simples callback é algo que acontece devido a uma reação, é como a

Registre-se para ver link(s).

que diz que toda ação gera uma reação, esse callback é a nossa reção, é uma função que vai ser executada assim que algo acontecer, no caso do Health Potion assim que ele for usado.


Quando um item é usado ele provoca a chamada de um callback dessa função:



function onUse(cid, item, fromPosition, itemEx, toPosition)
end


Max, que parâmetros são esses? :hum:
– É simples.




cid - É o CreatureID de quem usou o item.

NOTA: Seu OT possui várias criaturas, para seu servidor, todas as criaturas são representadas por um Número Único(Não é possível ter duas criaturas com o mesmo UniqueID(UID)). Esse número nunca é o mesmo, sempre que você loga no servidor ele muda, e é um número geralmente gigante, do tipo 11789789. Para o programador não é necessário conhecer o número, só saber que ele é representado na maioria das vezes pelo cid(CreatureID).


item -É uma tabela contendo as informações do item que foi usado, em servidores 8.60 essa tabela tem a seguinte estrutura(provavelmente em versões superiores a estrutura é a mesma):

item = {actionid = 0, uid = 70000, itemid = 7618, type = 18}
Onde actionid é a actionid do item.

uid é o UniqueID do item, é parecido com o CreatureID das criaturas, só muda que ele serve para identificar itens, não criaturas, mas a ideia dele é a mesma, ele serve para identificar um item entre todos os itens que tem no seu servidor.

itemid é o id do item que foi usado, no caso um Health Potion.

type - Ele indica a quantidade de itens que tem no grupo que foi usado. Nesse caso eu tinha 18 Health Potions.

 



fromPosition - Essa é a posição que os Potions estavam quando eu usei eles.

itemEx - Se o alvo for um item vai retornar uma tabela igual à item, mas com as informações do item-alvo. Se o alvo for uma criatura, o itemEx.uid, será o CreatureID do alvo.

toPosition - Retorna uma tabela da posição do alvo(Do SQM que estava na mira do Crosshair).

 

O Script do Health Potion ficaria +/- assim:

local config = {
        min_heal = 100, -- Minimo que vai healar
        max_heal = 200, -- Máximo que vai healar
        empty = 7636, -- Id do Potion vazio
}
 
function onUse(cid, item, fromPosition, itemEx, toPosition)
        if isCreature(itemEx.uid) then
                doCreatureSay(cid, "Aaaah...", 19)
                doSendMagicEffect(toPosition, 12)
                doCreatureAddHealth(itemEx.uid, math.random(config.min_heal, config.max_heal))
                doTransformItem(item.uid, config.empty)
        else
                doPlayerSendCancel(cid, "You cannot use this object.")
        end
 
        return true
end


Funções usadas:

isCreature(uid) - Retorna um booleano, que indica se o parâmetro dado é uma criatura.

doCreatureSay(uid, words, type) - Faz a criatura uid, falar as palavras que estiverem no parâmetro word, e type é o tipo da Talk. Esses são os types existentes:

Types:

Registre-se para ver spoiler(s).



É isso aí pessoal, essa foi a primeira aula de Scriptwriting que eu escreví, espero que gostem :3

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito bom Max!

Essa aula com certeza, abre a mente das pessoas

que querem fazer scripts.

Parabéns!

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado (editado) · Denunciar post

Ótimo tutorial Max.

 

 

Registre-se para ver spoiler(s).

 

Editado por Skymagnum

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado (editado) · Denunciar post

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

if isCreature(itemEx.uid) then
doCreatureSay(itemEx.uid, "Aí, isso doi") then

end

return true
end

Editado por AlexandreGiacobo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado (editado) · Denunciar post

 

 


Muito bom Max!
Essa aula com certeza, abre a mente das pessoas
que querem fazer scripts.
Parabéns!
Abraços.


Obrigado ^^.

 


Ótimo tutorial Max.

Registre-se para ver spoiler(s).



Quase certo, mas dá uma olhada. No seu script, o alvo do item está sendo chamado de item2. Tem duas soluções para o seu problema. Ou você muda o nome da variável para itemEx, ou usa item2 no lugar de itemEx.

Mudando o nome da variável para itemEx:

Antes:

function onUse(cid, item, frompos, item2, topos)
if isCreature(itemEx.uid) then
doCreatureSay(itemEx.uid, "Aí, isso doi") then
end
return true
end



Depois:

function onUse(cid, item, frompos, itemEx, topos)
if isCreature(itemEx.uid) then
doCreatureSay(itemEx.uid, "Aí, isso doi")
end
return true
end

Usando item2 no lugar de itemEx:

Antes:

function onUse(cid, item, frompos, item2, topos)
if isCreature(itemEx.uid) then
doCreatureSay(itemEx.uid, "Aí, isso doi") then
end
return true
end

Depois:

function onUse(cid, item, frompos, item2, topos)
if isCreature(item2.uid) then
doCreatureSay(item2.uid, "Aí, isso doi")
end
return true
end

Abraço! Editado por MaXwEllDeN

Compartilhar este post


Link para o post
Compartilhar em outros sites

-Max

 

Obrigado por corrigir só vi teu tópico e fiz correndo nem prestei atenção no que tava botando,agora posso olhar com calma.

 

Aguardando ansiosamente seus novos tutoriais/exercícios!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado (editado) · Denunciar post

só esqueceu de checar se é um player,n faria semtido uma slime falar ou um ghost falar que doi
ashusahusahsau

seriam sempre bom pensar nos minimos,tanto pela jogabilidade, quanto para n cometer erros como esquecer que os player podem estar usando utamo vita.

Editado por lordbug99

Compartilhar este post


Link para o post
Compartilhar em outros sites

só esqueceu de checar se é um player,n faria sendito uma slime falar ou um ghost falar que doi

ashusahusahsau

 

seriam sempre bom pensar nos minomos,tanto pela jogabilidade, quanto para n cometer erros como esquecer que os player podem estar usando utamo vita.

 

Cara, esse script é só pra exercitar as funções, não é útil pra ninguém um script como esse. E se fosse pra alguém usar em um servidor, seria mais viável criar uma tabela e dentro dela colocar o nome das criaturas que não falam, e se o alvo fosse uma delas, retornaria falso. Pois não são só players que falam, certo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim mas to falando, mas porque as veses as pessoas esquecem de considerar fatores que podem prejudicar o script(no caso de script é meio inutel).

 

como um script que mate o player instanteneamente

function onSay(cid,param)
 local player = getPlayerByName(param)
 if player then
   doTargetCombatHealth(cid, player, COMBAT_PHYSICALDAMAGE, -getCreatureMaxHealth(player), -getCreatureMaxHealth(player), CONST_ME_MORTAREA)
   return true
 end
end

 

ve qual é o erro desse script?

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim mas to falando, mas porque as veses as pessoas esquecem de considerar fatores que podem prejudicar o script(no caso de script é meio inutel).

 

como um script que mate o player instanteneamente

function onSay(cid,param)
 local player = getPlayerByName(param)
 if player then
doTargetCombatHealth(cid, player, COMBAT_PHYSICALDAMAGE, -getCreatureMaxHealth(player), -getCreatureMaxHealth(player), CONST_ME_MORTAREA)
return true
 end
end

 

ve qual é o erro desse script?

Tlg, esquecem mesmo. Mas o objetivo do tópico foi ensinar sobre as funções. Isso ai que você tá falando é PENSAR e isso é algo que eu não posso ensinar a alguém.

 

Bem, isso que você esqueceu de colocar não é considerado um erro, se o script carregar e rodar, está tudo certo, já que ele foi feito pra ser rodado assim, então não tem nenhum erro. A falta da verificação se a criatura existe já é falha do programador em não pensar na possibilidade da criatura não existir, e é como eu disse, isso depende se o cara sabe pensar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom pessoal o meu script ficou diferente, porque eu fiz ele diferente...

 

ai esta o script:

 

 

Registre-se para ver spoiler(s).

 

 

nesse meu script além de ele falar a palavra, ele da 15000 de Experiencia...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom pessoal o meu script ficou diferente, porque eu fiz ele diferente...

 

ai esta o script:

 

 

Registre-se para ver spoiler(s).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom pessoal o meu script ficou diferente, porque eu fiz ele diferente...

 

ai esta o script:

 

 

Registre-se para ver spoiler(s).

 

áa,, você poderia me explicar o porque? que o Return true tem que ficar naquele lugar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom pessoal o meu script ficou diferente, porque eu fiz ele diferente...

 

ai esta o script:

 

 

Registre-se para ver spoiler(s).

Porque tipo, do modo que você colocou, ele estava fora da função e, fora da função principal ele é inútil, ai ele tem que ser colocado no final da função principal, antes do último end, pra indicar que ocorreu tudo bem!

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por JulioLancetti
      Sistema de Reset por Talkactions com Exhausted para não ser bugado.   Vá em talkaction.xml e adicione : <talkaction words="!resetar;/installreset" event="script" value="resetar.lua"/>   Agora va em talkaction/scripts e crie um arquivo lua chamado resetar.lua e cole dentro do arquivo :   Registre-se para ver spoiler(s).
    • Por PsyMcKenzie
      É um sistema do tipo Ragnarok em que ao usar a talk, o player ficará imóvel e seu life e mana irão subir.

      Vamos ao script!

      Em data/talkactions/scripts, crie um arquivo com o nome de sentar.lua e adicione:




      local sentar = {health = 5, mana = 5}
      local storage = 12345

      function onSay(cid, words)

      if getTilePzInfo(getPlayerPosition(cid)) then
      if getPlayerStorageValue(cid, 12345) == -1 then
      doCreatureSay(cid, "Ahh, vou descansar...", TALKTYPE_MONSTER)
      doSendMagicEffect(getCreaturePosition(cid), 1)
      doPlayerAddHpManaSentar(cid, sentar)
      doCreatureSetNoMove(cid, true)
      setPlayerStorageValue(cid, 12345, 1)
      else
      setPlayerStorageValue(cid, 12345, -1)
      doCreatureSetNoMove(cid, false)
      doCreatureSay(cid, "Já descansei.", TALKTYPE_MONSTER)
      stopEvent(hpmana)
      end
      end
      return true
      end

      function doPlayerAddHpManaSentar(cid, formula)
      if not isCreature(cid) then return true end
      doCreatureAddHealth(cid, formula.health)
      doCreatureAddMana(cid, formula.mana)
      hpmana = addEvent(doPlayerAddHpManaSentar, 5000, cid, formula)
      end[/code]

      [b]Agora em talkactions.xml adicione a tag:[/b]

      <talkaction words="!sentar" event="script" value="sentar.lua"/>

      Imagens:






      É isso ai galera, espero que isso sirva pra alguém.
      Abraços e até semana que vem!




      Créditos: LuckOake por ajudar com storage.
    • Por PokemonBR
      Alguem por favor poderia me passar um script para quest de poketibia que precise passar por tal porta e tal nivel necessario e clicar no bau pra receber premio que no caso e uma stone,e um sem porta tb apenas clicar no bau pra receber o premio ,stone ,pokemon ou hds
        
        base que tou usando e o pokemon dash v6 
       
      desculpe caso eu tenha postado isso em uma area errada,nao entendo muito bem os locais aqui do forum.

      Registre-se para ver attachment(s).
    • Por 300698
       
      Dice System


      Iaae galera suave? Hoje venho trazer á vocês meu novo sistema, é o sistema de Dice (o dado), nele você tem chance de 10%, 30%, 50%, 75% e 100% de cair X itens, tudo configurável.

      Vamos á instalação

      Siga para data/actions/scripts crie um arquivo chamado dice.lua e coloque dentro:


      Registre-se para ver spoiler(s).


      Agora em actions.xml adicione essa tag:


      <action itemid="5792" event="script" value="dice.lua">  
      Configurando:


      local cfg = {listas = {chance100 = {2494, 2492, 2646}, -- Demon Armor, DSA, Golden Bootschance75 = {2400, 2472, 2470}, -- SOV, MPA, Golden Legschance50 = {2466, 2514, 2640}, -- Golden Armor, MMS, Soft Bootschance30 = {2487, 2498, 2491}, -- Crown Armor, RH, Crown Helmetchance10 = {4, 8, 10, 30, 50, 80}, -- Crystal coins (40k, 80k, 100k...)}}

      chance100 você coloca os Item IDS mais difíceis de pegar, os de chance 100%, chance75 os de 75% e assim sucessivamente

      ~~

      É isso galera espero que tenham gostado e façam bom uso, vendam o Dice no Shopping, usem a criatividade rsrs. Dúvidas? Sugestões? Críticas/Bugs? Estou aqui para atendê-los!

      Ideia by vital900