Как Я открывал сервер World of Warcraft

Часть 1

Уже довольно долгое время назад у меня появилась идея поднятия собственного сервера World of Warcraft, так как все пиратские сервера не отличались особым качеством и полностью кишили неадекватной администрации, у которых по серверу бегает половина ГМ персонажей, хотя были и хорошие сервера, но там меня не ценили… Это отдельная уже история, о ней Я может быть расскажу позднее, а сейчас вернёмся к небольшому экскурсу в историю…
3 года назад, когда интернеты были медленные, а о мощных серверах Я только мог мечтать, Я познакомился с интересной личностью под ником ZloFenix. Тогда он был администратором портала zlofenix.net.ru. Тогда всё собирались всё поднять, но никак руки ни у кого не доходили, так как боялись, что может не хватить ресурсов сервера, который тогда ещё стоял у жадного местного провайдера, который ничего не умел, кроме как хапать деньги. И вот Буквально пол года назад ZloFenix ставит сервер в дата центр в Москве и переносит всё туда, так как старый его сервер окончательно скончался.
Месяц назад мы решаем с ним открыть совместный проект World of Warcraft под названием WoW Fenix, который был был нечто нейтральным между моими и его проектами и относился к обоим порталам.
Решено было ставить сервер на его железке, так как в это время Я как раз устанавливал новый маршрутизатор и в то время было много перебоев в работе сети. Сначала был открыт 1 мир с FUN рейтами, о котором Я так долго мечтал, так как у меня была уникальная идея по организации игрового мира с ролевыми элементами. На данный момент наш сервер обладает двумя реалмами с рейтами х5 и фан. Главным реалмом является всё таки фан. Ведь в него было вложено столько сил и идей, без которых бы ничего не было, которые обдумывались и планировались на ротяжение долгих месяцев.

Часть 2

Сервер стоит, аптайм с каждой миллисекундой растёт, но онлайна нет. ZloFenix ушел от сервера и Я полностью отвечаю за его работу и мне одному приходится пересобирать ядра, исправлять все баги. Не успеваю собрать одно ядро и настроить его, так через 2 дня выходит уже новый билд и всё приходится делать заново. Всё это время, пока Я молчал в блоге, Я занимался разработкой уникального личного кабинета для сайта, что бы игроки могли удобно пользоваться веб интерфейсом управления своим аккаунтом. Кстати, следующая часть будет посвящена как раз ему.
Ну что Я сделаю, если нет онлайна? Поспамил немного на тематических форумах — собрал первых игроков. Недавно нашлись люди, которые охотно помогли разместить сервер во всех рейтингах. Недавно сервер взял свой рекорд — 15 человек онлайн.

Часть 3

