Создание простого бота для онлайн-игры world of warcraft

  • Tutorial
Думаю, тема ботов не оставляет равнодушным ни одного игрока в онлайн-игры. Кого-то они раздражают, кто-то ими интересуется, а кто-то их использует. Существует и некоторое количество людей, довольно маленькое относительно остальных трех групп — это люди, которые этих ботов разрабатывают.
Я предлагаю присоединиться к этой небольшой касте людей и посмотреть изнутри процесс разработки бота.

Предыстория


Как-то раз в выходные я зашел за своего персонажа в world of warcraft. Делать было в игре нечего — все рейдовые боссы уже убиты, друзей для похода на арену нет, остается только выполнение квестов и неспешная добыча золота. Квесты я не очень люблю и свое свободное время в игре провожу обычно возле аукциона — с помощью специальных аддонов скупаю что подешевле и потом продаю подороже, выигрывая на разнице в цене.

Соответственно в голову пришла мысль автоматизировать эти рутинные действия — прийти на аукцион, запустить аддон, покликать в нем на кнопки, дойти до почтового ящика, забрать вещи с почты, вернуться на аукцион и снова запустить аддон, и далее по кругу.

В качестве инструмента для реализации был выбран Auto It, но потом оказалось что задача не такая тривиальная, как выглядит на первый взгляд, и пришлось подключать дополнительные инструменты. Сразу скажу, что никакие «грязные» методы вроде чтения памяти процесса или перехвата траффика я не использовал, только autoit для имитации кликов мышки и клавиатуры и чтения цветов пикселей с экрана.



Предупреждение


Все описанные действия вы производите на свой страх и риск, правилами игры это запрещено и может привести к перманентному бану аккаунта.

Передвижение


Собственно, наверное самая интересная тема при разработке бота — это реализация его перемещения по миру. Сначала я думал что проблем с этим не возникнет — путь у нас простой: аукцион это здание, в котором на такой площадке стоят NPC, с которыми необходимо поговорить чтобы начать торговлю, а почтовый ящик стоит прямо на выходе из аукциона, немного слева. Персонаж поэтому все время ходит как бы буквой «Г», туда и обратно



Я думал что просто засеку сколько времени нужно жать «вперед», сколько «вправо» или «влево» чтобы прийти в нужную точку и просто это захардкожу. Но реальность показала что это сделать нереально: если так делать то возникает проблема с пингом: персонаж иногда пробегал лишнего, иногда слишком сильно поворачивался, способ был совершенно нерабочим.

Но отчаиваться я не стал и начал думать что делать дальше. Казалось бы следующее решение — каким то образом определять где в данный момент находится персонаж, и в зависимости от этого расчитывать куда ему дальше двигаться. Только каким образом получить данные о позиции и угле поворота персонажа без чтения памяти процесса игры? Анализировать целиком картинку или какие то отдельные ее части довольно сложно, скриншот выхода из аукциона:


После недолгих раздумий было придумано решение проблемы: надо писать аддон для WoW, который будет получать данные о текущем положении персонажа (координаты и поворот персонажа) и давать команды, куда надо двигать персонажа. Внешне это должно выглядеть как цветной «семафор» который будет отображать необходимое действие: двигаться вперед, вправо или влево, или поворачиваться. Когда персонаж приходит в необходимую точку семафор должен символизировать что персонаж пришел на место и необходимо выполнять следующее действие. Так как у меня персонаж перемещается между двумя точками, то и семафоворов я решил делать 2: один будет командовать по дороге к аукционеру, а второй — по дороге к почте. С алгоритмом вроде разобрались, далее будут примеры кода (xml — шаблоны аддонов, lua — собственно исходники аддона, и autoit), местами кривоватые и грязноватые, но думаю простительно: на этих языках писал первый раз, и еще до конца не разобрался.

Для реализации семафоров пришлось изучить процесс разработки аддонов для WoW, он очень хорошо описан в WoWwiki

Самая первая версия семафора, она показывала только повернут ли я лицом к аукционеру в данный момент, и подсвечивала зеленым соответствующие блоки:


