Ir para conteúdo
Entre para seguir isso  
Mock

Perfect Forge System

Recommended Posts

Mock    32
Mock

Autor: Mock

Servidor Testado: Tfs 0.3.3 (possivel funcionamento em versoes posteriores)

Versão: 1.0

 

 

 

Depois de muito tempo eu vejo as pessoas fazendo craft, forje systems porem todos que eu vi criavam um item, quando criava mais de um era cerca de 20 linhas por item criado, decidi entao usando tabelas criar um forge system com apenas 145 linhas que suporta N combinações, neste script exclusivo da OTnet você verá este script e terá apenas que criar combinações de items para ele.

 

---------------------------------------------------------

Map

---------------------------------------------------------

Para começar vamos criar nosso centro de forja, você deve criar um botão para iniciar o script e 3 altares para que os items a serem criados sejem postos, algo assim:

---------------------------------------------------------

forj.png

---------------------------------------------------------

Note que aquele quadrado verde é o itemid 9565, você é obrigado a usar ele para ativar o script, e tambem você DEVE colocar o actionid 9565 nele. os outros 3 altares podem ser qualquer outro tipo de mesa contanto que nao seje movel.

 

---------------------------------------------------------

Script

---------------------------------------------------------

 

Feito isso vá em actions.xml adcione a seguinte tag:

<action actionid="9565" event="script" value="forj.lua"/>

Apos feito isso crie um arquivo na pasta scripts chamado forj.lua e adcione o seguinte codigo:

local formulas = {
{{5911,30},0,0,id=8473,count=1}, --- red piece of cloth + nd + nd = Great health potion
{5922,{6500,2},0,id=2391,count=1}, -- holy orchid + 2 demoniac esscence = war hammer
{6500,6500,6500,id=2391,count=1},  -- demoniac esscence + demoniac esscence + demoniac esscence = war hammer
}
function isInArraya(a, v,i1,i2)--- script By mock
  i1 = i1 or 0
  i2 = i2 or 0
  for i=1,#a do
    if i ~= i1 and i ~= i2 then      
     if a[i] == v then
        return a[i], i
  elseif type(a[i]) == 'table' and a[i][1] == v  then
     return a[i][1], i 
     end
    end 
  end
  return false
end
function getForm(n1,n2,n3,n1cnt,n2cnt,n3cnt)--- script By mock
        n1 = n1 or 0
        n2 = n2 or 0
        n3 = n3 or 0
        n2cnt = n2cnt or 1
        n1cnt = n1cnt or 1
        n3cnt = n3cnt or 1
        if not n1 then
           return 'nil'
        end
        local fnd = {}
        local ret = {}
        for i=1,#formulas do
           local find1, p1 = isInArraya(formulas[i], n1,0)
           local find2, p2 = isInArraya(formulas[i], n2,p1)
           local find3, p3 = isInArraya(formulas[i], n3,p1,p2)
           if (find1 == formulas[i][p1] or (type(formulas[i][p1]) == 'table' and formulas[i][p1][1] == find1 )) and
              (find2 == formulas[i][p2] or (type(formulas[i][p2]) == 'table' and formulas[i][p2][1] == find2 )) and
              (find3 == formulas[i][p3] or (type(formulas[i][p3]) == 'table' and formulas[i][p3][1] == find3 )) then
              if (type(formulas[i][1]) ~= 'table' or formulas[i][1][2] <= n1cnt) and (type(formulas[i][2]) ~= 'table' or formulas[i][2][2] <= n2cnt) and (type(formulas[i][3]) ~= 'table' or formulas[i][3][2] <= n3cnt) then

              if type(formulas[i][1]) == 'table' then
                 n1 = formulas[i][1][1]
                 n1cnt = formulas[i][1][2]
              end
               if type(formulas[i][2]) == 'table' then
                 n2 = formulas[i][2][1]
                 n2cnt = formulas[i][2][2]
              end
              if type(formulas[i][3]) == 'table' then
                 n3 = formulas[i][3][1]
                 n3cnt = formulas[i][3][2]
              end
              return {id=formulas[i].id,{n1,n1cnt},{n2,n2cnt},{n3,n3cnt},count=formulas[i].count,form=formulas[i]}  
              end
           end
        end
        return n1..'-'..n2..'-'..n3