Как и обещал, посвящаю эту часть сайту сервера.
Ещё до открытия сервера Я долго думал, какой сайт взять за основу.
Было много вариантов от уже готовых сайтов, которые использует одно быдло, до идея с разными редкими cms.
Так и решил Я, что сайтом для сервера будет моя любимая e107. Но в ходе оказалось, что малолетним людям не нравятся простые дизайны. Им надо по 10мб картинок только на главной и ещё по 50мб картинок в закладках, но так как Я противник всех наворотов и любитель простоты, то решил поставить точно такую же тему, как и на этом портале. только на зло быдло упростить её ещё больше.
Сайт работал, аккаунты к серверу регистрировались отдельным скриптом.
Потом захотелось сделать что-то типа личного кабинета. Было скачано парочку скриптов личных кабинетов от разных разработчиков, но все они оказывались либо работающими на 1/10 от общих функций, либо не работали вообще, так как были написаны под старые версии баз, которые уже давно не поддерживались. Копался-копался, смотрел, как они устроены, по какому принципу работают и тут меня осенила величайшая идея из всех, которой Я занимаюсь и по настоящий момент. Почему бы не написать личный кабинет прямо модулем к e107, что бы он использовал регистрацию e107 для входа в игру и имел бы жесткую привязку аккаунта на сайте к аккаунту в игре.
Уникальная идея есть — можно идти реализовывать.
С начала всё выглядело на стадии «зародыша», который мог только показывать небольшую часть информации об аккаунте. Кстати, ещё были личные кабинеты, рассчитанные на 1 игровой мир, но так как у меня изначально было 2 мира и в будущем Я планирую расширение, то такой личный кабинет мне не подошел бы.
Следующем шагом было создание собственной валюты в личном кабинете, за которую игроки могли бы покупать себе вещи. Как обычно, бонусы даются за голосование в топах, либо за благотворительно сть. Затем, одним из очень сложных шагов было создание уникальной функции для подобных проектов — это реферальная система. То есть, игрок приводит в игру нового игрока и получает за это бонусы.
Проверку начисления бонусов Я решил сделать очень простой и в тоже время очень действенной, которую обойти не удастся ни каким образом, так как бонусы за рефералов начисляются только, если сам реферал провёл в игре в общей сложности 24 часа — и серверу общий онлайн подымут, если захотят накрутить и себе бонус заработают. Всё честно и справедливо.
Дал ее были написаны все остальные банальные функции: Покупка бонусов за деньги, «Вытаскивание» персонажа в случае застревания, лог операция личного кабинета и куча разных других фич.
Последний скрипт, с которым Я провозился сегодня весь день, до самой ночи, и который заслуживает отдельного внимания, это Связь с администратором.
С виду скрипт не обладает ни чем особенным, но на самом деле это не так, ведь из всех 1600 строк, из которых состоит мой личный кабинет и 70кб, только 200 строк относится к данному скрипту, ведь всё не так просто, как кажется с первого взгляда.
Ведь, этот скрипт дал начало новому уровню личного кабинета, когда он разделился на 3 уровня доступа — Администратор, ГМ и обычный пользователь.
Мо гу дополнить, что в функцию администратора входит начисление бонусов на аккаунты, через веб интерфейс, просмотр всех логов, кто, что и кого покупал. К правам ГМа на данный момент относится только просмотр и ответ на вопросы в форме связи с администрацией, ну а юзерам обычные штучки, которые доступны всем смертным, гыгы.
Ну так вот…
Суть всей сложности данного блока скрипта заключается в том, что здесь идёт жесткий контроль против всего, как SQL инъекции, так и фильтрация флуда и бреда, есдь школота она такая… Решил поделить все сообщения на открытые и закрытые.
Открыт ыми считаются те, на которые ещё нету ответа, а закрытые, на которые уже дали ответ, соответственно. Если на аккауте уже есть 1 не закрытый вопрос, то открыть второй уже нельзя — нужно либо удалить старый и создать с дополненной информацией, либо ждать ответа на уже заданный вопрос. При попытки создать новые вопрос, с уже имеющимся открытым вопросом, старый просто удаляется, что бы не создавать загромождения в базе, да и просто не создавать мусор, так как Я за полную оптимизацию всего и мне не нужны скрипты, которые будут секунду обрабатывать запросы.
Если человек получает ответ на свой вопрос, то его сразу информируют об этом на главной страницы личного кабинета. Дабы не быть уж слишком назойливым с данным вопросом, да и просто не мозолить игроку глаза, добавил функцию «спрятать ответ», которая убирает ответ из поля видимости игрока, но при этом все ответы и запросы к администрации отображаются в логе всез запросов и если игрок что-нибудь забыл, то он сможет открыть историю и прочитать ответ снова.
Ещё из одной очень важной особенностью данной функции является парсер тикетов из самой игры. То есть, если игрок напишет тикет в самой игре, то он будет немедленно перенесён из игры в личный кабинет, дабы на него смогли дать ответ администраторы или ГМы сервера. Так же, после ответа, игрок получает оповещение об ответе в личном кабинете.

Часть 4

