Создание простого бота для WoW: продолжение

  • Tutorial
Это продолжение предыдущей статьи:
Создание простого бота для онлайн-игры world of warcraft

В этой части я рассмотрю процесс взаимодействия с аукционером и почтовым ящиком. Если предыдущая часть была более общая, то эта часть уже больше связана с миром WoW и многое врядли будет применимо к другим онлайн-играм.



В той статье мы создали бота, который умеет самостоятельно приходить к NPC-аукционеру. Теперь нам необходимо реализовать дальнейшие наши действия. Сначала я немного расскажу как происходит торговля на аукционе. Я лично торгую символами, но аддоны, которые я использую, также позволяют автоматизировать торговлю любыми крафтовыми предметами. Я использую TradeSkill Master, это аддон от авторов auction profit masterа, который раньше назывался quick auctions. Смысл в чем: у меня лежит на аукционе около 400-500 моих предметов. Кроме меня на сервере есть еще 4-5 человек, которые торгуют тем же товаром в таких же объемах. Моя задача — все время держать цену на товар ниже чем у них. Это позволяет делать аддон: он автоматически сканирует аукцион, если находит что кто-то выставил предмет по цене ниже моей он снимает мой лот с торгов. Предмет отправляется на почту. Соответсвенно его потом нужно забрать с почты и выложить по цене ниже чем у конкурентов. Цену назначает также аддон.

Т.е. фактически задача бота заключается в том, что нужно прийти к аукционеру, открыть окно аукциона, запустить выставление на аукцион предметов, затем запустить отмену лотов, когда все отменится — пойти на почту и все забрать, дальше вернуться на аукцион. Бота, который умеет приходить к NPC-аукционеру мы уже написали. Теперь наша задача начать торговлю.

Торговля


Здесь уже идет чистый AutoIt, с небольшим добавлением макросов.
Нам понадобится один макрос, который будет брать в цель аукционера — это
/ц Аукционист Дрезмит