end
function onUse(cid, item, frompos, item2, topos)
  --- script By mock
   if getPlayerStorageValue(cid, 10906) < os.time() then
   setPlayerStorageValue(cid,10906, os.time()+5)
   doTransformItem(item.uid, 9562)
   addEvent(function()
      for stackpos=1,255 do
      topos.stackpos = stackpos
      item = getThingfromPos(topos)
      if item.itemid == 9562 then
      doTransformItem(item.uid, 9563)
      break
      end
      end
   end,1500)
   local posittions = {
    {x=82,y=91,z=7,stackpos=255}, --- pos de um item
    {x=83,y=91,z=7,stackpos=255}, --- pos de um item
    {x=84,y=91,z=7,stackpos=255}, --- pos de um item
    {x=82,y=93,z=7,stackpos=255}, --- pos do resultado.
   }
   local tb = {}
   local k
   for i=1,#posittions do
      if i == 4 then break end;
         k = getThingfromPos(posittions[i])

         if k.itemid ~= 0 then
            table.insert(tb,1,k)
            doSendMagicEffect(posittions[i],14)
         else
            doSendMagicEffect(posittions[i],13)
         end
   end
   local n1 = tb[1] or {temid=0,type=0}
   local n2 = tb[2] or {temid=0,type=0}
   local n3 = tb[3] or {temid=0,type=0}
   doPlayerSendTextMessage(cid, 25,"Verificando.")
   local ret = getForm(n1.itemid,n2.itemid,n3.itemid,n1.type,n2.type,n3.type)
   if type(ret) == 'table' then
      for i=1,#posittions do
          if i == 4 then break end;
          k = getThingfromPos(posittions[i])
          for e=1,#ret do
             if type(ret[e]) == 'table' then
                if ret[e][1] == k.itemid and k.itemid ~= 0 then
                   local del = ret[e][2]
                   if del == 0 then del = 1 end
                   doRemoveItem(k.uid,del)
                   addEvent(doSendMagicEffect,3000,posittions[i], 0)
                   break
                end
             end 
          end
      end
      addEvent(function()
      for stackpos=1,255 do
          topos.stackpos = stackpos
          item = getThingfromPos(topos)
          if item.itemid == 9563 then
             doTransformItem(item.uid, 9565)
             break
          end
      end
      doCreateItem(ret.id,ret.count, posittions[4])
      doSendMagicEffect(posittions[4], 56)
      if ret.count ~= 1 then
         fnsh = 's'
      end
      fnsh = fnsh or ''
      if getItemNameById == nil then
         getItemNameById = getItemName
      end
      doPlayerSendTextMessage(cid, 25,"Você criou "..ret.count.." ".. getItemNameById(ret.id) ..fnsh..".")
      end,3000)
   else
      addEvent(function()
      for stackpos=1,255 do
          topos.stackpos = stackpos
          item = getThingfromPos(topos)
          if item.itemid == 9563 then
             doTransformItem(item.uid, 9565)
             break
          end
      end
      doPlayerSendTextMessage(cid, 25,"Não existe esta combinação.")
      end,3000)
   end

   return TRUE
   else
   doPlayerSendCancel(cid,"Aguarde.")
   doSendMagicEffect(topos, 2)
   return FALSE
   end
end

 

----17/8/2009 updated-----

 

Feito isso volte em seu mapa e veje que na foto que eu fiz tem la pos1 pos2 e pos3,estas são as 3 primeiras posições que você deve por na tabela de posições em negrito, lembre de por stackpos=255, não importa a ordem das 3 primeiras posições pois a ordem dos items não afeta o resultado. já a quarta posição é onde o item que você criou vai aparecer.

 

---------------------------------------------------------

Fórmulas

---------------------------------------------------------

Todas as formulas do script ninguem alem de você vai saber, entao caos queira que os outros saibam, revele elas pelo seu site ou entao crie um livro falando delas, mais vamos aprender a configura-las.

