Як я Доту-ліги відкривав (ч. 1)

Йшов 2006й рік. Це були хороші студентські роки, час розквіту і становлення гри DotA Allstars. У ті часи всі грали в доту через офіційний сервер від Blizzard — Battle.net. Індустрія була дуже мізерна — не було нормальних трансляцій, інтернет у багатьох був ще на adsl, а з подій — мало освітлювані турніри з призами до $5000. Тоді ініціативні гравці збиралися в групи і організовувалися в клани. Саме тоді мені зателефонував мій товариш і запропонував організувати першу Доту-лігу СНД. Це був справжній виклик для мене, і він був прийнятий…

StealthBot

В ті часи я активно боровся з чат-ботами, які могли сидіти на каналі Battle.net, прикидаючись звичайним гравцем в Warcraft. Тоді найпоширеніший і функціональний бот був — StealthBot. У нього були вбудовані функції начебто автокика непотрібних людей з каналу(safelist) і він міг говорити скільки зараз час і вдавати з себе «розумного бота», відповідаючи на заздалегідь зашиті відповіді на команди.

Але в ньому була чудова штучка — автор цього бота надав можливість розширювати цього бота через звичайний текстовий файл script.txt, в якому можна було писати власні скрипти на мові Visual Basic Script. Зі шкільних років я любив займатися програмуванням, а сама гра Warcraft 3 — була моєю пристрастю. Я знав цю гру практично напам'ять, я знав усі звуки всіх юнітів, знав всі ресурси, текстуркі і моделі цієї гри, клепав карти в World Editor е і гордо називав себе мапмейкером.

до Речі про мапмейкерах і дотіКоли вийшла перша повноцінна Dota Allstars 5.84 c, то суспільство мапмейкеров дуже негативно сприйняло цю гру і затаврували непридатною. Всі більш-менш нормальні картоделы так критикували цю «карту»: вона дуже довго вантажиться, в ній купа героїв з «звичайними» здібностями, дуже плоский сценарій, немає ніякого сюжету, вежі занадто сильні, декорації розставлено як-попало ітд…

Чого гріха таїти, я й сам так вважав і критикував цю карту, дивитися на неї не міг.
Але все змінилося в 2005м. Тоді вийшла версія 6.01, яка була дуже добре оптимізована і перероблена. Ця карта завантажувалася навіть швидше, ніж будь-яка інша карта(навіть більш проста). Це був справжній прорив! На жаль, до багатьох мапмейкеров так і не дійшло, чому доту стала популярною, і це зовсім не через відсутність сюжету. Ця карта була збалансованої — в ній можна було грати будь-яким героєм і перемагати!


Життя в Battle.Net'е

Чат Battle.net був досить убогий:
  • У ньому не можна було відкрити окремий приватний чат, у ньому не можна зберігати листування
  • При переході на інший канал, у тебе стирається весь попередній
  • Щоб зайти в Battle.Net потрібен був офіційний CD-KEY — ключ від гри. Якщо у тебе піратський Warcraft — ти не можеш зайти в Battle.net.
  • Історія чату була лише на останню сотню рядків, а більш пізні стиралися
  • На одному каналі могло сидіти не більше 40 користувачів
  • А ще в ньому не можна було копіювати або виділяти текст!
  • Про посилання або смайли я взагалі мовчу
Щоб хоч якось урізноманітнити життя в Battle.Net'е я писав ботів. Перші мої боти могли запам'ятовувати, коли в останній раз такий-то член клану був в онлайні (відвідував канал). Потім через бота можна було залишати повідомлення людині, який зараз оффлайн (свого роду пошта).

У той час єдиною більш-менш нормальної доту-лігою був європейський канал «Clan DCE», де стояв простенький бот, який кикал всіх, кого немає в білому списку. Потрапити туди було досить не просто, хоча і не важко. Але це все було не те. Там не було обліку «поганих» гравців — хто сильно лаявся, або найнеприємніше — виходив з гри до її завершення (лівер). З часом, в DCE рівень гри став падати, ливеры траплялися в кожній грі, і їх просто не встигали банити на каналі.

У підсумку все це наштовхувало на думку, що треба взяти ситуацію в свої руки, і відкрити круту доту-лігу, яка влаштовувала б усіх і вирішувала ці проблеми! Моїх пізнань в ботостроении тоді вистачало, щоб записувати дані в текстові файли і читати з них, і спілкуватися з людьми в Battle.Net. Вся мозаїка потреб і можливостей склалася в голові, і я сказав собі: «Все що треба їсти, я зможу!» і понеслася…

