Jump to content
Poccnn

tfs 0.3 Lib luaXml - lua for xml - functions

Recommended Posts

Vim aqui explicar sobre a livraria luaxml, suas funções e implementações. 

 

Primeiro: Adicionar em seu servidor a livraria luaXml.lua e LuaXML_lib.dll 


   esse é o script da luaXml.lua que voce vai ter que por esse arquivo com esse codigo na mesma pasta do seu executavel

Spoiler

 

require("LuaXML_lib") 

local base = _G 
local xml = xml 
module("xml") 

-- symbolic name for tag index, this allows accessing the tag by var[xml.TAG] 
TAG = 0 

-- sets or returns tag of a LuaXML object 
function tag(var,tag) 
  if base.type(var)~="table" then return end 
  if base.type(tag)=="nil" then 
    return var[TAG] 
  end 
  var[TAG] = tag 
end 

-- creates a new LuaXML object either by setting the metatable of an existing Lua table or by setting its tag 
function new(arg) 
  if base.type(arg)=="table" then 
    base.setmetatable(arg,{__index=xml, __tostring=xml.str}) 
   return arg 
  end 
  local var={} 
  base.setmetatable(var,{__index=xml, __tostring=xml.str}) 
  if base.type(arg)=="string" then var[TAG]=arg end 
  return var 
end 

