• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!
  • 2026 staff recruitment is open! Check it out and consider applying!

scripts/macros for kondras otclientv8 bot

Hey, where is the version if player on screen stop spell attack?
Post automatically merged:


Hey, where is the version if player on screen stop spell attack?

Hey, where i can get scirpt if player on screen stop spell attack?

LUA:
local batman = Game.playerOnScreen()
if batman then
    if batman:attack('SpiderMan') then
        batman:use('exori frigo')
    else
        batman:use('exevo gran mas frigo')
    end
end

try
 
anyone have script for auto target enemy player name?
Post automatically merged:

anyone got script for auto target player name?
 
Cast aoe spell when more than X monsters on the screen, else use single target spell: (there's also a version where it doesn't cast aoe spells if there are players on screen if somebody needs)
pleeease i need this one it would help me a lot
Post automatically merged:

Cast aoe spell when more than X monsters on the screen, else use single target spell: (there's also a version where it doesn't cast aoe spells if there are players on screen if somebody needs)
pleeease i need this one it would help me a lot
 
gostariaa de um script para estar utilizando os scrol do mouse, quando eu scrolar para cima, usar uma certa "magia" e quando eu scrolar para baixo usar outro. Alguem consegue?
 
example of an automatic party (I got it from somewhere else, I don't remember where, so I can't credit it).

LUA:
local infoTime = 0
local talkTime = 0
local maxLevel = 0
local minLevel = 0
local justForInfo = true
local canSeeInfo = true
local partyMembersCount = 0

local partyLeaderHuntWidget = macro(1000, "Party Leader Hunt", function()
  if not player:isPartyLeader() then
    justForInfo = true
    partyMembersCount = 0
    return
  end
  if justForInfo and canSeeInfo then
    sayChannel(getChannelId("party"), "!party info")
    return
  end
  if talkTime > 0 then
    talkTime = talkTime - 1
  end
  if player:getShield() == 10 then
    infoTime = infoTime + 1
    if infoTime >= 20 then
      sayChannel(getChannelId("party"), "!party info")
      infoTime = 0
    end
  else
    infoTime = 0
  end
end)

addLabel("maxLevel", "Max Level:")
addTextEdit("maxLevel", storage.maxLevel or "", function(widget, text)
  if tonumber(text) then
    maxLevel = tonumber(text)
  else
    sayChannel(getChannelId("party"), "!party info")
  end
  storage.maxLevel = tonumber(text)
end)

addLabel("minLevel", "Min Level:")
addTextEdit("minLevel", storage.minLevel or "", function(widget, text)
  if tonumber(text) then
    minLevel = tonumber(text)
  else
    sayChannel(getChannelId("party"), "!party info")
  end
  storage.minLevel = tonumber(text)
end)

onTalk(function(name, level, mode, text, channelId, pos)
  if partyLeaderHuntWidget:isOn() then
    if name == player:getName() then return end
    if text:lower():find("pt") or (text:lower():find("party") and not text:lower():find("!party")) then
      for _, spec in ipairs(getSpectators()) do
        if spec:getName() == name then
          if spec:isPartyMember() then return end
          if spec:getShield() == 2 then
            g_game.talkPrivate(5, name, name .. ", I already invited you")
            return
          end
          if level > maxLevel or level < minLevel then
            g_game.talkPrivate(5, name, name .. ", the minimum level is " .. minLevel .. " and the maximum is " .. maxLevel)
            return
          end
          if partyMembersCount >= 30 then
            g_game.talkPrivate(5, name, name .. ", the party already has 30 players for a better use of the shared experience.")
            return
          end
          g_game.partyInvite(spec:getId())
        end
      end
    end
  end
end)

