Ir para conteúdo

Killua

Membro
  • Registro em

  • Última visita

Histórico de Curtidas

  1. Gostei
    Killua recebeu reputação de premii em Armazenar Tabelas em Storages (setGlobalTableStorage)   
    Introdução:

    Esses dias eu estava fazendo um sistema e senti a necessidade de armazenar várias informações (por player) em um só lugar. Porém, todos nós sabemos que não é possível colocar uma tabela como valor de um storage. Por conta disso, decidi tornar possível esse armazenamento.

    Tenho certeza de que essa biblioteca será uma ferramenta extremamente útil para todos os scripters. Ela abre muitas portas e vai permitir a criação de muitos sistemas interessantes.

    Instalação:

    Simplesmente crie o arquivo tableStorage.lua em data/lib e coloque esse código:





    Utilização:

    Para armazenar uma tabela em um storage de um player, use:
    setPlayerTableStorage(cid, key, tabela) Exemplo:
    setPlayerTableStorage(cid, 199991, {["primeiro"] = 4, [8] = "Killua", [3] = 22}) Para armazenar uma tabela em um storage global, use:
    setGlobalTableStorage(key, tabela) Exemplo:
    setGlobalStorageValue(123412, {1, 55, "c", 3}) Para retornar as tabelas, use:
    getGlobalTableStorage(key) ou
    getPlayerTableStorage(cid, key) Esclarecimento:

    As tabelas retornadas pelas funções getGlobalTableStorage e getPlayerTableStorage são tabelas normais e podem ser manipuladas como qualquer outra, por exemplo:
    for t, k in pairs(getPlayerTableStorage(cid, 123444)) do print("["..t.."] "..v) end Observações:

    As tabelas não armazenam valores booleanos, outras tabelas e nem funções, apenas strings e números. No entanto é claro que ela pode armazenar valores recebidos de funções, por exemplo:
    setPlayerTableStorage(cid, 17271, {["level"] = getPlayerLevel(cid), ["sex"] = getPlayerSex(cid) == 1 and "female" or "male"}) Funcionará perfeitamente.


    Mas:
    setPlayerTableStorage(cid, 17271, {returnDouble = function(value) return value*2 end, try = 11, [2] = 10}) Não irá funcionar.

    As tabelas podem ser preenchidas com ou sem index definido, de forma que os não definidos serão definidos automaticamente numa sequencia (Como qualquer tabela). Sendo assim:
    setPlayerTableStorage(cid, 12344, {1,3,23,1999,"test"})setPlayerTableStorage(cid, 12344, {[5] = "hi", ["mia"] = 32, c = 18})setPlayerTableStorage(cid, 12344, {1, "c", 6, ["test"] = 18, b = "c", "hello world"}) São todas válidas.
     
    Cuidado com com tabelas muito grandes! Elas podem acabar pesando bastante e consumindo bastante de sua database. Eu aconselho não ultrapassar 4 elementos. É claro que apenas um storage com uma tabela bem grande não vai causar problema mas, em um servidor com muitos jogadores, pode ser perigoso adicionar muitas tabelas grandes (1 por jogador).

    Considerações:

    Eu realmente acho que essa biblioteca vai abrir várias possibilidades para todos vocês, scripters. E espero que criem muitos sistemas legais a partir dela. Se tiverem dúvidas ou sugestões, podem dizer.

    Abraços.
  2. Curtir
    Killua recebeu reputação de LeoTK em Sistema de Plantação por Killua   
    Sistema de Plantação
     

     
     
    Crie cultivo.lua em data/actions/scripts e cole:
     
    -- Plantation System created by Vítor Bertolucci - Killua -- 02/04/2014 local usableDirt = 103 -- Dirt to seed local mustBeInHouse = true -- Is it only enabled inside houses? [true/false] local fruits = {2682, 5097, 8838, 2685, 2674} -- Fruits that can grow local failChance = 0 -- Fail chance in % function transformIt(pos, id) -- Seeds the ground     pos.stackpos = 0     return doTransformItem(getThingFromPos(pos).uid, id) end function getUnwantedItem(pos) -- Checks for unwanted items     for i = 1, 5 do         pos.stackpos = i         if getThingFromPos(pos).itemid > 0 and getThingFromPos(pos).itemid ~= 7732 then             return true         end     end     return false end function transformTo(pos, fromid, toid) -- Makes the plants grow     for s = 1, 5 do         pos.stackpos = s         local item = getThingFromPos(pos)         if item.itemid == fromid then             doTransformItem(item.uid, toid)         end     end end function doRemoveMe(pos, id) -- Removes weeds     for stackpos = 1, 5 do       pos.stackpos = stackpos       local item = getThingFromPos(pos)         if item.itemid == id then           doRemoveItem(item.uid)         end     end end function onUse(cid, item, fromPosition, itemEx, toPosition)     if mustBeInHouse and not getHouseFromPos(toPosition) then         return doPlayerSendCancel(cid, "You can only plant inside houses.")     end          toPosition.stackpos = 0     local tile = getThingFromPos(toPosition)     if tile.itemid == usableDirt and not getUnwantedItem(toPosition) and itemEx.itemid ~= 7732 then         if item.itemid == 2552 then             doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You have plowed the ground.")             doTransformItem(tile.uid, 804)             addEvent(transformIt, math.random(44600, 48600), toPosition, usableDirt)         end     elseif item.itemid == 7732 and tile.itemid == 804 and not getUnwantedItem(toPosition) then         doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You have planted the seed.")         doRemoveItem(item.uid, 1)         doCreateItem(6216, 1, toPosition)         doSendMagicEffect(toPosition, CONST_ME_SMALLPLANTS)         local chance = math.random(1, 100)         local time1 = math.random(8500, 12600)         local time2 = math.random(24500, 28600)         if chance <= failChance then             addEvent(transformTo, time1, toPosition, 6216, 2784)             addEvent(doSendMagicEffect, time1, toPosition, 7)             addEvent(doRemoveMe, time2, toPosition, 2784)             addEvent(doSendMagicEffect, time2, toPosition, CONST_ME_POFF)         else             addEvent(transformTo, time1, toPosition, 6216, 2779)             addEvent(doSendMagicEffect, time1, toPosition, CONST_ME_SMALLPLANTS)             addEvent(doSendMagicEffect, time2, toPosition, CONST_ME_PLANTATTACK)             addEvent(transformTo, time2, toPosition, 2779, fruits[math.random(1, #fruits)])         end     elseif itemEx.itemid == 2784 or itemEx.itemid == 2779 then         if tile.itemid == 804 or tile.itemid == 103 then             doRemoveItem(itemEx.uid, 1)             doSendMagicEffect(toPosition, 3)             doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You have removed the plant.")         end         else         doPlayerSendCancel(cid, "You cannot plow this ground.")     end     return true end Em actions.xml coloque:
    <action itemid="2552" event="script" value="cultivo.lua"/> <action itemid="7732" event="script" value="cultivo.lua"/> Use a enchada (ID: 2552) para arar o solo e plante uma semente (ID: 7732) nele.
  3. Gostei
    Killua recebeu reputação de Augusto em Armazenar Tabelas em Storages (setGlobalTableStorage)   
    Introdução:

    Esses dias eu estava fazendo um sistema e senti a necessidade de armazenar várias informações (por player) em um só lugar. Porém, todos nós sabemos que não é possível colocar uma tabela como valor de um storage. Por conta disso, decidi tornar possível esse armazenamento.

    Tenho certeza de que essa biblioteca será uma ferramenta extremamente útil para todos os scripters. Ela abre muitas portas e vai permitir a criação de muitos sistemas interessantes.

    Instalação:

    Simplesmente crie o arquivo tableStorage.lua em data/lib e coloque esse código:





    Utilização:

    Para armazenar uma tabela em um storage de um player, use:
    setPlayerTableStorage(cid, key, tabela) Exemplo:
    setPlayerTableStorage(cid, 199991, {["primeiro"] = 4, [8] = "Killua", [3] = 22}) Para armazenar uma tabela em um storage global, use:
    setGlobalTableStorage(key, tabela) Exemplo:
    setGlobalStorageValue(123412, {1, 55, "c", 3}) Para retornar as tabelas, use:
    getGlobalTableStorage(key) ou
    getPlayerTableStorage(cid, key) Esclarecimento:

    As tabelas retornadas pelas funções getGlobalTableStorage e getPlayerTableStorage são tabelas normais e podem ser manipuladas como qualquer outra, por exemplo:
    for t, k in pairs(getPlayerTableStorage(cid, 123444)) do print("["..t.."] "..v) end Observações:

    As tabelas não armazenam valores booleanos, outras tabelas e nem funções, apenas strings e números. No entanto é claro que ela pode armazenar valores recebidos de funções, por exemplo:
    setPlayerTableStorage(cid, 17271, {["level"] = getPlayerLevel(cid), ["sex"] = getPlayerSex(cid) == 1 and "female" or "male"}) Funcionará perfeitamente.


    Mas:
    setPlayerTableStorage(cid, 17271, {returnDouble = function(value) return value*2 end, try = 11, [2] = 10}) Não irá funcionar.

    As tabelas podem ser preenchidas com ou sem index definido, de forma que os não definidos serão definidos automaticamente numa sequencia (Como qualquer tabela). Sendo assim:
    setPlayerTableStorage(cid, 12344, {1,3,23,1999,"test"})setPlayerTableStorage(cid, 12344, {[5] = "hi", ["mia"] = 32, c = 18})setPlayerTableStorage(cid, 12344, {1, "c", 6, ["test"] = 18, b = "c", "hello world"}) São todas válidas.
     
    Cuidado com com tabelas muito grandes! Elas podem acabar pesando bastante e consumindo bastante de sua database. Eu aconselho não ultrapassar 4 elementos. É claro que apenas um storage com uma tabela bem grande não vai causar problema mas, em um servidor com muitos jogadores, pode ser perigoso adicionar muitas tabelas grandes (1 por jogador).

    Considerações:

    Eu realmente acho que essa biblioteca vai abrir várias possibilidades para todos vocês, scripters. E espero que criem muitos sistemas legais a partir dela. Se tiverem dúvidas ou sugestões, podem dizer.

    Abraços.
  4. Gostei
    Killua recebeu reputação de Frenesy em Armazenar Tabelas em Storages (setGlobalTableStorage)   
    Introdução:

    Esses dias eu estava fazendo um sistema e senti a necessidade de armazenar várias informações (por player) em um só lugar. Porém, todos nós sabemos que não é possível colocar uma tabela como valor de um storage. Por conta disso, decidi tornar possível esse armazenamento.

    Tenho certeza de que essa biblioteca será uma ferramenta extremamente útil para todos os scripters. Ela abre muitas portas e vai permitir a criação de muitos sistemas interessantes.

    Instalação:

    Simplesmente crie o arquivo tableStorage.lua em data/lib e coloque esse código:





    Utilização:

    Para armazenar uma tabela em um storage de um player, use:
    setPlayerTableStorage(cid, key, tabela) Exemplo:
    setPlayerTableStorage(cid, 199991, {["primeiro"] = 4, [8] = "Killua", [3] = 22}) Para armazenar uma tabela em um storage global, use:
    setGlobalTableStorage(key, tabela) Exemplo:
    setGlobalStorageValue(123412, {1, 55, "c", 3}) Para retornar as tabelas, use:
    getGlobalTableStorage(key) ou
    getPlayerTableStorage(cid, key) Esclarecimento:

    As tabelas retornadas pelas funções getGlobalTableStorage e getPlayerTableStorage são tabelas normais e podem ser manipuladas como qualquer outra, por exemplo:
    for t, k in pairs(getPlayerTableStorage(cid, 123444)) do print("["..t.."] "..v) end Observações:

    As tabelas não armazenam valores booleanos, outras tabelas e nem funções, apenas strings e números. No entanto é claro que ela pode armazenar valores recebidos de funções, por exemplo:
    setPlayerTableStorage(cid, 17271, {["level"] = getPlayerLevel(cid), ["sex"] = getPlayerSex(cid) == 1 and "female" or "male"}) Funcionará perfeitamente.


    Mas:
    setPlayerTableStorage(cid, 17271, {returnDouble = function(value) return value*2 end, try = 11, [2] = 10}) Não irá funcionar.

    As tabelas podem ser preenchidas com ou sem index definido, de forma que os não definidos serão definidos automaticamente numa sequencia (Como qualquer tabela). Sendo assim:
    setPlayerTableStorage(cid, 12344, {1,3,23,1999,"test"})setPlayerTableStorage(cid, 12344, {[5] = "hi", ["mia"] = 32, c = 18})setPlayerTableStorage(cid, 12344, {1, "c", 6, ["test"] = 18, b = "c", "hello world"}) São todas válidas.
     
    Cuidado com com tabelas muito grandes! Elas podem acabar pesando bastante e consumindo bastante de sua database. Eu aconselho não ultrapassar 4 elementos. É claro que apenas um storage com uma tabela bem grande não vai causar problema mas, em um servidor com muitos jogadores, pode ser perigoso adicionar muitas tabelas grandes (1 por jogador).

    Considerações:

    Eu realmente acho que essa biblioteca vai abrir várias possibilidades para todos vocês, scripters. E espero que criem muitos sistemas legais a partir dela. Se tiverem dúvidas ou sugestões, podem dizer.

    Abraços.
  5. Curtir
    Killua recebeu reputação de Gogetasaya em Como usar addEvent   
    Usando addEvent
     
    O uso do addEvent tem inúmeras utilidades e pode ser complicado para algumas pessoas, inclusive era para mim quando eu estava começando a aprender LUA.
     
    Para que serve o addEvent?
    Para "chamar" uma função após um periodo de tempo, ou seja, executar uma função após um tempo estipulado. 
     
    O addEvent tem como parâmetros: callback, delay e ...
    addEvent(callback, delay, ...)
     
    Onde callback é a função que será chamada, delay é o tempo (em milissegundos) até que se chame essa função e ... são os parâmetros que a função chamada utiliza. Exemplo:
    addEvent(doBroadcastMessage, 1000, "Bom dia", 23) Aqui, após 1 segundo (1000 ms), a função doBroadcastMessage(message, type) será executada com os parâmetros message = "Bom dia" e type = 23.
     
    O addEvent pode ser usado de duas maneiras:
    Chamando uma função existente ou criando uma nova função.
     
    Para chamar uma função existente, basta usar como acima, para usá-lo para criar uma nova função, usa-se assim, por exemplo:
    addEvent(function()      if isCreature(cid) then           doPlayerAddItem(cid, 2160, 10)           doPlayerSendTextMessage(cid, 25, "Voce ganhou 10k.")      end end, 1000) Assim é basicamente a mesma coisa, mas pude colocar várias funções dentro de um único addEvent e mantive o delay 1000 (1 segundo).
    Obs: Precisei usar 2 ends, um para fechar function() e outro para fechar o if.
     
    Atenção! Além disso, existe uma outra diferença entre as duas formas de uso, vou tentar explicar da melhor maneira possível:
    Quando usamos o addEvent com uma função já existente (1o exemplo), as informações usadas serão as geradas no momento em que o evento foi chamado, por exemplo:
    function onUse(cid, item, fromPosition, itemEx, toPosition)      if getPlayerLevel(cid) > 10 then           doPlayerSendTextMessage(cid, 25, "Uma pedra sera criada na sua posiçao dentro de 2 segundos.")           addEvent(doCreateItem, 2000, 1308, 1, getThingPos(cid))      end      return true end Se usarmos assim, a pedra será criada na posição onde o jogador se encontrava no momento em que "deu use" e não onde ele estará 2 segundos depois. Se você quiser que a pedra seja criada na nova posição do jogador (pos de 2 segundos depois), você deve fazer uma nova checagem, criando uma função:
    function onUse(cid, item, fromPosition, itemEx, toPosition)      if getPlayerLevel(cid) > 10 then           doPlayerSendTextMessage(cid, 25, "Uma pedra sera criada na sua posiçao dentro de 2 segundos.")           addEvent(function()                if isCreature(cid) then                     doCreateItem(1308, 1, getThingPos(cid))                end           end, 2000)      end      return true end Atenção novamente: A checagem if isCreature(cid) que utilizei, é muito importante para um addEvent que envolva criaturas. Se você executasse o addEvent sem a checagem e o player logasse ou morresse antes desses 2 segundos se passarem, daria um erro na distro e interromperia o resto do script.
     
     
    Recursão
    Uma outra ótima funcionalidade dos addEvents é a recursão, ou seja, criar um evento que fica se repetindo. É simplesmente um addEvent chamando a sí mesmo.
    Para usar, crie uma função, exemplo:
    function respawnMonster(name, pos)      if doCreateMonster(name, pos) then           doBroadcastMessage(name.." nasceu!")      end      addEvent(respawnMonster, 10000, name, pos) end Quando chamada, esta função ficará criando um monstro e uma determinada área a cada 10 segundos, sem nunca parar.
    Para chamar a função, seria assim:
    respawnMonster("Demon", {x = 123, y = 123, z = 5}) Considerações
    Reloads param os addEvents. Se um script talkaction executou um addEvent programado para acontecer depois de 5 minutos e se dentro deste intervalo de tempo, você usar /reload talkactions, o addEvent será interrompido.
     
    Erros no código podem fazer o evento ser interrompido, preste sempre atenção.
     
    Se ainda ficou com alguma dúvida, poste aqui.
     
     
        
  6. Curtir
    Killua recebeu reputação de N3MESIZ em Como usar addEvent   
    Usando addEvent
     
    O uso do addEvent tem inúmeras utilidades e pode ser complicado para algumas pessoas, inclusive era para mim quando eu estava começando a aprender LUA.
     
    Para que serve o addEvent?
    Para "chamar" uma função após um periodo de tempo, ou seja, executar uma função após um tempo estipulado. 
     
    O addEvent tem como parâmetros: callback, delay e ...
    addEvent(callback, delay, ...)
     
    Onde callback é a função que será chamada, delay é o tempo (em milissegundos) até que se chame essa função e ... são os parâmetros que a função chamada utiliza. Exemplo:
    addEvent(doBroadcastMessage, 1000, "Bom dia", 23) Aqui, após 1 segundo (1000 ms), a função doBroadcastMessage(message, type) será executada com os parâmetros message = "Bom dia" e type = 23.
     
    O addEvent pode ser usado de duas maneiras:
    Chamando uma função existente ou criando uma nova função.
     
    Para chamar uma função existente, basta usar como acima, para usá-lo para criar uma nova função, usa-se assim, por exemplo:
    addEvent(function()      if isCreature(cid) then           doPlayerAddItem(cid, 2160, 10)           doPlayerSendTextMessage(cid, 25, "Voce ganhou 10k.")      end end, 1000) Assim é basicamente a mesma coisa, mas pude colocar várias funções dentro de um único addEvent e mantive o delay 1000 (1 segundo).
    Obs: Precisei usar 2 ends, um para fechar function() e outro para fechar o if.
     
    Atenção! Além disso, existe uma outra diferença entre as duas formas de uso, vou tentar explicar da melhor maneira possível:
    Quando usamos o addEvent com uma função já existente (1o exemplo), as informações usadas serão as geradas no momento em que o evento foi chamado, por exemplo:
    function onUse(cid, item, fromPosition, itemEx, toPosition)      if getPlayerLevel(cid) > 10 then           doPlayerSendTextMessage(cid, 25, "Uma pedra sera criada na sua posiçao dentro de 2 segundos.")           addEvent(doCreateItem, 2000, 1308, 1, getThingPos(cid))      end      return true end Se usarmos assim, a pedra será criada na posição onde o jogador se encontrava no momento em que "deu use" e não onde ele estará 2 segundos depois. Se você quiser que a pedra seja criada na nova posição do jogador (pos de 2 segundos depois), você deve fazer uma nova checagem, criando uma função:
    function onUse(cid, item, fromPosition, itemEx, toPosition)      if getPlayerLevel(cid) > 10 then           doPlayerSendTextMessage(cid, 25, "Uma pedra sera criada na sua posiçao dentro de 2 segundos.")           addEvent(function()                if isCreature(cid) then                     doCreateItem(1308, 1, getThingPos(cid))                end           end, 2000)      end      return true end Atenção novamente: A checagem if isCreature(cid) que utilizei, é muito importante para um addEvent que envolva criaturas. Se você executasse o addEvent sem a checagem e o player logasse ou morresse antes desses 2 segundos se passarem, daria um erro na distro e interromperia o resto do script.
     
     
    Recursão
    Uma outra ótima funcionalidade dos addEvents é a recursão, ou seja, criar um evento que fica se repetindo. É simplesmente um addEvent chamando a sí mesmo.
    Para usar, crie uma função, exemplo:
    function respawnMonster(name, pos)      if doCreateMonster(name, pos) then           doBroadcastMessage(name.." nasceu!")      end      addEvent(respawnMonster, 10000, name, pos) end Quando chamada, esta função ficará criando um monstro e uma determinada área a cada 10 segundos, sem nunca parar.
    Para chamar a função, seria assim:
    respawnMonster("Demon", {x = 123, y = 123, z = 5}) Considerações
    Reloads param os addEvents. Se um script talkaction executou um addEvent programado para acontecer depois de 5 minutos e se dentro deste intervalo de tempo, você usar /reload talkactions, o addEvent será interrompido.
     
    Erros no código podem fazer o evento ser interrompido, preste sempre atenção.
     
    Se ainda ficou com alguma dúvida, poste aqui.
     
     
        
  7. Gostei
    Killua recebeu reputação de Biinhow em Como usar addEvent   
    Usando addEvent
     
    O uso do addEvent tem inúmeras utilidades e pode ser complicado para algumas pessoas, inclusive era para mim quando eu estava começando a aprender LUA.
     
    Para que serve o addEvent?
    Para "chamar" uma função após um periodo de tempo, ou seja, executar uma função após um tempo estipulado. 
     
    O addEvent tem como parâmetros: callback, delay e ...
    addEvent(callback, delay, ...)
     
    Onde callback é a função que será chamada, delay é o tempo (em milissegundos) até que se chame essa função e ... são os parâmetros que a função chamada utiliza. Exemplo:
    addEvent(doBroadcastMessage, 1000, "Bom dia", 23) Aqui, após 1 segundo (1000 ms), a função doBroadcastMessage(message, type) será executada com os parâmetros message = "Bom dia" e type = 23.
     
    O addEvent pode ser usado de duas maneiras:
    Chamando uma função existente ou criando uma nova função.
     
    Para chamar uma função existente, basta usar como acima, para usá-lo para criar uma nova função, usa-se assim, por exemplo:
    addEvent(function()      if isCreature(cid) then           doPlayerAddItem(cid, 2160, 10)           doPlayerSendTextMessage(cid, 25, "Voce ganhou 10k.")      end end, 1000) Assim é basicamente a mesma coisa, mas pude colocar várias funções dentro de um único addEvent e mantive o delay 1000 (1 segundo).
    Obs: Precisei usar 2 ends, um para fechar function() e outro para fechar o if.
     
    Atenção! Além disso, existe uma outra diferença entre as duas formas de uso, vou tentar explicar da melhor maneira possível:
    Quando usamos o addEvent com uma função já existente (1o exemplo), as informações usadas serão as geradas no momento em que o evento foi chamado, por exemplo:
    function onUse(cid, item, fromPosition, itemEx, toPosition)      if getPlayerLevel(cid) > 10 then           doPlayerSendTextMessage(cid, 25, "Uma pedra sera criada na sua posiçao dentro de 2 segundos.")           addEvent(doCreateItem, 2000, 1308, 1, getThingPos(cid))      end      return true end Se usarmos assim, a pedra será criada na posição onde o jogador se encontrava no momento em que "deu use" e não onde ele estará 2 segundos depois. Se você quiser que a pedra seja criada na nova posição do jogador (pos de 2 segundos depois), você deve fazer uma nova checagem, criando uma função:
    function onUse(cid, item, fromPosition, itemEx, toPosition)      if getPlayerLevel(cid) > 10 then           doPlayerSendTextMessage(cid, 25, "Uma pedra sera criada na sua posiçao dentro de 2 segundos.")           addEvent(function()                if isCreature(cid) then                     doCreateItem(1308, 1, getThingPos(cid))                end           end, 2000)      end      return true end Atenção novamente: A checagem if isCreature(cid) que utilizei, é muito importante para um addEvent que envolva criaturas. Se você executasse o addEvent sem a checagem e o player logasse ou morresse antes desses 2 segundos se passarem, daria um erro na distro e interromperia o resto do script.
     
     
    Recursão
    Uma outra ótima funcionalidade dos addEvents é a recursão, ou seja, criar um evento que fica se repetindo. É simplesmente um addEvent chamando a sí mesmo.
    Para usar, crie uma função, exemplo:
    function respawnMonster(name, pos)      if doCreateMonster(name, pos) then           doBroadcastMessage(name.." nasceu!")      end      addEvent(respawnMonster, 10000, name, pos) end Quando chamada, esta função ficará criando um monstro e uma determinada área a cada 10 segundos, sem nunca parar.
    Para chamar a função, seria assim:
    respawnMonster("Demon", {x = 123, y = 123, z = 5}) Considerações
    Reloads param os addEvents. Se um script talkaction executou um addEvent programado para acontecer depois de 5 minutos e se dentro deste intervalo de tempo, você usar /reload talkactions, o addEvent será interrompido.
     
    Erros no código podem fazer o evento ser interrompido, preste sempre atenção.
     
    Se ainda ficou com alguma dúvida, poste aqui.
     
     
        
  8. Gostei
    Killua recebeu reputação de gui11gui12 em Como usar addEvent   
    Usando addEvent
     
    O uso do addEvent tem inúmeras utilidades e pode ser complicado para algumas pessoas, inclusive era para mim quando eu estava começando a aprender LUA.
     
    Para que serve o addEvent?
    Para "chamar" uma função após um periodo de tempo, ou seja, executar uma função após um tempo estipulado. 
     
    O addEvent tem como parâmetros: callback, delay e ...
    addEvent(callback, delay, ...)
     
    Onde callback é a função que será chamada, delay é o tempo (em milissegundos) até que se chame essa função e ... são os parâmetros que a função chamada utiliza. Exemplo:
    addEvent(doBroadcastMessage, 1000, "Bom dia", 23) Aqui, após 1 segundo (1000 ms), a função doBroadcastMessage(message, type) será executada com os parâmetros message = "Bom dia" e type = 23.
     
    O addEvent pode ser usado de duas maneiras:
    Chamando uma função existente ou criando uma nova função.
     
    Para chamar uma função existente, basta usar como acima, para usá-lo para criar uma nova função, usa-se assim, por exemplo:
    addEvent(function()      if isCreature(cid) then           doPlayerAddItem(cid, 2160, 10)           doPlayerSendTextMessage(cid, 25, "Voce ganhou 10k.")      end end, 1000) Assim é basicamente a mesma coisa, mas pude colocar várias funções dentro de um único addEvent e mantive o delay 1000 (1 segundo).
    Obs: Precisei usar 2 ends, um para fechar function() e outro para fechar o if.
     
    Atenção! Além disso, existe uma outra diferença entre as duas formas de uso, vou tentar explicar da melhor maneira possível:
    Quando usamos o addEvent com uma função já existente (1o exemplo), as informações usadas serão as geradas no momento em que o evento foi chamado, por exemplo:
    function onUse(cid, item, fromPosition, itemEx, toPosition)      if getPlayerLevel(cid) > 10 then           doPlayerSendTextMessage(cid, 25, "Uma pedra sera criada na sua posiçao dentro de 2 segundos.")           addEvent(doCreateItem, 2000, 1308, 1, getThingPos(cid))      end      return true end Se usarmos assim, a pedra será criada na posição onde o jogador se encontrava no momento em que "deu use" e não onde ele estará 2 segundos depois. Se você quiser que a pedra seja criada na nova posição do jogador (pos de 2 segundos depois), você deve fazer uma nova checagem, criando uma função:
    function onUse(cid, item, fromPosition, itemEx, toPosition)      if getPlayerLevel(cid) > 10 then           doPlayerSendTextMessage(cid, 25, "Uma pedra sera criada na sua posiçao dentro de 2 segundos.")           addEvent(function()                if isCreature(cid) then                     doCreateItem(1308, 1, getThingPos(cid))                end           end, 2000)      end      return true end Atenção novamente: A checagem if isCreature(cid) que utilizei, é muito importante para um addEvent que envolva criaturas. Se você executasse o addEvent sem a checagem e o player logasse ou morresse antes desses 2 segundos se passarem, daria um erro na distro e interromperia o resto do script.
     
     
    Recursão
    Uma outra ótima funcionalidade dos addEvents é a recursão, ou seja, criar um evento que fica se repetindo. É simplesmente um addEvent chamando a sí mesmo.
    Para usar, crie uma função, exemplo:
    function respawnMonster(name, pos)      if doCreateMonster(name, pos) then           doBroadcastMessage(name.." nasceu!")      end      addEvent(respawnMonster, 10000, name, pos) end Quando chamada, esta função ficará criando um monstro e uma determinada área a cada 10 segundos, sem nunca parar.
    Para chamar a função, seria assim:
    respawnMonster("Demon", {x = 123, y = 123, z = 5}) Considerações
    Reloads param os addEvents. Se um script talkaction executou um addEvent programado para acontecer depois de 5 minutos e se dentro deste intervalo de tempo, você usar /reload talkactions, o addEvent será interrompido.
     
    Erros no código podem fazer o evento ser interrompido, preste sempre atenção.
     
    Se ainda ficou com alguma dúvida, poste aqui.
     
     
        
  9. Gostei
    Killua recebeu reputação de Whyzin em Como usar addEvent   
    Usando addEvent
     
    O uso do addEvent tem inúmeras utilidades e pode ser complicado para algumas pessoas, inclusive era para mim quando eu estava começando a aprender LUA.
     
    Para que serve o addEvent?
    Para "chamar" uma função após um periodo de tempo, ou seja, executar uma função após um tempo estipulado. 
     
    O addEvent tem como parâmetros: callback, delay e ...
    addEvent(callback, delay, ...)
     
    Onde callback é a função que será chamada, delay é o tempo (em milissegundos) até que se chame essa função e ... são os parâmetros que a função chamada utiliza. Exemplo:
    addEvent(doBroadcastMessage, 1000, "Bom dia", 23) Aqui, após 1 segundo (1000 ms), a função doBroadcastMessage(message, type) será executada com os parâmetros message = "Bom dia" e type = 23.
     
    O addEvent pode ser usado de duas maneiras:
    Chamando uma função existente ou criando uma nova função.
     
    Para chamar uma função existente, basta usar como acima, para usá-lo para criar uma nova função, usa-se assim, por exemplo:
    addEvent(function()      if isCreature(cid) then           doPlayerAddItem(cid, 2160, 10)           doPlayerSendTextMessage(cid, 25, "Voce ganhou 10k.")      end end, 1000) Assim é basicamente a mesma coisa, mas pude colocar várias funções dentro de um único addEvent e mantive o delay 1000 (1 segundo).
    Obs: Precisei usar 2 ends, um para fechar function() e outro para fechar o if.
     
    Atenção! Além disso, existe uma outra diferença entre as duas formas de uso, vou tentar explicar da melhor maneira possível:
    Quando usamos o addEvent com uma função já existente (1o exemplo), as informações usadas serão as geradas no momento em que o evento foi chamado, por exemplo:
    function onUse(cid, item, fromPosition, itemEx, toPosition)      if getPlayerLevel(cid) > 10 then           doPlayerSendTextMessage(cid, 25, "Uma pedra sera criada na sua posiçao dentro de 2 segundos.")           addEvent(doCreateItem, 2000, 1308, 1, getThingPos(cid))      end      return true end Se usarmos assim, a pedra será criada na posição onde o jogador se encontrava no momento em que "deu use" e não onde ele estará 2 segundos depois. Se você quiser que a pedra seja criada na nova posição do jogador (pos de 2 segundos depois), você deve fazer uma nova checagem, criando uma função:
    function onUse(cid, item, fromPosition, itemEx, toPosition)      if getPlayerLevel(cid) > 10 then           doPlayerSendTextMessage(cid, 25, "Uma pedra sera criada na sua posiçao dentro de 2 segundos.")           addEvent(function()                if isCreature(cid) then                     doCreateItem(1308, 1, getThingPos(cid))                end           end, 2000)      end      return true end Atenção novamente: A checagem if isCreature(cid) que utilizei, é muito importante para um addEvent que envolva criaturas. Se você executasse o addEvent sem a checagem e o player logasse ou morresse antes desses 2 segundos se passarem, daria um erro na distro e interromperia o resto do script.
     
     
    Recursão
    Uma outra ótima funcionalidade dos addEvents é a recursão, ou seja, criar um evento que fica se repetindo. É simplesmente um addEvent chamando a sí mesmo.
    Para usar, crie uma função, exemplo:
    function respawnMonster(name, pos)      if doCreateMonster(name, pos) then           doBroadcastMessage(name.." nasceu!")      end      addEvent(respawnMonster, 10000, name, pos) end Quando chamada, esta função ficará criando um monstro e uma determinada área a cada 10 segundos, sem nunca parar.
    Para chamar a função, seria assim:
    respawnMonster("Demon", {x = 123, y = 123, z = 5}) Considerações
    Reloads param os addEvents. Se um script talkaction executou um addEvent programado para acontecer depois de 5 minutos e se dentro deste intervalo de tempo, você usar /reload talkactions, o addEvent será interrompido.
     
    Erros no código podem fazer o evento ser interrompido, preste sempre atenção.
     
    Se ainda ficou com alguma dúvida, poste aqui.
     
     
        
  10. Obrigado
    Killua recebeu reputação de lordzetros em Como usar addEvent   
    Usando addEvent
     
    O uso do addEvent tem inúmeras utilidades e pode ser complicado para algumas pessoas, inclusive era para mim quando eu estava começando a aprender LUA.
     
    Para que serve o addEvent?
    Para "chamar" uma função após um periodo de tempo, ou seja, executar uma função após um tempo estipulado. 
     
    O addEvent tem como parâmetros: callback, delay e ...
    addEvent(callback, delay, ...)
     
    Onde callback é a função que será chamada, delay é o tempo (em milissegundos) até que se chame essa função e ... são os parâmetros que a função chamada utiliza. Exemplo:
    addEvent(doBroadcastMessage, 1000, "Bom dia", 23) Aqui, após 1 segundo (1000 ms), a função doBroadcastMessage(message, type) será executada com os parâmetros message = "Bom dia" e type = 23.
     
    O addEvent pode ser usado de duas maneiras:
    Chamando uma função existente ou criando uma nova função.
     
    Para chamar uma função existente, basta usar como acima, para usá-lo para criar uma nova função, usa-se assim, por exemplo:
    addEvent(function()      if isCreature(cid) then           doPlayerAddItem(cid, 2160, 10)           doPlayerSendTextMessage(cid, 25, "Voce ganhou 10k.")      end end, 1000) Assim é basicamente a mesma coisa, mas pude colocar várias funções dentro de um único addEvent e mantive o delay 1000 (1 segundo).
    Obs: Precisei usar 2 ends, um para fechar function() e outro para fechar o if.
     
    Atenção! Além disso, existe uma outra diferença entre as duas formas de uso, vou tentar explicar da melhor maneira possível:
    Quando usamos o addEvent com uma função já existente (1o exemplo), as informações usadas serão as geradas no momento em que o evento foi chamado, por exemplo:
    function onUse(cid, item, fromPosition, itemEx, toPosition)      if getPlayerLevel(cid) > 10 then           doPlayerSendTextMessage(cid, 25, "Uma pedra sera criada na sua posiçao dentro de 2 segundos.")           addEvent(doCreateItem, 2000, 1308, 1, getThingPos(cid))      end      return true end Se usarmos assim, a pedra será criada na posição onde o jogador se encontrava no momento em que "deu use" e não onde ele estará 2 segundos depois. Se você quiser que a pedra seja criada na nova posição do jogador (pos de 2 segundos depois), você deve fazer uma nova checagem, criando uma função:
    function onUse(cid, item, fromPosition, itemEx, toPosition)      if getPlayerLevel(cid) > 10 then           doPlayerSendTextMessage(cid, 25, "Uma pedra sera criada na sua posiçao dentro de 2 segundos.")           addEvent(function()                if isCreature(cid) then                     doCreateItem(1308, 1, getThingPos(cid))                end           end, 2000)      end      return true end Atenção novamente: A checagem if isCreature(cid) que utilizei, é muito importante para um addEvent que envolva criaturas. Se você executasse o addEvent sem a checagem e o player logasse ou morresse antes desses 2 segundos se passarem, daria um erro na distro e interromperia o resto do script.
     
     
    Recursão
    Uma outra ótima funcionalidade dos addEvents é a recursão, ou seja, criar um evento que fica se repetindo. É simplesmente um addEvent chamando a sí mesmo.
    Para usar, crie uma função, exemplo:
    function respawnMonster(name, pos)      if doCreateMonster(name, pos) then           doBroadcastMessage(name.." nasceu!")      end      addEvent(respawnMonster, 10000, name, pos) end Quando chamada, esta função ficará criando um monstro e uma determinada área a cada 10 segundos, sem nunca parar.
    Para chamar a função, seria assim:
    respawnMonster("Demon", {x = 123, y = 123, z = 5}) Considerações
    Reloads param os addEvents. Se um script talkaction executou um addEvent programado para acontecer depois de 5 minutos e se dentro deste intervalo de tempo, você usar /reload talkactions, o addEvent será interrompido.
     
    Erros no código podem fazer o evento ser interrompido, preste sempre atenção.
     
    Se ainda ficou com alguma dúvida, poste aqui.
     
     
        
  11. Obrigado
    Killua recebeu reputação de Vodkart em Evento Blood Castle [Automático]   
    Últimas atualizações:
     
    16/12/2013:
     
     


     
     
    Introdução:
     
     
    Este é o meu já conhecido evento Blood Castle Automático que estava em outro fórum que acabou. Estou trazendo ele aqui para que ele não "morra".
     
     
     
     
    Informações:  
     
    #Dica: Acho que fica legal o premio do evento ser um item que da double exp por um tempo.
     
     
    Atualização [12/04/2014]
     
     
    Resolvi refazer o código, para facilitar a instalação e melhorar o funcionamento do evento.
     
     
    O que mudou?
     
     
     
     
     
    Instalando o evento:
     
    Lib:
     


     
     
    Movements: 
     


     
     
     
    Creaturescripts: 
     


     
    Monsters: 
     

        O evento pode acontecer de duas maneiras: automática ou manualmente. Vou por as duas possibilidades:     Automática:   

     
     
    Manual:
     


     
     
    Como Configurar:
     
     
    * Se você for colocar, dentro do evento, um teleporte para as pessoas que não quiserem mais participar, coloque o Action ID 9371 nele.
     
     
    * Lembre-se de por NO-LOGOUT tool e NO-PVP tool em toda área do evento!!
     
     
    Todas as demais explicações estão na lib, mas vou demonstrar como configurar os mais "confusos".
     
     
    No modo automático, você configura de quanto em quanto o tempo o evento vai acontecer. Nessa tag:
    <globalevent name="Blood Castle" interval="3600" event="script" value="BloodGlobalEvent.lua"/> Aqui está 3600 segundos, ou seja, 1 hora.
    * Se seu servidor for em milisegundos, multiplique o número por 1000, assim: 3600 segundos * 1000 = 3600000 milisegundos = 1 hora.
     
    No modo manual, para iniciar o evento, basta usar a talkaction /blood-start com seu god.
     
     
    Em posGuarda, vc deve colocar a posicao do Guarda do Portao, como mostrado abaixo:  
      As posPedras são onde ficam as pedras que tampam a passagem enquanto o evento não esta aberto, conforme na imagem abaixo:  
      Em estátua, vc deve colocar a posição em que o arcanjo vai ser criado, conforme na imagem abaixo:  

      Nas posParedes, vc deve por a posição das paredes que bloqueiam a entrada do castelo e que são removidas quando o guarda morre, conforme abaixo:  
      Em fromPos e toPos, você vai por o canto superior esquerdo e o canto inferior direito do mapa do seu evento, respectivamente. Dessa maneira:  
      As outras configurações eu acredito que já estejam bem explicadas.     Espero que gostem dessa nova versão. Recomendo a todos que já usam o evento, reinstalar com essa nova versão.   Qualquer dúvida ou bug, postem que irei responder.
  12. Gostei
    Killua recebeu reputação de Magalhaes92 em Evento Blood Castle [Automático]   
    Últimas atualizações:
     
    16/12/2013:
     
     


     
     
    Introdução:
     
     
    Este é o meu já conhecido evento Blood Castle Automático que estava em outro fórum que acabou. Estou trazendo ele aqui para que ele não "morra".
     
     
     
     
    Informações:  
     
    #Dica: Acho que fica legal o premio do evento ser um item que da double exp por um tempo.
     
     
    Atualização [12/04/2014]
     
     
    Resolvi refazer o código, para facilitar a instalação e melhorar o funcionamento do evento.
     
     
    O que mudou?
     
     
     
     
     
    Instalando o evento:
     
    Lib:
     


     
     
    Movements: 
     


     
     
     
    Creaturescripts: 
     


     
    Monsters: 
     

        O evento pode acontecer de duas maneiras: automática ou manualmente. Vou por as duas possibilidades:     Automática:   

     
     
    Manual:
     


     
     
    Como Configurar:
     
     
    * Se você for colocar, dentro do evento, um teleporte para as pessoas que não quiserem mais participar, coloque o Action ID 9371 nele.
     
     
    * Lembre-se de por NO-LOGOUT tool e NO-PVP tool em toda área do evento!!
     
     
    Todas as demais explicações estão na lib, mas vou demonstrar como configurar os mais "confusos".
     
     
    No modo automático, você configura de quanto em quanto o tempo o evento vai acontecer. Nessa tag:
    <globalevent name="Blood Castle" interval="3600" event="script" value="BloodGlobalEvent.lua"/> Aqui está 3600 segundos, ou seja, 1 hora.
    * Se seu servidor for em milisegundos, multiplique o número por 1000, assim: 3600 segundos * 1000 = 3600000 milisegundos = 1 hora.
     
    No modo manual, para iniciar o evento, basta usar a talkaction /blood-start com seu god.
     
     
    Em posGuarda, vc deve colocar a posicao do Guarda do Portao, como mostrado abaixo:  
      As posPedras são onde ficam as pedras que tampam a passagem enquanto o evento não esta aberto, conforme na imagem abaixo:  
      Em estátua, vc deve colocar a posição em que o arcanjo vai ser criado, conforme na imagem abaixo:  

      Nas posParedes, vc deve por a posição das paredes que bloqueiam a entrada do castelo e que são removidas quando o guarda morre, conforme abaixo:  
      Em fromPos e toPos, você vai por o canto superior esquerdo e o canto inferior direito do mapa do seu evento, respectivamente. Dessa maneira:  
      As outras configurações eu acredito que já estejam bem explicadas.     Espero que gostem dessa nova versão. Recomendo a todos que já usam o evento, reinstalar com essa nova versão.   Qualquer dúvida ou bug, postem que irei responder.
  13. Gostei
    Killua recebeu reputação de KotZletY em function printTable(table)   
    Se você já leu o manual de referência já deve ter visto uma função parecida com essa.
     
    O que ela faz?
    Ela printa uma tabela completa, por exemplo:
     
    Executando ela em seu OT:
     
    O chamado printTable{1,3,4,[5] = 5, [6] = 1} retorna  
    Instalação
    Crie printTable.lua em data/lib e cole:
    function printTable(table, includeIndices,prnt) -- By Killua if includeIndices == nil then includeIndices = true end if prnt == nil then prnt = true end if type(table) ~= "table" then error("Argument must be a table") return end local str, c = "{", "" for v, b in pairs(table) do if type(b) == "table" then str = includeIndices and str..c.."["..v.."]".." = "..printTable(b,true,false) or str..c..printTable(b,false,false) else str = includeIndices and str..c.."["..v.."]".." = "..b or str..c..b end c = ", " end str = str.."}" if prnt then print(str) end return str end Utilização
    Basta chamar ela colocoando sua tabela como primeiro argumento, exemplo:
    printTable({1,2,3,4}) O segundo parâmetro (includeIndices) define se os indices vão ou não ser mostrados no print. Como padrão, ele tem valor true. Por exemplo:
    printTable({1,2,3,4}) ou printTable({1,2,3,4}, true) Vai printar: {[1] = 1, [2] = 2, [3] = 3, [4] = 4}
     
    E
    printTable({1,2,3,4}, false) Vai printar: {1, 2, 3 ,4}
     
     
    Além de printar sua tabela, a função ainda retorna ela como string. Sendo assim, você pode usar essa string para oque precisar. Por exemplo:
    doPlayerSendTextMessage(cid, 25, printTable{1,2,3,4}) Vai enviar para o player a mensagem: "{[1] = 1, [2] = 2, [3] = 3, [4] = 4}"
     
     
    Obrigado, espero que sjea útil.
  14. Gostei
    Killua recebeu reputação de Victor Cain J em Evento Blood Castle [Automático]   
    Últimas atualizações:
     
    16/12/2013:
     
     


     
     
    Introdução:
     
     
    Este é o meu já conhecido evento Blood Castle Automático que estava em outro fórum que acabou. Estou trazendo ele aqui para que ele não "morra".
     
     
     
     
    Informações:  
     
    #Dica: Acho que fica legal o premio do evento ser um item que da double exp por um tempo.
     
     
    Atualização [12/04/2014]
     
     
    Resolvi refazer o código, para facilitar a instalação e melhorar o funcionamento do evento.
     
     
    O que mudou?
     
     
     
     
     
    Instalando o evento:
     
    Lib:
     


     
     
    Movements: 
     


     
     
     
    Creaturescripts: 
     


     
    Monsters: 
     

        O evento pode acontecer de duas maneiras: automática ou manualmente. Vou por as duas possibilidades:     Automática:   

     
     
    Manual:
     


     
     
    Como Configurar:
     
     
    * Se você for colocar, dentro do evento, um teleporte para as pessoas que não quiserem mais participar, coloque o Action ID 9371 nele.
     
     
    * Lembre-se de por NO-LOGOUT tool e NO-PVP tool em toda área do evento!!
     
     
    Todas as demais explicações estão na lib, mas vou demonstrar como configurar os mais "confusos".
     
     
    No modo automático, você configura de quanto em quanto o tempo o evento vai acontecer. Nessa tag:
    <globalevent name="Blood Castle" interval="3600" event="script" value="BloodGlobalEvent.lua"/> Aqui está 3600 segundos, ou seja, 1 hora.
    * Se seu servidor for em milisegundos, multiplique o número por 1000, assim: 3600 segundos * 1000 = 3600000 milisegundos = 1 hora.
     
    No modo manual, para iniciar o evento, basta usar a talkaction /blood-start com seu god.
     
     
    Em posGuarda, vc deve colocar a posicao do Guarda do Portao, como mostrado abaixo:  
      As posPedras são onde ficam as pedras que tampam a passagem enquanto o evento não esta aberto, conforme na imagem abaixo:  
      Em estátua, vc deve colocar a posição em que o arcanjo vai ser criado, conforme na imagem abaixo:  

      Nas posParedes, vc deve por a posição das paredes que bloqueiam a entrada do castelo e que são removidas quando o guarda morre, conforme abaixo:  
      Em fromPos e toPos, você vai por o canto superior esquerdo e o canto inferior direito do mapa do seu evento, respectivamente. Dessa maneira:  
      As outras configurações eu acredito que já estejam bem explicadas.     Espero que gostem dessa nova versão. Recomendo a todos que já usam o evento, reinstalar com essa nova versão.   Qualquer dúvida ou bug, postem que irei responder.
  15. Gostei
    Killua recebeu reputação de Calisto em Sistema de Plantação por Killua   
    Sistema de Plantação
     

     
     
    Crie cultivo.lua em data/actions/scripts e cole:
     
    -- Plantation System created by Vítor Bertolucci - Killua -- 02/04/2014 local usableDirt = 103 -- Dirt to seed local mustBeInHouse = true -- Is it only enabled inside houses? [true/false] local fruits = {2682, 5097, 8838, 2685, 2674} -- Fruits that can grow local failChance = 0 -- Fail chance in % function transformIt(pos, id) -- Seeds the ground     pos.stackpos = 0     return doTransformItem(getThingFromPos(pos).uid, id) end function getUnwantedItem(pos) -- Checks for unwanted items     for i = 1, 5 do         pos.stackpos = i         if getThingFromPos(pos).itemid > 0 and getThingFromPos(pos).itemid ~= 7732 then             return true         end     end     return false end function transformTo(pos, fromid, toid) -- Makes the plants grow     for s = 1, 5 do         pos.stackpos = s         local item = getThingFromPos(pos)         if item.itemid == fromid then             doTransformItem(item.uid, toid)         end     end end function doRemoveMe(pos, id) -- Removes weeds     for stackpos = 1, 5 do       pos.stackpos = stackpos       local item = getThingFromPos(pos)         if item.itemid == id then           doRemoveItem(item.uid)         end     end end function onUse(cid, item, fromPosition, itemEx, toPosition)     if mustBeInHouse and not getHouseFromPos(toPosition) then         return doPlayerSendCancel(cid, "You can only plant inside houses.")     end          toPosition.stackpos = 0     local tile = getThingFromPos(toPosition)     if tile.itemid == usableDirt and not getUnwantedItem(toPosition) and itemEx.itemid ~= 7732 then         if item.itemid == 2552 then             doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You have plowed the ground.")             doTransformItem(tile.uid, 804)             addEvent(transformIt, math.random(44600, 48600), toPosition, usableDirt)         end     elseif item.itemid == 7732 and tile.itemid == 804 and not getUnwantedItem(toPosition) then         doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You have planted the seed.")         doRemoveItem(item.uid, 1)         doCreateItem(6216, 1, toPosition)         doSendMagicEffect(toPosition, CONST_ME_SMALLPLANTS)         local chance = math.random(1, 100)         local time1 = math.random(8500, 12600)         local time2 = math.random(24500, 28600)         if chance <= failChance then             addEvent(transformTo, time1, toPosition, 6216, 2784)             addEvent(doSendMagicEffect, time1, toPosition, 7)             addEvent(doRemoveMe, time2, toPosition, 2784)             addEvent(doSendMagicEffect, time2, toPosition, CONST_ME_POFF)         else             addEvent(transformTo, time1, toPosition, 6216, 2779)             addEvent(doSendMagicEffect, time1, toPosition, CONST_ME_SMALLPLANTS)             addEvent(doSendMagicEffect, time2, toPosition, CONST_ME_PLANTATTACK)             addEvent(transformTo, time2, toPosition, 2779, fruits[math.random(1, #fruits)])         end     elseif itemEx.itemid == 2784 or itemEx.itemid == 2779 then         if tile.itemid == 804 or tile.itemid == 103 then             doRemoveItem(itemEx.uid, 1)             doSendMagicEffect(toPosition, 3)             doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You have removed the plant.")         end         else         doPlayerSendCancel(cid, "You cannot plow this ground.")     end     return true end Em actions.xml coloque:
    <action itemid="2552" event="script" value="cultivo.lua"/> <action itemid="7732" event="script" value="cultivo.lua"/> Use a enchada (ID: 2552) para arar o solo e plante uma semente (ID: 7732) nele.
  16. Gostei
    Killua recebeu reputação de Calisto em Sistema de Upgrade Bronson Server (refinar)   
    Este é um sistema de refinar itens feito com base no do Bronson Server. Para refinar, o jogador precisa ter uma certa quantidade de Iron Ores (dependendo do level do item) e de um Iron Hammer. 
     

     
    Somente equipamentos e armas podem ser refinados.
     
    crie Killua Upgrading System.lua em data/actions/scripts e coloque:
    --- Sistema de Upgrade de itens feito por Killua. --- Sistema feito com base no do Bronson Server. local vocations = {1, 2, 4, 5, 6, 7, 8} -- Vocações que podem refinar itens local ids_bloqueados = {2160, 5706, 2463} -- Itens que não podem ser refinados local controle = { {level = 0, quantOre = 1, chance = 100}, -- Level do item, quantidade de Iron Ore necessaria, chance de sucesso {level = 1, quantOre = 2, chance = 90}, {level = 2, quantOre = 3, chance = 80}, {level = 3, quantOre = 4, chance = 70}, {level = 4, quantOre = 5, chance = 60}, {level = 5, quantOre = 6, chance = 50}, {level = 6, quantOre = 7, chance = 40}, {level = 7, quantOre = 8, chance = 30}, {level = 8, quantOre = 9, chance = 20}, {level = 9, quantOre = 10, chance = 10} } function getItemLevel(uid) if uid > 0 then return getItemAttribute(uid, "lvl") or 0 end return false end function doItemAddLevel(uid, count) if uid > 0 and tonumber(count) > 0 then return doItemSetAttribute(uid, "lvl", getItemLevel(uid) + count) end return false end function onUse(cid, item, fromPosition, itemEx, toPosition) if not isInArray(vocations, getPlayerVocation(cid)) then return doPlayerSendCancel(cid, "Sua vocacao nao pode refinar.") elseif isInArray(ids_bloqueados, itemEx.uid) then return doPlayerSendCancel(cid, "Este item nao pode ser refinado.") end if getItemInfo(itemEx.itemid).attack > 0 or getItemInfo(itemEx.itemid).defense > 0 or getItemInfo(itemEx.itemid).armor > 0 then for _, upgrade in pairs(controle) do local atk = getItemAttribute(itemEx.uid, "attack") or getItemInfo(itemEx.itemid).attack local def = getItemAttribute(itemEx.uid, "defense") or getItemInfo(itemEx.itemid).defense local arm = getItemAttribute(itemEx.uid, "armor") or getItemInfo(itemEx.itemid).armor local chance = math.random(1, 100) if getItemLevel(itemEx.uid) == upgrade.level then if doPlayerRemoveItem(cid, 5880, upgrade.quantOre) then doSendMagicEffect(getThingPos(itemEx.uid), CONST_ME_CRAPS) if chance <= upgrade.chance then if getItemLevel(itemEx.uid) == 0 then doItemSetAttribute(itemEx.uid, "description", "Esse item foi refinado por" ..getCreatureName(cid)) end doItemAddLevel(itemEx.uid, 1) doItemSetAttribute(itemEx.uid, "name", getItemNameById(itemEx.itemid).. " + " ..getItemLevel(itemEx.uid)) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce refinou com sucesso! Agora seu "..getItemNameById(itemEx.itemid).." eh level " ..getItemLevel(itemEx.uid)) if getItemInfo(itemEx.itemid).attack > 0 then doItemSetAttribute(itemEx.uid, "attack", atk + 1) return true elseif getItemInfo(itemEx.itemid).armor > 0 then doItemSetAttribute(itemEx.uid, "armor", arm + 1) return true elseif getItemInfo(itemEx.itemid).defense > 0 and getItemInfo(itemEx.itemid).attack <= 0 then doItemSetAttribute(itemEx.uid, "defense", def + 1) return true end else doTransformItem(itemEx.uid, 2256) doItemSetAttribute(itemEx.uid, 'name', "metal trash") doItemSetAttribute(itemEx.uid, 'attack', 0) doItemSetAttribute(itemEx.uid, 'armor', 0) doItemSetAttribute(itemEx.uid, 'defense', 0) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Voce falhou.") return true end else doPlayerSendCancel(cid, "Voce nao tem iron ores o suficiente. Voce precisa de "..upgrade.quantOre.." iron ores.") end end end else doPlayerSendCancel(cid, "Esse item nao pode ser refinado.") end return true end Em data/actions/actions.xml coloque essa TAG:
    <action itemid="2422" event="script" value="Killua Upgradin System.lua"/> Para configurar, leia meus comentários dentro do código.
  17. Gostei
    Killua recebeu reputação de ricardiitoohz em Itens ganhando exp e upando (Upgrade System)   
    Como funciona?
    A cada monstro que vc mata, seus itens equipados ganham 1 de exp. Quando seus itens chegarem às quantidades de exp definidas, eles upam e ficam com o nome assim: Demon Helmet + 1. Helmets, armors, legs, e boots recebem 1 de arm a cada vez que upam. Armas recebem 1 de ataque e escudos 1 de defesa.
     
    Para o monstro contar, ele deve dar um mínimo de exp (definido no script). O número de exp a que me refiro é aquele um presente no arquivo .xml.
     
    Para instalar, crie Killua Items Upgrade.lua em data/creaturescripts/scripts e coloque:
      Em data/creaturescripts/creaturescripts.xml coloque essas duas tags:
    <event type="kill" name="Item level" event="script" value="Killua Items Upgrade.lua"/> <event type="login" name="Item levell" event="script" value="Killua Items Upgrade.lua"/> Configurando: Na tabela table_of_slots, coloque em quais slots os itens upam.
    min_exp é a experiência mínima que o monstro deve ter para contar exp para o item. Se vc colocar 500, somente os monstros que tem exp igual ou superior a 500 no arquivo.xml vão valer.
    exp_levels são os valores de exp que os itens devem atingir para upar. No meu caso, quando o item alcançar 50 de exp, ele upa para o level 1. Quando alcançar 50 de exp, upa para o level 2 e assim por diante.
  18. Gostei
    Killua recebeu reputação de gtms em Como usar addEvent   
    Usando addEvent
     
    O uso do addEvent tem inúmeras utilidades e pode ser complicado para algumas pessoas, inclusive era para mim quando eu estava começando a aprender LUA.
     
    Para que serve o addEvent?
    Para "chamar" uma função após um periodo de tempo, ou seja, executar uma função após um tempo estipulado. 
     
    O addEvent tem como parâmetros: callback, delay e ...
    addEvent(callback, delay, ...)
     
    Onde callback é a função que será chamada, delay é o tempo (em milissegundos) até que se chame essa função e ... são os parâmetros que a função chamada utiliza. Exemplo:
    addEvent(doBroadcastMessage, 1000, "Bom dia", 23) Aqui, após 1 segundo (1000 ms), a função doBroadcastMessage(message, type) será executada com os parâmetros message = "Bom dia" e type = 23.
     
    O addEvent pode ser usado de duas maneiras:
    Chamando uma função existente ou criando uma nova função.
     
    Para chamar uma função existente, basta usar como acima, para usá-lo para criar uma nova função, usa-se assim, por exemplo:
    addEvent(function()      if isCreature(cid) then           doPlayerAddItem(cid, 2160, 10)           doPlayerSendTextMessage(cid, 25, "Voce ganhou 10k.")      end end, 1000) Assim é basicamente a mesma coisa, mas pude colocar várias funções dentro de um único addEvent e mantive o delay 1000 (1 segundo).
    Obs: Precisei usar 2 ends, um para fechar function() e outro para fechar o if.
     
    Atenção! Além disso, existe uma outra diferença entre as duas formas de uso, vou tentar explicar da melhor maneira possível:
    Quando usamos o addEvent com uma função já existente (1o exemplo), as informações usadas serão as geradas no momento em que o evento foi chamado, por exemplo:
    function onUse(cid, item, fromPosition, itemEx, toPosition)      if getPlayerLevel(cid) > 10 then           doPlayerSendTextMessage(cid, 25, "Uma pedra sera criada na sua posiçao dentro de 2 segundos.")           addEvent(doCreateItem, 2000, 1308, 1, getThingPos(cid))      end      return true end Se usarmos assim, a pedra será criada na posição onde o jogador se encontrava no momento em que "deu use" e não onde ele estará 2 segundos depois. Se você quiser que a pedra seja criada na nova posição do jogador (pos de 2 segundos depois), você deve fazer uma nova checagem, criando uma função:
    function onUse(cid, item, fromPosition, itemEx, toPosition)      if getPlayerLevel(cid) > 10 then           doPlayerSendTextMessage(cid, 25, "Uma pedra sera criada na sua posiçao dentro de 2 segundos.")           addEvent(function()                if isCreature(cid) then                     doCreateItem(1308, 1, getThingPos(cid))                end           end, 2000)      end      return true end Atenção novamente: A checagem if isCreature(cid) que utilizei, é muito importante para um addEvent que envolva criaturas. Se você executasse o addEvent sem a checagem e o player logasse ou morresse antes desses 2 segundos se passarem, daria um erro na distro e interromperia o resto do script.
     
     
    Recursão
    Uma outra ótima funcionalidade dos addEvents é a recursão, ou seja, criar um evento que fica se repetindo. É simplesmente um addEvent chamando a sí mesmo.
    Para usar, crie uma função, exemplo:
    function respawnMonster(name, pos)      if doCreateMonster(name, pos) then           doBroadcastMessage(name.." nasceu!")      end      addEvent(respawnMonster, 10000, name, pos) end Quando chamada, esta função ficará criando um monstro e uma determinada área a cada 10 segundos, sem nunca parar.
    Para chamar a função, seria assim:
    respawnMonster("Demon", {x = 123, y = 123, z = 5}) Considerações
    Reloads param os addEvents. Se um script talkaction executou um addEvent programado para acontecer depois de 5 minutos e se dentro deste intervalo de tempo, você usar /reload talkactions, o addEvent será interrompido.
     
    Erros no código podem fazer o evento ser interrompido, preste sempre atenção.
     
    Se ainda ficou com alguma dúvida, poste aqui.
     
     
        
  19. Gostei
    Killua recebeu reputação de Mathias Silva em Evento Blood Castle [Automático]   
    Últimas atualizações:
     
    16/12/2013:
     
     


     
     
    Introdução:
     
     
    Este é o meu já conhecido evento Blood Castle Automático que estava em outro fórum que acabou. Estou trazendo ele aqui para que ele não "morra".
     
     
     
     
    Informações:  
     
    #Dica: Acho que fica legal o premio do evento ser um item que da double exp por um tempo.
     
     
    Atualização [12/04/2014]
     
     
    Resolvi refazer o código, para facilitar a instalação e melhorar o funcionamento do evento.
     
     
    O que mudou?
     
     
     
     
     
    Instalando o evento:
     
    Lib:
     


     
     
    Movements: 
     


     
     
     
    Creaturescripts: 
     


     
    Monsters: 
     

        O evento pode acontecer de duas maneiras: automática ou manualmente. Vou por as duas possibilidades:     Automática:   

     
     
    Manual:
     


     
     
    Como Configurar:
     
     
    * Se você for colocar, dentro do evento, um teleporte para as pessoas que não quiserem mais participar, coloque o Action ID 9371 nele.
     
     
    * Lembre-se de por NO-LOGOUT tool e NO-PVP tool em toda área do evento!!
     
     
    Todas as demais explicações estão na lib, mas vou demonstrar como configurar os mais "confusos".
     
     
    No modo automático, você configura de quanto em quanto o tempo o evento vai acontecer. Nessa tag:
    <globalevent name="Blood Castle" interval="3600" event="script" value="BloodGlobalEvent.lua"/> Aqui está 3600 segundos, ou seja, 1 hora.
    * Se seu servidor for em milisegundos, multiplique o número por 1000, assim: 3600 segundos * 1000 = 3600000 milisegundos = 1 hora.
     
    No modo manual, para iniciar o evento, basta usar a talkaction /blood-start com seu god.
     
     
    Em posGuarda, vc deve colocar a posicao do Guarda do Portao, como mostrado abaixo:  
      As posPedras são onde ficam as pedras que tampam a passagem enquanto o evento não esta aberto, conforme na imagem abaixo:  
      Em estátua, vc deve colocar a posição em que o arcanjo vai ser criado, conforme na imagem abaixo:  

      Nas posParedes, vc deve por a posição das paredes que bloqueiam a entrada do castelo e que são removidas quando o guarda morre, conforme abaixo:  
      Em fromPos e toPos, você vai por o canto superior esquerdo e o canto inferior direito do mapa do seu evento, respectivamente. Dessa maneira:  
      As outras configurações eu acredito que já estejam bem explicadas.     Espero que gostem dessa nova versão. Recomendo a todos que já usam o evento, reinstalar com essa nova versão.   Qualquer dúvida ou bug, postem que irei responder.
  20. Gostei
    Killua recebeu reputação de Savidotti em Evento Blood Castle [Automático]   
    Últimas atualizações:
     
    16/12/2013:
     
     


     
     
    Introdução:
     
     
    Este é o meu já conhecido evento Blood Castle Automático que estava em outro fórum que acabou. Estou trazendo ele aqui para que ele não "morra".
     
     
     
     
    Informações:  
     
    #Dica: Acho que fica legal o premio do evento ser um item que da double exp por um tempo.
     
     
    Atualização [12/04/2014]
     
     
    Resolvi refazer o código, para facilitar a instalação e melhorar o funcionamento do evento.
     
     
    O que mudou?
     
     
     
     
     
    Instalando o evento:
     
    Lib:
     


     
     
    Movements: 
     


     
     
     
    Creaturescripts: 
     


     
    Monsters: 
     

        O evento pode acontecer de duas maneiras: automática ou manualmente. Vou por as duas possibilidades:     Automática:   

     
     
    Manual:
     


     
     
    Como Configurar:
     
     
    * Se você for colocar, dentro do evento, um teleporte para as pessoas que não quiserem mais participar, coloque o Action ID 9371 nele.
     
     
    * Lembre-se de por NO-LOGOUT tool e NO-PVP tool em toda área do evento!!
     
     
    Todas as demais explicações estão na lib, mas vou demonstrar como configurar os mais "confusos".
     
     
    No modo automático, você configura de quanto em quanto o tempo o evento vai acontecer. Nessa tag:
    <globalevent name="Blood Castle" interval="3600" event="script" value="BloodGlobalEvent.lua"/> Aqui está 3600 segundos, ou seja, 1 hora.
    * Se seu servidor for em milisegundos, multiplique o número por 1000, assim: 3600 segundos * 1000 = 3600000 milisegundos = 1 hora.
     
    No modo manual, para iniciar o evento, basta usar a talkaction /blood-start com seu god.
     
     
    Em posGuarda, vc deve colocar a posicao do Guarda do Portao, como mostrado abaixo:  
      As posPedras são onde ficam as pedras que tampam a passagem enquanto o evento não esta aberto, conforme na imagem abaixo:  
      Em estátua, vc deve colocar a posição em que o arcanjo vai ser criado, conforme na imagem abaixo:  

      Nas posParedes, vc deve por a posição das paredes que bloqueiam a entrada do castelo e que são removidas quando o guarda morre, conforme abaixo:  
      Em fromPos e toPos, você vai por o canto superior esquerdo e o canto inferior direito do mapa do seu evento, respectivamente. Dessa maneira:  
      As outras configurações eu acredito que já estejam bem explicadas.     Espero que gostem dessa nova versão. Recomendo a todos que já usam o evento, reinstalar com essa nova versão.   Qualquer dúvida ou bug, postem que irei responder.
  21. Gostei
    Killua recebeu reputação de Ryukiimaru em Armazenar Tabelas em Storages (setGlobalTableStorage)   
    Introdução:

    Esses dias eu estava fazendo um sistema e senti a necessidade de armazenar várias informações (por player) em um só lugar. Porém, todos nós sabemos que não é possível colocar uma tabela como valor de um storage. Por conta disso, decidi tornar possível esse armazenamento.

    Tenho certeza de que essa biblioteca será uma ferramenta extremamente útil para todos os scripters. Ela abre muitas portas e vai permitir a criação de muitos sistemas interessantes.

    Instalação:

    Simplesmente crie o arquivo tableStorage.lua em data/lib e coloque esse código:





    Utilização:

    Para armazenar uma tabela em um storage de um player, use:
    setPlayerTableStorage(cid, key, tabela) Exemplo:
    setPlayerTableStorage(cid, 199991, {["primeiro"] = 4, [8] = "Killua", [3] = 22}) Para armazenar uma tabela em um storage global, use:
    setGlobalTableStorage(key, tabela) Exemplo:
    setGlobalStorageValue(123412, {1, 55, "c", 3}) Para retornar as tabelas, use:
    getGlobalTableStorage(key) ou
    getPlayerTableStorage(cid, key) Esclarecimento:

    As tabelas retornadas pelas funções getGlobalTableStorage e getPlayerTableStorage são tabelas normais e podem ser manipuladas como qualquer outra, por exemplo:
    for t, k in pairs(getPlayerTableStorage(cid, 123444)) do print("["..t.."] "..v) end Observações:

    As tabelas não armazenam valores booleanos, outras tabelas e nem funções, apenas strings e números. No entanto é claro que ela pode armazenar valores recebidos de funções, por exemplo:
    setPlayerTableStorage(cid, 17271, {["level"] = getPlayerLevel(cid), ["sex"] = getPlayerSex(cid) == 1 and "female" or "male"}) Funcionará perfeitamente.


    Mas:
    setPlayerTableStorage(cid, 17271, {returnDouble = function(value) return value*2 end, try = 11, [2] = 10}) Não irá funcionar.

    As tabelas podem ser preenchidas com ou sem index definido, de forma que os não definidos serão definidos automaticamente numa sequencia (Como qualquer tabela). Sendo assim:
    setPlayerTableStorage(cid, 12344, {1,3,23,1999,"test"})setPlayerTableStorage(cid, 12344, {[5] = "hi", ["mia"] = 32, c = 18})setPlayerTableStorage(cid, 12344, {1, "c", 6, ["test"] = 18, b = "c", "hello world"}) São todas válidas.
     
    Cuidado com com tabelas muito grandes! Elas podem acabar pesando bastante e consumindo bastante de sua database. Eu aconselho não ultrapassar 4 elementos. É claro que apenas um storage com uma tabela bem grande não vai causar problema mas, em um servidor com muitos jogadores, pode ser perigoso adicionar muitas tabelas grandes (1 por jogador).

    Considerações:

    Eu realmente acho que essa biblioteca vai abrir várias possibilidades para todos vocês, scripters. E espero que criem muitos sistemas legais a partir dela. Se tiverem dúvidas ou sugestões, podem dizer.

    Abraços.
  22. Gostei
    Killua recebeu reputação de Dark Magican em Itens ganhando exp e upando (Upgrade System)   
    Como funciona?
    A cada monstro que vc mata, seus itens equipados ganham 1 de exp. Quando seus itens chegarem às quantidades de exp definidas, eles upam e ficam com o nome assim: Demon Helmet + 1. Helmets, armors, legs, e boots recebem 1 de arm a cada vez que upam. Armas recebem 1 de ataque e escudos 1 de defesa.
     
    Para o monstro contar, ele deve dar um mínimo de exp (definido no script). O número de exp a que me refiro é aquele um presente no arquivo .xml.
     
    Para instalar, crie Killua Items Upgrade.lua em data/creaturescripts/scripts e coloque:
      Em data/creaturescripts/creaturescripts.xml coloque essas duas tags:
    <event type="kill" name="Item level" event="script" value="Killua Items Upgrade.lua"/> <event type="login" name="Item levell" event="script" value="Killua Items Upgrade.lua"/> Configurando: Na tabela table_of_slots, coloque em quais slots os itens upam.
    min_exp é a experiência mínima que o monstro deve ter para contar exp para o item. Se vc colocar 500, somente os monstros que tem exp igual ou superior a 500 no arquivo.xml vão valer.
    exp_levels são os valores de exp que os itens devem atingir para upar. No meu caso, quando o item alcançar 50 de exp, ele upa para o level 1. Quando alcançar 50 de exp, upa para o level 2 e assim por diante.
  23. Gostei
    Killua recebeu reputação de Sanieg em Armazenar Tabelas em Storages (setGlobalTableStorage)   
    Introdução:

    Esses dias eu estava fazendo um sistema e senti a necessidade de armazenar várias informações (por player) em um só lugar. Porém, todos nós sabemos que não é possível colocar uma tabela como valor de um storage. Por conta disso, decidi tornar possível esse armazenamento.

    Tenho certeza de que essa biblioteca será uma ferramenta extremamente útil para todos os scripters. Ela abre muitas portas e vai permitir a criação de muitos sistemas interessantes.

    Instalação:

    Simplesmente crie o arquivo tableStorage.lua em data/lib e coloque esse código:





    Utilização:

    Para armazenar uma tabela em um storage de um player, use:
    setPlayerTableStorage(cid, key, tabela) Exemplo:
    setPlayerTableStorage(cid, 199991, {["primeiro"] = 4, [8] = "Killua", [3] = 22}) Para armazenar uma tabela em um storage global, use:
    setGlobalTableStorage(key, tabela) Exemplo:
    setGlobalStorageValue(123412, {1, 55, "c", 3}) Para retornar as tabelas, use:
    getGlobalTableStorage(key) ou
    getPlayerTableStorage(cid, key) Esclarecimento:

    As tabelas retornadas pelas funções getGlobalTableStorage e getPlayerTableStorage são tabelas normais e podem ser manipuladas como qualquer outra, por exemplo:
    for t, k in pairs(getPlayerTableStorage(cid, 123444)) do print("["..t.."] "..v) end Observações:

    As tabelas não armazenam valores booleanos, outras tabelas e nem funções, apenas strings e números. No entanto é claro que ela pode armazenar valores recebidos de funções, por exemplo:
    setPlayerTableStorage(cid, 17271, {["level"] = getPlayerLevel(cid), ["sex"] = getPlayerSex(cid) == 1 and "female" or "male"}) Funcionará perfeitamente.


    Mas:
    setPlayerTableStorage(cid, 17271, {returnDouble = function(value) return value*2 end, try = 11, [2] = 10}) Não irá funcionar.

    As tabelas podem ser preenchidas com ou sem index definido, de forma que os não definidos serão definidos automaticamente numa sequencia (Como qualquer tabela). Sendo assim:
    setPlayerTableStorage(cid, 12344, {1,3,23,1999,"test"})setPlayerTableStorage(cid, 12344, {[5] = "hi", ["mia"] = 32, c = 18})setPlayerTableStorage(cid, 12344, {1, "c", 6, ["test"] = 18, b = "c", "hello world"}) São todas válidas.
     
    Cuidado com com tabelas muito grandes! Elas podem acabar pesando bastante e consumindo bastante de sua database. Eu aconselho não ultrapassar 4 elementos. É claro que apenas um storage com uma tabela bem grande não vai causar problema mas, em um servidor com muitos jogadores, pode ser perigoso adicionar muitas tabelas grandes (1 por jogador).

    Considerações:

    Eu realmente acho que essa biblioteca vai abrir várias possibilidades para todos vocês, scripters. E espero que criem muitos sistemas legais a partir dela. Se tiverem dúvidas ou sugestões, podem dizer.

    Abraços.
  24. Gostei
    Killua recebeu reputação de Viny 13 em otPokémon - New Client   
    Boa noite a todos, venho apresentar a nova versão do nosso New Client que está sendo desenvolvido pela nossa equipe. É uma versão inovadora que proporciona uma experiência de jogo diferente das que estamos acostumados.
     
    Novidades
    Nova tela de entrada Nova lista de personagens com mais informações Mais SQMs na tela Janela de chat transparente Novo design Nova pokédex Nova lista de pokémon  
    Veja abaixo algumas imagens.
     
    Nova tela de entrada

     
     
    Nova lista de personagens com mais informações
     
     

     
     
    Nessa nova lista, sempre que um personagem é selecionado, é mostrado seu outfit e gifs de todos os pokémon que ele está carregando.
     
     
    Mais SQMs na tela, novo design e janela de chat transparente
     
     

     
     
    Com esse novo design, chat transparente e mais SQMs na tela, a tela inteira é aproveitada para o jogo.
     
     
    Nova pokédex
     

     
     
    Nova lista de pokémon
     
     

     
     
    Esperamos que gostem da nova versão, nossa equipe trabalhou bastante para poder liberá-la. Até mais e esperamos vocês no jogo 
     
    Acessem: www.otpokemon.com
  25. Gostei
    Killua recebeu reputação de Erondino em Sistema de Plantação por Killua   
    Sistema de Plantação
     

     
     
    Crie cultivo.lua em data/actions/scripts e cole:
     
    -- Plantation System created by Vítor Bertolucci - Killua -- 02/04/2014 local usableDirt = 103 -- Dirt to seed local mustBeInHouse = true -- Is it only enabled inside houses? [true/false] local fruits = {2682, 5097, 8838, 2685, 2674} -- Fruits that can grow local failChance = 0 -- Fail chance in % function transformIt(pos, id) -- Seeds the ground     pos.stackpos = 0     return doTransformItem(getThingFromPos(pos).uid, id) end function getUnwantedItem(pos) -- Checks for unwanted items     for i = 1, 5 do         pos.stackpos = i         if getThingFromPos(pos).itemid > 0 and getThingFromPos(pos).itemid ~= 7732 then             return true         end     end     return false end function transformTo(pos, fromid, toid) -- Makes the plants grow     for s = 1, 5 do         pos.stackpos = s         local item = getThingFromPos(pos)         if item.itemid == fromid then             doTransformItem(item.uid, toid)         end     end end function doRemoveMe(pos, id) -- Removes weeds     for stackpos = 1, 5 do       pos.stackpos = stackpos       local item = getThingFromPos(pos)         if item.itemid == id then           doRemoveItem(item.uid)         end     end end function onUse(cid, item, fromPosition, itemEx, toPosition)     if mustBeInHouse and not getHouseFromPos(toPosition) then         return doPlayerSendCancel(cid, "You can only plant inside houses.")     end          toPosition.stackpos = 0     local tile = getThingFromPos(toPosition)     if tile.itemid == usableDirt and not getUnwantedItem(toPosition) and itemEx.itemid ~= 7732 then         if item.itemid == 2552 then             doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You have plowed the ground.")             doTransformItem(tile.uid, 804)             addEvent(transformIt, math.random(44600, 48600), toPosition, usableDirt)         end     elseif item.itemid == 7732 and tile.itemid == 804 and not getUnwantedItem(toPosition) then         doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You have planted the seed.")         doRemoveItem(item.uid, 1)         doCreateItem(6216, 1, toPosition)         doSendMagicEffect(toPosition, CONST_ME_SMALLPLANTS)         local chance = math.random(1, 100)         local time1 = math.random(8500, 12600)         local time2 = math.random(24500, 28600)         if chance <= failChance then             addEvent(transformTo, time1, toPosition, 6216, 2784)             addEvent(doSendMagicEffect, time1, toPosition, 7)             addEvent(doRemoveMe, time2, toPosition, 2784)             addEvent(doSendMagicEffect, time2, toPosition, CONST_ME_POFF)         else             addEvent(transformTo, time1, toPosition, 6216, 2779)             addEvent(doSendMagicEffect, time1, toPosition, CONST_ME_SMALLPLANTS)             addEvent(doSendMagicEffect, time2, toPosition, CONST_ME_PLANTATTACK)             addEvent(transformTo, time2, toPosition, 2779, fruits[math.random(1, #fruits)])         end     elseif itemEx.itemid == 2784 or itemEx.itemid == 2779 then         if tile.itemid == 804 or tile.itemid == 103 then             doRemoveItem(itemEx.uid, 1)             doSendMagicEffect(toPosition, 3)             doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You have removed the plant.")         end         else         doPlayerSendCancel(cid, "You cannot plow this ground.")     end     return true end Em actions.xml coloque:
    <action itemid="2552" event="script" value="cultivo.lua"/> <action itemid="7732" event="script" value="cultivo.lua"/> Use a enchada (ID: 2552) para arar o solo e plante uma semente (ID: 7732) nele.

Informação Importante

Confirmação de Termo