Повітряні замки в голові

Перед створенням ліги, потрібно було вирішити першу дуже важливу проблему: хостити ігри Battle.net'е могли лише ті гравці, у яких відкриті порти або є білі ip-адреси. Такі гравці були рідкістю, і щоб раптом не виникало ситуацій, коли збирався народ пограти, а ні в кого з них немає білого ip-адреси, було прийнято рішення, що починати набір гравців на гру могли тільки гравці, які мають можливість хостити гри. Їм адміни і модератори повинні будуть видавати особливий рівень доступу «Hoster»(Хостер).

Наступною проблемою було те, що коли гравці заходять до кого-то в гру, то бот ніяк не може дізнатися, в яку команду вони зайшли — 1.Sentinel або за 2.Scourge.

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

І тут я вирішив: нехай Хостер починає набір ігри, повідомляючи боту про свій намір. Бот у цей час усім у чат починає кожні 20 секунд повідомляти, що зараз відбувається набір ігри, з ім'ям гри:
«Відбувається набір в гру QDL012. Залишилося місць: Sentinel: 4, Scourge: 5»
Ім'я ігри — це свого роду адресу IP, куди підключатися. Вводячи назву гри в Battle.net'е, гравець потрапляв в цю гру до Хостеру.
Гравець міг зайти за будь-яку вільну сторону, і коли він визначався з вибором, він повинен був повідомити про це боту(з дуже коротким ніком QDL і QD.) через надсилання особистого повідомлення короткою командою:
/w qdl .j1 — значить він зайшов за першу команду
або
/w qdl .j2 — за другу
Як факт підтвердження реєстрації, бот відповідав: Sucess!QDL012;team1

Одна команда з 9 символів запам'ятовувалася досить швидко, більше того, гравці підказували один одному, що треба зробити. Коли всі слоти забиті, і всі гравці зайшли, Хостер повинен був перевірити список гравців, які зареєструвалися» в боте, і перевірити, чи всі гравці відповідають своїм командам. Для цього він відправляв боту команду:
/w qdl .check
і йому у відповідь прилітало довге повідомлення, зі списку гравців по командам:
QDL012 {Sentinels: [1]Quad.Тімс [2]Quad.5min [3]AlfaCriostat [4]y6uBaIIIe4ka [5]remi} {Scourges: [6]Piragok [7]zagalex [8]Fade.Killer [9]Ums.Acc [10]upska}

Хостер повинен був звіритися зі списком, і якщо все гаразд, то повідомити боту про старт:
/w qdl .start
Гра починалася, люди грали. В кінці гри, люди поверталися на канал і повідомляли про результат, хто переміг:
.result 1 — перемогла перша команда The Sentinel
.result 2 — перемогла друга команда The Scourge
.result 0 — нічия. Вона могла статися з різних причин, зазвичай за ліверу.

Коли 51%+ гравців проголосували за якесь рішення, бот виробляв роздачу окулярів — віднімав у переможених, давав перемогли, і записував в статистику гравців +1 перемогу перемогли і +1 поразка переможеним, щоб вести статистику.

В якості способу боротьби з ливерами, ми також попросили гравців повідомляти про ливерах:
.leaver Username
Гравець втрачав свої окуляри, отримував бан, а при перевищенні якого значення виганяли назавжди з ліги.

Ще трохи механіки ботаЩоб людям було зручніше набирати ім'я бота, я їх зареєстрував з дуже короткими ніками:
QDL і QD.

Які «фішечки» були в роботі:
Бували ситуації, коли гравець зайшов в гру і зареєструвався у бота, а хостер його кикнул з гри, гравець автоматично потрапляв на канал. Коли гравець заходив на канал, бот перевіряв — не зареєстрований цей гравець в якій-небудь грі, і якщо це так, то автоматично знімав з нього реєстрацію, і слот в лічильнику гравців звільнявся.

