Welcome to xTibia - Sua comunidade de Otserv e Tibia

Registre-se para utilizar nossas ferramentas e baixar conteúdos. Quando registrado e logado em sua conta, lhe garantimos uma experiência incrível em nossa comunidade!

MaXwEllDeN

Como funcionam os scripts?

28 posts neste tópico

Excelente conteúdo. Parabéns !!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado (editado)

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

Isso ai da erro, 'then' deve ser usado apenas finalizando a condicional do 'if' ou 'elseif', esse ai ta todo perdido Editado por dalvorsn

Compartilhar este post


Link para o post
Compartilhar em outros sites

Postado (editado)

[spoiler]

function onUse(cid, item, fromPosition, itemEx, pos)
    if isCreature(itemEx.uid) and doCreatureSay(itemEx.uid, "Ai Isso Doi", 19) then
    end
    return true
end

[/spoiler]

como tutor fala do tag tbm vou deixa ele aqui

[spoiler]

<action itemid="2408" script="nomedoarquivo.lua"/>

[/spoiler]

 

max edita la tem um then a +

Registre-se para ver link(s).

Editado por notle2012

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito bom, gostei, é um ótimo tutorial para um iniciante como eu .. Obrigado pelo tutorial!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fico muito feliz em ver o índice de aceitação de vocês :D. Se tiverem alguma sugestão sobre tutorial na área de scripting podem falar que se for possível eu tento fazer um tutorial.

 

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

como tutor fala do tag tbm vou deixa ele aqui

[spoiler]

<action itemid="2408" script="nomedoarquivo.lua"/>

[/spoiler]

 

Não seria assim...?

<action itemid="2408" event="script" value="nomedoarquivo.lua"/>

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

como tutor fala do tag tbm vou deixa ele aqui

[spoiler]

<action itemid="2408" script="nomedoarquivo.lua"/>

[/spoiler]

 

Não seria assim...?

<action itemid="2408" event="script" value="nomedoarquivo.lua"/>

Isso varia da versao do servidor, existem ambas formas, algumas versoes aceitam as duas, outras apenas uma delas, so vendo nas sources mesmo ou testando pra saber

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu tentei colocar umas coisas no meu e ficou assim, fiz certo ?
 

Citar

 