onLoginAdvice(function(text)
  if partyLeaderHuntWidget:isOn() then
    local explode1 = string.explode(text, "*")
    local explode2 = string.explode(explode1[8], ":")[2]
    if not storage.maxLevel then
      maxLevel = math.ceil(tonumber(string.explode(explode1[4], ":")[2])*3/2)
    else
      maxLevel = storage.maxLevel
    end
    if not storage.minLevel then
      minLevel = math.ceil(tonumber(string.explode(explode1[3], ":")[2])*2/3)
    else
      minLevel = storage.minLevel
    end
    partyMembersCount = tonumber(string.explode(explode1[2], ":")[2])
    if justForInfo then
      justForInfo = false
      return
    end
    if explode2:find(",") then
      local names = string.explode(explode2, ",")
      for i = 1, #names do
        canSeeInfo = false
        schedule(1000 * i, function()
          if i == #names then
            canSeeInfo = true
          end
          sayChannel(getChannelId("party"), "!party kick," .. names[i])
        end)
      end
    elseif explode2 ~= "" then
      schedule(1000, function() sayChannel(getChannelId("party"), "!party kick," .. explode2) end)
    end
  end
end)

onCreatureAppear(function(creature)
  if partyLeaderHuntWidget:isOn() then
    if not creature:isPlayer() then return end
    if creature:isLocalPlayer() then return end
    if creature:getShield() == 2 then return end
    if creature:isPartyMember() then return end
    if talkTime == 0 and partyMembersCount < 30 then
      say("If you want to join the Party, say 'pt' so I can invite you!")
      talkTime = 15
    end
  end
end)

onTextMessage(function(mode, text)
  if partyLeaderHuntWidget:isOn() then
    if text:lower():find("you are now the leader of the party.") or text:lower():find("has joined the party.") or (text:lower():find("has left the party.") and canSeeInfo) then
      justForInfo = true
    end
  end
end)
 
hello, can someone help me with this function for cavebot;
LUA:
-- MOVE ITEM TO EMPTY COAL BASIN / CAVEBOT FUNCTION
-- BY GEMINI

-- START CONFIG
local source_container_id = 3253 -- ID de la Backpack of Holding
local target_item_id = 2114     -- ID del Empty Coal Basin
local move_delay = 500
-- END CONFIG

local tag = "[MoveItems]\n"

function MoveItemToBasin()
    -- Paso 1: Buscar la mochila de origen (Backpack of Holding)
    local source_container = g_game.getContainerByItem(source_container_id)
    if not source_container then
        warn(tag .. "Source container (Backpack of Holding) not found.")
        return true -- Retorna 'true' para indicar que no pudo realizar la tarea pero no hay un error crítico.
    end

    -- Paso 2: Buscar el contenedor de destino (Empty Coal Basin)
    local target_item = findItem(target_item_id)
    if not target_item then
        warn(tag .. "Target item (Empty Coal Basin) not found.")
        return true -- Retorna 'true' si el destino no se encuentra.
    end

    -- Paso 3: Mover ítems de la mochila de origen al destino
    for i = 0, source_container:size() - 1 do
        local item = source_container:getItem(i)
        if item and not item:isContainer() then
            g_game.move(item, target_item:getPosition(), item:getCount())
            delay(move_delay)
            return "retry" -- Retorna 'retry' después de mover un ítem, para que el script siga buscando y moviendo más.
        end
    end

    warn(tag .. "No items to move from source container.")
    return true -- Si el bucle termina y no se movió nada, indica que la tarea ha finalizado por ahora.
end

is a tapic tomb telepor -3, I get this error: WARNING: [BOT] Invalid return from cavebot action (function), should be "retry", false or true, is: nil

1757111223204.webp
 
hello, can someone help me with this function for cavebot;
LUA:
-- MOVE ITEM TO EMPTY COAL BASIN / CAVEBOT FUNCTION
-- BY GEMINI

-- START CONFIG
local source_container_id = 3253 -- ID de la Backpack of Holding
local target_item_id = 2114     -- ID del Empty Coal Basin
local move_delay = 500
-- END CONFIG

local tag = "[MoveItems]\n"