Хостер, відправляючи команду CHECK і отримуючи список гравців, повинен був звірятися — все зареєструвалися правильно. Бувало так, що когось кикнули, а реєстрація не знялася. І щоб хостеру не вводити довгі і складні ніки начебто y6uBaIIIe4ka, хостер міг ввести лише порядковий номер «зайвого» гравця, і бот знімав реєстрацію.
QDL: QDL012 {Sentinels: [1]Quad.Тімс [2]Quad.5min [3]AlfaCriostat [4]y6uBaIIIe4ka [5]remi} {Scourges: [6]Piragok [7]zagalex [8]Fade.Killer [9]Ums.Acc [10]upska}
Hoster: /w qdl .kick 4


Бот вів таймер для кожної гри, і у хостера було 5хвилин, щоб почати гру, інакше гра скасовувалася, хостер отримував штраф, а інший хостер міг оголосити новий набір ігри. Але цей час можна було продовжити, відповідаючи боту на попередження командою .continue.


Пробудження сили

Код був написаний приблизно за 2 місяці. Це був справжній розрив мозку і трансформація мислення, я ще ніколи не писав стільки коду! Ще ніколи не робив повноцінний проект! Соромно це визнавати (але тепер вже не соромно): весь код був написаний з використанням звичайних текстових файлів! Жодних БД, ніяких запитів! Тільки хардкор)
Запускатися вирішили через 2 тижні: у листопаді 2016года. За 2 тижні розмістили інформацію на всіх Dota-форумах, де змогли, а мої товариші соклановцы підготували правила гри і нарахування очок.

Залишається останній тиждень мені мій друг повідомляє, що мене зламали, якісь чуваки запустили свою доту-лігу! Спочатку я не повірив, що таке можливо, що взагалі мене хтось знає, а тим більше зміг розібратися в моєму коді. Пішов на розвідку до них на канал, і виявилося, що це дійсно наші співвітчизники, але які запустили чужого dota-бота, який був копією IRC-дотабота, обслуговуючого найпотужнішу і саму закриту доту-лігу IHCS (про яку ніхто серед простих смертних ніби нас і не знав).
Видихнувши з полегшенням, що мене ніхто не зламував, і впевненістю, що у нас все одно найкрутіший бот, ми не стали змінювати планів і запустилися як годиться.

Запуск

І ось ми запустилися! У перший день листопада у нас було проведено близько 10 ігор. Народ мляво-текуще розігрувався і тягнув своїх знайомих. Ми з радістю додавали в білі списки і дозволяли їм грати. Щоб збільшити потік гравців, ми видавали відразу цілі білі списки на ім'я Клану, наприклад «FADE» — якщо на канал заходив гравець, і він складався в цьому клані, то він автоматично потрапляв в білий список.
А щоб посилити конкуренцію, ми крім списку кращих гравців вели список кращих кланів, в якому враховувалися окуляри всіх участнико в клані.
Через тиждень у нас на каналі вже стабільно 20 осіб, з якими можна почати гру.
Так як в Battle.Net було обмеження — максимум 40 осіб на каналі, то бот згодом навчився кикать з каналу неактивних користувачів, коли канал заповнювався на 90% щоб інші могли без праці зайти.
Через 2 тижні, можна було в будь-який час зайти на лігу і протягом 5 хвилин знайти нормальних гравців, які не ливали.

Ефект очок

Знаєте, чого ми не очікували? А того, що люди, які ніколи раніше не бачили віртуальний лічильник очок (points), перемог і поразок, що вони почали викладатися в іграх на 100%! Вони розуміли, що якщо вони будуть погано грати, то програють. А значить втратять winrate, окуляри і знизяться в рейтингу гравців. Ці прості циферки, які бот говорить в чаті — значили для гравців дуже багато! Бути топ-50 гравцем з 1000 чоловік — це щось та значило!

Як підсумок — на нашому форумі почали вестися гарячі суперечки, хто правий і хто винен. Ми виявили, що наші правила були далекі від досконалості і їх доводилося надалі постійно вдосконалювати — забороняти збирати певні занадто читерські предмети(заборонений був некромикон), розписувати правоту в певних спірних ситуаціях ітд. Дуже швидко ми набрали помічників-модераторів, які могли б кожен день розбирати суперечки, змінювати результати гри і карати гравців.

Ліга жила повним життям спільноти, яке ми об'єднали! Ми створили доту-лігу, і на ній відіграє народ, користується нашими виробами! Це було справжнє юнацьке щастя самореалізації!

Перспективи та монетизація