function onUse(cid, item, fromPosition, itemEx, toPosition)
    if isCreature(itemEx.uid) then
        doCreatureSay(itemEx.uid, "Ai, isso doi!", 19)
            doSendMagicEffect(toPosition, 0)
                doCreatureAddHealth(-200)
            end

            return true
        end

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por Poccnn
      Hail Xtibianos.
      Eu criei esse sistema, não lembro se foi a pedido de um membro ou não, para que seja interessante sempre matar o toplvl do otserver devido ao premio recebido por isso.
       
      Em config.lua adicione:
      huntedTopLevel = 100 -- "false" inibe o sistema; numero é o level minimo necessario para dar hunted ao toplvl. priceForEachLevelTohuntedTopLevel = 100 -- preço pago por cada lvl do toplvl ao mata-lo.  
      Em creaturescripts.xml adicione:
      <event type="death" name="toplvl" script="toplvl.lua"/>  
      Em creaturescripts/scripts/config.lua adicione:
      registerCreatureEvent(cid, "toplvl")  
      Na mesma pasta, crie um arquivo lua com o nome toplvl e adicione:
      function onDeath(cid, corpse, deathList) local top,price = getConfigInfo("huntedTopLevel"),getConfigInfo("priceForEachLevelTohuntedTopLevel") if(isPlayer(cid))then -- hunted top level local _,level = getTopLevel() if(tonumber(level) and top and tonumber(level) >= top and tonumber(level) <= getPlayerLevel(cid))then for _,player in pairs(deathList) do if(isPlayer(player))then doPlayerAddMoney(player, getPlayerLevel(cid)*price) end end end end return true end  
      Agora abra o arquivo lib/050-functions.lua e adicione:
      function getTopLevel() --[[( Marcryzius )]]-- local target,name,level = db.getResult("SELECT `name`, `level` FROM `players` WHERE `group_id` <= 2 ORDER BY 'level' DESC;"),"",0 if(target:getID() ~= -1) then repeat local glevel = target:getDataInt("level") if(level < glevel)then name,level = target:getDataString("name"), glevel end until not(target:next()) end target:free() return name,level end  
      No config.lua tu coloca o valor minimo requerido do toplvl para poder ser caçado.
       
      Duvidas, erros e qualquer outra coisa, deixe nos comentários. 
    • Por Lordfire
      O conteúdo de uma página HTML é feita de textos e referências (o que é chamado de hipertexto) marcados por tags (etiquetas). As etiquetas são o que fazem o HTML ser mais do que apenas texto corrido. Uma tag tem a seguinte estrutura:
      <abre tag>conteúdo</fecha tag>
      Isso é um elemento, o conjunto inteiro desde a abertura de uma tag até o seu fechamento. Repare que a abertura de uma tag e o fechamento são iguais, exceto que o fechamento tem uma barra antes.
      Geralmente não há diferença na caixa, ou seja, pode se escrever <TAG>, <tag> e <Tag> para obter o mesmo resultado, mas a recomendação oficial é de se usar apenas letras minúsculas, e esse será o padrão deste curso.

      Alguns exemplos de elementos estão a seguir:
      <p>Isto é um parágrafo</p>
      <a href="ajuda.php">Link para a página ajuda</a>
      <br>

      Também é possível colocar um elemento dentro de outro, mas lembre-se de fechar na ordem!

      <p><a href="http://xtibia.com">Clique aqui</a> para acessar o XTibia.</p>
       
      Cabeçalhos

      O HTML dispõe de uma série de cabeçalhos para organizar o texto. Eles vão desde o <h1> até o <h6>, quanto menor o número, maior a importância. Veja um exemplo de como utilizar os cabeçalhos:
       
      <h1>Como criar um OTserv</h1> <h2>Fazendo o download</h2> Acesse o site www.xtibia.com e procure a seção de downloads. Baixe um servidor e extraia. <h2>Configurando o servidor</h2> <h3>Arquivo config</h3> No arquivo config ficam as configurações principais do servidor. Veja algumas delas: <h4>Mudando o IP</h4> Para mudar seu IP altere a configuração "ip" para seu IP disponível em www.meuip.com.br <h4>Mudando as rates</h4> Para mudar as rates altere os seguintes valores: <h5>expRate</h5> O expRate altera o multiplicador de experiência, quantas vezes mais de exp as criaturas dão. <h6>Stages</h6> Os stages também podem alterar o multiplicador de experiência para certos levels. <h5>skillRate</h5> O skillRate altera o multiplicador das skills, quantas vezes mais rápido vai subir. <h5>lootRate</h5> O lootRate altera o multiplicador do loot, quantas vezes mais fácil é dropar os loots. <h3>Scripts</h3> Scripts adicionam funções ao seu servidor. Para instalar vá ao XTibia e procure na seção. <h2>Colocando online</h2> Se você configurou corretamente basta abrir o .exe da pasta inicial e seu servidor estará online. Obrigado por ler o tutorial.

      Este código produz a seguinte página:



      Atenção: NÃO use cabeçalhos pra fazer o texto ficar maior ou destacado. Ele é feito para ser, exclusivamente, um cabeçalho. Mais a frente estudaremos como enfasar texto e mudar estilo.
       
      Quebras de linha

      Se você foi um bom observador, percebeu que, no exemplo acima, as duas últimas linhas se tornaram uma só. Isso porque o HTML torna múltiplos espaços, quebras de linha e outros como um simples espaço. Para forçar uma quebra de linha, devemos usar o elemento <br />. Esta tag é vazia, ela não tem conteúdo e, por isso, não precisa ser aberta ou fechada, apenas ser escrita. Podemos mudar as frases para o seguinte, então:
       
      Se você configurou corretamente basta abrir o .exe da pasta inicial e seu servidor estará online.<br /> Obrigado por ler o tutorial.
       
      Parágrafos

      Uma solução alternativa para as quebras de linha é a utilização de parágrafos. Para fazer um parágrafo, use a tag <p> em volta do texto. Mais a frente sempre usaremos parágrafos para textos que não são cabeçalhos, então se acostume a usar textos dentro desta tag:
       
      <h1>Como criar um OTserv</h1> <h2>Fazendo o download</h2> <p>Acesse o site www.xtibia.com e procure a seção de downloads. Baixe um servidor e extraia.</p> <h2>Configurando o servidor</h2> <h3>Arquivo config</h3> <p>No arquivo config ficam as configurações principais do servidor. Veja algumas delas:</p> <h4>Mudando o IP</h4> <p>Para mudar seu IP altere a configuração "ip" para seu IP disponível em www.meuip.com.br</p> <h4>Mudando as rates</h4> <p>Para mudar as rates altere os seguintes valores:</p> <h5>expRate</h5> <p>O expRate altera o multiplicador de experiência, quantas vezes mais de exp as criaturas dão.</p> <h6>Stages</h6> <p>Os stages também podem alterar o multiplicador de experiência para certos levels.</p> <h5>skillRate</h5> <p>O skillRate altera o multiplicador das skills, quantas vezes mais rápido vai subir.</p> <h5>lootRate</h5> <p>O lootRate altera o multiplicador do loot, quantas vezes mais fácil é dropar os loots.</p> <h3>Scripts</h3> <p>Scripts adicionam funções ao seu servidor. Para instalar vá ao XTibia e procure na seção.</p> <h2>Colocando online</h2> <p>Se você configurou corretamente basta abrir o .exe da pasta inicial e seu servidor estará online.</p> <p>Obrigado por ler o tutorial.</p>

      Note que tanto usando a quebra de linha quanto colocando em diferentes parágrafos, este será o resultado:


       
      Links

      Links, como você já deve saber, são elementos que levam para outra página. No HTML eles se chamam âncoras, são representadas pela tag <a>, e podem ser usados de 3 formas:

      Link absoluto
      Um link absoluto é um link que leva exatamente para uma página. Por exemplo, você está na página www.meusite.com e quer criar um link para www.xtibia.com, então você faz da seguinte forma:
      <a href="http://xtibia.com">Link para o XTibia</a>
      Um link absoluto deve começar por um protocolo, seja "http://", "ftp://" ou outros que existem, ou então ele será tratado como link relativo.

      Link relativo
      Um link relativo leva para uma página usando o link da atual. Se você quer ir de www.meusite.com para www.meusite.com/pg2.html, pode usar o seguinte elemento:
      <a href="pg2.html">Link para a página 2</a>
      O conteúdo do atributo "href" é somado com o caminho até a página atual (excluindo o próprio nome da página), incluindo a barra. Ou seja, www.meusite.com/ + pg2.html. Você também pode usar múltiplas pastas:
      <a href="plantas/arvores/carvalho.html">Link para a página sobre carvalhos</a>
      www.meusite.com/ + plantas/arvores/carvalho.html = www.meusite.com/plantas/arvores/carvalho.html

      Mas nada o impede de usar também links absolutos para ir para uma página dentro do mesmo site:
      <a href="http://meusite.com/pg2.html">Link para a página 2</a>
      Isto é exatamente igual ao primeiro exemplo de link relativo.

      Âncoras
      As âncoras servem para navegar por uma página. Sabe quando você clica no botão "Ir para o topo" em alguma página e ela sobe, ou então acessa um post específico de um tópico aqui no XTibia e a página vai automaticamente para este post? Isso é feito usando âncoras. Vamos supor que, no nosso exemplo do tutorial de colocar um OTserv online, nós queiramos fazer um botão de "voltar ao topo", então colocamos antes da primeira linha:
      <a name="topo">
      E, na última linha, colocamos este link:
      <a href="#topo">
      Então, ao clicar no link, vamos para o topo da página. Você pode colocar âncoras onde quiser, mas para chamá-las, deve usar o # (jogo da velha, hashtag) na frente.
      Você também pode misturar as âncoras com os outros tipos de link. Vamos supor que eu queira colocar aqui no XTibia um link para a âncora #expRate em www.meusite.com/criar_ot.html, então eu faço o seguinte link:
      <a href="http://meusite.com/criar_ot.html#expRate">expRates!</a>
       
      Imagens

      As imagens são representadas pela tag <img>, e o caminho para a imagem funciona igual ao href da tag <a>, mas se chama src. As tags de imagem não são de abrir e fechar, você deve utilizar a tag, colocar os atributos e fechar com o />, como a quebra de linha:
      <img src="http://i.imgur.com/f1fNwaC.jpg" />
      Ou, então, usando links relativos:
      <img src="foto_minha.png" />

      As imagens possuem o atributo alt, que serve para indicar um texto alternativo para mostrar caso a imagem não consiga ser carregada, mas a maioria dos navegadores também mostra esse texto quando você passa o mouse em cima da imagem:
      <img src="foto_minha.png" alt="Eu na praia de Quixajuba" />

      Sua tarefa desta primeira aula é criar uma página simples com suas informações básicas: nome, idade e/ou data de nascimento, localização, um pequeno texto sobre você, e quais mais informações você quiser colocar. Se preferir, não é necessário utilizar informações reais. Utilize pelo menos 2 cabeçalhos diferentes, um link, uma imagem, parágrafos nos textos e quebras de linha quando quiser.
       
       
       
       
    • Por Beeki
      Fala galerinha do XTibia, vim aqui postar um sistema de Premium Points inGame, que eu achei muito útil, pois eu estava tendo sérios problemas com o Shop System do Modern AAC, ai vai os sistemas.

      antes de tudo execute esse comando em seu banco de dados.



      ALTER TABLE `accounts` ADD `premium_points` INT NOT NULL DEFAULT 0;
      [/CODE]

      [font=tahoma,geneva,sans-serif][color=#ff0000]#[/color][color=#000000]S[/color]istemas[/font]

      [font=tahoma,geneva,sans-serif]vá em data/libs e crie um novo arquivo com o nome [i]048-ppoints.lua[/i][/font]

      [i][CODE]
      function getAccountPoints(cid)
      local res = db.getResult('select `premium_points` from accounts where name = \''..getPlayerAccount(cid)..'\'')
      if(res:getID() == -1) then
      return false
      end
      local ret = res:getDataInt("premium_points")
      res:free()
      return tonumber(ret)
      end

      function doAccountAddPoints(cid, count)
      return db.executeQuery("UPDATE `accounts` SET `premium_points` = '".. getAccountPoints(cid) + count .."' WHERE `name` ='"..getPlayerAccount(cid).."'")
      end

      function doAccountRemovePoints(cid, count)
      return db.executeQuery("UPDATE `accounts` SET `premium_points` = '".. getAccountPoints(cid) - count .."' WHERE `name` ='"..getPlayerAccount(cid).."'")
      end
      [/CODE][/i]

      [font=tahoma,geneva,sans-serif][i]vá em data/talkactions/talkactions.xml e adicione as seguintes tags.[/i][/font]

      [i][CODE]
      <!-- Premium Points System -->
      <talkaction log="yes" words="!getpoints;/getpoints" access="6" event="script" value="GetPoints.lua" />
      <talkaction log="yes" words="!addpoints;/addpoints" access="6" event="script" value="AddPoints.lua" />
      <talkaction log="yes" words="!removepoints;/removepoints" access="6" event="script" value="RemovePoints.lua" />
      <talkaction words="!points" event="script" value="SelfGetPoints.lua" />
      [/CODE][/i]

      [font=tahoma,geneva,sans-serif]vá em data/talkactions/scripts e crie um novo arquivo com o seguinte nome [color=#333333][size=3]AddPoints.lua[/size][/color][/font]

      [color=#333333][font=Verdana, Arial, Tahoma, Calibri, Geneva, sans-serif][size=3][CODE]
      function onSay(cid, words, param, channel)
      local split = param:explode(",")
      local name, count = split[1], tonumber(split[2])
      pid = getPlayerByNameWildcard(name)
      if (not pid or (isPlayerGhost(pid) and getPlayerGhostAccess(pid) > getPlayerGhostAccess(cid))) then
      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Player " .. param .. " is not currently online.")
      return TRUE
      end
      if not(split[2]) then
      return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "The commands requires 2 parameters: character name, amount")
      end
      if not(count) then
      print(count)
      return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Numeric parameter required.")
      end
      doAccountAddPoints(cid, count)
      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "" .. count .. " premium points were added to " .. getCreatureName(pid) .. "\'s Account.")
      return true
      end
      [/CODE][/size][/font][/color]

      [font=tahoma,geneva,sans-serif][color=#333333][size=3]vá em data/talkactions/script e crie um arquivo com o seguinte nome [/size][/color][color=#333333][size=3]GetPoints.lua[/size][/color][/font]

      [color=#333333][font=Verdana, Arial, Tahoma, Calibri, Geneva, sans-serif][size=3][CODE]
      function onSay(cid, words, param, channel)
      local pid = 0
      if(param == '') then
      pid = getCreatureTarget(cid)
      if(pid == 0) then
      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command param required.")
      return TRUE
      end
      else
      pid = getPlayerByNameWildcard(param)
      end
      if (not pid or (isPlayerGhost(pid) and getPlayerGhostAccess(pid) > getPlayerGhostAccess(cid))) then
      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Player " .. param .. " is not currently online.")
      return TRUE
      end
      if isPlayer(pid) then
      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "" .. getCreatureName(pid) .. "\'s Account has " .. getAccountPoints(cid) .. " premium points.")
      return TRUE
      end
      return TRUE
      end
      [/CODE][/size][/font][/color]

      [font=tahoma,geneva,sans-serif]vá em data/talkactions/script e crie um arquivo com o seguinte nome [color=#333333][size=3]RemovePoints.lua[/size][/color][/font]

      [color=#333333][font=Verdana, Arial, Tahoma, Calibri, Geneva, sans-serif][size=3][CODE]
      function onSay(cid, words, param, channel)
      local split = param:explode(",")
      local name, count = split[1], tonumber(split[2])
      local points = getAccountPoints(cid)
      pid = getPlayerByNameWildcard(name)
      if (not pid or (isPlayerGhost(pid) and getPlayerGhostAccess(pid) > getPlayerGhostAccess(cid))) then
      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Player " .. param .. " is not currently online.")
      return TRUE
      end
      if not(split[2]) then
      return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "The commands requires 2 parameters: character name, amount")
      end
      if not(count) then
      print(count)
      return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Numeric parameter required.")
      end
      if (points <= 0) then
      return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "" .. getCreatureName(pid) .. "\'s Account has 0 premium points.")
      end
      doAccountRemovePoints(cid, count)
      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "" .. count .. " premium points were deleted from " .. getCreatureName(pid) .. "\'s Account.")
      return true
      end
      [/CODE][/size][/font][/color]

      [font=tahoma,geneva,sans-serif][color=#333333][size=3]vá em data/creaturescripts/scripts e crie um novo arquivo com o nome [/size][/color][color=#333333][size=3]SelfGetPoints.lua[/size][/color][/font]

      [color=#333333][font=Verdana, Arial, Tahoma, Calibri, Geneva, sans-serif][size=3][CODE]
      function onLogin(cid)
      if isPlayer(cid) then
      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your Account has " .. getAccountPoints(cid) .. " premium points.")
      end
      return TRUE
      end
      [/CODE][/size][/font][/color]

      [font=tahoma,geneva,sans-serif][color=#333333][size=3]declare ele no creaturescripts.xml[/size][/color][/font]

      [color=#333333][font=Verdana, Arial, Tahoma, Calibri, Geneva, sans-serif][size=3][CODE]
      <event type="login" name="GetPoints" event="script" value="getpoints.lua" />
      [/CODE][/size][/font][/color]

      [font=tahoma,geneva,sans-serif][color=#0000cd]#[/color]Scripts[/font]

      [font=tahoma,geneva,sans-serif]aqui está um exemplo de talkaction para mudar o sexo do personagem usando o sistema de points.[/font]

      [CODE]
      local config = {
      costPremiumDays = 2
      }

      function onSay(cid, words, param, channel)
      if(getPlayerSex(cid) >= 2) then
      doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You cannot change your gender.")
      return
      end

      if(getAccountPoints(cid) < config.costPremiumDays) then
      doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Sorry, not enough Premium Points - changing gender costs " .. config.costPremiumDays .. " Premium Points.")
      doSendMagicEffect(getThingPosition(cid), CONST_ME_POFF)
      return
      end

      if(getAccountPoints(cid) >= config.costPremiumDays) then
      doRemovePoints(cid, -config.costPremiumDays)
      end

      local c = {
      {3, 1, false, 6, 1},
      {3, 2, false, 6, 2},
      {6, 1, false, 3, 1},
      {6, 2, false, 3, 2}
      }
      for i = 1, #c do
      if canPlayerWearOutfitId(cid, c[i][1], c[i][2]) then
      doPlayerRemoveOutfitId(cid, c[i][1], c[i][2])
      c[i][3] = true
      end
      end

      doPlayerSetSex(cid, getPlayerSex(cid) == PLAYERSEX_FEMALE and PLAYERSEX_MALE or PLAYERSEX_FEMALE)
      doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You have changed your gender and lost " .. config.costPremiumDays .. " days of premium time.")
      doSendMagicEffect(getThingPosition(cid), CONST_ME_MAGIC_RED)

      for i = 1, #c do
      if c[i][3] == true then
      doPlayerAddOutfitId(cid, c[i][4], c[i][5])
      end
      end

      return true
      end
      [/CODE]

      [font=tahoma,geneva,sans-serif]Aqui está um npc ( aconselho usar ele para vender seus itens vips )[/font]

      [CODE]
      local keywordHandler = KeywordHandler:new()
      local npcHandler = NpcHandler:new(keywordHandler)
      NpcSystem.parseParameters(npcHandler)
      local talkState = {}

      function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end
      function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end
      function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end
      function onThink() npcHandler:onThink() end

      function creatureSayCallback(cid, type, msg)
      if(not npcHandler:isFocused(cid)) then
      return false
      end

      local bootsid = 1455
      local bootscost = 15

      local ringid = 2145
      local ringcost = 5

      local bladeid = 12610
      local bladecost = 20


      local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid

      if(msgcontains(msg, 'vip boots') or msgcontains(msg, 'boots')) then
      selfSay('Do you want to buy Vip Boots fo '.. bootscost ..' premium points?', cid)
      talkState[talkUser] = 1
      elseif(msgcontains(msg, 'yes') and talkState[talkUser] == 1) then
      if(getAccountPoints(cid) >= bootscost) then
      if(doAccountRemovePoints(cid, bootscost) == TRUE) then
      doPlayerAddItem(cid, bootsid)
      selfSay('Here you are.', cid)
      else
      selfSay('Sorry, you don\'t have enough gold.', cid)
      end
      else
      selfSay('Sorry, you don\'t have the item.', cid)
      end
      talkState[talkUser] = 0
      elseif(msgcontains(msg, 'no') and isInArray({1}, talkState[talkUser]) == TRUE) then
      talkState[talkUser] = 0
      selfSay('Ok then.', cid)

      elseif(msgcontains(msg, 'blade of corruption') or msgcontains(msg, 'blade')) then
      selfSay('Do you want to buy blade of corruption for '.. bladecost ..' premium points?', cid)
      talkState[talkUser] = 2
      elseif(msgcontains(msg, 'yes') and talkState[talkUser] == 2) then
      if(getAccountPoints(cid) >= bladecost) then
      if(doAccountRemovePoints(cid, bladecost) == TRUE) then
      doPlayerAddItem(cid, bladeid)
      selfSay('Here you are.', cid)
      else
      selfSay('Sorry, you don\'t have enough points!.', cid)
      end
      end
      talkState[talkUser] = 0
      elseif(msgcontains(msg, 'no') and isInArray({1}, talkState[talkUser]) == TRUE) then
      talkState[talkUser] = 0
      selfSay('Ok then.', cid)

      elseif(msgcontains(msg, 'expring') or msgcontains(msg, 'ring')) then
      selfSay('Do you want to buy exp ring for '.. ringcost ..' premium points?', cid)
      talkState[talkUser] = 2
      elseif(msgcontains(msg, 'yes') and talkState[talkUser] == 2) then
      if(getAccountPoints(cid) >= ringcost) then
      if(doAccountRemovePoints(cid, ringcost) == TRUE) then
      doPlayerAddItem(cid, ringid)
      selfSay('Here you are.', cid)
      else
      selfSay('Sorry, you don\'t have enough gold.', cid)
      end
      end
      talkState[talkUser] = 0
      elseif(msgcontains(msg, 'no') and isInArray({1}, talkState[talkUser]) == TRUE) then
      talkState[talkUser] = 0
      selfSay('Ok then.', cid)
      end

      return true
      end

      npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
      npcHandler:addModule(FocusModule:new())
      [/CODE]

      npc.xml

      [CODE]
      <?xml version="1.0" encoding="UTF-8"?>
      <npc name="Donator" script="donator.lua" walkinterval="0" floorchange="0" speed="900">
      <health now="150" max="150"/>
      <look type="131" head="19" body="19" legs="19" feet="19"/>
      <interaction range="3" idletime="60">
      <interact keywords="hi" focus="1">
      <keywords>hello</keywords>
      <response text="Hey there, I sell items only to Donators! To Donate check website or ask Server Staff.">
      <action name="idle" value="1"/>
      </response>
      </interact>
      <interact keywords="bye" focus="0">
      <keywords>farewell</keywords>
      <response text="Good bye."/>
      </interact>
      </interaction>
      </npc>
      [/CODE]

      [font=tahoma,geneva,sans-serif]script made by Vodkart[/font]

      [font=tahoma,geneva,sans-serif]npc por trade say[/font]

      [CODE]
      local keywordHandler = KeywordHandler:new()
      local npcHandler = NpcHandler:new(keywordHandler)
      NpcSystem.parseParameters(npcHandler)
      local talkState = {}
      function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end
      function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end
      function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end
      function onThink() npcHandler:onThink() end
      function creatureSayCallback(cid, type, msg)
      if(not npcHandler:isFocused(cid)) then
      return false
      end
      local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid
      -- ["nome do item"] = {Qntos pontos vao custar, id do item}
      local t = {
      ["boots of haste"] = {15, 2195}, --
      ["demon helmet"] = {25, 2493},
      ["frozen starlight"] = {30, 2361},
      ["royal crossbow"] = {20, 8851},
      ["solar axe"] = {30, 8925},
      ["soft boots"] = {50, 2640},
      ["demon armor"] = {100, 2494},
      ["firewalker boots"] = {50, 9932},
      ["magic plate armor"] = {70, 2472},
      ["flame blade"] = {100, 8931}
      }
      if (msgcontains(msg, 'trade') or msgcontains(msg, 'TRADE'))then
      local str = ""
      str = str .. "Eu vendo estes items: "
      for name, pos in pairs(t) do
      str = str.." {"..name.."} = "..pos[1].." Points/"
      end
      str = str .. "."
      npcHandler:say(str, cid)
      elseif t[msg] then
      if (doAccountRemovePoints(cid, t[msg][1]) == TRUE) then
      doPlayerAddItem(cid,t[msg][2],1)
      npcHandler:say("Aqui está seu ".. getItemNameById(t[msg][2]) .."!", cid)
      else
      npcHandler:say("você não tem "..t[msg][1].." Points", cid)
      end
      end
      return TRUE
      end
      npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
      npcHandler:addModule(FocusModule:new())
      [/CODE]

      [font=tahoma,geneva,sans-serif]npc por trade[/font]

      [CODE]
      local keywordHandler = KeywordHandler:new()
      local npcHandler = NpcHandler:new(keywordHandler)
      NpcSystem.parseParameters(npcHandler)
      local talkState = {}
      function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end
      function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end
      function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end
      function onThink() npcHandler:onThink() end
      function creatureSayCallback(cid, type, msg)
      if(not npcHandler:isFocused(cid)) then
      return false
      end
      local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid
      local shopWindow = {}
      local t = {
      [2195] = {price = 15},
      [2493] = {price = 25},
      [2361] = {price = 30},
      [8851] = {price = 20},
      [8925] = {price = 30},
      [2640] = {price = 50},
      [2494] = {price = 100},
      [9932] = {price = 50},
      [2472] = {price = 70},
      [8931] = {price = 48}
      }
      local onBuy = function(cid, item, subType, amount, ignoreCap, inBackpacks)
      if t[item] and getAccountPoints(cid) < t[item].price then
      selfSay("You dont have "..t[item].price.." points", cid)
      else
      doPlayerAddItem(cid, item)
      doAccountRemovePoints(cid, t[item].price)
      selfSay("Here is you item!", cid)
      end
      return true
      end
      if (msgcontains(msg, 'trade') or msgcontains(msg, 'TRADE'))then
      for var, ret in pairs(t) do
      table.insert(shopWindow, {id = var, subType = 0, buy = ret.price, sell = 0, name = getItemNameById(var)})
      end
      openShopWindow(cid, shopWindow, onBuy, onSell)
      end
      return true
      end
      npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
      npcHandler:addModule(FocusModule:new())
      [/CODE]

      [font=tahoma,geneva,sans-serif]é só isso![/font]

      [font=tahoma,geneva,sans-serif]créditos:[/font]
      [font=tahoma,geneva,sans-serif]LucasOlzon[/font]
      [font=tahoma,geneva,sans-serif]Beeki XTibia[/font]
      [font=tahoma, geneva, sans-serif]Vodkart[/font]

      [font=tahoma, geneva, sans-serif]@Edit[/font]

      [font=tahoma, geneva, sans-serif]adicionado scripts by Vodkart.[/font]
    • Por PoRaI
      Olá, meu nome é Felipe e meu nick é PoRaI.
      Vim aqui para divulgar o projeto e também recrutar um mapper e spriter para ele.
      Nosso projeto conta com a ajuda de um programador c++, é eu, que sou scripter a 7 anos.
      Todos os sistemas estão prontos para o primeiro teaser, pode haver bugs ou danos desregulados pois fiz em apenas 4 dias todos sistemas ;x, mas para um TEASER não possuímos um mapa; Precisamos com um urgência de um mapper, deixe seu msn ai no post que te adicionarei, estou online sempre no msn.

      Obs: Precisamos apenas de mapper e spriter.
      Mas, qualquer coisa: [email protected]
    • Por maykeldoido
      Olá galera tudo bem? 
      Vi um usuário perguntando no fórum sobre Opcodes, como no começo eu tive bastante dificuldade de entender, estou fazendo este tutorial básico para que fique claro!
       
      Opcodes são a comunicação entre o cliente e o servidor sem fazer alterações na source.. Na source você poderia usar sockets, que são pacotes de informação, diretamente sem usar funcionalidades do jogo como meio de transmissão, já o opCode utiliza recursos in game para fazer essa comunicação, entendeu?
       
       
      Exemplo:
       
      No módulo game_skills, no arquivo skills.lua, você pode notar a utilização do seguinte código:
      Registre-se para ver spoiler(s).
       
      Basicamente, está função preenche uma tabela com as informações sobre insígneas, coins, qtd capturas do player e envia de volta ao Cliente através do comando:
       return doSendPlayerExtendedOpcode(cid, opcodes.OPCODE_SKILL_BAR, table.concat(str))
      lembrando que o opcodes.OPCODE_SKILL_BAR nada mais que que o número 102 e o table.concat(str) é o buffer, ou seja, um parâmetro da função doSendPlayerExtendedOpcode com os dados que serão enviados ao Cliente.
       
       
      Espero que todos tenham entendido, qualquer dúvida deixe nos comentários e se for preciso estarei arrumando qualquer erro que reportem no tutorial.