[spoiler=Configurando PT1]Vamos criar uma formula onde se juntarmos 1 demoniac escensse (6500) e 1 bakpack cinza (2003) você receber uma backpack of holding (2365)

local formulas = {
}

Isso é uma tabela e lembre-se deve se espaçar tudo com virgulas!

Vamos ver... o primeiro valor é a demoniac es~ entao o id dela é 6500 vamos por 6500

local formulas = {
{6500}[b][color="Red"],[/color][/b]
}

Certo, a backpack é 2003

local formulas = {
{6500,2003}[b][color="Red"],[/color][/b]
}

Ixe... e o terceiro item? basta por 0

local formulas = {
{6500,2003,0}[b][color="Red"],[/color][/b]
}

Agora vamos por o ID do que vai ser criado e a quantidade:

local formulas = {
{6500,2003,0,id=2365,count=1}[b][color="Red"],[/color][/b]
}

Pronto! criamos uma formula!

 

[spoiler=Configurando PT2]

Bom agora eu quero 100 demoniac essence para criar 10 holy orchids, como fazer?

Assim!

local formulas = {
{[b]{[color="Navy"]6500[/color][color="Sienna"],[/color][color="Red"]10[/color]}[/b],0,0,id=5922,count=10}[b][color="Red"],[/color][/b]
}

Ou seja bastar por outra tabela sendo o primeiro valor o id e o segundo a quantidade:

{{ ID , QTD } , { ID , QTD } , { ID , QTD } , id = ID, count = QTD },

 

 

 

Bom proveito do script, quaisquer bugs ou duvidas postem no topico!

 

 

Caso não queira que seu comentario seje deletado poste apenas: Duvidas, Sugestoes, Criticas ou Bugs, se quer agradeçer clique no botão agradeçer no topico.

Editado por Mock

Compartilhar este post


Link para o post
Rany Money    0
Rany Money

Eu tenho uma duvida !

Quando você coloca os itens no Pos 1 pos 2 Pos 3 automaticamente ele cria o outro item?!

Ou precisa clicar em alguma coisa ?!

Compartilhar este post


Link para o post
Mock    32
Mock

@feeh

no caso vc poe o item e da use no item que tem o actionid pra acionar o script.

Compartilhar este post


Link para o post
Lyu Elite    0
Lyu Elite

@Mock

tenho uma dúvida:

qual a actionid do pos1,pos2,pos3,pos4 ?

Compartilhar este post


Link para o post
Shyzoul    0
Shyzoul
@Mock

tenho uma dúvida:

qual a actionid do pos1,pos2,pos3,pos4 ?

/\ acho que não precisa é so você por na lavanca ou onde o mock sei lá pois o actionid 9565

Compartilhar este post


Link para o post
Mock    32
Mock

@luy

 

é so no pos4 o actionid

Compartilhar este post


Link para o post
Jedi    7
Jedi

Duvida:

Você clica em algo ou puxa uma alavanca,

Ou combina os itens e bate com um martelo por exemplo?

Compartilhar este post


Link para o post
Mock    32
Mock

@cardy

 

ta endo aquele quadrado verde?

bom você da use nele quando os items tiverem lá, quando der use ele vai ficar vermelho e os items serão removidos conforme a formula, passara- 2 segundos ele ficará azul e 1 segundo depois ele fica verde e o item aparece na pos4

Compartilhar este post


Link para o post
Stroodus    0
Stroodus

Bom, onde que eu tenho que salvar a parta das tabelas dos itens que precisa pra faser outro item?

Compartilhar este post


Link para o post
Mock    32
Mock

@strodus.

fica tudo junto ao script. deu ma lida dinovo :D

Compartilhar este post


Link para o post
Stroodus    0
Stroodus

Ta, mas eu tenho q por todas as tabelas juntas, no final do script? Se puder dar um exemplo eu ficarei gratississississimo...

Compartilhar este post


Link para o post
Mock    32
Mock

Ler com atenção sempre ajuda não e?