Зараз досить кумедно це згадувати, але проект взагалі не передбачав ніякої монетизації або комерції! Тоді ми як піонери працювали просто заради слави в інтернеті :). Ні я, ні адміністратори-соклановцы, ні набрані модератори не отримували ні копійки. Та й часи були такі, що з віртуальних грошей були тільки WebMoney, якими користуватися вміли всі.

З часом, ми подружилися з хлопцями, які вперед нас створили лігу, і почали дружити. Виявилося, що організатори особисто знають всіх найкращих Дотеров, і вони розраховували створити закриту лігу, чисто для самих топових гравців, а вони нам обіцяли скидати всіх інших, хто їм не підходив. Нам — додаткова реклама, їм можливість чемно «відмовити» невідповідним гравцям.
Домовилися, а на ділі вийшло зовсім не так, як замислювалося: так як у них було досить мало гравців, щоб зібратися пограти, гравцям доводилося чекати довго, поки збереться 10 топових дотеров. Таке працювало тільки в самі години пік — з 18 до 22ч, а в інші години чекати доводилося хвилин за 20-30, і щоб не чекати, вони просто йшли до нас. Як підсумок — всі грають у нас — і кращі дотеры, і «не кращі». Іноді це призводило до скандалів, інтриг і розслідуванням, наприклад вони за одне літо(неактивний сезон) переманили до себе майже всіх наших адмінів і модераторів. Працювати стало нікому, доводилося заново набирати команду.

Все начебто йшло непогано, але я відчував, що щось не те. Здається, я вже не знав, як можна поліпшити лігу, в силу своїх можливостей. З часом у лізі виявилося досить багато проблем

Знову проблеми

Пройшов 1 рік:
Battle.Net лагал. Ігри, які хостилися через Battle.net, викликали затримки як мінімум в 80мс, в той час як по LAN у затримка була 40мс (це стандартна затримка гри, якщо гра хоститься через офіційний клієнт Warcraft. Набагато пізніше вийшов хост-бот: GhostBot, який радикально зменшив пінг)
Були чітери. На жаль, на кожен новий патч від Blizzard, виходила нова версія MapHacka (бачити всю карту і персонажів поза поля зору), або KickHack'а(хостер міг викинути будь-якого гравця (який йому не подобався, або дуже сильно розгойдав героя) прямо по серед гри, і тому дали бан за ливерство).
Метод набору в гру був несовершеннен. Дуже часто відбувалися абузы з боку Хостерів — вони набирали в свою команду хороших гравців, а в супротивниках залишали самих убогих. Виходило, що якщо ти хостер, то ти можеш з імовірністю 90% здобувати перемоги. Хвиля обурення зростала.
Чат був убогим, не дозволяв ботам занадто багато писати особисті повідомлення або в чат. Тут довелося запустити 2 бота, і частина повідомлень відправляти через другого. Нагадаю, що боти працювали через звичайні текстові файли — по одному на кожного гравця, і на кожну зіграну гру.
HDD гальмував — тоді я навіть не знав, що HDD працює повільно, коли йому треба визначити кращого гравця з 1000 гравців, відкрити 1000 файлів і висмикнути 3 кращих. Треба було вирішувати цю проблему…

Доля

Ви вірите в долю? А я вірю. Точніше впевнився в ній. Ось вам мій приклад:
Пам'ятаєте, я вище писав про лігу DCE? Яка була досить простою? Так ось. Мене тоді все ж додав у білий список мій друг-німець, з яким я познайомився в одній з ігор. Так от, він дізнався, що я пишу ботів, і попросив їм зробити апгрейд бота. Цей хлопець знав PHP і MySQL, але ось ботів писати не вмів і не хотів). Він попросив, щоб бот вмів працювати з базою даних через ODBC-клієнт MySQL, і навіть показав приклади-кодів. Ми провели з ним місяць, він навчив мене SQL, пояснив що таке бази даних, і як в них лежать дані. Так-же він показав мені чарівний unixtime, з яким дуже просто додавати до дат дні, хвилини і секунди, особливо, коли потрібно було давати бан на час. Я зробив йому бота, якого він хотів, який мав прямий зв'язок з БД від сайту, і він зміг у себе реалізувати онлайн-списки гравців.

Розпрощавшись, і озброївшись новою технологією, я за пару тижнів переписав з нуля свого бота на «нову технологію» — MySQL. Це був справжній прорив для мене. Можна було в одну секунду отримати кращого гравця, порахувати очки у всього клану, або вивести статистику по всій грі! Бот почав літати, а гравці отримали нового бота з новою механікою набору ігор, автобалансировкой команд за очками.