function MoveItemToBasin()
    -- Paso 1: Buscar la mochila de origen (Backpack of Holding)
    local source_container = g_game.getContainerByItem(source_container_id)
    if not source_container then
        warn(tag .. "Source container (Backpack of Holding) not found.")
        return true -- Retorna 'true' para indicar que no pudo realizar la tarea pero no hay un error crítico.
    end

    -- Paso 2: Buscar el contenedor de destino (Empty Coal Basin)
    local target_item = findItem(target_item_id)
    if not target_item then
        warn(tag .. "Target item (Empty Coal Basin) not found.")
        return true -- Retorna 'true' si el destino no se encuentra.
    end

    -- Paso 3: Mover ítems de la mochila de origen al destino
    for i = 0, source_container:size() - 1 do
        local item = source_container:getItem(i)
        if item and not item:isContainer() then
            g_game.move(item, target_item:getPosition(), item:getCount())
            delay(move_delay)
            return "retry" -- Retorna 'retry' después de mover un ítem, para que el script siga buscando y moviendo más.
        end
    end

    warn(tag .. "No items to move from source container.")
    return true -- Si el bucle termina y no se movió nada, indica que la tarea ha finalizado por ahora.
end

is a tapic tomb telepor -3, I get this error: WARNING: [BOT] Invalid return from cavebot action (function), should be "retry", false or true, is: nil

View attachment 94665
Why don't you just write on discord otcv8?

1757181018408.webp
1757181036647.webp

 
anyone can helping me with this i make script auto party but it give me this error when i make it on


image.png


LUA:
local MIN_LEVEL = 100
local MAX_LEVEL = 600
local CHECK_INTERVAL = 1000 -- in milliseconds
local ALERT_SOUND = "/sounds/alert.wav" -- custom sound path (optional)

-- 🧩 UI Panel
local ui = setupUI([[
Panel
  height: 250
  margin-top: 5

  Label
    text: Party Control Panel
    font: cipsoftFont
    color: yellow
    margin-bottom: 5

  Label
    id: nearbyLabel
    text: Nearby Players (Level Range)
    color: #00FF8C

  Panel
    id: nearbyList
    height: 90
    layout:
      type: verticalBox
      fit-children: true
      padding: 2
      spacing: 2
    background-color: #11111188
    margin-bottom: 6

  Label
    text: Current Party Members
    color: #FFD700

  Panel
    id: partyList
    height: 110
    layout:
      type: verticalBox
      fit-children: true
      padding: 2
      spacing: 2
    background-color: #11111188
]])

-- 🧠 Utility: Rebuild nearby players list
local function refreshNearby()
  ui.nearbyList:destroyChildren()

  for _, spec in ipairs(getSpectators()) do
    if spec:isPlayer() and spec:getName() ~= player:getName() then
      local lvl = spec:getLevel() or 0
      if lvl >= MIN_LEVEL and lvl <= MAX_LEVEL then
        local row = UI.DualLabel(spec:getName(), "Lv: " .. lvl, {parent = ui.nearbyList})
        row.left:setColor("white")
        row.right:setColor("#00FF8C")

        local inviteBtn = UI.Button("Invite", function()
          say("invite " .. spec:getName())
        end, row)
        inviteBtn:setWidth(50)
      end
    end
  end
end

-- 🧠 Utility: Rebuild party list with alerts
local function refreshParty()
  ui.partyList:destroyChildren()
  local members = getPartyMembers()

  for _, member in ipairs(members) do
    local name = member:getName()
    local lvl = member:getLevel() or 0
    local share = member:isSharedExperienceActive()

    local row = UI.DualLabel(name, "Lv: " .. lvl, {parent = ui.partyList})
    if lvl < MIN_LEVEL or lvl > MAX_LEVEL then
      row.left:setColor("#FF3333") -- red if out of range
    else
      row.left:setColor("white")
    end

    -- Status color
    if share then
      row.right:setColor("#00FF00")
      row.right:setText("Share ✓")
    else
      row.right:setColor("#FF0000")
      row.right:setText("No Share ✗")
      -- 🔊 Optional alert
      playSound(ALERT_SOUND)
    end
  end
end

-- 🔁 Auto refresh panel every second
macro(CHECK_INTERVAL, "Party Control Panel Refresh", function()
  refreshNearby()
  refreshParty()
end)
 
Back
Top