UP
– Добавлена возможность коммуникации между ботами
Новые функции:
on_bot_message,
send_to_bot_by_pid,
send_to_bot_by_name
На видео пример авто-ассиста реализованого без внутри-игровой стрелки.
Script 1 – Receiver
Скрипт слушает сообщения от других ботов, получает GID монстра, после чего выбирает и атакует его. Если GID не поступает, скрипт пытается найти моба, на которого указывает стрелка. Если такого моба тоже нет — персонаж начинает следовать за заданным игроком.
Код:
local name_to_assist = "0ne" -- Имя персонажа для ассиста / Player name to assist
local targetGid = nil
local function findMonsterByGid(gid)
local player_coord = game.get_player_coord()
if not player_coord then
return 0
end
local monsters = game.get_closest_characters(
ActorGroup.Monsters,
player_coord.x,
player_coord.y,
player_coord.z,
1000
)
for i = 1, #monsters do
local ptr = monsters[i].ptr
local monsterGid = game.get_character_gid(ptr)
if monsterGid and monsterGid == gid then
return ptr
end
end
return 0
end
local function moveToCharacterIfNeeded(characterPtr, radius)
local coord = game.get_character_coord(characterPtr)
if not coord or not coord.x or not coord.y or not coord.z then
return
end
local player_coord = game.get_player_coord()
if not player_coord then
return
end
local dx = player_coord.x - coord.x
local dy = player_coord.y - coord.y
local dz = player_coord.z - coord.z
local distance = math.sqrt(dx * dx + dy * dy + dz * dz)
if distance > radius then
local angle = math.random() * math.pi * 2
local dist = math.random() * radius
local rx = coord.x + math.cos(angle) * dist
local ry = coord.y + math.sin(angle) * dist
local rz = coord.z
actions.move_player(rx, ry, rz)
end
end
local function findTarget()
-- First try to find by received GID
if targetGid then
local ptr = findMonsterByGid(targetGid)
if ptr ~= 0 then
return ptr
else
targetGid = nil -- Clear if not found
end
end
-- Fallback to party assist
local assist_ptr = game.find_party_assist_marked_character(ActorGroup.Monsters)
if assist_ptr ~= 0 then
return assist_ptr
end
-- Fallback to character by name
local found_ptr = game.find_character_by_name(ActorGroup.OtherPlayers, name_to_assist)
if found_ptr ~= 0 then
moveToCharacterIfNeeded(found_ptr, 75)
end
return 0
end
local function setTargetIfNeeded(targetPtr)
if targetPtr == 0 then
return
end
local current_target = game.get_player_target()
if current_target ~= targetPtr then
actions.set_target(targetPtr, true)
end
end
local function attackCurrentTarget()
local current_target = game.get_player_target()
if current_target ~= 0 then
actions.click_on_target(current_target)
sleep(100)
actions.use_bar_action(1, 1)
end
end
events.on_bot_message(function(senderPid, message)
local gid = tonumber(message)
if gid then
if gid == 0 then
targetGid = nil
print("Target cleared by bot " .. senderPid)
else
targetGid = gid
print("Received monster GID: " .. gid .. " from bot " .. senderPid)
end
end
end)
while true do
local targetPtr = findTarget()
setTargetIfNeeded(targetPtr)
attackCurrentTarget()
sleep(100)
end
Script 2 – Sender
Отравляет GID выделенного монстра боту с ником "Two".
Код:
local receiver_name = "Two"
local last_target = 0
while true do
local current_target = game.get_player_target()
if current_target ~= last_target then
if current_target ~= 0 then
local gid = game.get_character_gid(current_target)
if gid then
bot.send_to_bot_by_name(receiver_name, tostring(gid))
print("Sent GID " .. gid .. " to bot " .. receiver_name)
last_target = current_target
end
else
bot.send_to_bot_by_name(receiver_name, "0")
print("Target cleared - notified bot " .. receiver_name)
last_target = 0
end
end
sleep(100)
end
– Обновил документацию в шапке.
Можете вставить её, например, в VS Code, и IDE будет показывать подсказки.