Так що там на рахунок долі? Зараз я розумію, що я тоді зайшов у глухий кут, і не знав, куди далі розвиватися. І якби не цей німець (і то не випадкове знайомство з ним під час гри), то він би не навчив мене MySQL, а сам я навряд чи б раптом загуглил «як працювати з mysql».

Я не можу назвати це звичайним збігом, яке призвело до знайомства 2 роки тому, і призвели до поштовху в бік пізнання баз даних і розуміння, що навіть з цього хиленького StealthBot можна чіплятися до великих і крутих баз даних!

Розвиток

Я знайшов цікавий мова AutoIt, з яким написав свою першу програму-клієнта для ліги. Вмонтував у нього детектор найпоширеніших читів, і сказав, що гравці, які будуть грати з ним, будуть отримувати на 50% більше очок. Бажаючі знайшлися, і це був перший цікавий досвід клієнт-серверного програмування.


Враховуючи всі мінуси, які псували гарне враження від гри, я почав шукати альтернативні клієнти і платформи, на яких можна було пограти.

Серед перших піддослідних був Hamachi. На жаль, з ним не склалося — занадто складно налаштовувати, потрібні адмінських права (встановлюється віртуальна мережева карта), але якість зв'язку було гарне, пінг був нижче, ніж у Battle.Net.

Наступним піддослідним була програма Battle Lan — невелика програма, яка транслювала широкомовні udp-пакети розвідники на введені адреси, і таким чином, якщо хтось з білим IP створював гру прямо в локальній мережі, то його могли побачити інші гравець за NAT'ом. Я вмонтував і автоматизував її у своєму клієнті, і деякі гравці могли пограти один з одним. На жаль, рішення виявилося нестабільним — частина гравців бачила хостера, а інша частина немає.


Серед останніх в поле зору потрапив якийсь Good Game Client (GGC, в майбутньому — Garena). В ньому можна було дуже легко пограти як за LAN в такі ігри як Counter Strike 1.6, або Warcraft 3(набагато пізніше була додана DotA). Пінг дуже радував! Коронна фішка була в можливості встановлювати прямі udp-тунелі між гравцями, що знаходяться за NAT, щоб вони могли грати один з одним, навіть не маючи білого ip, більш того, вони були затятими шанувальниками звичайного Warcraft 3 і у них був вбудований оновлюється античит. Щоб грати тут не потрібен офіційний ключ від Warcraft III. В цілому все круто, але під нього не було написано ніяких ботів. Що ж, я міг бути першим!

Використовуючи свої пізнання в AutoIt, я зміг отримувати Handle від вікна чату, і звичайним читанням отримувати поточний текст. Точно також, я отримував handle поля вводу повідомлення, міг вводити текст, і відправляти віртуальний клік по кнопці «Send». Залишилося тільки отримувати список користувачів на каналі, і це теж вийшло. Технічно, я був готовий запустити там бота. Але в цій платформі не було гравців. Ніхто не грав там, всі звикли до Battle.Net.
Це був 2008й рік, начебто не так багато часу пройшло, але тоді у багатьох був платний трафік за кожен мегабайт! І це було неприємно — граючи через звичайний Battle.Net сеанс гри з'їдав близько 1мбайта, а граючи через GGC — гра коштувала 2мбайта (за інкапсуляції даних, що ходять у віртуальному тунелі зв'язку), що для деяких гравців було критично — грати в доту стало дорожче!

Я бачив перспективи в цій платформі, адаптував під неї бота, запустив його там, призначив кількох місцевих гравців адмінами, щоб стежили, і оголосив перехідний період в 1 місяць. Народ тягнувся неохоче, та аж до останнього дня грав в Battle.net'е. Після відключення бота в battle.net'е, народ оголосив демарш, і не став підтягуватися GGC, натомість народ став грати на тій сусідній «закритої лізі» від наших співвітчизників.
Я вірив в успіх, і протягом місяця ми знову стали активно проводити ігри на новій платформі. Вже через рік в Battle.Net нікого небуло, GGC тепер називалася Garena, а гравців у нас стало в 2 рази більше, ніж раніше Battle.Net.

Продовження слідує…
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.