pos feito isso crie um arquivo na pasta scripts chamado forj.lua e adcione o seguinte codigo:

<code>

Difcil fazer isso? Depois a tabela que esta na 1ª linha você edita ela.

se tem tabela na utima linha você pegou o script errado.

Compartilhar este post


Link para o post
Fantom    1
Fantom

Vou usar aqui e ve se da resultado =)

Vlw Mock!

 

Att.

Compartilhar este post


Link para o post
Stroodus    0
Stroodus

Bom, eu fis tudo como esta no tutorial, mas na hora de abrir o server aparece uma mensagem:

 

[04/08/2009 20:16:41] [Warning - Event::loadScript] Cannot load script (data/actions/scripts/forj.lua)

[04/08/2009 20:16:41] data/actions/scripts/forj.lua:4: '}' expected near '{'

 

Bom, memso assim o server abriu, e quando fui lah testar, n estava funcionando...

 

Me ajudem por favor...

Compartilhar este post


Link para o post
Stroodus    0
Stroodus

Arrumei aquele de antes, mas agora veio esse:

 

[04/08/2009 20:47:49] [Warning - Event::loadScript] Cannot load script (data/actions/scripts/forj.lua)

[04/08/2009 20:47:49] data/actions/scripts/forj.lua:22: '}' expected near 'id'

 

ajuda plx...

Compartilhar este post


Link para o post
Mock    32
Mock

cara, se vc abre um { vc tem q fexa assim },

 

manda sua tabela p eu ve o erro.

vc erro na sintaxe.

Compartilhar este post


Link para o post
Stroodus    0
Stroodus

Bom, depois q eu corrigi esses erros n deu mais nenhum ao abrir o server, mas quando eu vou ao local, tentar forjar, eu boto os itens nos lugares, e cliko no tile verde, mas dai da uma fumassa e aparece a mensagem Aguarde, mas o iten não é forjado, ja botei no script as tabelas, mas pra ficar mais facil de vcs me ajudarem postei 3 fotos...

 

Bom, todas as imagens estão nesse link:

http://img196.imageshack.us/gal.php?g=imagem3nzc.png

 

Olhem as imagens e me ajudem a concertar o erro, agradeço desde jah... Vlws...

Compartilhar este post


Link para o post
Mock    32
Mock

Tenta com outro xar vai ver a storage fico salva com um numero gigante.

 

Se ainda sim nao funcionar use entao esse script sem o exaust:

local formulas = {
{5911,0,0,id=7588,count=1}, --- red piece of cloth + nd + nd = Great health potion
{5922,2225,2422,id=2391,count=1}, -- holy orchid + piece of iron + inron hammer = war hammer
{{5300,10},0,0,id=2108,count=1}, -- 10 woods = wooden doll
}
function isInArray(a, v)--- script By mock
  for i=1,#a do      
     if a[i] == v then
        return true
  elseif type(a[i]) == 'table' and a[i][1] == v then
     return true
     end
  end
  return false
end
function getForm(n1,n2,n3,n1cnt,n2cnt,n3cnt)--- script By mock
        n2 = n2 or 0
        n3 = n3 or 0
        n2cnt = n2cnt or 1
        n1cnt = n1cnt or 1
        n3cnt = n3cnt or 1
        if not n1 then
           return 'nil'
        end
        local ret = {}
        for i=1,#formulas do
           if isInArray(formulas[i], n1) == true and isInArray(formulas[i], n2) == true and isInArray(formulas[i], n3) == true then
              if (type(formulas[i][1]) ~= 'table' or formulas[i][1][2] <= n1cnt) and (type(formulas[i][2]) ~= 'table' or formulas[i][2][2] <= n2cnt) and (type(formulas[i][3]) ~= 'table' or formulas[i][3][2] <= n3cnt) then

              if type(formulas[i][1]) == 'table' then
                 n1 = formulas[i][1][2]
              end
               if type(formulas[i][2]) == 'table' then
                 n2 = formulas[i][2][2]
              end
              if type(formulas[i][3]) == 'table' then
                 n3 = formulas[i][3][2]
              end
              return {id=formulas[i].id,n1,n2,n3,count=formulas[i].count,form=formulas[i]}  
              end
           end
        end
        return n1..'-'..n2..'-'..n3