-- appends a new subordinate LuaXML object to an existing one, optionally sets tag 
function append(var,tag) 
  if base.type(var)~="table" then return end 
  local newVar = new(tag) 
  var[#var+1] = newVar 
  return newVar 
end 

-- converts any Lua var into an XML string 
function str(var,indent,tagValue) 
  if base.type(var)=="nil" then return end 
  local indent = indent or 0 
  local indentStr="" 
  for i = 1,indent do indentStr=indentStr.."  " end 
  local tableStr="" 
  if base.type(var)=="table" then 
    local tag = var[0] or tagValue or base.type(var) 
    local s = indentStr.."<"..tag 
    for k,v in base.pairs(var) do -- attributes 
      if base.type(k)=="string" then 
        if base.type(v)=="table" and k~="_M" then --  otherwise recursiveness imminent 
          tableStr = tableStr..str(v,indent+1,k) 
        else 
          s = s.." "..k.."=\""..encode(base.tostring(v)).."\"" 
        end 
      end 
    end 
    if #var==0 and #tableStr==0 then 
      s = s.." />\n" 
    elseif #var==1 and base.type(var[1])~="table" and #tableStr==0 then -- single element 
      s = s..">"..encode(base.tostring(var[1])).."</"..tag..">\n" 
    else 
      s = s..">\n" 
      for k,v in base.ipairs(var) do -- elements 
        if base.type(v)=="string" then 
          s = s..indentStr.."  "..encode(v).." \n" 
        else 
          s = s..str(v,indent+1) 
        end 
      end 
      s=s..tableStr..indentStr.."</"..tag..">\n" 
    end 
    return s 
  else 
    local tag = base.type(var) 
    return indentStr.."<"..tag.."> "..encode(base.tostring(var)).." </"..tag..">\n" 
  end 
end 

-- saves a Lua var as xml file 
function save(var,filename) 
  if not var then return end 
  if not filename or #filename==0 then return end 
  local file = base.io.open(filename,"w") 
  file:write("<?xml version=\"1.0\"?>\n<!-- file \"",filename, "\", generated by LuaXML -->\n\n") 
  file:write(str(var)) 
  base.io.close(file) 
end 

-- recursively parses a Lua table for a substatement fitting to the provided tag and attribute 
function find(var, tag, attributeKey,attributeValue) 
  -- check input: 
  if base.type(var)~="table" then return end 
  if base.type(tag)=="string" and #tag==0 then tag=nil end 
  if base.type(attributeKey)~="string" or #attributeKey==0 then attributeKey=nil end 
  if base.type(attributeValue)=="string" and #attributeValue==0 then attributeValue=nil end 
  -- compare this table: 
  if tag~=nil then 
    if var[0]==tag and ( attributeValue == nil or var[attributeKey]==attributeValue ) then 
      base.setmetatable(var,{__index=xml, __tostring=xml.str}) 
      return var 
    end 
  else 
    if attributeValue == nil or var[attributeKey]==attributeValue then 
      base.setmetatable(var,{__index=xml, __tostring=xml.str}) 
      return var 
    end 
  end 
  -- recursively parse subtags: 
  for k,v in base.ipairs(var) do 
    if base.type(v)=="table" then 
      local ret = find(v, tag, attributeKey,attributeValue) 
      if ret ~= nil then return ret end 
    end 
  end 
end

 

 

Não vou postar a dll para não virem dizer que tem virus. voce que tem o sistema lua implementado em seu pc, pode pegar a dll de dentro do diretorio: 

Citar

"...\Lua\5.1\clibs\LuaXML_lib.dll" 

copie essa dll e coloque ela na mesma pasta do executavel. 

 

implementado essa nova livraria em seu servidor. agora irei explicar um pouco sobre as funções e implementações dessa livraria. 

 

conhecendo as funções dessa livraria disponibilizada por lua: 

Citar

 

   function xml.load(dir) 
      > carrega o arquivo xml >> xfile_read = xml.load("test.xml") 

 

   function xml.find(var, tag, attributeKey,attributeValue) 
      > ler um bloco do arquivo >> xfile_block = xfile_read:find("scene") 

 

   function xml.tag(var,tag) 
      -- ele pode pegar ou inserir uma tag (palavra do cabeçalho de um bloco) 
      > pega o nome da tag da parte lida >> xfile_block:tag() >>> basicamente a palavra chave que foi lida. 
      > insere o nome de uma tag >> xfile_new:tag('vocation') >>> <vocation> <nome = "nome"/> <id = "0"/></vocation> 

 

   function xml.eval(xmlstring) 
      > converte uma string xml para uma tabela lua codificada. 
  
   function xml.str(var, indent, tag) 
      >converte as variaveis (cadeia de dados em uma tabela) para uma string formatada em xml. 
   
   function new(arg) 
      > cria um novo codigo em xml >> create_new_xml_layout = xml.new("esseEoNomeDaTagDeComando") 

 

   function append(var,tag) 
      > insere um bloco no codigo 
      > > Os valores podem ser inseridos entre tags com o uso do index [1] (um) ou dentro da propria tag com uso do index [0] (zero) 
      >> create_new_xml_layout:append("nomeDaTag")[1] = 123 - saida>>> <nomeDaTag>123</nomeDaTag> 
      >> create_new_xml_layout:append("nomeDaTag")[0] = 123 - saida>>> <nomeDaTag 123/> 

 

   function str(var,indent,tagValue) 
      > converte em string um bloco de comando >> xfile_read:str() >>> mesma coisa retornada por find() 

 

   function save(var,filename) 
      > salva os dados em um arquivo xml 

 

 

existem outras funções, mas não irei tratar delas. 

 

vamos a um uso pratico dessas funções da livraria usando como base o arquivo vocations.xml. 


apenas para uso didatico, deixo aqui uma parte do codigo do arquivo vocations.xml que irei usar no codigo de exemplo. 

Spoiler

   <vocation id="0" name="None" description="none" needpremium="0" gaincap="5" gainhp="5" gainmana="5" gainhpticks="6" gainhpamount="1" gainmanaticks="6" gainmanaamount="1" manamultiplier="4.0" attackspeed="2000" soulmax="100" gainsoulticks="86800" fromvoc="0" attackable="yes"> 
      <formula meleeDamage="1.0" distDamage="1.0" wandDamage="1.0" magDamage="1.0" magHealingDamage="1.0" defense="1.0" magDefense="1.0" armor="1.0"/> 
      <skill fist="1.5" club="2.0" sword="2.0" axe="2.0" distance="2.0" shielding="1.5" fishing="1.1" experience="1.0"/> 
   </vocation> 
   <vocation id="1" name="Sorcerer" description="a Sorcerer" needpremium="0" gaincap="10" gainhp="5" gainmana="30" gainhpticks="1" gainhpamount="0.8" gainmanaticks="1" gainmanaamount="6.7" manamultiplier="1.1" attackspeed="2000" soulmax="100" gainsoulticks="600" fromvoc="1"> 
      <formula meleeDamage="1.0" distDamage="1.0" wandDamage="1.0" magDamage="1.1" magHealingDamage="1.0" defense="1.0" magDefense="1.2" armor="1.0"/> 
      <skill fist="1.5" club="2.0" sword="2.0" axe="2.0" distance="2.0" shielding="1.5" fishing="1.1" experience="1.0"/> 
   </vocation> 
   ...

 

vamos agora ao codigo que irei usar como uso implementavel das funções da livraria luaxml. 
 

Citar

 

require('LuaXml') 
local str = [[ 
<vocation id="0" name="None" description="none" needpremium="0" gaincap="5" gainhp="5" gainmana="5" gainhpticks="6" gainhpamount="1" gainmanaticks="6" gainmanaamount="1" manamultiplier="4.0" attackspeed="2000" soulmax="100" gainsoulticks="86800" fromvoc="0" attackable="yes"> 
      <formula meleeDamage="1.0" distDamage="1.0" wandDamage="1.0" magDamage="1.0" magHealingDamage="1.0" defense="1.0" magDefense="1.0" armor="1.0"/> 
      <skill fist="1.5" club="2.0" sword="2.0" axe="2.0" distance="2.0" shielding="1.5" fishing="1.1" experience="1.0"/> 
   </vocation> 
]] 


local tab = xml.eval(str) 
   for k,v in pairs(tab) do 
      if(type(v) == 'string')then 
         print('eval: ['..k..'] = '..v) 
      end 
   end 


local xfile_load = xml.load("vocations.xml") 
local xfile_find = xfile_load:find("vocation",'name','Sorcerer') 

if not xfile_find then return end 


local new_xfile = xml.new('sorcerer') 
local formula = xfile_find[1]:find('formula') 
local skills = xfile_find[2]:find('skill') 
   new_xfile:tag('Bruxo') 
   new_xfile:append('id')[1] = xfile_find.id 
   new_xfile:append('id')[0] = 'autor nome = "Marcryzius" data = "16/julho/2016"' 
   new_xfile:append('gaincap')[0] = 'gainCapDefAndAxe cap = "'..xfile_find.gaincap..'" def = "'..formula.defense..'" axe = "'..skills.axe..'"' 
   xfile_find['id'] = 'newid' 
   xfile_find['newid'] = '0' 
   xfile_find.newid = '2' 
   new_xfile:append('newid')[1] = xfile_find.newid 
   new_xfile:append('id')[1] = xfile_find.id or 'nil' 
   new_xfile:save('dadosXml.xml') 

 

 

Explicando o codigo postado acima. 

Citar

 

-- Carrega a livraria LuaXml 
require('LuaXml') 

 

-- Peguei uma parte do codigo do arquivo vocations.xml e coloquei-o como string para estudarmos o funcionamento da função eval. 
local str = [[ 
<vocation id="0" name="None" description="none" needpremium="0" gaincap="5" gainhp="5" gainmana="5" gainhpticks="6" gainhpamount="1" gainmanaticks="6" gainmanaamount="1" manamultiplier="4.0" attackspeed="2000" soulmax="100" gainsoulticks="86800" fromvoc="0" attackable="yes"> 
      <formula meleeDamage="1.0" distDamage="1.0" wandDamage="1.0" magDamage="1.0" magHealingDamage="1.0" defense="1.0" magDefense="1.0" armor="1.0"/> 
      <skill fist="1.5" club="2.0" sword="2.0" axe="2.0" distance="2.0" shielding="1.5" fishing="1.1" experience="1.0"/> 
   </vocation> 
]] 

 

-- Apenas imprimi os valores strings associados aos index. outros valores como table, não foram acessados. 
local tab = xml.eval(str) 
   for k,v in pairs(tab) do 
      if(type(v) == 'string')then 
         print('eval: ['..k..'] = '..v) 
      end 
   end 

 

--Saida gerada por esse programa 

Citar

 

eval: [0] = vocation 
eval: [description] = none 
eval: [gaincap] = 5 
eval: [needpremium] = 0 
eval: [gainhpticks] = 6 
eval: [attackable] = yes 
eval: [gainmanaamount] = 1 
eval: [gainmanaticks] = 6 
eval: [soulmax] = 100 
eval: [id] = 0 
eval: [attackspeed] = 2000 
eval: [gainsoulticks] = 86800 
eval: [name] = None 
eval: [fromvoc] = 0 
eval: [manamultiplier] = 4.0 
eval: [gainhpamount] = 1 
eval: [gainmana] = 5 
eval: [gainhp] = 5 

 

 

 


-- Carrega o arquivo xml 
local xfile_load = xml.load("vocations.xml") 

 

-- Pega o bloco requerido segundo os parametros fornecidos. 
-- pode ser qualquer parâmetro que esteja inserido na tag ('vocation' << cabeçalho da tag - 'id','4' << retornar a tag do knight, 'name','Druid' ...). 
-- sempre use parâmetros em string mesmo que seja numeros, tem que ser fornecidos em string. 
local xfile_find = xfile_load:find("vocation",'name','Sorcerer') 

 

-- Verificação se houve resultado retornado. 
if not xfile_find then return end 

 

-- Criação de novos dados em xml 
-- 'Sorcerer' seria a tag do cabeçalho do bloco criado >> <sorcerer> ... </sorcerer> 
local new_xfile = xml.new('sorcerer') 

 

-- Esse daqui são dois exemplos de tags que existem dentro da tag principal. 
-- Cada tag é chamada por um index sucessivo e ascendente. 
local formula = xfile_find[1]:find('formula') 
local skills = xfile_find[2]:find('skill') 

 

-- Modifica o nome da tag do cabeçalho; nesse caso: 'Sorcerer'(declarado em xml.new) torna-se 'Bruxo'. 
   new_xfile:tag('Bruxo') 

 

-- index [1], Adiciona valores entre tags >> saida gerado por essa função >> <id>1</id> 
   new_xfile:append('id')[1] = xfile_find.id 

 

-- index [0], adiciona valores na tag >> saida gerada por essa função >> <autor nome = "Marcryzius" data = "16/julho/2016" /> 
   new_xfile:append('id')[0] = 'autor nome = "Marcryzius" data = "16/julho/2016"' 

 

-- Mais um exemplo de adição de valores na tag >> saida gerada por essa função >> <gainCapDefAndAxe cap = "10" def = "1.0" axe = "2.0" /> 
   new_xfile:append('gaincap')[0] = 'gainCapDefAndAxe cap = "'..xfile_find.gaincap..'" def = "'..formula.defense..'" axe = "'..skills.axe..'"' 

 

-- Adiciona novas variaveis dentro da propria cadeia de caracteres retornanda pela função find 
   xfile_find['newid'] = '0' 

 

-- Modifica valores associados as variaveis 

   xfile_find['id'] = 'newid' 
   xfile_find.newid = '2' 

 

-- Cria uma nova tag com valores entre as tags >> <newid>2</newid> 
   new_xfile:append('newid')[1] = xfile_find.newid 

 

-- Idem >> <id>newid</id> 
   new_xfile:append('id')[1] = xfile_find.id or 'nil' 

 

-- Salva essa string de caracteres em um arquivo formatado como xml. 
   new_xfile:save('dadosXml.xml') -- insira o caminho onde vai ser salvo o arquivo.

 

 

Esse é o codigo dentro do arquivo (dadosXml.xml) gerado por esse programa: 
 

Citar

 

<?xml version="1.0"?> 
<!-- file "dados.xml", generated by LuaXML --> 

<Bruxo> 
  <id>1</id> 
  <autor nome = "Marcryzius" data = "16/julho/2016" /> 
  <gainCapDefAndAxe cap = "10" def = "1.0" axe = "2.0" /> 
  <newid>2</newid> 
  <id>newid</id> 
</Bruxo> 

 

 

Espero que tenham entendido. Qualquer duvida, deixe nos comentarios e tentarei ajuda-lo.

Edited by Poccnn
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.


    Administrador |  Diretor |  Coordenador |  Moderador |  Suporter |  Estagiário |  Herói
  • Similar Content

    • By Marshmello
      Fala pessoal Então tava sem nada pra fazer decidir ajudar um pouco quem ta começando
       
      Trazendo Exemplo de quest (tanto item e pokemon)
       
      Então vamos lá
       
      Exempo de quest Que ganha Item
      --[[ Script: Exemplo Quest Item AUTOR: Brendo Hiesttfer EMAIL: [email protected] ]] function onUse(cid,item,fropos,topos) storage = 587954 -- Storage da quest (troque quando for fezer outra quest) item = 9999 -- id do Item valor = 1 -- quantidade de item que o player vai ganhar na quest itemname = "NomeItem" -- nome do Item que vai ser ganho na quest level = 1 -- Level minimo para completar a quest if getPlayerStorageValue(cid,storage) == -1 then if getPlayerLevel(cid) >= level then doPlayerAddItem(cid,item,Valor) doPlayerSendTextMessage(cid,25, "Parabéns você ganhou um "..itemname.." como premio") -- Msg ao completar a quest setPlayerStorageValue(cid,storage,1) else doPlayerSendTextMessage(cid, 26, "Desculpe, mais você precisa ter no minimo level "..level.." para completar a quest") --- Msg quando não tiver o level end else doPlayerSendTextMessage(cid,26, "Você já pegou oque estava dentro") -- Msg quando tentar fazer novamente end return true end  
      EXEMPLO QUEST QUE GANHA POKEMON:
      --[[ Script: Exemplo Quest Pokemon AUTOR: Brendo Hiesttfer EMAIL: [email protected] ]] function onUse(cid,item,fropos,topos) storage = 587954 -- Storage da quest (troque quando for fezer outra quest) pokemon = "Pikachu" -- Pokemon Que o player vai ganhar TypeBall = "Normal" -- type da ball level = 1 -- Level que precisa para completar a quest if getPlayerStorageValue(cid,storage) == -1 then if getPlayerLevel(cid) >= level then addPokeToPlayer(cid,pokemon,0 ,nil ,TypeBall) doPlayerSendTextMessage(cid,25, "Parabéns você ganhou um "..pokemon.." como premio! ") -- Msg ao completar a quest setPlayerStorageValue(cid,storage,1) else doPlayerSendTextMessage(cid, 26, "Desculpe, mais você precisa ter no minimo level "..level.." para completar a quest") --- Msg quando não tiver o level end else doPlayerSendTextMessage(cid, 26, "Você já fez essa quest") -- Msg quando tentar fazer novamente end return true end E isso coisa simples para quem está começando agora com poketibias , abraços ♥
    • By Punchlines Nemmo
      Sera que alguém aqui poderia me ajudar com isso ?? 
      Estou tentando compilar a sources mas quando ele vai criar o .exe ele da erro 
      o pior é que eu já compilei esta Sources 1 vez e não sei porque começou dar este erro agora  
      Eu baixei a sources da base que eu estou utilizando pra ver se era alguma coisa que eu tenha feito mas o erro continua.
       


    • By Poccnn
      Fala XTibianos!
      Vim disponibilizar e ensinar como usar a livraria xml em lua, desenvolvida por mim. 
       
      Ela foi desenvolvida para substituir a livraria padrão disponibilizada por lua para trabalhar com dados xml.
      Essa livraria não requer a dll-xml necessária para a livraria padrão lua.
       
      Aqui tem o tutorial criado por mim para demonstrar as funções e suas implementações da livraria luaxml.
      Tutorial lua lib xml padrão
       
      Vamos lá.
      Primeiro, a livraria: 
       
      Vou ensinar como usar ela. 
      Vou usar como exemplo uma parte do arquivo vocations.xml: 
         
       
      Primeiro, carregar o arquivo. 
      Ele vai retornar um objeto para ser usado pelos metametodos ou uma string para outros fins como "print". 
       
      Buscar a tag desejada. 
      Ele vai retornar uma tabela contendo todos os parametros que foram lidos no arquivo. 
      O primeiro argumento da função, é o nome da tag requerida. exemplo: <tagNome ....>, tagNome seria o primeiro argumento da função. 
      O segundo elemento é usado para diferenciar um bloco de outro como no caso do arquivo vocations que contem varias vocations, mas apenas uma é a requerida. 
      O terceiro elemento é o que diferencia um bloco de outro similar. seguindo o exemplo do arquivo vocations, existe varias vocações, mas apenas uma delas tem o id de numero 2. 
       
      Imprime o que foi lido no arquivo. 

      a saida seria essa, nesse caso. 
       
      Mas, ela tambem é uma tabela, por isso, voce pode pegar os elementos dentro dela dessa forma. 
       
      As tags existentes dentro do bloco "vocation", tambem é uma tabela com indice numerico; portanto é valido pegar os dados dela dessa forma. 
       
      Cada tag que exista dentro do bloco, vem como uma tabela com indicie numerico. 
       
      Criando objetos para xml:
      O argumento inserido , seria o nome do bloco. Ex -> <novo> </novo> 
       
      Adiciona tag's dentro do corpo do bloco. 
      Pode ser adicionado quantas tags quiser. 
       
      Cria uma tagbloco ou bloco dentro do bloco principal. Ex -> <tagBloco inserido="primer" ordem="2" face="not"> </tagBloco> 
      Essa função retorna um objeto para ser usado pelos metametodos ou uma string para outros fins como "print". 
       
      Dessa forma que foi declarada sem uma tabela contendo os parametros da tag, ela é criada como um bloco. Ex -> <newBloco> </newBloco> 
       
      Adiciona tag's ao corpo do novo bloco/tagbloco criado pela função append. 
       
      E por fim, salva os dados em um arquivo. 
      Nessa função, existe o argumento unico que é o destino do arquivo e seu nome, que nesse caso foi ocultado. 
       
      Esse é os dados dentro do arquivo gerador pelo script.
       
       
      Devido as novas atualizações feitas a lib, agora podeis usar caracteres especial de busca e inserção de maiores informações para busca.
       
      Vou usar como exemplo essa parte do arquivo items.xml e movements.xml para explicar essas mudanças.
       
      items
       
      movements
       
      Na versão anterior da lib ela não poderia buscar informações no arquivo items.xml devido a um erro na ora de selecionar o bloco buscado.
       
      O problema residia em que: ao encontrar uma tag ela busca o seu fechamento, sendo que, no exemplo da parte do arquivo items que postei acima, ela pegava todo esse bloco, dessa forma anulando o verdadeiro id buscado.
       
      Isso foi resolvido. agora ela filtra o bloco encontrado antes de fazer a analise de que seja o dado requisitado.
       
      Outro problema era quando se desejava buscar uma informação mais precisa, como no caso do arquivo movements.xml que existe duas tags com os mesmo ids equip e deequip; se eu colocasse o id de qualquer item ele me retornaria a primeira sentença encontrada que na maioria das vezes não era a que eu queria. isso também foi corrigido; agora podeis usar mais informações para melhorar a precisão da busca. Veja esse exemplo:
       
       
      Obs. Os codigos estão codificados em utf8, converta para ansi antes de usa-los.
       
      É isso ae pessoal, espero que gostem; qualquer erro ou sugestão serão bem vindas. obrigado.
       
    • By nbb147
      E ai galera, esses dias eu estava tentando fazer um script que o pessoal procura muito que é o famoso sistema de saga, que consiste no seguinte, o player só pode atacar e ser atacado por uma devida criatura se possuir certa storage caso contrario a criatura não ira se mover, bom, consegui fazer quase tudo em lua, só que existe um pequeno problema, que é o seguinte, esse problema está na parte que retorna a speed da criatura, a speed não retorna, tudo funciona corretamente exceto essa parte, peça a ajuda de vocês e agradeço desde já, script:
      local name, storage = 'fire devil', 11112local sto = 800000local speedchange = 0function onAttack(cid, target)if isMonster(cid) and getCreatureName(cid):lower() == name and isPlayer(target) and getCreatureStorage(target, storage) < 0 thensetPlayerStorageValue(cid, sto, getCreatureSpeed(cid))doChangeSpeed(cid, -getCreatureSpeed(cid))doChangeSpeed(cid, speedchange)return falseendif isMonster(cid) and getCreatureName(cid):lower() == name and isPlayer(target) and getCreatureStorage(target, storage) > 1 then -- O ERRO PERTENCE A ESSA PARTEdoChangeSpeed(cid, -getCreatureSpeed(cid))local oldspeed = getPlayerStorageValue(cid, sto) == -1 and getCreatureBaseSpeed(cid) or getPlayerStorageValue(cid, sto)doChangeSpeed(cid, oldspeed)return false -- O PROBLEMA ESTA AQUIendreturn trueendfunction onCombat(cid, target)if isPlayer(cid) and getCreatureStorage(cid, storage) < 0 and isMonster(target) and getCreatureName(target):lower() == name thendoPlayerSendCancel(cid, 'You cannot attack this monster.')return falseend if isMonster(cid) and getCreatureName(cid):lower() == name and isPlayer(target) and getCreatureStorage(target, storage) < 0 thenreturn falseendreturn trueendfunction onKill(cid, target, lastHit)if isMonster(target) and getCreatureName(target):lower() == name and isPlayer(cid) and getCreatureStorage(cid, storage) > 0 thendoCreatureSetStorage(cid, storage, -1)endreturn trueend  
    • By zude96
      Bom Galera Agora Estou Com Esse Bug o Player Consegui Capturar O Pokemon Mais Quando O Player Usa Ele. Ele Fica Mutiplicando e Eles Vem Sem O Sexo e da o Seguinte Erro Na Distro

      Podem Ver Nas Imagens
       
       
      Goback.lua
       

       
       
       
       


×
×
  • Create New...