Ir para conteúdo
  • 0

Box por %


New'gadu

Pergunta

Alguém poderia me arruma um scripting de box 
Exemplo: De conseguir um item por % esse item é agrupável de 1 a 100 e quando abrir a box seja random 
tipo 1% de vim 100
2% de vim 99
3 % de vim 98

4 % de vim 97

5 % de vim 96
99 % de vim 1 etc...

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Não sei se é assim que quer, porque está meio confuso seu pedido. Mas faça o teste e veja se é assim que você pediu.

 

Vá em Data/Actions/Scripts e crie um arquivo box_random.lua (Crie com a codificação ANSI porque tem textos em português com acentuação, para não dar problema) e adicione o código dentro:

local id_item = 12163 -- ID DO ITEM
local quantidade_item = math.abs(math.random(1, 100)) -- GERA A QUANTIDADE DO ITEM RANDOMICAMENTE
local level = 1 -- LEVEL MÍNIMO
local id_box = 12338 -- ID DA BOX

function onUse(cid, item, frompos, item2, topos)
if item.itemid == id_box then -- VERIFICA SE CLICOU NA BOX, ALTERAR O ID DA BOX NA VARIÁVEL
    
  if getPlayerLevel(cid) >= level then -- VERIFICA SE O PLAYER TEM O NÍVEL NECESSÁRIO. DEIXEI COMO 1 CASO NÃO QUEIRA QUE TENHA VERIFICAÇÃO DE NÍVEL, POIS O NÍVEL MÍNIMO É 1. QUALQUER COISA SÓ ALTERAR NA VARIÁVEL      
    doPlayerAddItem(cid, id_item, quantidade_item) -- SETAR O ID DO ITEM NA VARIÁVEL
    doSendMagicEffect(getThingPos(cid), 27) -- EFEITO AO ABRIR A BOX     
    doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"Parabéns, você recebeu " ..quantidade_item.. " " ..getItemNameById(id_item)) -- MENSAGEM PARA O PLAYER
    doRemoveItem(item.uid, 1) -- REMOVE A BOX DA BAG DO PLAYER
    
  else
    doPlayerSendCancel(cid,"Você dever ser no mínimo nível "..level.." para abrir a box.") -- MENSAGEM CASO NÃO TENHA NÍVEL
  end 

return true 
end  

end

 Agora vá em Data/Actions e abra o actions.xml e adicione a tag:

<action itemid="ID_BOX" event="script" value="box_random.lua"/> <!-- COLOQUE O ID DA BOX ONDE ESTÁ ESCRITO ID_BOX -->

Testei aqui e funcionou, mas testa e me fala se funciona e se é assim que quer.

Editado por Yan18
Link para o comentário
Compartilhar em outros sites

  • 0

Testa assim Brow

 

local config = {
   [90] = {ID, COUNT},  -- [PORCENTAGEM] = {ID DO ITEM, QUANTIDADE}
   [80] = {ID, COUNT},
   [59] = {ID, COUNT},
   [50] = {ID, COUNT},
   [40] = {ID, COUNT},
   [30] = {ID, COUNT},
   [20] = {ID, COUNT},
   [10] = {ID, COUNT},
   [3] = {ID, COUNT},
   [1] = {ID, COUNT},
}
 
function onUse(cid)
   
 
   local chance_growing = {}
 
   for chance, _ in pairs(config) do
      table.insert(chance_growing, chance)
   end
 
   table.sort(chance_growing, function(a, b) return a > b end)
 
   local chance = 0
 
   for _, v in pairs(chance_growing) do
      if math.random(100) < v then
         chance = v
         break
      end
   end
 
   local item = config[chance]
   if item then
      doPlayerAddItem(cid, item[1], item[2])
      doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Você encontrou ".. item[2] .." ".. item[1] .. ".")
      doSendMagicEffect(getThingPos(cid), 13)
   else
      doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Não foi dessa vez, tente na próxima ):")
   end
 
   return true
end

 

Editado por Marshmello
Link para o comentário
Compartilhar em outros sites

  • 0
Em 02/01/2020 em 19:55, Yan18 disse:

Não sei se é assim que quer, porque está meio confuso seu pedido. Mas faça o teste e veja se é assim que você pediu.

 

Vá em Data/Actions/Scripts e crie um arquivo box_random.lua (Crie com a codificação ANSI porque tem textos em português com acentuação, para não dar problema) e adicione o código dentro:


local id_item = 12163 -- ID DO ITEM
local quantidade_item = math.abs(math.random(1, 100)) -- GERA A QUANTIDADE DO ITEM RANDOMICAMENTE
local level = 1 -- LEVEL MÍNIMO
local id_box = 12338 -- ID DA BOX

function onUse(cid, item, frompos, item2, topos)
if item.itemid == id_box then -- VERIFICA SE CLICOU NA BOX, ALTERAR O ID DA BOX NA VARIÁVEL
    
  if getPlayerLevel(cid) >= level then -- VERIFICA SE O PLAYER TEM O NÍVEL NECESSÁRIO. DEIXEI COMO 1 CASO NÃO QUEIRA QUE TENHA VERIFICAÇÃO DE NÍVEL, POIS O NÍVEL MÍNIMO É 1. QUALQUER COISA SÓ ALTERAR NA VARIÁVEL      
    doPlayerAddItem(cid, id_item, quantidade_item) -- SETAR O ID DO ITEM NA VARIÁVEL
    doSendMagicEffect(getThingPos(cid), 27) -- EFEITO AO ABRIR A BOX     
    doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"Parabéns, você recebeu " ..quantidade_item.. " " ..getItemNameById(id_item)) -- MENSAGEM PARA O PLAYER
    doRemoveItem(item.uid, 1) -- REMOVE A BOX DA BAG DO PLAYER
    
  else
    doPlayerSendCancel(cid,"Você dever ser no mínimo nível "..level.." para abrir a box.") -- MENSAGEM CASO NÃO TENHA NÍVEL
  end 

return true 
end  

end

 Agora vá em Data/Actions e abra o actions.xml e adicione a tag:


<action itemid="ID_BOX" event="script" value="box_random.lua"/> <!-- COLOQUE O ID DA BOX ONDE ESTÁ ESCRITO ID_BOX -->

Testei aqui e funcionou, mas testa e me fala se funciona e se é assim que quer.

Olá! testei, mas sempre que eu abro a box ela da o item com quantidade sempre 85 não está vindo random! téria como vc fazer para que funcionasse com porcentagem? tipo 99% de vim de 1 a 100 esse item (ID 2362) e 1% (ID 2361)?  E a box ao usar não remove do player, onde encaixa a função "doRemoveItem(item.uid, 1)" para remover?

Em 04/01/2020 em 04:42, Marshmello disse:

Testa assim Brow

 


local config = {
   [90] = {ID, COUNT},  -- [PORCENTAGEM] = {ID DO ITEM, QUANTIDADE}
   [80] = {ID, COUNT},
   [59] = {ID, COUNT},
   [50] = {ID, COUNT},
   [40] = {ID, COUNT},
   [30] = {ID, COUNT},
   [20] = {ID, COUNT},
   [10] = {ID, COUNT},
   [3] = {ID, COUNT},
   [1] = {ID, COUNT},
}
 
function onUse(cid)
   
 
   local chance_growing = {}
 
   for chance, _ in pairs(config) do
      table.insert(chance_growing, chance)
   end
 
   table.sort(chance_growing, function(a, b) return a > b end)
 
   local chance = 0
 
   for _, v in pairs(chance_growing) do
      if math.random(100) < v then
         chance = v
         break
      end
   end
 
   local item = config[chance]
   if item then
      doPlayerAddItem(cid, item[1], item[2])
      doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Você encontrou ".. item[2] .." ".. item[1] .. ".")
      doSendMagicEffect(getThingPos(cid), 13)
   else
      doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Não foi dessa vez, tente na próxima ):")
   end
 
   return true
end

 

Oi! testei a sua, mas aparenta que a random dela não está me calibrada... sempre da 1 e uma vez perdida 10 mas nunca cair as outras porcentagem image.png.819e0cad294f0c3681db0b39f104e7b8.pngimage.png.6591d4d1d1462f443e86e81bf52b2541.png 

Editado por New'gadu
Link para o comentário
Compartilhar em outros sites

  • 0
2 horas atrás, New'gadu disse:

Olá! testei, mas sempre que eu abro a box ela da o item com quantidade sempre 85 não está vindo random! téria como vc fazer para que funcionasse com porcentagem? tipo 99% de vim de 1 a 100 esse item (ID 2362) e 1% (ID 2361)?  E a box ao usar não remove do player, onde encaixa a função "doRemoveItem(item.uid, 1)" para remover?

