Show Show

Membros novatos
  • Posts

    89
  • Joined

  • Last visited

  • Days Won

    10

Posts posted by Show Show

  1. Fiz esse macro com o objetivo de comparar armas e mensurar ganho de dano através de itens com bônus de skill.

     

    Descrição

      Fornece algumas informações sobre o dano causado pelo personagem: Dano máximo, dano médio, dano médio por turno, porcentagem de acertos (Hit%), além de uma funcionalidade que permite ignorar danos abaixo de um valor, o que é útil quando se quer testar apenas a magia sem interferência do dano causado pela arma. 

    Comentários

      Recomendo que espere ao menos uns 20 minutos atacando sem pausa pra ter uma noção pelo menos razoável. Quanto mais tempo, mais precisa será a medida.

    Demonstração

    [Macro] Análise de Dano - YouTube

     

    1uq7poo.png

     

     

    XwCjkQJ.png

     

    3FhZeUQ.png

     

    Spoiler
    
    local messageText5 = "your attack"
    
    TempoInicio = now
    danoMax = 0
    danoMin = 10000
    dano2s = 0
    HitMedio = 0
    danoMinuto = 0 
    danoHora = 0
    danoDia = 0
    danoTotal = 0
    nHits = 0
    HitPercentage = 0
    
    
    
    flagTempo = 0
    local TempoSwitch = macro(500, "Tempo Decorrido", function() 
    if flagTempo==0 then
      TempoAgora = now
      IntervaloTempo = (TempoAgora - TempoInicio)/1000
    
      minutos = math.floor(IntervaloTempo/60)
      segundos = IntervaloTempo-minutos*60
    
      if minutos>0 then
       say('Tempo Decorrido: ' .. minutos .. ' minutos ' .. 'e ' .. segundos .. ' segundos.')
      else
       say('Tempo Decorrido: ' .. IntervaloTempo .. ' segundos.')
      end
      flagTempo = 1
    end 
     
    end)
    macro(500, function() 
     if TempoSwitch.isOff() then
       flagTempo = 0
     end
    end)
    
    flag = 0
    
    
    local danoSwitch = macro(2000, "Fala dano causado", function() 
    
    if flag == 0 then
      TempoAgora = now
      IntervaloTempo = (TempoAgora - TempoInicio)/1000
      dano2s = 2*danoTotal/(IntervaloTempo) 
      danoMinuto = math.round(30*dano2s)
      danoHora = 60*danoMinuto
      HitMedio = math.round(danoTotal/nHits)
      
    
      say('Dano Mínimo: ' .. danoMin)
      
      schedule(1000, function() 
        say('Dano máximo: ' .. danoMax)
      end)
      schedule(2000, function() 
        say('Dano médio por turno: ' .. dano2s)
      end)
      schedule(3000, function() 
        say('Dano médio por ataque: ' .. HitMedio)
      end)
        schedule(4000, function() 
      say('Dano por minuto: ' .. danoMinuto)
      end)
      schedule(8000, function() 
        --say('Dano por hora: ' .. danoHora)
      end) 
      flag = 1
    
    end
    
    end)
    
    
    local ResetSwitch = macro(500, "Reset", function() 
    
    TempoInicio = now
    danoMax = 0
    danoMin = 10000
    dano2s = 0
    HitMedio = 0
    danoMinuto = 0 
    danoHora = 0
    danoDia = 0
    danoTotal = 0
    nHits = 0
    
    HitPercentage = 0
    end)
    
    macro(3000, function() 
      if not danoSwitch.isOn() then
         flag = 0  
    
      end
    end)
    
    onTextMessage(function(mode, text)
    
    
     if string.find(text, messageText5) then
      dano = tonumber(string.match(text, "%d+"))
      if dano > tonumber(storage.IgnorarDano) then
      danoTotal = danoTotal + dano
      nHits = nHits + 1
       if dano<danoMin then
      
         danoMin = dano
      
       end
    
       if dano>danoMax then
      
         danoMax = dano
      
       end 
    
    
    
     end
    
     end
    end)
    
    addLabel("IgnorarDano", "Ignorar dano abaixo de:", warTab)
    addTextEdit("uhfriendpercent", storage.IgnorarDano or "", function(widget, text)   
      storage.IgnorarDano = text
    end)
    
    
    
    storage.highestDamage = 0
    storage.DPS = 0
    
    
    local height = 50
    local widget = setupUI([[
    Panel
      height: 400
      width: 200
    ]], g_ui.getRootWidget())
    
    
    local DMGLabel = g_ui.loadUIFromString([[
    Label
      color: #cd17ff
      background-color: #494949
      opacity: 1
    ]], widget)
    
    local DPhitLabel = g_ui.loadUIFromString([[
    Label
      color: #f25555
      background-color: #494949
      opacity: 1
    ]], widget)
    
    local DPSLabel = g_ui.loadUIFromString([[
    Label
      color: #f25555
      background-color: #494949
      opacity: 1
    ]], widget)
    
    local tempoLabel = g_ui.loadUIFromString([[
    Label
      color: #f25555
      background-color: #494949
      opacity: 1
    ]], widget)
    
    local HitPercentageLabel = g_ui.loadUIFromString([[
    Label
      color: #f25555
      background-color: #494949
      opacity: 1
    ]], widget)
    
    
    -- Set Label Positions
    DMGLabel:setPosition({y = height + 5, x = 230})
    DPSLabel:setPosition({y = height + 18, x = 230})
    DPhitLabel:setPosition({y = height + 31, x = 230})
    tempoLabel:setPosition({y = height + 57, x = 230})
    HitPercentageLabel:setPosition({y = height + 44, x = 230})
    
    macro(100, function()
     
      if DMGLabel:getWidth() < (200 - 30) then
        DMGLabel:setWidth(DMGLabel:getWidth() + 5)
      end
      DMGLabel:setText("Hit máximo: " .. danoMax)
    
    
    
      TempoAgora = now
      IntervaloTempo = (TempoAgora - TempoInicio)/1000
      dano2s = 2*danoTotal/(IntervaloTempo) 
      dano2s = math.round(dano2s)
    
      if DPSLabel:getWidth() < (200 - 30) then
        DPSLabel:setWidth(DPSLabel:getWidth() + 5)
      end
      DPSLabel:setText("Dano médio por turno: " .. dano2s)
    
    
      HitMedio = danoTotal/nHits
      if DPhitLabel:getWidth() < (200 - 30) then
        DPhitLabel:setWidth(DPhitLabel:getWidth() + 5)
      end
      DPhitLabel:setText("Hit médio: " .. math.round(HitMedio))
    
    
       TempoAgora = now
      IntervaloTempo = (TempoAgora - TempoInicio)/1000
    
      minutos = math.floor(IntervaloTempo/60)
      segundos = math.round(IntervaloTempo-minutos*60)
    
     if tempoLabel:getWidth() < (200 - 30) then
        tempoLabel:setWidth(tempoLabel:getWidth() + 5)
      end
      tempoLabel:setText("Tempo decorrido: " .. minutos .. "min" .. segundos .. "s")
    
     
      HitPercentage = math.round(100*2*nHits/IntervaloTempo)
    
    if HitPercentageLabel:getWidth() < (200 - 30) then
        HitPercentageLabel:setWidth(HitPercentageLabel:getWidth() + 5)
      end
      HitPercentageLabel:setText("Hit %: " .. HitPercentage)
    
    
    end)

     

     

    • Like 3
  2. Tava conversando com o Cad sobre colocar uma lista de macros no listão. vocês tem alguma sugestão para inclusão? Existe algum tipo que não deveria ser colocado nessa possível lista?

    Inicialmente tinha pensando nesses:

    Cura: Aqui seria mais um mecanismo de proteção caso troque de char e esqueça de configurar o heal normal do bot. Já teria a magia configurada pra cada vocação e só teria um botão de "Liga" e "Desliga" caso queira de fato morrer (Last, rift, etc).
    Pot: Mesma lógica do anterior com a vantagem de que não fica dando exhausted, o que atrapalha na hora de andar.
    Auto Pet: Sumona o pet caso não esteja na tela.
    Auto Mount: Sempre montado, útil em hunts que o monstro tira sua mount.
    Follow: Segue o personagem definido.
    Auto Ataque: Parecido com o Target bot, porém não precisa ficar configurando os monstros e mais fácil de adicionar exceções. 
    Estoura Pots: Pode ser estendido para outros itens.
    Calculadora Hits: Hit máximo, Hit médio, Dano médio/turno, Hit%.
    Sio/UH: Um char ou vários?
    SSA/Might por HP: Quando a vida chega em 30% equipa o SSA/Might, quando voltar pra 90% equipa o colar normal. (valores configuráveis) 
    Vita Gran Sio: Se HP< HP base + 40%, usa a magia.
    Utevo Gran Sio: Usa a cada 10 minutos ou se não tiver buff.
    Tira Pet PK: Caso aparece um PK na tela, tira o pet. Quanto tempo depois deve sumonar o pet novamente?

    Auto Arrow: Equipa flechas quando acabarem e troca o tipo de flecha ao pressionar tecla específica.

    • Like 2
  3. Boa noite. No domingo de madrugada como estava meio cansado creio que acabei configurando o bot errado por desatenção. Com isso ele morreu na cave e continuou voltando diversas vezes até tomar ban. Gostaria de saber se existe a possibilidade do ban ser removido antes do tempo completo. Agradeço desde já a atenção. 

     

    224228463_heeeyban.png.8f67a7547f59ba3c7ab113292039333c.png

    • Sad 1
  4. Descrição: Equipa arrow com BP fechada e troca o tipo de arrow ao apertar a fecla "V".

    Vídeo:

    rmb7vUX.gif (1376×712) (imgur.com)

    image.png.052b18312c33ca057b712f65f9e8171d.png

    Spoiler
    
    
    function sendEquipItem(id)
      local protocol = g_game.getProtocolGame()
      local msg = OutputMessage.create()
      msg:addU8(119)    
      msg:addU16(id)
      protocol:send(msg)
    
    
    end
    
    local ammo = InventorySlotAmmo
    iArrow = 1
    
    
    macro(1000,"Equip Arrow",function()
    
    local arrow= storage.sortItems1[iArrow] 
    arrowId = arrow.id
    
    
    if player:getInventoryItem(ammo) == nil then
      sendEquipItem(arrowId)
    
    else
    
      local arrowEquip = player:getInventoryItem(ammo)
      
      if arrowEquip:getId() == arrowId then
        return
      else
        sendEquipItem(arrowId)
      end
    
    end
    
    
    end)
    
    local sortItems1 = UI.Container(function(widget, items)
      storage.sortItems1 = items
    end, true)
    sortItems1:setHeight(140)
    sortItems1:setItems(storage.sortItems1)
    
    local raiderHotkey = hotkey("V", "Change Arrow", function()
    if storage.sortItems1[iArrow + 1] == nil then
      iArrow = 1
    else
      iArrow = iArrow + 1
    end
    end)

     

     

    • Like 2
  5. Não cheguei a testar fora da cidade, então qualquer feedback será útil para possíveis correções.

    Por algum motivo fiz um vídeo explicando como inserir o código no jogo e demonstrando as funcionalidades.

     

    Spoiler
    
    --Description: A macro to follow players through stairs, doors, ladders, sewer gates and some other things. 
    --A message error appears on the log, but other than that everything seems to run well... save for the eventual hiccups.
    --ATTENTION: It might not work if multiple "use objects" that lead to paths places are near eachother.
    
    Follow = macro(1000,"Follow",function()
    
    nome = storage.followLeader
    end)
    
    UI.Label("Follow Player:")
    addTextEdit("playerToFollow", storage.followLeader or "Heeey", function(widget, text)
        storage.followLeader = text
        target = tostring(text)
    end)
    
    nome = storage.followLeader
    pos_p = player:getPosition()
    
    p = getCreatureByName(nome)
    
    onCreaturePositionChange(function(creature, newPos, oldPos)
        if Follow.isOn() then
        
            if creature:getName()==player:getName() and getCreatureByName(nome) == nil and newPos.z>oldPos.z then
            
                say('exani tera')
                for i = -1,1 do
                  for j = -1,1 do
                
                    local useTile = g_map.getTile({x=posx()+i,y=posy()+j,z=posz()})
                     g_game.use(useTile:getTopUseThing())
                    
                
                  end
                end
            end
            if creature:getName()==nome then
              
                
                if newPos==nil then
                    
                    
                    lastPos = oldPos
                    
                    schedule(200,function()
                     autoWalk(oldPos)
                    end)
                    
                    schedule(1000,function()
                        for i = -1,1 do
                          for j = -1,1 do
                        
                            local useTile = g_map.getTile({x=posx()+i,y=posy()+j,z=posz()})
                            g_game.use(useTile:getTopUseThing())
                            
                        
                          end
                        end
                    end)
                
                
                end
                
                if oldPos.z == newPos.z then
                         
                    schedule(300,function()
                     local useTile = g_map.getTile({x=oldPos.x,y=oldPos.y,z=oldPos.z})
                     topThing = useTile:getTopThing()
                     
                     if not useTile:isWalkable() then
                       use(topThing)
                     end
                    
                    end)
                
                
                    autoWalk({x=oldPos.x,y=oldPos.y,z=oldPos.z})
                else
                
                    lastPos = oldPos
                    autoWalk(oldPos)
                    for i = 1,6 do
                        schedule(i*200,function()
                          autoWalk(oldPos)
                        
                          if getDistanceBetween(pos(), oldPos) == 0 and (posz()>newPos.z and getCreatureByName(nome) == nil) then
                            say('exani tera')
                          end
                        end)
                    end
                    local useTile = g_map.getTile({x=newPos.x,y=newPos.y-1,z=oldPos.z})
                     g_game.use(useTile:getTopUseThing())
                                
                
                end
              
            
            end
        
        end
    end)

     

     

    • Like 3
    • Thanks 2
  6. Em 16/08/2021 at 13:03, Clerigo FX disse:

    Boa tarde, Script de summon de pet não está funcionando !!!

    Testei aqui e tá funcionando normal. Você tá colocando no lugar certo?

    Você deve colar em "Ingame macro editor" ou  salvar o código como .lua na pasta do seu otc ( "\AppData\Roaming\OTClientV8\otclienttrpgbv8\bot\cavebot_1.2").

    image.png.c6999830dfa27d2a72e9036084754c94.png

     

    Vou aproveitar pra fazer uma atualização no macro. Alterações:

    - Não mais tenta sumonar dentro de casas.

    - Caso não haja pet na tela quando a função for chamada, irá checar novamente em 5 segundos para garantir que o pet não esteja "muito pra trás" ao se deslocar pelo mapa.

    - Botão para ativar/desativar função.

     

    petName = 'Mercenary'
    macro(60000,"Summon Pet", function()
    
      pet = getCreatureByName('Pet ' .. petName)
      if pet == nil and not isInPz() then
        schedule(5000,function()
        
    
          pet = getCreatureByName('Pet ' .. petName)
          if pet == nil and not isInPz() then
            say('!pet summon,' .. petName)
          end
    
        end)
      end
      
    
    end)

     

  7. Em 15/08/2021 at 17:24, Cadwallow disse:

    manoooooooo que irado esses macros que voce tá fazendo!!! Obrigado pela colaboração. Será que seria viável voce fazer um apanhado de seus macros, por tudo num tpopico (só os links mesmo) pra eu poder mover eles pro Super Listão?

    Posso sim. Você tem alguma sugestão de quais macros seriam interessantes pra lista? Qualquer coisa a gente pode trocar uma ideia pelo discord ou ingame mesmo.

  8. Fiz uma atualização na parte de magias do macro. Antes o personagem soltaria as magias de acordo com a quantia de mana do char, independente de estar atacando algum monstro ou não. Como nem todos upam assim, coloquei um botão a mais "On Target" que quando ativo, condiciona o uso das magias a estar atacando algum monstro.

    image.png.970224f8dcef8a498249e4a035045955.png

     

    Spoiler
    
    local monsterList = {}
    local whitelistMonsters = {"emberwing", "skullfrost", "groovebeast", "thundergiant","pet mercenary","pet archer","pet witchdoctor", "pet mage", "pet blaze" , "pet wolf", "pet dog"}
    
    macro(100, "Atk Closest Target", function()
      if g_game.isAttacking() then
        return
      end
      for _,mob in ipairs(getSpectators(posz())) do
        distancia = getDistanceBetween(pos(), mob:getPosition())
        if mob:isMonster() and not table.find(whitelistMonsters, mob:getName():lower()) and distancia >=distMin and distancia <=distMax then
          table.insert(monsterList, {monster = mob, distance = getDistanceBetween(pos(), mob:getPosition())})
        end
      end
      table.sort(monsterList, function(a,b) return a.distance < b.distance end)
      if not g_game.isAttacking() and monsterList[1] then
        g_game.attack(monsterList[1].monster)
      end
      monsterList = {}
    end)
    
    
    macro(100, "Auto Follow", function()
    g_game.setChaseMode(1)
    end)
    
    
    macro(300, "Auto Pause CaveBot", function()
     if g_game.isAttacking() then
      CaveBot.setOn(false)
     else
      CaveBot.setOn(true)
     end
    end)
    
    
    UI.Separator()
    
    UI.Label("Distância para ataque")
    distMin = 1
    distMax = 8
    function Distancia(parent)
        local panelName = "distancia"
        if not parent then
          parent = panel
        end
    
        local ui = g_ui.createWidget("DualScrollPanel", parent)
        ui:setId(panelName)
        if not storage[panelName] then
          storage[panelName] = {
            min = 1,
            max = 100,
            text = 'exura'
          }
        end
    
        ui.title:setOn(storage[panelName].enabled)
        ui.title.onClick = function(widget)
          storage[panelName].enabled = not storage[panelName].enabled
          widget:setOn(storage[panelName].enabled)
        end
     
      
        local updateText = function()
          ui.title:setText("distância >= " .. math.floor(storage[panelName].min*8/100)  .. " e <= " .. math.floor(storage[panelName].max*8/100) .. ' sqms')
        end
    
        local repeatTime
        ui.scroll1.onValueChange = function(scroll, value)
          storage[panelName].min = value
          updateText()
        end
        ui.scroll2.onValueChange = function(scroll, value)
          storage[panelName].max = value
          updateText()
        end
        ui.text.onTextChange = function(widget, text)
          storage[panelName].text = ""
          updateText()
        end
    
    
        ui.scroll1:setValue(storage[panelName].min)
        ui.scroll2:setValue(storage[panelName].max)
        
        macro(1000, function()
          
          if storage[panelName].enabled then
            distMin = math.floor(storage[panelName].min*8/100)
            distMax = math.floor(storage[panelName].max*8/100)
          end
        end)
    end
    Distancia()
    
    UI.Separator()
    
    UI.Label("Magias")
    
    
    onTarget = macro(10000, "On Target", function()
    
    end)
    
    function Magia1(parent)
        local panelName = "magiaUm"
        if not parent then
          parent = panel
        end
    
        local ui = g_ui.createWidget("DualScrollPanel", parent)
        ui:setId(panelName)
        if not storage[panelName] then
          storage[panelName] = {
            min = 10,
            max = 80,
            text = 'exura'
          }
        end
    
        ui.title:setOn(storage[panelName].enabled)
        ui.title.onClick = function(widget)
          storage[panelName].enabled = not storage[panelName].enabled
          widget:setOn(storage[panelName].enabled)
        end
     
      
        local updateText = function()
          ui.title:setText("mana >= " .. storage[panelName].min  .. "% e <= " .. storage[panelName].max  .. "%")
        end
    
        local repeatTime
        ui.scroll1.onValueChange = function(scroll, value)
          storage[panelName].min = value
          updateText()
        end
        ui.scroll2.onValueChange = function(scroll, value)
          storage[panelName].max = value
          updateText()
        end
        ui.text.onTextChange = function(widget, text)
          storage[panelName].text = text
          updateText()
        end
    
    
        ui.scroll1:setValue(storage[panelName].min)
        ui.scroll2:setValue(storage[panelName].max)
        ui.text:setText(storage[panelName].text)
        macro(1000, function()
          
          if storage[panelName].enabled and manapercent() >= storage[panelName].min and manapercent() <= storage[panelName].max then
    
      if onTarget.isOn() and g_game.isAttacking() then
              say(storage[panelName].text)
      elseif onTarget.isOff() then
        say(storage[panelName].text)
      end
            
          end
    
        end)
    end
    Magia1()
    
    
    function Magia2(parent)
        local panelName = "MagiaDois"
        if not parent then
          parent = panel
        end
    
        local ui = g_ui.createWidget("DualScrollPanel", parent)
        ui:setId(panelName)
        if not storage[panelName] then
          storage[panelName] = {
            min = 10,
            max = 80,
            text = 'exura'
          }
        end
    
        ui.title:setOn(storage[panelName].enabled)
        ui.title.onClick = function(widget)
          storage[panelName].enabled = not storage[panelName].enabled
          widget:setOn(storage[panelName].enabled)
        end
     
      
        local updateText = function()
          ui.title:setText("mana >= " .. storage[panelName].min  .. "% e <= " .. storage[panelName].max  .. "%")
        end
    
        local repeatTime
        ui.scroll1.onValueChange = function(scroll, value)
          storage[panelName].min = value
          updateText()
        end
        ui.scroll2.onValueChange = function(scroll, value)
          storage[panelName].max = value
          updateText()
        end
        ui.text.onTextChange = function(widget, text)
          storage[panelName].text = text
          updateText()
        end
    
    
        ui.scroll1:setValue(storage[panelName].min)
        ui.scroll2:setValue(storage[panelName].max)
        ui.text:setText(storage[panelName].text)
        macro(1000, function()
          
          if storage[panelName].enabled and manapercent() >= storage[panelName].min and manapercent() <= storage[panelName].max then
      
      if onTarget.isOn() and g_game.isAttacking() then
              say(storage[panelName].text)
      elseif onTarget.isOff() then
        say(storage[panelName].text)
      end
            
          end
        end)
    end
    Magia2()

     

     

  9. Vi hoje no WC um pessoal conversando sobre script pra sumonar pet sozinho. Eu coloco no cave bot pra sumonar sempre que der uma volta na cave assim:

    image.png.0cf0ed9b0af22577541fa217714787d0.png

    O lado ruim é que enche o default de mensagens e às vezes acabo não vendo outras que chegam. Pra tentar resolver esse problema, fiz um macro pra sumonar o pet caso não tenha nenhum pet do tipo na tela (pet de outras pessoas irão afetar).


     

    petName = 'Mercenary'
    macro(60000, function()
    pet = getCreatureByName('Pet ' .. petName)
    if pet == nil then
    say('!pet summon,' .. petName)
    end
    end)

     

    Uma coisa que já causou muitas mortes por distração nos meu chars foi trocar de personagem e esquecer de mudar as configurações de cura e poção. Pra isso fiz um macro que seleciona a magia e poção correta de acordo com a vocação (pra simplificar pulei a parte de checar a vocação).

    Spoiler

     

    
    -CURA
    macro(200,  function() 
    
      if hppercent()<75 then
        say("exura gran san")
        say("exura max vita")
        say("exura gran mas ico")
      end
    end)
    
    --USA POT DE MANA
    macro(1000,  function() 
    
      if manapercent() <=25 then
        useWith(23373, player)
    
        useWith(238, player)
    
        useWith(237, player)
      elseif manapercent() > 25 and manapercent() < 50 then
        useWith(238, player)
    
        useWith(237, player)
      end
    end)

     

    Qualquer dúvida é só mandar mensagem pelo discord para #dimerism5429 ou em danae para Heeey/Jhon Snowy/Drurian.

    • Like 2
  10. 11 horas atrás, Coldzera disse:

    @Show Show sou meio leigo com essas coisas, então queria tirar uma dúvida. O script "Atk Closest Target" é para que o pet fique próximo ao mestre e que ele não fique saindo da tela dele? Ou não? Não entendi muito bem a funcionalidade.

    O personagem vai atacar o monstro mais próximo dele (dentro da faixa especificada) e ignorar pets e summons especiais. A principal funcionalidade é não precisar configurar vários monstros diferentes dentro do Target ou escrever " * " e o bot ficar atacando os pets.

  11. 4 horas atrás, Faramir disse:

    mto bom mano !! 

    tomei liberdade de editar seu post só pra não ficar mto grande e já colocar com highlight Lua pra melhor visualização

    Pô, legal! Não sabia dessas opções. Vou usar daqui pra frente. Valeu!

    • Like 1
  12. Sempre vejo o pessoal reclamando dos summons do global que "bugam" o bot, dentre algumas outras coisas. Fiz algumas modificações no macro de auto ataque que já existia:

    1 - Opção de Follow no target.

    2 - Pausa o cavebot enquanto estiver atacando e retoma quando não mais estiver.

    3 - Controle do intervalo de distância dos monstros, ignorando aqueles fora desse intervalo.

    4 - Configuração de duas magias de ataque de acordo com a porcentagem de mana do personagem.

    Qualquer problema ou dúvida pode mandar mensagem ingame para: Heeey, Jhon Snowy, Drurian ou kalastaja. De preferência fala pelo discord (dimerism#5429) que caso esteja afk quando ver respondo. Lembrando que o código deve ser colocado em Ingame macro editor.

    image.png.52e1e5959ae218f3398e824e3bcfb3b8.png

    Spoiler
    
    local monsterList = {}
    local whitelistMonsters = {"emberwing", "skullfrost", "groovebeast", "thundergiant","pet mercenary","pet archer","pet witchdoctor", "pet mage", "pet blaze" , "pet wolf", "pet dog"}
    
    macro(100, "Atk Closest Target", function()
      if g_game.isAttacking() then
        return
      end
      for _,mob in ipairs(getSpectators(posz())) do
        distancia = getDistanceBetween(pos(), mob:getPosition())
        if mob:isMonster() and not table.find(whitelistMonsters, mob:getName():lower()) and distancia >=distMin and distancia <=distMax then
          table.insert(monsterList, {monster = mob, distance = getDistanceBetween(pos(), mob:getPosition())})
        end
      end
      table.sort(monsterList, function(a,b) return a.distance < b.distance end)
      if not g_game.isAttacking() and monsterList[1] then
        g_game.attack(monsterList[1].monster)
      end
      monsterList = {}
    end)
    
    
    macro(100, "Auto Follow", function()
    g_game.setChaseMode(1)
    end)
    
    
    macro(300, "Auto Pause CaveBot", function()
     if g_game.isAttacking() then
      CaveBot.setOn(false)
     else
      CaveBot.setOn(true)
     end
    end)
    
    
    UI.Separator()
    
    UI.Label("Distância para ataque")
    distMin = 1
    distMax = 8
    function Distancia(parent)
        local panelName = "distancia"
        if not parent then
          parent = panel
        end
    
        local ui = g_ui.createWidget("DualScrollPanel", parent)
        ui:setId(panelName)
        if not storage[panelName] then
          storage[panelName] = {
            min = 1,
            max = 100,
            text = 'exura'
          }
        end
    
        ui.title:setOn(storage[panelName].enabled)
        ui.title.onClick = function(widget)
          storage[panelName].enabled = not storage[panelName].enabled
          widget:setOn(storage[panelName].enabled)
        end
     
      
        local updateText = function()
          ui.title:setText("distância >= " .. math.floor(storage[panelName].min*8/100)  .. " e <= " .. math.floor(storage[panelName].max*8/100) .. ' sqms')
        end
    
        local repeatTime
        ui.scroll1.onValueChange = function(scroll, value)
          storage[panelName].min = value
          updateText()
        end
        ui.scroll2.onValueChange = function(scroll, value)
          storage[panelName].max = value
          updateText()
        end
        ui.text.onTextChange = function(widget, text)
          storage[panelName].text = ""
          updateText()
        end
    
    
        ui.scroll1:setValue(storage[panelName].min)
        ui.scroll2:setValue(storage[panelName].max)
        
        macro(1000, function()
          
          if storage[panelName].enabled then
            distMin = math.floor(storage[panelName].min*8/100)
            distMax = math.floor(storage[panelName].max*8/100)
          end
        end)
    end
    Distancia()
    
    UI.Separator()
    
    UI.Label("Magias")
    
    function Magia1(parent)
        local panelName = "magiaUm"
        if not parent then
          parent = panel
        end
    
        local ui = g_ui.createWidget("DualScrollPanel", parent)
        ui:setId(panelName)
        if not storage[panelName] then
          storage[panelName] = {
            min = 10,
            max = 80,
            text = 'exura'
          }
        end
    
        ui.title:setOn(storage[panelName].enabled)
        ui.title.onClick = function(widget)
          storage[panelName].enabled = not storage[panelName].enabled
          widget:setOn(storage[panelName].enabled)
        end
     
      
        local updateText = function()
          ui.title:setText("mana >= " .. storage[panelName].min  .. "% e <= " .. storage[panelName].max  .. "%")
        end
    
        local repeatTime
        ui.scroll1.onValueChange = function(scroll, value)
          storage[panelName].min = value
          updateText()
        end
        ui.scroll2.onValueChange = function(scroll, value)
          storage[panelName].max = value
          updateText()
        end
        ui.text.onTextChange = function(widget, text)
          storage[panelName].text = text
          updateText()
        end
    
    
        ui.scroll1:setValue(storage[panelName].min)
        ui.scroll2:setValue(storage[panelName].max)
        ui.text:setText(storage[panelName].text)
        macro(1000, function()
          
          if storage[panelName].enabled and manapercent() >= storage[panelName].min and manapercent() <= storage[panelName].max then
            say(storage[panelName].text)
            
          end
        end)
    end
    Magia1()
    
    
    function Magia2(parent)
        local panelName = "MagiaDois"
        if not parent then
          parent = panel
        end
    
        local ui = g_ui.createWidget("DualScrollPanel", parent)
        ui:setId(panelName)
        if not storage[panelName] then
          storage[panelName] = {
            min = 10,
            max = 80,
            text = 'exura'
          }
        end
    
        ui.title:setOn(storage[panelName].enabled)
        ui.title.onClick = function(widget)
          storage[panelName].enabled = not storage[panelName].enabled
          widget:setOn(storage[panelName].enabled)
        end
     
      
        local updateText = function()
          ui.title:setText("mana >= " .. storage[panelName].min  .. "% e <= " .. storage[panelName].max  .. "%")
        end
    
        local repeatTime
        ui.scroll1.onValueChange = function(scroll, value)
          storage[panelName].min = value
          updateText()
        end
        ui.scroll2.onValueChange = function(scroll, value)
          storage[panelName].max = value
          updateText()
        end
        ui.text.onTextChange = function(widget, text)
          storage[panelName].text = text
          updateText()
        end
    
    
        ui.scroll1:setValue(storage[panelName].min)
        ui.scroll2:setValue(storage[panelName].max)
        ui.text:setText(storage[panelName].text)
        macro(1000, function()
          
          if storage[panelName].enabled and manapercent() >= storage[panelName].min and manapercent() <= storage[panelName].max then
            say(storage[panelName].text)
            
          end
        end)
    end
    Magia2()

     

    • Like 7
  13. Em 27/07/2021 at 00:42, vishit disse:

    @Faramirman teria como vc ver melhor sobre essas taxa de venda de char que o servidor calcula pq ja eh cobrado 10ppt pra posta char mais as tarifas que o servidor cobra ai o char nosso que colocamos a venda nao vale de nada pelo tempo gasto e ppt investidos teria como melhora essas tarifas ??? talvez com o calculo justo aumente a vendar de char e a circulação de ppt no servidor 

    Eu concordo, mas esse tópico não tá fora da área correta do fórum?

     

    Em 27/07/2021 at 11:12, Romântico Anônimo disse:

    @Faramir gostaria que as taxas para venda de char fossem aumentadas e não diminuidas, um char comprado prejudica o servidor visto que se um player começar do zero fará com que o servidor obtenha muito mais receitas e sendo assim o valor podera ser investido para melhoria do ot e mante-lo online por muito mais tempo.

    Todos pedem facilidades e melhorias, contudo, não pensam que tais facilidades podem atrapalhar o progresso do nosso Ot..

     

    @TOPIC REPROVED 

    Se alguém começando quiser comprar um char vai ter que donatar uma bolada de cara. Ninguém garante que esse cara iria passar anos se matando pra melhorar o char. Tem muita gente que só que entrar, bater um pelego e pronto. Mas vou te ajudar. Vou traduzir o que você quis dizer: Por favor não deixe que alguém possa comprar um char e venha me dar uma surra com 1 dia de jogo. Se puder introduza um sistema em que eu e meus amigos possamos através de power abuse impedir que qualquer player novo entre no servidor e assim possamos nos dar parabéns por sermos os bonzões.

     

    Em 27/07/2021 at 11:51, Coldzera disse:

    Eu compactuo dessa mesma ideia. Acredito que parte do mercado, economia, eventos, quests e hunt em party acabou se perdendo pela praticidade de se upar afk e com a possibilidade de vender/comprar esses chars que são upados. Isso acaba estragando toda a magia de se jogar um MMORPG. Então sempre que houver a possibilidade de facilitar ainda mais esse salto de tudo que um jogo do tipo MMORPG oferece eu serei contrário.

    Mas que o tópico tenha bons comentários para refinar a proposta e quem sabe até mesmo ser implementada no futuro.

    Eu concordo que isso tudo acabou com a magia do tibia, mas é um caminho sem volta. O tibia nunca será o mesmo porque hoje em dia o tempo é mais limitado e infelizmente ninguém tem tempo pra upar na mão o que acaba fazendo as coisas terem menos valor. 

    • Like 2
  14. Em 07/07/2021 at 08:59, Coldzera disse:

    Cara, você simplesmente revolucionou o Tibia. Fez algo que nem o Global fez até hoje.

    Eu particularmente removo todos os efeitos dos jogos que eu jogo para escutar música, mas eu achei incrível isso que você fez. Parabéns.

     

    Foi mal a demora pra responder, além de tá meio corrido esses dias também andei meio doente.

    Acho que a Cip não implementou até hoje por conveniência. Eles sabem que a galera que joga já tá acostumada e vê isso como uma característica do Tibia. Além de que Pra fazer um sistema de efeitos sonoros de verdade ia dar uma baita trabalho.

     

    Em 07/07/2021 at 14:40, Cadwallow disse:

    Ideia vai ser levada para discussão.

    Espero que psosa ser possivel implementar. Acho lgl ter essa opção pra quem gosta.

    Acho que fazendo um sistema bem básico já ficaria bem maneiro. Adicionei mais alguns efeitos esses dias e tentei fazer o esquema da rádio que falei (se não me engano vi a ideia em um vídeo do Carteroide a um ou dois anos atrás). 

     

    Adição de mais alguns efeitos.

     

     "Rádio Tibia" (ainda não tem diferentes "canais")/music player.

     

    Essa é uma versão inicial feita mais com a ideia de ter uma noção de como ficaria o sistema do que ser algo funcional de verdade. Se alguém tiver interesse posso tentar dar uma melhorada em algumas pontos que não estão tão bons na prática, organizar os códigos e arquivos e postar aqui.

  15. Tava com umas 3 ideias aqui,

    1) Um sistema de músicas temáticas de fundo que poderiam depender do local que o player está (hunt, enigma, korneta, livissi, boss, etc) ou de condções como pvp.

    creio que essa parte seja tranquila de fazer.

    2) Um rádio com diversos canais cada um com um tema. Opções de troca de música, de canal e desligar.

    também tranquilo acho.

    3) Esse de longe daria mais trabalho. Adicionar efeitos sonoros ao jogo, sons de hit, magias, ao usar items, andar e o que mais quiserem. No caso aqui o que mais da trabalho é procurar efeitos sonoros online e edita-los. 

     

    Fiz um experimento aqui:

     

    https://youtu.be/hSNeT8NJmuU

     

    Caso alguém mais tenha interesse a gente pode montar um grupo e ir fazendo aos poucos.

     

     

     

     

     

    • Thanks 2
  16. 3 horas atrás, MeLkSz disse:

    Opa Show rl Bom curto bastante caçar no "Otc" Rifts é talz ...

    Recomendo Dms galera quer ta em busca de scprits pra ele vc

    ja me ajudo bastante com uns scprits muito pika <3

     

    Opa, valeu rl! tamo junto! kkkk

  17. Em 25/06/2021 at 12:19, ThiagoMetal disse:

    Acredito que seja aleatório, não acho que tem essa de quem apostou primeiro ganha.. Os números apostados são salvos e o servidor escolhe alguém aleatoriamente dentro de todas as apostas, sendo assim quanto mais apostar maiores são as chances de ganhar. 

     

    thiagoMetal.png.87be85e3cf581f3b679ae0d79d5523ba.png

     

    Tinha visto isso e fiquei curioso pra perguntar umas coisas. Quanto você apostou no total? Qual era sua ideia por trás disso? O site deu um overflow, o jogo também é limitado em 32 bits? Você recebeu todo dinheiro de volta?