В качестве основы для своего аддона я взял hello world! аддон, описанный в воввики.
Изначально он не имел никаких графических элементов, соответственно понадобилось добавить в него вывод прямоугольников, а также повесить обработчик . В итоге мой HelloWorld.xml стал выглядеть примерно так:
<Ui xmlns="http://www.blizzard.com/wow/ui/" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://www.blizzard.com/wow/ui/ 
 ..\..\FrameXML\UI.xsd">
  <Script File="HelloWorld.lua"/>
    <!-- Фрейм - контейнер для семафора -->
   <Frame
       name="myTabContainerFrame"
       toplevel="true"
       frameStrata="DIALOG"
       movable="true"
       enableMouse="true"
       hidden="false"
       parent="UIParent">
       <!-- размер фрейма -->
       <Size>
           <AbsDimension x="20" y="120"/>
       </Size>
       <!-- положение - в левом верхнем углу экрана, отступы от краев экрана 20 пикселей -->
       <Anchors>
           <Anchor point="TOPLEFT">
             <Offset><AbsDimension x="20" y="-20"/></Offset>
           </Anchor>
       </Anchors>
       <!-- вложенные фреймы -->
       <Frames>     
        <!-- фрейм - семафор для передвижения к аукциону -->
        <Frame name="myGoToAucFrame">
            <!-- размер - половина родительского фрейма, ниже будет семафор для почты -->
            <Size>
                <AbsDimension x="20" y="60"/>
            </Size>
            <!-- положение - находится в левом верхнем углу родителя -->
            <Anchors>
                <Anchor point="TOPLEFT" />
            </Anchors>        
            <Frames>
            <!-- первый элемент семафора - показывает на месте ли я нахожусь -->
           <Frame name="myTabPage1" hidden="false">
               <!-- находится в левом верхнем углу -->
               <Anchors>
                   <Anchor point="TOPLEFT" />
               </Anchors>
               <!-- размер - ширина как у родителя, высота небольшая -->
                <Size>
                    <AbsDimension x="20" y="10"/>
                </Size>               
                <!-- содержимое фрейма -->
               <Layers>
                   <Layer level="ARTWORK">
                       <!-- текст - нужен чтобы проще было писать скрипты autoit --> 
                       <FontString inherits="GameFontNormal" text="*">
                           <Anchors>
                               <Anchor point="TOPLEFT" relativeTo="$parent" />
                           </Anchors>
                       </FontString>
                       <!-- текстура - ее цвет мы будем менять -->
					<Texture name="PlayerAucViewTrue">
                        <Size>
                            <AbsDimension x="20" y="20" />
                        </Size>
                        <Anchors>
                            <Achor point="BOTTOM" relativePoint="BOTTOM" relativeTo="UIParent" />
                        </Anchors>
				    </Texture>                       
                   </Layer>
               </Layers>
               <Frames>
               </Frames> 
           </Frame>
           <!-- элемент семафора, который показывает что нужно повернуть налево -->
           <Frame name="myGoToAucFrame2" hidden="false">
               <Anchors>
                   <!-- сдвинут на 10 пикселей вниз, чтобы быть ниже предыдущего фреймом -->
                   <Anchor point="TOPLEFT">
                        <Offset><AbsDimension x="0" y="-10"/></Offset>
                   </Anchor>
               </Anchors>
               <!-- размеры - ширина в два раза меньше - справа будет фрейм, сигнализирующий о повороте направо -->
                <Size>
                    <AbsDimension x="10" y="10"/>
                </Size>               
               <Layers>
                   <Layer level="ARTWORK">
                       <FontString inherits="GameFontNormal" text="<">
                           <Anchors>
                               <Anchor point="TOPLEFT" relativeTo="$parent">
                                   <Offset>
                                       <AbsDimension x="0" y="0"/>
                                   </Offset>
                               </Anchor>
                           </Anchors>
                       </FontString>
					<Texture name="PlayerAucViewLeft">
                        <Size>
                            <AbsDimension x="20" y="20" />
                        </Size>
                        <Anchors>
                            <Achor point="BOTTOM" relativePoint="BOTTOM" relativeTo="UIParent" />
                        </Anchors>
				    </Texture>                       
                   </Layer>
               </Layers>
               <Frames>
               </Frames> 
           </Frame>           
          <!-- далее добавляем необходимое количество фреймов по аналогии -->
           </Frames>
          </Frame>
         
       </Frames>
     <!-- обработчики событий - при загрузке аддона и при обновлении данных в игре -->
	<Scripts>
		<OnLoad>
		Semafor_Onload();
		</OnLoad>
        <OnUpdate>
        CheckPosition();
        </OnUpdate>
	</Scripts>
   </Frame>
</Ui> 