end
function onUse(cid, item, frompos, item2, topos)
  --- script By mock
   if item.itemid == 9565 then -- coloquei isso pra nao usarem enquanto o item esta em uso
   doTransformItem(item.uid, 9562)
   addEvent(function()
      for stackpos=1,255 do
      topos.stackpos = stackpos
      item = getThingfromPos(topos)
      if item.itemid == 9562 then
      doTransformItem(item.uid, 9563)
      break
      end
      end
   end,1500)
   local posittions = {
    {x=104,y=82,z=7,stackpos=255}, --- pos de um item
    {x=106,y=82,z=7,stackpos=255}, --- pos de um item
    {x=108,y=82,z=7,stackpos=255}, --- pos de um item
    {x=106,y=84,z=7,stackpos=255}, --- pos do resultado.
   }
   local tb = {}
   local k
   for i=1,#posittions do
      if i == 4 then break end;
         k = getThingfromPos(posittions[i])

         if k.itemid ~= 0 then
            table.insert(tb,1,k)
            doSendMagicEffect(posittions[i],14)
         else
            doSendMagicEffect(posittions[i],13)
         end
   end
   local n1 = tb[1] or {temid=0,count=0}
   local n2 = tb[2] or {temid=0,count=0}
   local n3 = tb[3] or {temid=0,count=0}
   doPlayerSendTextMessage(cid, 25,"Verificando.")
   local ret = getForm(n1.itemid,n2.itemid,n3.itemid)
   if type(ret) == 'table' then
      for i=1,#posittions do
          if i == 4 then break end;
          k = getThingfromPos(posittions[i])
          for e=1,#ret do
             if type(ret[e]) == 'table' then
                if ret[e][1] == k.itemid and k.itemid ~= 0 then
                   doRemoveItem(k.uid,ret[e][2])
                   addEvent(doSendMagicEffect,3000,posittions[i], 0)
                   break
                end
             else
                   if ret[e] == k.itemid and k.itemid ~= 0 then
                   doRemoveItem(k.uid,1)
                   addEvent(doSendMagicEffect,3000,posittions[i], 0)
                   break
                   end
             end 
          end
      end
      addEvent(function()
      for stackpos=1,255 do
          topos.stackpos = stackpos
          item = getThingfromPos(topos)
          if item.itemid == 9563 then
             doTransformItem(item.uid, 9565)
             break
          end
      end
      doCreateItem(ret.id,ret.count, posittions[4])
      doSendMagicEffect(posittions[4], 56)
      if ret.count ~= 1 then
         fnsh = 's'
      end
      fnsh = fnsh or ''
      doPlayerSendTextMessage(cid, 25,"Você criou "..ret.count.." "..getItemNameById(ret.id)..fnsh..".")
      end,3000)
   else
      addEvent(function()
      for stackpos=1,255 do
          topos.stackpos = stackpos
          item = getThingfromPos(topos)
          if item.itemid == 9563 then
             doTransformItem(item.uid, 9565)
             break
          end
      end
      doPlayerSendTextMessage(cid, 25,"Não existe esta combinação.")
      end,3000)
   end

   return TRUE
   else
   doPlayerSendCancel(cid,"Aguarde.")
   doSendMagicEffect(topos, 2)
   return FALSE
   end
end

Compartilhar este post


Link para o post
Stroodus    0
Stroodus

Bom, a dica q vc deu de usar outro char, deu certo, acho q n dava só com o gm, mas agora outro problema, eu boto os itens certos, (coloquei a tabela pra vc conferir se quiser), mas na hora de criar ele ocorre certo, mas dis q a combinação n existe...

 

LINK IMAGEM: http://img269.imageshack.us/img269/1545/imagem4q.png

Compartilhar este post


Link para o post
Mock    32
Mock

vc mudo as posições no script mantendo stackpos = 255?

Compartilhar este post


Link para o post
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  
  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×