Рас уж речь пошла о моих скриптах, а обсуждать их и хвастаться ими Я могу бесконечно, решил посветить 4 часть продолжению третий — буду дальше расхваливать наш личный кабинет.
Суть оригинальности моего скрипта состоит в том, что он полностью интегрирован в рабочее ядро e107( сайта ), на котором всё и работает. Игрок может с того же аккаунта писать на форум, заходить в игру, пользоваться личным кабинетом. Всё это даёт один огромный плюс, которого нету ни у одной другой системы — полная интеграция всего, то есть, Вам больше не надо в каждом месте вводить свои логины и пароли от игры, от сайта, от форума — всё в 1 месте и это всё может спокойно храниться в Ваших куках, дабы не утруждать Вашу жизнь запоминанием лишний информации, ведь Вы в любой момент можете восстановить Ваш пароль, через форму восстановления пароля, если по каким-то причинам забыли его или потеряли.
В этой главе Я Вам хочу рассказать о том, как Я побеждал баг донат-системы, а именно покупки вещей из личного кабинета. Изсамым начально Я делал свой скрипт по форме и подобию старой версии MangPanel, которая стояла у моего давнего знакомого — администратора игрового сервера wow-qrsk. Просить скрипты Я не хотел, так как знал, что могу написать лучше — это всего лишь вопрос времени. Переписал все функции, которые умеет mangpanel и тут, когда Я уже упёрся в тупик и мой скрипт умел всё, нужно было начинать писать систему, которая обменивала бонусы( валюта моего личного кабинета ) и отсылала бы вещь игроку на почту, прямо в игру.
Как Я добился отправки вещь на почту? Это было самым сложном этапом на тот момент, так как суть отправки вещи делилась на 3 действия: создание письма, добавление вещи в письмо и тут самое интересное — добавление данных о существование вещи. Ведь вещь должна существовать в мире. Не отсылать же пустоту. Данный этам у меня вызвал очень много вопросов и непоняток, так как точной документации на данную функцию ни где нету и пришлось самому понимать, что к чему. Могу сказать, что поле данных, которое несёт в себе информацию о существование вещи состоит из множества нулей и имеет подобный вид: 6 0 1 6 128472748 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
Я решил делать всё научным методом — в игре создал вещь, через команду, и заглянул в таблицу и увидел все данные о существования и принадлежности данной вещи конкретному персонажу — именно то, что мне и надо! Я взял готовую вещь и в известные мне переменные подставил свои, а именно id вещи, её владелец. С остальными 60 переменными Я так и не разобрался для чего они, но скрипт работал. При выполнение скрипта, вещь приходила на почту — вроде бы всё отлично, а нет. Далее стало известно, что не для всех типов вещей подходит такая система, например, у сумок, маунтов другая система существования вещи. К пирмеру, для сумки в самой базе нулей и единиц записывалась ёмкость сумки. Всё это вызвало в моём скрипте очень большую систему проверок типов и вещей, да бы точно выбрать схему и форму, по которой её надо обработать и отправить.
Всё работало. Лично Я тестировал данную систему около 100 раз, если не меньше — все 100 раз всё приходило отлично, что говорило, что процент запросов с ошибками = 0, но не тут-то было! ИГроки часто жаловались, что вещь пропала, что не дошла. Проверяю сам — всё доходит и судя по логам личного кабинета, тоже всё сходилось. Но жалобы поступали. Я проанализировал логи и понял, что игроки не могут обманывать, так как, к примеру, он купил вещь и говорит, что она ему не пришла. Допустим эта вещь, штаны, которых ему одних хватит и смысла обманывать меня нету, так как со вторыми такими же штанами он не сделает. Я естественно сразу же вручную прописывал снова вещи игрокам. Такой расклад меня не устраивал, так как жалоб становилось всё больше, а понять, почему это происходит, Я так и не мог, ведь у меня всвё работало идеально, когда Я брался сам всё тестировать. И тут начался новый уровень моего личного кабинета — Я решил заменить все sql обращения на telnet обращения прямо к ядру сервера, что 100% избавит от подобного бага, да и просто упростит всю систему, но придаст небольшую нагрузку и небольшой риск падения сервера, так как коннект производится прямо в само ядро игры и как оно себя поведёт от неизвестной переменной не известно. За сутки по документации php-telnet был написан класс обращения к телнету и по небольшому примеру обращения был создан скрипт, который будет залогиниваться в ядро и отправлять заданные переменные. К счастью данный скрипт удалось быстро написать и применить, так как класс уже был написан и нужно было только к нему обратиться. Далее Я просто удалил все sql запросы в личном кабинете, относительно добавления вещей, и использовал прямое обращения к ядру, что сделало мгновенное добавление вещи игроку, ведь в таком случае ему, даже, не приходилось перезаходить в игру, а вещь шла ему прямо на почту. Система работала ( и работает по сей день идеально ). Я себя за этот скрипт уже раз 20 похвалил.
Сейчас у меня есть интересная идея, что бы всем игрокам на аккаунты раз в сутки начислять по 0.1 бонуса, что 100% гарантирует персонажам покупку вещей за определённый срок времени. Таким образом они смогут примерно планировать время, когда можно ожидать обновление гардероба, да и просто немного подтолкнуть людей на участие в голосование за сервер, ведь за это и получают игроки бонусы.
Tags:
games, world of warcraft, game server

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