Соответственно в HelloWorld.lua необходимо написать соответствующие обработчики. Для того, чтобы узнать, на какой угол в данный момент повернут персонаж, используется функция GetPlayerFacing, которая возвращает угол относительно севера в радианах. Экспериментальным путем было выяснено, что когда персонаж смотрит прямо на аукционера — это угол 5.42 радиана. Но повернуть персонажа точно на этот угол довольно сложно, поэтому допускаем небольшой разброс (5.35 — 5.5 радиана).
function Semafor_Onload()
    print("Hi!");
end

function CheckPosition()
	local facing = GetPlayerFacing();   
    -- проверим куда смотрит персонаж и отрисуем в какую сторону ему надо поворачиваться чтобы смотреть на аукционера
    if(facing <= 5.50 and facing >= 5.35) then
      PlayerAucViewTrue:SetTexture(0,1,0); -- установка цвета текстуры, цвет в формате RGB. 1,0,0 - красный, 0,1,0 - зеленый
      PlayerAucViewLeft:SetTexture(1,0,0);
      PlayerAucViewRight:SetTexture(1,0,0);
    elseif ((facing > 5.50))then
      PlayerAucViewTrue:SetTexture(1,0,0);
      PlayerAucViewLeft:SetTexture(1,0,0);
      PlayerAucViewRight:SetTexture(0,1,0);    
    elseif (facing < 5.35) then
      PlayerAucViewTrue:SetTexture(1,0,0);
      PlayerAucViewLeft:SetTexture(0,1,0);
      PlayerAucViewRight:SetTexture(1,0,0);    
    end
end


Теперь напишем скрипт на autoit, который будет смотреть какой цвет в данный момент у семафора, и поворачивать персонажа в необходимую сторону, и заодно создадим каркас нашего приложения для автоматической торговли на аукционе. Опытным путем было выяснено что цвет пикселя 65280 — это зеленый.
Global $WinName = "World of Warcraft"
Global $state = "stop" 
Opt("PixelCoordMode", 2) ;Отсчет координат пикселей от левого верхнего угла клиентской части окна
Opt("MouseCoordMode", 2) ;Отсчет координат мыши от левого верхнего угла клиентской части окна
HotKeySet("{NUMPAD1}", "GoRotate")
HotKeySet("{NUMPAD3}", "_Exit")

WinActivate($WinName)
WinWaitActive($WinName)	

While 1
	sleep(10)
	Running(); бесконечный вызов этой функции, которая делает необходимое в данный момент действие
WEnd

Func _Exit()
    Exit
EndFunc

Func GoRotate()
	$state = "rotating" 
EndFunc

Func  Running()
	Switch $state
	Case  "rotating" 
		Rotating()
	EndSwitch
EndFunc

Func Rotating()
	While $state = "rotating"
		;определим угол поворота, надо ли поворачиваться, координаты точек, в которых берем цвет, взяты вручную в paintе со скриншота с семафором
		$angleOkColor = PixelGetColor(32,24)
		$angleLeftColor = PixelGetColor(29,36)
		$angleRightColor = PixelGetColor(40,32)
			
		
		if $angleOkColor = 65280 Then
			$state = "starttrading" ;если все ок значит мы на месте - начинаем торговлю
		ElseIf $pxAngleLeftColor = 65280 Then; поворот налево
				Send("{LEFT down}"); жмем кнопку "влево" и засыпаем пока не погаснет сигнал семафора, поворот налево - плавный, иногда поворачивает лишнего из-за этого
				While PixelGetColor(29,36) = 65280
					sleep(2)
				Wend
				Send("{LEFT up}")
		ElseIf $pxAngleRightColor = 65280 Then ; поворот направо - не плавный, чтобы более точно поворачивать
				Send("{RIGHT down}");
				sleep(20);
				Send("{RIGHT up}");	
		EndIf		
	WEnd
EndFunc


Всё, сохраняем аддон, запускаем WoW, запускаем скрипт AutoIt и смотрим на персонажа, который сам поворачивается лицом в нужное направление. Но кроме поворотов надо также реализовать перемещение персонажа вперед-назад и вправо-влево, чтобы он мог приходить к аукционеру от почтового ящика. Удачно, что на пути персонажа нет никаких препятствий, иначе задача была бы сложнее.