Oi! testei a sua, mas aparenta que a random dela não está me calibrada... sempre da 1 e uma vez perdida 10 mas nunca cair as outras porcentagem image.png.819e0cad294f0c3681db0b39f104e7b8.pngimage.png.6591d4d1d1462f443e86e81bf52b2541.png 

Sobre vir o valor repetido, foi erro meu, falta de atenção, pois como deixei a variável fora da function onUse ele deixava sempre o valor que gerou randomico fixo. Eu tinha criado a váriavel dentro do escopo, mas ai deixando organizado, comentado e legível para você acabei colocando fora da função. Estarei mandando corrigido.

 

Sobre o seu pedido, eu não acho que vale a pena fazer desse jeito, porque você vai fazer um esforço para duas coisas que na verdade é uma, pois como é aleatório, como você vai saber a porcentagem que vai sair? Não tem como entendeu? De qualquer forma vai ser aleatório, então eu sugiro que deixa a quantidade de itens aleatoriamente direto igual eu fiz. E nem estou falando isso para não precisar fazer, pois se quiser posso tentar fazer, mas a questão é que vai gastar esforço com uma coisa sem necessidade.

 

Mas reflita sobre o que falei e veja se vai aceitar o meu conselho ou se vai querer como pediu inicialmente.

 

Estou mandando o código corrigido, pode testar que agora virá valores aleatórios normal. Mandarei até uma print que testei para comprovar. Substitua o código por esse:

local id_item = 2392 -- ID DO ITEM
local level = 1 -- LEVEL MÍNIMO
local id_box = 12338 -- ID DA BOX

function onUse(cid, item, frompos, item2, topos)
local quantidade_item = math.floor(math.random(1, 100)) -- GERA A QUANTIDADE DO ITEM RANDOMICAMENTE
  
if item.itemid == id_box then -- VERIFICA SE CLICOU NA BOX, ALTERAR O ID DA BOX NA VARIÁVEL
    
  if getPlayerLevel(cid) >= level then -- VERIFICA SE O PLAYER TEM O NÍVEL NECESSÁRIO. DEIXEI COMO 1 CASO NÃO QUEIRA QUE TENHA VERIFICAÇÃO DE NÍVEL, POIS O NÍVEL MÍNIMO É 1. QUALQUER COISA SÓ ALTERAR NA VARIÁVEL      
    doPlayerAddItem(cid, id_item, quantidade_item) -- SETAR O ID DO ITEM NA VARIÁVEL
    doSendMagicEffect(getThingPos(cid), 27) -- EFEITO AO ABRIR A BOX     

    if quantidade_item > 1 then  
       doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"Parabéns, você recebeu " ..quantidade_item.. " " ..getItemNameById(id_item) .."s") -- MENSAGEM PARA O PLAYER NO PLURAL CASO SEJA A QUANTIDADE MAIOR QUE 1
    else
       doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"Parabéns, você recebeu " ..quantidade_item.. " " ..getItemNameById(id_item)) -- MENSAGEM PARA O PLAYER NO SINGULAR SE A QUANTIDADE FOR 1
    end

    doRemoveItem(item.uid, 1) -- REMOVE A BOX DA BAG DO PLAYER
    
  else
    doPlayerSendCancel(cid,"Você dever ser no mínimo nível "..level.." para abrir a box.") -- MENSAGEM CASO NÃO TENHA NÍVEL
  end 

return true 
end  

end

Print:

image.thumb.png.b70a59db04b4863c8e222b4a7307489b.png

 

Como pode ver fiz o teste, cliquei 4x na box e veio quantidades diferentes nas 4 vezes. Testa ai e me fala.

 

(Fazendo um adendo, eu troquei no código a função math.abs para math.floor porque o abs pode pegar número real, e o floor só pega inteiro, outro erro meu rs. Também acrescentei uma verificação para caso a quantidade de itens seja maior que um ele fala o nome do item no plural, e com 1 no singular.)

Link para o comentário
Compartilhar em outros sites

  • 0
8 minutos atrás, Yan18 disse:

Sobre vir o valor repetido, foi erro meu, falta de atenção, pois como deixei a variável fora da function onUse ele deixava sempre o valor que gerou randomico fixo. Eu tinha criado a váriavel dentro do escopo, mas ai deixando organizado, comentado e legível para você acabei colocando fora da função. Estarei mandando corrigido.

 