Назначаем этот макрос, например, на кнопку «9». Дальше нам необходимо начать с ним торговлю. Тут тоже все просто: в настройках назначения клавиш, раздел «функции использования целей» надо назначить кнопку «взаимодействовать с целью», я ее назначил на "\" например.
После открытия аукциона необходимо запустить процесс выставления товаров из сумок на аукцион. В моем аддоне это желается простым кликом по кнопке, в других аддонах может потребоваться два клика — не принципиально, все равно функция получается тривиальной:
Func StartPostingAuc()
	Send("9") ; берем аукциониста в цель
	Sleep(300)
	Send("\") ; открываем аукцион
	Sleep(2000); на всякий случай вдруг проблема с пингом или еще что - лучше подождать
	MouseClick("left", 1278, 155) ; кликаем на кнопку "начать постинг"
	Sleep(2000)
	$state = "posting"  ; постинг
EndFunc


Собственно сама функция постинга тоже довольно проста. После нажатия на кнопку у нас появляется такое окно:

В нем внизу идет прогрессбар, а наверху появляется кнопка, по клику на ней наш товар выставляется на аукцион.
Соответственно наша задача кликать по кнопке пока есть прогресс-бар, как только прогресс-бар заканчивается — переходим к следующему шагу — отмене товаров, цену на которые перебили
Func PostingAuc()
	$borderPixelColor = PixelGetColor(937,527); наличие прогрессбара определеяем по его рамке - пока она есть, есть и прогресс-бар
	While $borderPixelColor = 6249826 and $state = "posting" ; пока есть прогресс-бар - кликаем
		MouseClick("left", 1026, 210)
		Sleep(500);		
		$borderPixelColor = PixelGetColor(937,527);
	Wend
	if $state = "posting" then ; если закончили выставлять - переходим к следующему шагу - отмене
		$state = "startcancel"
	EndIf
EndFunc


Отмена ничем принципиально не отличается от постинга, такое же точно окно с прогрессбаром и одной кнопкой. Соответственно функции точно такие же, просто кликаем. Вот собственно и весь процесс торговли.

Перемещение к почтовому ящику


После того, как все отмененные товары попали на почту, надо их оттуда забрать. Для этого мы идем к почтовому ящику. В принципе процесс ходьбы к почтовому ящику почти ничем не отличается от процесса ходьбы к аукционеру:
Также пишем семафор, который будет показывать куда идти. Также делаем поворот системы координат чтобы было проще ориентироваться. Когда персонаж стоит лицом к почтовому ящику угол составляет 2.31 радиан.

Единственная разница: когда идешь в сторону почтового ящика в стенах есть выступающие элементы, в которые я иногда врезался, поэтому при создании семафора я этот момент учел и сделал чтобы при приближении к стене от отодвигался от нее вправо. В принципе это было сделано просто добавлением еще одной ветки в if:
    elseif(mailPosX < 0.2000 and mailPosY > 0.896) then
      PlayerMailGoForvard:SetTexture(1,0,0);
      PlayerMailGoBack:SetTexture(1,0,0);
      PlayerMailGoLeft:SetTexture(1,0,0);
      PlayerMailGoRight:SetTexture(0,1,0);
      PlayerOnMail:SetTexture(1,0,0); 

Т.е. x < 0.2 это пока не выйду из здания, y > 0.896 — приближаюсь к стене, надо отойти. Как только вышел из здания стены уже нет, отходить не надо.

Теперь, когда персонаж пришел к почтовому ящику надо его каким-то образом открыть.
Способ как с аукционером тут не работает — почтовый ящик нельзя взять в цель.
Поэтому тут требуется небольшая подготовка: перед запуском бота необходимо максимально приблизить камеру и сделать чтобы он смотрел вперед и вниз. Раньше api вова позволял узнать текущее положение камеры, и можно было бы написать семафор для управления камерой, но после того как предприимчивые люди написали аддон дополненной реальности, который существенно упрощал жизнь игроку, эту функцию апи запретили к использованию в аддонах. Поэтому придется камеру настраивать вручную, при запуске бота: для взаимодействия с аукционером все равно как направлена камера.

Итак, мы пришли к почтовому ящику, камера направлена вниз. Видим примерно такую картину:

Наша задача кликнуть по почтовому ящику правой кнопкой мыши.
Тут возникают проблемы:
1. мы не можем гарантировать точно точку, в которую мы придем, только примерно
2. почтовый ящик может быть загорожен другим игроком

Эти проблемы означают следующее: мы не можем захардкодить точку, по которой надо кликать, чтобы открыть почтовый ящик, как мы поступаем в случае с другими кнопками.
Но с учетом нашего алгоритма похода к почтовому ящику мы считаем что скорее всего он будет где-то в левой трети экрана.
Соответсвенно напишем функцию, которая будет кликать сначала в то место, где чаще всего находится почтовый ящик, и если она его не находит — кликать по левой трети экрана пока не найдет.
За 9 часов тестирования эта функция только 2 раза не смогла найти почтовый ящик, и то по моей вине: путь до ящика был плохо прописан, персонаж падал с уступа на котором он стоял и ящика на экране вообще не было. Проблема была решена прописыванием в семафор условия, при котором персонаж должен отойти немного назад чтобы не упасть.
    elseif (mailposX > 0.203) then
      PlayerMailGoForvard:SetTexture(1,0,0);
      PlayerMailGoBack:SetTexture(0,1,0);
      PlayerMailGoLeft:SetTexture(1,0,0);
      PlayerMailGoRight:SetTexture(1,0,0);
      PlayerOnMail:SetTexture(1,0,0); 

ПОчтовый ящик в открытом состоянии (слева вверху виден кусок обновленного семафора, более компактного):


Собственно открытие почтового ящика мы будем определять по появлению красной кнопки «получить все». Функция для autoit у меня получилась такая:
Func OpenMail()	
	$x1 = 392 ; позиция, в которой почтовый ящик находится наиболее часто
	$y1 = 382
	While not (PixelGetColor(237,515) = 6226176) ; пока не появится красная кнопка - обходим заданную область поиска
		MouseClick("right", $x1, $y1);	
		$y1 = $y1 + 20
		if $y1 > 620 Then
			$x1 = $x1 + 10
			$y1 = 54			
			if $x1 > 650 and $y1 > 620 Then
				$x1 = 194
				$y1 = 54
			EndIf
		EndIf
		Sleep(200)
	Wend
	MouseClick("left", 237,515)4 когда нашли кнопку - кликаем по ней
	Sleep(1000)
	MouseClick("left", 237,535); убираем с нее мышку
	$state = "givingmails"; переходим к получению писем
EndFunc

При этом после клика по красной кнопке она становится серой до того момента, пока все письма не будут получены

Получение писем


Вообще получение писем работает довольно просто: нужно просто стоят и ждать пока умный TradeSkillMaster не извлечет все письма из почты. Как только аддон все извлечет — кнопка меняется на красную и можно идти обратно к аукционисту: это мы уже умеем.

Казалось бы все, бот написан. Но тут то меня и поджидали самые большие проблемы: узнать о том, что все письма получены, оказалось не такой тривиальной задачей, как выглядело сначала. Вообще есть два способа узнать что все письма получены:
1. кнопка снова стала красной. самый простой вариант, к сожалению — самый редкий.
2. сумки заполнились — при этом кнопка не становится красной и бот мог бы вечно стоять и ждать возле почты. Чтобы решить эту проблему бот автоматически открывает последнюю сумку при запуске и следит чтобы последняя ячейка в ней была пустой. Как только цвет последней ячейки сумки меняется — значит сумки заполнены, пора идти на аукцион
3. иногда trade skill master глючит и некоторые пустые письма не удаляются с почты. В этом случае кнопка тоже никогда не становится красной, даже если писем на почте уже нет. В этом случае проблема решается просто: я взял последний слот почты, и смотрю меняется он или нет: при получении писем они постоянно сдвигаются вверх и слот меняется. Когда все письма получены он перестает меняться. Если он не меняется в течении 20 секунд — значит пора идти выставлять товар.

Итого функция получилась такая:
Func GiveMails()
	if PixelGetColor(237,515) = 6226176 or $i = 25 or not (PixelGetColor(1665, 868) = 2761500)  then ; проверяем на соответствие одному из трех условий
		$state = "goingtoauc"
		$i = 0
	EndIf
	if PixelGetColor(52,470) = $prevcolor then ; сохраняем состояние слота и ведем подсчет секунд, сколько времени цвет не менялся
		$i = $i+1
	else 
		$i = 0
	EndIf
	$prevcolor = PixelGetColor(52,470)
	Sleep(1000)
EndFunc


Все, мы успешно получили письма, возвращаемся к аукционеру!


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

В качестве заключения хочу сказать что разработка ботов для онлайн-игр это как логическая игра:
Как заставить его забрать все письма? Каким образом обойти ту или иную особенность? Как лучше реализовать ту или иную функцию? Выходные считаю проведенными с толком, хорошая разминка для мозгов :)
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама
Комментарии 49
  • –28
    В мире столько всего интересного можно запрограммировать. Более полезного и легального.
    Не распространяйте хотябы свои поделки. И так уже комиссию на аукционе подняли.
    • +37
      В мире столько всего интересного можно почитать.Более полезного и легального.
      Не распространяйте хотя-бы свои комментарии. И так уже флуда достаточно.
      • 0
        *хотя бы
        • 0
          Где тут флуд? Я по существу написал, что подобные «боты» нарушают правила и значит мешают играть другим. Я понимаю, что автором движет интерес к самому процессу программирования и хочу сказать, что интересно писать любые программы. Большинство из них будут полезнее. Неужели это не очевидно?
          • 0
            нарушают правила — да.
            мешает жить другим игрокам (конкретно данный бот) — нет, ниже я это уже аргументировал:
            habrahabr.ru/blogs/gdev/113271/#comment_3636324

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

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

            Кроме того, для написания данного бота нужно очень немного, я лично его написал буквально часа за 2-3 и потом где то час на отладку. Если из интереса писать какие нибудь системные приложения или еще что то сложное — понадобится много времени на разбор теории.
            В данной же теме достаточно опыта программирования на любом языке чтобы разобраться с синатксисом.

            Вы можете предложить другую интересную и полезную тему, разобраться в которой можно за пару часов с утра субботы, я с удовольствием в ней разберусь в следующие выходные.
            • 0
              Программирование и есть процесс автоматизации, не мне же вам рассказывать. Чем глубже изучаешь любую тему, тем интереснее. Можно потратить и всю субботу, не одну. Меньше играть просто надо ) Автоматизация игры — это неправильный и нечестный выход. Зачем вам вообще мучить этот аукцион, если вы даже не играете сами?

              Что касается вреда для самой игры:
              1) «Захватывая рынок» вы не даёт развиваться остальным, нормальным игрокам (продавать за более адекватные деньги).
              2) Из-за ботов поднимается комиссия на аукционе, что тоже не приносит пользы и обычным игрокам.
              3) Вы «обогащаетесь» не участвуя в игре, что само по себе ставит вас в неравное положение с остальными.
              4) Я хочу быть уверен, что в онлайн-игре я играю с людьми, а не с компьютером.

              А аргумент типа «все так делают» и «ничего не изменится» в корне неверен не только в игре, но и в жизни. Что значит «проблемы самой игры»? Вы хотите, чтоб они ещё каптчу поставили на аукцион из-за вас?
        • +3
          Вроде я ничего и не распространял: полностью законченный код я же не выложил.
          тут скорее набор «сделай сам» из функций и пояснений.:)

          кто захочет повторить — все равно разберется, с моими статьями или без них, возможно с использованием моего опыта будет немного проще. информации на эту тему на русском языке довольно мало, поэтому и решил опубликовать свою историю
          • –6
            Если для человека написание скрипта — самоцель, то ваш опыт ему не нужен. Если цель — обманывать других пользователей игры, нарушая правила, то да, пишите ещё.
            • 0
              Когда ты пишешь первый в своей жизни скрипт любой опыт может оказаться полезным
        • +23
          На самом деле создание бота интереснее чем игра)
          • +7
            по сути это уже другая игра, больше похожая на colobot или robocode
          • 0
            Для более надёжного «прицеливания» в почтовый ящик рекомендую использовать максимальное приближение.

            Изменение положение камеры биндится на клавиши. Перед открытием ящика несколько раз нажимаем «приблизить», после открытия — восстановить вид. В таком случае можно целиться хоть в центр экрана=)
            • 0
              Во времена, когда игралось в Ультиму, были UOPilot и Injection…
              • 0
                А сейчас есть Stealth, которому даже клиент не нужен.
                • 0
                  Да, помню как я писал извращенческий скрипт для lumberjacking на Injection и обменивал его на несметные богатства отцов на Drw.ru :)
                  • 0
                    EasyUO вот там расходился скриптами, даже домик у шахты строил для зароботка

                    теперь вот автоматизирую тестирование
                    • 0
                      не-не-не… меня отпустило еще лет 9-10 назад )))
                  • –2
                    Думал будет разбор протокола и настоящий бот, а тут так, эмулятор игрока =(
                    • 0
                      Зря думали, я же специально в заголовке поста написал что бот простой, а в первом посте указал что грязные методы вроде перехвата траффика не использовал потому что палевно — у вова есть достаточно неплохая система самозащиты — warden.

                      да и не перехватишь просто так траффик игры, он хорошо шифруется
                      • 0
                        Понял.
                        Я просто не вкурсе, все мое знакомство с ним заключалось в поднятии локального сервака в сети, в по-моему 2005 году.
                        С тех пор слышал что бы какой-то бот, за которого автора чуть не посадили. На этом мои знания закончились.
                        • 0
                          Там человек напродавал копий своего бота почти на 3 000 000 долларов, близард поэтому с ним и судились.
                          эксперименты вроде моего максимум грозят пожизненным баном аккаунта
                          • 0
                            А у него как работал? Вместо клиента запускался, тогда еще небыло защиты и шифрования протокола? Или патчил процесс в памяти?
                            • 0
                              Работал с памятью процесса
                              вообще большинство ботов, которые сейчас есть, представляют из себя связку приложения, которое работает с памятью, и кликателя.

                              мне было интересно написать бота, который сможет выполнять действия без чтения памяти: команды ему дает игра легальным способом в виде аддона, а кликер действует в соответствии с полученными инструкциями
                              • 0
                                Спасибо за ответы, было интересно.
                    • +3
                      Я писал когда то бота для PW. Он умел мочить мобов, собирать лут и ресы, пить банки, есть пилюли, пользовать полет, спамить в чате, сваливать от нападающего если мало жизни. Можно было зайти двумя клиентами: один- танк, другой прист- летал над танком, в недоступности для мобов, бафал и хилил танка.
                      и даже на пвп задел был…
                      Было жутко интересно.
                      Разбогател неимоверно.

                      Правда я потом подустал от этого, и как-то забил. И одновременно к игре интерес потерял совсем.
                      • +1
                        Пользовал кстати метод инжекции своего потока в процесс клиента.

                        Была еще тема, DLL-injection. Но я тогда до нее так и не дорос. А теперь ленно как-то :)
                        • +1
                          Как было выше метко подмечено это уже совсем другая игра, вспомнил как когда-то писал аим и вх для ксс(с эксклюзивной фишкой для особо наглых — ass shot, убивает тех кто позади тебя, а ты дальше продолжешь бежать) с инъекциями конечно. Если кому интересно поделюсь). Но самый интерес написать.
                      • –1
                        Для линейки такое не пройдет, наверно.

                        Особенно для руофа. В своё время у меня там не работали даже драйвера логитечевской мышки, я уж молчу про всякие кликеры =)
                        • –1
                          А разве L2Walker уже не работает? Он специально для оффа создавался. Платный, но очень функциональный.
                          • 0
                            Своими руками писал бота-рыбака на кликере.
                            Давно, правда, дело было. Уже несколько лет как в ЛА2 не играю =)
                          • НЛО прилетело и опубликовало эту надпись здесь
                            • 0
                              Через веб ограничение в 200 транзакций в день.
                              Отмена/выставление лота на аукцион — одна транзакция

                              У меня 400+ лотов на аукционе, с учетом активных конкурентов количество транзакций в день достигает нескольких тысяч.

                              Веб можно использовать для того, чтобы не сканировать каждый раз весь аукцион — т.е. чтобы приходя на аукцион бот уже заранее знал какие товары надо отменять/выставлять по какой цене, но бегать от аукциона до почты и обратно все равно придется.
                            • 0
                              А если два таких бота столкнутся? Один выставляет на аукцион вещи по n копеек, второй по n — 1, первый опять идет делать дешевле… Покупатели, наверное, будут в восторге )
                              • 0
                                Наверное :)

                                Вообще полный цикл занимает примерно 3-5 минут, 1 цикл это снижение цены на 10 копеек. Два бота будут снижать цену примерно со скоростью 2 золотых в час.

                                Средняя цена на мой товар порядка 100 золотых, т.е. цена на средний товар уйдет в ноль примерно за двое суток.

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

                                  Хотя можно и по 20 золотых сграбить определенный вид товара и начать его продавать.
                                  • 0
                                    Ну просто стоит ограничение не выставлять товар по цене ниже себестоимости. Если кто-то намеренно снизит цену до себестоимости и скупит весь мой товар то я просто вечером после работы сделаю еще товара.

                                    Потери у меня будут в виде недополученной прибыли за то время, пока моего товара не было на аукционе, но убытков я не понесу.
                              • –5
                                Надеюсь, вас когда-нибудь забанят.
                                • +1
                                  когда-нибудь меня в любом случае забанят :)

                                  Но интересно, откуда столько ненависти?

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

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

                                  Кроме того, я не использую его втихую, а выложил свои наработки для всех, так что вполне вероятна ситуация, которую я описал выше, что два бота одновременно убьют цены и рынок станет неприбыльным, что принесет несомненную пользу остальным игрокам на этом сервере — привет халявные символы!
                                • 0
                                  «Моя задача — все время держать цену на товар ниже чем у них.»
                                  не демпингуй!!! :)
                                  • 0
                                    О демпинге речи не идет, занижение на 10 копеек просто чтобы быть в выдаче результатов поиска по аукциону выше конкурентов и люди покпуали у меня, а не у них.
                                    • НЛО прилетело и опубликовало эту надпись здесь
                                      • 0
                                        Если у него тоже бот ситуацию я рассмотрел выше:
                                        habrahabr.ru/blogs/gdev/113271/#comment_3636304

                                        Насчет ограниченности товаров это отчасти правда, но не на рынке символов — тут конкруенты постоянно пополняют свои запасы товара и если не обновлять цены то можно никогда ничего не продать.

                                        Это не как на рынке химии или реагентов, где люди приходят каждый день чтобы купить себе товар в большом объеме, символы каждый персонаж покупает 1 раз 1 штуку и надо чтобы максимальное количество покупок было сделано у меня чтобы получить нормальную прибыль.
                                  • +1
                                    А расскажите о том плагине дополненной реальности, из-за которой запретили функцию определения положения камеры.
                                    • 0
                                      Аддонам как бы нельзя рисовать ничего на объктах в мире, только на интерфейсе пользователя.

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

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

                                      Это очень сильно упрощало PvE-аспект игры: чтобы успешно проходить боссов требовалось просто следовать за метками на полу

                                      wow.curse.com/downloads/wow-addons/details/avr.aspx — ссылка на сам аддон (уже не рабочий, но скрины и описание можно посмотреть)
                                      • 0
                                        это еще не сильно.

                                        сильно — это когда хелпер используя directx-хуки рисует прямо в игровоми мире, к примеру АОЕ зоны, опасные направления и т.п., причем заранее, до их появления и подсвечивает их если игрок слишком близко.

                                        данные обо всем этом прикодят в клиент немного заранее (буквально 1-2 секунды, но их хватает), так что это вполне себе возможно.

                                        естественно это нарушение лицензии, естественно подписка на такие вещи (для юзеров, которые кроме как платить ничего не умеют :) ) стоит дороже чем подписка на сам вов, и естественно, как только очередная такая рисовалка становится достаточно распространена — она попадает в базы античита и начинаются баны.
                                        • 0
                                          Ну, описанное вами невозможно реализовать без вмешательства в процесс игры, а AVR в работе использовал вполне легальные функции API для аддонов, которые правда после этого были убраны
                                    • 0
                                      мм я бы еще добавил проверку на минимальную цену, а то кто-то пропалит тему, и выставит значение в 1 голду и спустит вас с торгового пьедестала +)
                                      • 0
                                        да, в аддоне такое есть, слишком дешевые товары просто не выставляются а лежат в сумках и ждут своего часа.

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

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

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