А так просто добавляем в наш xml дополнительные фреймы для еще 5 кнопок семафора: положение Ок!, двигаться вперед, двигаться назад, двигаться вправо и двигаться влево, и в lua файле дописываем код, который будет показывать, куда нам небходимо двигаться в данный момент. Эталонные координаты где нам нужно находится мы знаем. Казалось бы тоже все просто, но не тут то было — как мы видели по карте, и уже выяснили когда делали повороты, движение у нас идет под углом к северу. Т.е. при движении у нас постоянно меняются обе координаты персонажа. Считать при этом куда двигаться дальше не очень удобно, поэтому воспользуемся известными со школьного курса формулами для поворота системы координат на заданный угол (в нашем случае — 5.42 радиана)



Теперь при движении к/от аукционера и вправо-влево у нас будет меняться только одна координата. Допишем соответствущий код в наш lua файл и он примет примерно следующий вид:
function Semafor_Onload()
    print("Hi! All done!");
end

function CheckPosition()
	local facing = GetPlayerFacing();
    SetMapToCurrentZone();
	local posX, posY = GetPlayerMapPosition("player");
    
    -- переходим в систему координат относительно аукциона (повернем координаты на угол 5.42 радиан)
    newPosX = posX*math.cos(5.42) + posY*math.sin(5.42);
    newPosY = -posX*math.sin(5.42) + posY*math.cos(5.42);
    newPosX = -newPosX; -- не люблю отрицательные числа :)
   
    
    -- проверим куда смотрит персонаж и отрисуем в какую сторону ему надо поворачиваться чтобы смотреть на аукционера
    if(facing <= 5.50 and facing >= 5.35) then
      PlayerAucViewTrue:SetTexture(0,1,0);
      PlayerAucViewLeft:SetTexture(1,0,0);
      PlayerAucViewRight:SetTexture(1,0,0);
    elseif ((facing > 5.50 and facing < 6.5))then
      PlayerAucViewTrue:SetTexture(1,0,0);
      PlayerAucViewLeft:SetTexture(1,0,0);
      PlayerAucViewRight:SetTexture(0,1,0);    
    elseif (facing < 5.35) then
      PlayerAucViewTrue:SetTexture(1,0,0);
      PlayerAucViewLeft:SetTexture(0,1,0);
      PlayerAucViewRight:SetTexture(1,0,0);    
    end
    -- проверим позицию персонажа и определим куда бежать чтобы попасть к аукционеру
    if (newPosX <= 0.207 and newPosY <=0.889 and newPosY >=0.8875) then
      PlayerGoForvard:SetTexture(1,0,0);
      PlayerGoBack:SetTexture(1,0,0);
      PlayerGoLeft:SetTexture(1,0,0);
      PlayerGoRight:SetTexture(1,0,0);
      PlayerOnAuc:SetTexture(0,1,0);      
    elseif (newPosY > 0.889) then
      PlayerGoForvard:SetTexture(1,0,0);
      PlayerGoBack:SetTexture(1,0,0);
      PlayerGoLeft:SetTexture(0,1,0);
      PlayerGoRight:SetTexture(1,0,0);
      PlayerOnAuc:SetTexture(1,0,0);    
    elseif (newPosY < 0.8875) then
      PlayerGoForvard:SetTexture(1,0,0);
      PlayerGoBack:SetTexture(1,0,0);
      PlayerGoLeft:SetTexture(1,0,0);
      PlayerGoRight:SetTexture(0,1,0);
      PlayerOnAuc:SetTexture(1,0,0);      
    elseif (newPosX > 0.207) then
      PlayerGoForvard:SetTexture(0,1,0);
      PlayerGoBack:SetTexture(1,0,0);
      PlayerGoLeft:SetTexture(1,0,0);
      PlayerGoRight:SetTexture(1,0,0);
      PlayerOnAuc:SetTexture(1,0,0);       
    end
end


Все, теперь у нас получился примерно вот такой семафор:

Осталось дописать по аналогии скрипт AutoIt чтобы когда загораются сигналы семафора он посылал соответствующие кнопки в игру. Единственное с чем я столкнулся — он не дает посылать нормально буквенные кнопки (A/D), поэтому пришлось забиндить стрейф на F6/F7.

Вот собственно и все, после этого мы получаем персонажа, который автоматически поворачивается, и потом бежит и встает возле аукционера.

Объем текста вышел уже достаточно большим, если тема окажется интересной хабрасообществу то в следующих частях расскажу о том, как я реализовывал взаимодействие с аукционером и как получал почту из почтового ящика.

