Pull to refresh

Comments 39

Отличная теоретическая часть, но к счастью я не фанат ММОРПГ. Да и весь интерес от игры пропадает, если за вас играете не вы.
А по-моему, гораздо интереснее, если играет собственный бот. Игры были бы гораздо интереснее, если бы в них по-умолчанию были бы инструменты для программирования ботов, чтобы не делать механическую работу.
UFO just landed and posted this here
Посмотрите в сторону X3… там встроенный «язык программирования» есть, при помощи которого вполне можно автоматизировать часть игры. Такую как торговля, разведка и пр… А самому прикинуться пиратом к примеру.
Но ведь Нотч и пишет игру про «что-то такое»… Забыл только название, шестнадцатеричное какое-то.
0x10c.net
Только, видимо, забросил он этот проект.
Я всегда буду обновлять комментарии перед отправкой
Есть мод под названием ComputerCraft, там можно на Lua запрограммировать «черепашку» на выполнение почти любых нужных вам задач.
Там даже можно запрограммировать «GPS» систему для черепашки и она будет определять свои координаты в мире по дистанциям до компьютеров [спутников] (нативного способа узнать координаты нет :-) )
Интересней когда играет человек. Пишите ботов в оффлайн играх, не портите игру другим людям и разработчикам проектов.
Ну, многие аддоны частично замещают игрока в особенно нудных местах. Например, аддоны для аукциона, которые анализируют текущие предложения и предлагают оптимальную цену для выставляемого товара (т.е. чтобы предложение было немножко выгоднее для потенциальных покупателей). Или TomTom, которому достаточно скормить набор координат, и флай-маунт сам облетит по точкам нужный маршрут.
Сам-то не облетит, ведь аддон не позволяет управлять персонажем.
Я им не пользуюсь, но, по-моему, там схема такая:
1) запихнул набор координат
2) кликнул кнопку — персонаж полетел
3) долетел, что-то сделал, кликнул снова — персонаж полетел дальше.

Выгода в том, что не надо долго втыкать в достаточно нудное занятие (если вы облазили Азерот вдоль и поперек, то лететь в очередной раз на другой конец континента малость скучно). Можно на маршрутках, конечно, но потом всё-равно придётся добираться до нужной точки.
Он просто показывает стрелкой куда лететь и сколько до туда осталось.
Наоборот. Писать ботов — самая интересная часть любой игры.
Если всё же своего бота писать лень, то есть окончательное решение проблемы: Progress Quest
Реквестирую такую статью, но для World of Tanks :)
Не стоит, там и так «оленей» хватает.
Олени вымерли, теперь раки
фу-фу-фу! это ооочень испортит игру союзникам!
Конечно, еще будет замечательно, если отошел в туалет, в тебе всех крипов на линии в Dota 2 зафармило :)
Правда если совсем честно. например за лайфстиллера в доте действительно можно бота написать. закупка щитка, топорика, идти ближе к лесу. На 0.30 идти к легкому спауну крипов. На 0.55 отойти от спауна. на 1.00 продолжить фарм легкого спауна и т.д. Только вот ганги будет очень просты.

Поэтому мне кстати интересно, а разве в этих ботах в wow прописано что делать, если будет нападение? Или если монстры окажутся слишком сильны и убьют тебя?