Sobre o seu pedido, eu não acho que vale a pena fazer desse jeito, porque você vai fazer um esforço para duas coisas que na verdade é uma, pois como é aleatório, como você vai saber a porcentagem que vai sair? Não tem como entendeu? De qualquer forma vai ser aleatório, então eu sugiro que deixa a quantidade de itens aleatoriamente direto igual eu fiz. E nem estou falando isso para não precisar fazer, pois se quiser posso tentar fazer, mas a questão é que vai gastar esforço com uma coisa sem necessidade.

 

Mas reflita sobre o que falei e veja se vai aceitar o meu conselho ou se vai querer como pediu inicialmente.

 

Estou mandando o código corrigido, pode testar que agora virá valores aleatórios normal. Mandarei até uma print que testei para comprovar. Substitua o código por esse:


local id_item = 2392 -- ID DO ITEM
local level = 1 -- LEVEL MÍNIMO
local id_box = 12338 -- ID DA BOX

function onUse(cid, item, frompos, item2, topos)
local quantidade_item = math.floor(math.random(1, 100)) -- GERA A QUANTIDADE DO ITEM RANDOMICAMENTE
  
if item.itemid == id_box then -- VERIFICA SE CLICOU NA BOX, ALTERAR O ID DA BOX NA VARIÁVEL
    
  if getPlayerLevel(cid) >= level then -- VERIFICA SE O PLAYER TEM O NÍVEL NECESSÁRIO. DEIXEI COMO 1 CASO NÃO QUEIRA QUE TENHA VERIFICAÇÃO DE NÍVEL, POIS O NÍVEL MÍNIMO É 1. QUALQUER COISA SÓ ALTERAR NA VARIÁVEL      
    doPlayerAddItem(cid, id_item, quantidade_item) -- SETAR O ID DO ITEM NA VARIÁVEL
    doSendMagicEffect(getThingPos(cid), 27) -- EFEITO AO ABRIR A BOX     

    if quantidade_item > 1 then  
       doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"Parabéns, você recebeu " ..quantidade_item.. " " ..getItemNameById(id_item) .."s") -- MENSAGEM PARA O PLAYER NO PLURAL CASO SEJA A QUANTIDADE MAIOR QUE 1
    else
       doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"Parabéns, você recebeu " ..quantidade_item.. " " ..getItemNameById(id_item)) -- MENSAGEM PARA O PLAYER NO SINGULAR SE A QUANTIDADE FOR 1
    end

    doRemoveItem(item.uid, 1) -- REMOVE A BOX DA BAG DO PLAYER
    
  else
    doPlayerSendCancel(cid,"Você dever ser no mínimo nível "..level.." para abrir a box.") -- MENSAGEM CASO NÃO TENHA NÍVEL
  end 

return true 
end  

end

Print:

image.thumb.png.b70a59db04b4863c8e222b4a7307489b.png

 

Como pode ver fiz o teste, cliquei 4x na box e veio quantidades diferentes nas 4 vezes. Testa ai e me fala.

 

(Fazendo um adendo, eu troquei no código a função math.abs para math.floor porque o abs pode pegar número real, e o floor só pega inteiro, outro erro meu rs. Também acrescentei uma verificação para caso a quantidade de itens seja maior que um ele fala o nome do item no plural, e com 1 no singular.)

Funcionou perfeitamente! Poderia me fazer outro? Uma box que ao abrir venha 6 items? como meu serve trabalha com sets gostaria de uma box contendo 6 item (os sets) grato desde já.

Link para o comentário
Compartilhar em outros sites

  • 0
14 minutos atrás, New'gadu disse:

Funcionou perfeitamente! Poderia me fazer outro? Uma box que ao abrir venha 6 items? como meu serve trabalha com sets gostaria de uma box contendo 6 item (os sets) grato desde já.

Que bom que funcionou! ?

 

Faço sim, mas você precisa criar um outro tópico para isso, pois além de ser um outro pedido, se alguma outra pessoa quiser o mesmo pedido que o seu já existirá um tópico para isso. Enquanto você cria o tópico, eu irei fazendo o script para você. 

 

E lembrando que você precisa criar o tópico na área de pedidos, pois essa área é para scripts já existentes que estão com problemas.

 

Área correta para pedidos de script: https://www.xtibia.com/forum/forum/1260-scripts/

Editado por Yan18
Link para o comentário
Compartilhar em outros sites

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...