Сегодня в 12 часов я поставил бота крутиться по аукциону, за время его работы (около 9 часов) потребовалось 3 раза вмешаться в его работу — один раз застрял в торчащих элементах стены, после этого я слегка переписал алгоритм бега в сторону почты, и 2 раза промахивался мимо почтового ящика — надо поправить это, пока руки не дошли.
Прибыль за день:

Неплохо при условии что я в процессе не участвовал совершенно :)

Upd:
вторая часть
Метки:
Поделиться публикацией
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама
Комментарии 67
  • +4
    Для action игр не пробовали писать ботов? ну типо… для World Of Tanks например )))
    • +3
      Чтобы вел врага на прицеле и всегда бил в боеукладку? )
      • +5
        Да я вчера только первый раз в жизни попробовал бота написать :)
        сеглдня весь день тестировал, когда убедился в работоспособности решил поделиться
        • 0
          Обалдеть, супер! :) Осталось сделать детектилку мёртвых аукционеров на случай рейда и научить курить по средам. После этого можно запускать на месяц :)
        • 0
          Вообще говоря если в игре есть возможность написания аддонов как в вов, например чтобы над головой врага все время висела плашка уникального цвета, тогда задача нахождния истрельбы по врагу становится довольно простой

          если такой возможности нет то без плясок с памятью процесса сделать бота будет довольно сложно (анализ всего экрана игры в посках врага, с учетом что танки ещеи в кафуляже — это уже из области алгоритмов поиска обьектов на фотографиях, а не ботов для игр)
          • 0
            Читал впечатления человека игравшего в эту игру на китайском сервере, тк там у них в игре капча есть и боты кстати не такие уж тупые, например если едут и упираются в стену могу сдать назад или изменить направление пути. А камуфляж там можно заменить на самодельный wotskins.ucoz.ru/ вот сайт со шкурками так что можно хоть ядовито зеленый и розовый.

            • 0
              Если уж речь о шкурках пошла, то официальный сайтздесь. AutoIt в WOT работает отлично, я настроил быстро несмотря на то что раньше программой не пользовался
        • 0
          А администрацию сервера не смутит что персонаж 9 часов подряд бегает в одном и том же направлении? ))
          • +1
            Для этого написано предупреждение :)
            вообще говоря ботов в вове довольно много разных: для рыбалки, для сбора травы и так далее. Только по ним очень мало информации потому что они коммерческие по большей части: авторы пытаются их продавать. Поэтому и решил рассказать про свой опыт, потому что мне пришлось до всего самом

            вообще говоря отследить такого бота дольно сложно потому что путь ксждый раз разный. А девять часов… Мало ли может мы с женой по очереди бегаем весь день :)
            • +4
              Писать ботов — хорошее, интересное занятие. Постоянное использование в реальной игре — нарушение правил и неуважение к игрокам. Второго делать лично я бы не стал.
              • +1
                Согласен. Да и боты бывают разные. Например, кому какое дело, если игрок использует бота для автоматической ротации дпс? Криворукость игрока остаётся на совести игрока.

                Игры надо проектировать так, чтобы не было смысла в ботах…
            • +2
              во всех играх банят в первую очередь популярных или коммерческих ботов, как правило их можно как-то отследить.
              различных самодельных отслеживать сложнее, их чаще банят по наводке от игроков.
            • +2
              Хорошая статья, буду ждать продолжения.
              • 0
                Ну тут в основном код для AutoIt, думаю что Warden умеет его определять.
                Советую запускать AutoIT от другово юзера и менять название процесса.
                Подобных кликеров и имитации клавиатуры довольно много, но молодцы что сами разобрались)

                • 0
                  Кликер и имитация клавиатуры это известные вещи, я их использую еще с препатча когда для выставления на аукцион стало требоваться на каждый выставляемый предмет клик мышью делать — написал скрипт для автоита который сам кликал мне по кнопке пока я чай пил.

                  Вроде не забанили :))

                  Теперь вот решил развить идею и сделать торговца полностью автоматическим. Для меня был больше интересен не код на автоит, потому что он довольно тривиальный, а реализация перемещения и взаимодействия с аукционером и почтой через систему семафоров, поиск почтового ящика на экране (его же нельзя выделить макросом) и т.д.

                  Собственно в следующей статье расскажу про то, как я работал с почтой и с аукционером — условия на переход к следующему этапу цикла, поиск почтового ящика и т.д.
                  • 0
                    Я давно не играю, но пережил два банхамера один большой связанный с Glider, кстати замечу что он был написан на c#. Потом был mimic, pirox.

                    Замечу, что важным фактором является то где ты юзаешь бота, лучше перенести его в другую столицу. Добавить в перемещение прыжки, левые движения.
                    Это снизит репорты юзеров, которые иногда выходят боком.

                    Мне аукцион неинтересен всегда был, но знаю что большенство кто химичит и работает по схеме купи/продай юзают «Аукционер»(адон не бот — для не играющих), там на сколько знаю всё автоматизированно в плане кликов и забирания с почты.
                    • 0
                      В препатче катаклизма близзарды сделали что чтобы выставить/забрать вещь с аукциона необхоимо обязательно сделать клик мышью.

                      Поэтому все эти аддоны автоматизируют одинаково: предоставляют большую кнопку на которую ты сидищь и кликаешь :)

                      Забираение с почты автоматизировано, но нужно:
                      1. дойти до почты
                      2. открыть почтовый ящик
                      3. нажать кнопку «получить все»
                      4. определить что ты все забрал что есть либо что сумки заполнены
                      5. если все забрал идешь обратно на аукцион выставлять.
                • +1
                  Интересно и информативно написано. Жду продолжения!
                  • 0
                    Я тоже писал абсолютно такого же бота(тот же самый пиксель хант, тот же самый AutoIt), но несколько под другие цели. Пользовался порядка 4х месяцев, бана и флага не получил(интересовался у GM висит ли на мне флаг, его вешает warden или GM, по регламенту они должны предоставлять эту информацию по запросу игрока). В принципе я знал о том что не один я до такого додумался =)
                    • 0
                      ну тут не совсем пиксель хант :)

                      А семафор с заранее известными координатами пикселей, которые управляют движением.

                      Многие пишут ботов, но мало кто делится наработками. Будет больше наработок ботов в открытом доступе — может станет меньше ботов в игре :)
                      • +1
                        Все же это пиксель хант =) пускай даже эти пиксели создаём сами аддоном, надеюсь ваши статьи не разозлят святую инквизицию.
                    • –9
                      для хабра было бы интереснее написать парсер веб аукциона на node.js и самого торгового бота. Кол-во транзакций ограничено — в этом есть своя соль.
                      А вообще есть и бесплатные боты, которые не палятся. И комьюнити у них огого.
                      • +1
                        Веб акуцион для меня не ауктально: торгую символами, по 400+ лотов на аукционе, в день по 2 000 — 10 000 транзакций. Веб-аукцион это так, закупиться фласками по дороге домой если к рейду опаздываешь
                        • –10
                          тут хабр, а не вов!
                          • +2
                            Я хотел сказать что торговый бот через веб аукцион это заведомо бесполезная вещь.
                            зачем его разрабатывать и писать про него? Это же абсолютно пустая трата времени
                        • 0
                          Не палится все до поры до времени.
                          Не заметил обновление Warden'а и все — пока :)
                          • –11
                            ну забанят пиксели, ну и что?
                            • +4
                              Тогда с вашей точки зрения всё что в мониторе пиксели, например программисты занимаются разработкой пикселей.
                              • +1
                                Присядьте. Деньги — это просто бумажки.
                                • –1
                                  Бумажный, довольно защищенный клочок бумаги, эквивалентен к Вашим трудозатратам, который устраняет систему бартера.

                                  А так бы Вам пришлось таскать за собой стадо баранов, чтобы поесть в Макдональтсе.
                                  • –1
                                    Деньги — это высшая форма ликвидного товара.
                                    А у вас детские представления.
                            • +2
                              Увы и ах, но серьезного бота на автоите с вкраплениями Lua не напишешь.
                              Все боты для WoW (да и для Aion) сейчас пишутся, в основном, на C# с применением библиотек типа BlackMagic, которые позволяют активно читать / писать в память процессе. Соответственно, самый сложный этап — поиск оффсетов в памяти процесса.
                              Интересующиеся могут даже скачать исходники некоторые OpenSource ботов. Их в изобилии на www.mmowned.com/forums/
                              • +1
                                Спасибо за ссылку, жалко на эту тему мало русскоязычной информации
                                • 0
                                  <offtopic>
                                  Хм, а почему только в памяти? Я, вобщем-то, совсем не в теме WoW, но самое первое, что пришло в голову это встроиться в передачу пакетов, думаю сетевой протокол уже кто-то разжевал. Или это как-то палится? С другой стороны и внедрение в процесс ведь спалить можно. Как-то не понятно.
                                  </offtopic>
                                  • +4
                                    Пакеты в вове начиная с катаклизма зашифрованы с RSA-2048. Подобрать ключ такой длины нереально
                                    • 0
                                      Не трогал клиенты ММОРПГ, но подбирать-то зачем?
                                      На клиентской стороне шифруем — в памяти клиента и сырые данные лежат, как минимум, на момент передачи в процедуру шифрования перед отправкой пакета. Наверняка шифруется пакет целиком, а не каждая структура данных по отдельности.
                                      • 0
                                        Ну а ключ где вы возмёте, чтоб зашифровать на своей стороне пакет перед отправкой?
                                        • 0
                                          Ну клиент-то сам шифрует, значит и ключ у него есть? :)

                                          Даже если реализован навороченный распределенный протокол генерации ключей, взаимная аутентификация, а сам алгоритм шифрования не RSA ни разу, а нечто жутко сложное и новомодное — мы уже видим весь код клиента и весь его контекст исполнения (регистры и память), значит мы — это клиент (с погрешностью по времени в считанные единицы тактов процессора даже на одном однопоточном ядре).
                                          • +1
                                            Это в теории.

                                            А на практике, если нужно делать что-то кроме пассивного чтения памяти: подмена/инъекция пакетов, модификация памяти, то при любом мелком обновлении придётся полностью анализировать код клиента, чтобы убедиться, что клиент не ввел новую проверку и сервер не обнаружит ваших действий. Цена ошибки высока.

                                            Это примерно как война вирусов с антивирусами (при условии, что вирус уже запущен), и с поправкой на то, что клиенту в случае подозрений достаточно доложить об этом серверу.
                                            • 0
                                              Да, о трудоемкости я даже и не заикался, ибо ужс.

                                              Тем более, когда в популярных ботах:
                                              Соответственно, самый сложный этап — поиск оффсетов в памяти процесса.

                                            • 0
                                              Немного не понял, как мы можем вызвать функцию шифрования клиента? По моему всё что мы можем это перехватить пакет и заменить на свой. Вмешиваться в регистр и память — помоему не лучший вариант Warden(http://en.wikipedia.org/wiki/Warden_(software) ) сразу распознает такое вмешательство.
                                              Теоретически нам нужны только входящие пакеты — там инфа где персонаж находится, сколько у него жизни/маны, кто находится рядом из игроков и мобов — расстояние до них.
                                              И на этих данных уже можно строить бота куда бежать и что делать. Такие функции как взять цель и т.д реализуется внутри игровыми макросами и посылка пакетов на сервер не нужна.
                                              • 0
                                                Я имел в виду только то, что теоретических проблем с подменой пакетов нет. Мы все исходные данные и алгоритмы можем узнать, а значит, можем и проделать те же действия, что и клиент, или заставить его сделать это.

                                                Как тяжко это будет, как обойти античит — это уже отдельные проблемы.

                                                А в данном случае, похоже, лезть глубоко и не надо совсем, как нам автор и показал :)
                                                • +1
                                                  Заменить пакет, не вмешиваясь в регистр и память нельзя, соединение же шифрованное. Заменим пакет — все последующие пакеты перестанут проходить, т.к. нарушится контрольная сумма.

                                                  Может быть возможно сделать MITM и проксировать все пакеты, попутно наблюдая за ними, возможно даже модифицируя.

                                                  По крайне мере два года назад в TBC это работало, достаточно было знать пароль к аккаунту. Для аутентификации использовался SRP и полученный ключ использовался для шифрования, ЕМНИП, почти простым xor.

                                                  Более того, так как размер пакета передаётся в том же зашифрованном канале в заголовках пакета, то наблюдая за размерами передаваемых блоков данных, и вычисляя тем самым размеры передаваемых пакетов (это можно сделать при условии хорошего интернет-соединения), и сравнивая их с зашифрованными заголовками, можно через несколько минут получить ключ шифрования даже без MITM на этапе соединения!

                                                  Хотя вот выше пишут, что начиная с катаклизма шифрование усилили, так что теперь не всё так просто.
                                                  • 0
                                                    ничего там не усилили, по сравнению с WotLK.

                                                    xor, заменили на RC4 еще пару лет назад.

                                                    просто в Cata стало несколько соединений, клиент переподключается по ходу игры и в разные соединения идут разные данные.

                                                    естественно все это нужно отслеживать.

                                                    впрочем, работа с пакетами никогда не была самым простым и удобным способом реализации хоть сколь-нибудь сложного бота.

                                                    самое простое и удобное — это вызовы функций внутри самого клиента (ну и вызовы Lua'шных, с отключеной защитой, там где это удобнее).
                                    • 0
                                      Сколько же у вас свободного времени :)

                                      А ведь вы тут изложили реальный пример заработка :) не кому не секрет что эти голды можно продавать ) и не только в этой игре.
                                      • +1
                                        насчет заработка — была когда-то в игромании достаточно общая статья, про одного весьма предприимчивого человека. сути полностью она, конечно же, не раскроет, но в целом почитать интересно.
                                      • +1
                                        А где собственно процесс торговли?
                                        Что бот скупает, как определяет настоящую цену на товар и по какой цене продает?
                                        • +2
                                          А я тоже для аукциона писал, правда на C# и с чтением памяти таки.
                                          Аддон на Lua записывает в массив всю нужную информацию и команды, а в начало массива — сигнатуру (несколько произвольных чисел).
                                          Потом основной процесс ищет в памяти игры сигнатуру, и считывает всю нужную информацию из массива. Так и быстрее и удобнее, чем пикселями.

                                          Правда у меня ещё рандомизация и по времени, и по выбору маршрута.

                                          А что за аддон, не Auc-Advanced ли?
                                          9к за один день без ручного управления — это как-то многовато.
                                          • 0
                                            Аддон TradeSkillMaster
                                            • 0
                                              Насчет 9к за один день — я и руками такую прибыль иногда получал.

                                              Начертание оно такое, пока люди говорят что оно не прибыльное, и что его понерфили и т.д. — остальные на нем зарабатывают деньги :)
                                              • +1
                                                То есть на профессии?

                                                А ну это не интересно, я думал чистая торговля: «купил/продал», да ещё и чтобы не нужно было вручную анализировать цены.
                                                • 0
                                                  Да, на профессии.

                                                  Не знаю, на профессии заработок устраивает: затраты в день порядка 1-3кг, вычрука 7-12кг

                                                  Хотелось автоматизировать просто рутинный процесс обновления аукционов :)
                                                  • +1
                                                    Просто получается, что для этого нужно ещё и играть, знать тонкости профессии, добывать редкие рецепты, прокачивать персонажа до того уровня, чтобы он мог изучить профессию.
                                                    • 0
                                                      Это верно не для всех профессий (в частности для начертания все обстоит не совсем так. из перечисленного спика нужно только докачать персонажа до 68 уровня)
                                                      • 0
                                                        А голд потом продаете или просто себе оставляете?
                                                        • 0
                                                          ни разу не продавал (но практически все раздал/подарил)
                                                          • 0
                                                            Вот это поворот, честно думал что на продажу, хотя я приценивался, если 1кг стоит 30р, то за сколько ж его покупают у фермеров, совсем смешные деньги выходят
                                                            • 0
                                                              Я обычно просто напивался и шел в оргриммар и там набирал пати 5 человек, мы шли в БРД слушать рок-концерт параллельно я устраивал всякие конкурсы-викторины в чате с призами типа 5/10/15кг и т.д., за вечер 50-150 кг сливал на такие развлечения.

                                                              Было весело.
                                                              • 0
                                                                Хех сорил монетами значит =) теперь все ясно
                                          • +4
                                            следующим шагом предлагаю написать бота для торговли на бирже :)
                                            • 0
                                              Goldman Sachs занимаются этим уже не первое десятилетие. Полагаю, они не единственные.
                                              • +1
                                                да, не единственные, я тоже этим занимаюсь :) вообщем нас много )
                                              • 0
                                                Лучше купи японца
                                              • 0
                                                Еще надо, чтоб при виспах бот отключался от сервера.
                                                Если начнут виспать (игроки, ГМ), а при этом игрок молчит и носится от аукциона к ящику — подозрительно. :-)
                                                • 0
                                                  Берем бота-говорилку, обучаем его на очень-очень ломаном английском — и вуаля, даже если кто поинтересуется — желание интересоваться дальше пропадет почти мгновенно.
                                                  • 0
                                                    это не будет работать на русских серверах.
                                                    • 0
                                                      На русских серверах и так не понятно почти, кто что говорит. =/

                                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.