Хотя если мне не изменяет память, в Dota 2 некоорые боты умеют сами фармить леса, можно в общемто как то налету подключать встроенного бота для фарма, однако опять таки там бывает можно минут 20 в лесу сидеть никто не придет, а бывает уже на первых секундах блочат весь лес и рыскают в поисках тебя.
В описанной в посте ситуации с lol-level подземельем мобы по определению не могут убить персонажа. В WoW, как правило, весь фарм начинается, когда вы достигли максимального уровня. В случае автора — недособрано «что-то» с уровней поменьше. В Стратхольме, если ты максимального уровня, хоть полчаса среди толпы мобов стой — не убьют :)
Да, все верно. В описанном примере подземелье 60-го уровня, а персонаж 90-го. Убить не могут, но оказывают существенное влияние на процесс. Это будет отдельно описано во второй части поста.
У меня был бот для того, чтобы держать ротацию для ферала, ДПС выдавал шикарный и можно было по сторонам смотреть =)
<offtopic>
У меня тоже был бот для ротации. Сначала сделал для ретри-пала чтобы пальцы не ломать, а потом ради интереса для ферала. У меня от ДПСа глаза на лоб полезли — друль в крапо-шмоте выдал в полтора раза больше чем пал в топе.
</offtopic>
Уж Вам ли не знать, как влияет очередной патч на дпс различных спеков.
Чтобы выдавать хороший дпс %your_class% в ветке %your_spec% надо быть роботом. © не моё
А вот слово «марсоход» есть во второй части поста, ждите
Тэг неправильный, не Game Development, а Game Destroyed. Благодаря таким «несложным ботам», многие игры теряют свой смысл.
То, что вы рассказали про слеш-команды — замечательно, но это не к месту. Отладочная информация выводится через простой print в коде (для пущего комфорта отключаются лишние аддоны и конманда /reload биндится на нужную кнопку), либо через чат. Достаточно набрать "/run print(GetPlayerFacing(), GetUnitPitch(«player»))". Ну и конечно же — для отладки необходимо включить опцию в игре: Ошибки сценариев lua.

Не обязательно для каждой текстуры создавать отдельный фрейм. По сути сама текстура — уже фрейм. Ей также можно задать размер и положение. А так как текстура создается на уже существующем фрейме, то можно использовать говотый(на весь экран) UIParent. Про PLAYER_LOGIN тоже: Сбасибо, рассказали про собития, но тут не к месту.

Я считаю что OnUpdate — это слишком часто. Проверте, какую долю секунды повторяется ивент. Наберите в чате "/run local f=CreateFrame(«Frame»);f:SetScript(«OnUpdate»,function(this, elapsed) print(elapsed);this:SetScript(«OnUpdate»,nil) end);". Так как в Autoit наверняка не каждые 5 милисекунд будет проверять цвета, то и в аддоне это незачем. Я для таких целей ставлю счетчик, который обходится дешевле сложных расчетов.

На публику я бы показал именно такой код.
function myCreateTexture(x,y)
	local texture = UIParent:CreateTexture()
	texture:SetPoint("TOPLEFT", UIParent, "TOPLEFT", x*10, y*10)
	texture:SetSize(10,10)
	return texture
end

local textures = {
	myCreateTexture(0,0),
	myCreateTexture(1,0),
}

local timer = CreateFrame("Frame")
timer.elapsed = 0
timer.tick = 0.5
timer.func = function()
    local x, y = GetPlayerMapPosition("player");
    local x1, x2 = math.modf(x*255)
    local y1, y2 = math.modf(y*255)
    textures[1]:SetTexture(x1/255, x2, GetPlayerFacing()/7)
    textures[2]:SetTexture(y1/255, y2, GetUnitPitch("player")/4+0.5)
end
timer:SetScript("OnUpdate", function(this, elapsed)
	this.elapsed = this.elapsed + elapsed
	if this.elapsed > this.tick then
		this.elapsed = 0
		this.func()
	end
end)



Простой, без наворотов, без лишних ивентов и переменных.
Жду с нетерпением части про Autoit.

Большое спасибо за все Ваши замечания. Особо ценными я считаю пример использования elapsed для снижения нагрузки на систему обработчиком OnUpdate и пример упрощенного рисования.

Что касается обработки событий и слеш-команд. Безусловно, можно было обойтись и без них, но мне хотелось их описать, так как их использование неизбежно в любом чуть более сложном аддоне. Даже для наших нужд совсем не помешало бы обрабатывать события PLAYER_REGEN_DISABLED (начало боя), PLAYER_DEAD.

Вторую часть планирую выложить на этой рабочей неделе.
Не знаю, нашли вы или нет, но это и это поможет экипировать бота.
Sign up to leave a comment.

Articles