Jump to content

Magicsea Online

Community
  • Content Count

    43
  • Joined

  • Last visited

  • Days Won

    20

Magicsea Online last won the day on January 14

Magicsea Online had the most liked content!

Community Reputation

82 Good

5 Followers

About Magicsea Online

  • Rank
    Pirate

Recent Profile Visitors

1,680 profile views
  1. Функционал сетевой части уже в LUA и мы начали работать над синхронизацией клиента и игры.
  2. Давно от нас не было новостей и это не значит что мы не работает. Работа идёт, я бы даже сказал кипит... Новый год мы начали удачно, полностью закрыли все открытии вакансии на разработчиков. На данный момент над проектом трудятся 4 C++ и 4 LUA разработчика из них практически все работают над клиентом. Помимо этого мы одновременно работаем с двумя дизайнерами над новым макетом сайта и над прототипом интерфейса игры, наш сайт каждый день наполняется новым функционалом, который вы можете опробовать уже сейчас! Форум так же не стоит в стороне и активно пополняется новыми темами, описывающий наш игровой мир! А игровой мир у нас тоже не прост, так как над ним отдельно трудится наш геймдизайнер! Сейчас мы сильны как никогда, наша большая и опытная команда работает день и ночь, десятки коммитов в сутки в более чем 4 направлениях! Всем добра, развивайтесь, не работайте в одиночку, один в поле не воин!
  3. Полноценно работать - купить на официальном сайте. а так это рулетка, скачиваешь, крякаешь и наслаждаешься или страдаешь =(
  4. Так или иначе все формы должны быть в одном стиле иначе игрок будет чувствовать дискомфорт при обращении с GUI.
  5. Возможно вы пытаетесь декомпилировать файл клиента у которого изменен формат содержания, с которым не знакомо данное приложение.
  6. Нигде нет информации про русский язык, так что не факт что с порога будет мультиязык. Но там его легче завести чем имея легаси исходники пиратии.
  7. Resource и .RES файлы заменить. По факту сборка это файлы в Resource. Если тебя интересуют НПС и квесты обрати внимание на папку scripts/MisScript
  8. Select cha_id, dbo.decrypt( content ) from GameDB.dbo.Resource Парсинг одной из строчек 48@113#1;48; 0,6821,1,0,0,1,1,0,0,0,0; 1,7274,14,0,0,0,0,0,0,0,0; 2,3908,1,5000,5000,0,0,0,0,0,0; 3,1031,44,0,0,0,0,0,0,0,0; 4,4022,1,0,0,0,0,0,0,0,0; 5,7248,29,0,0,0,0,0,0,0,0; 6,7255,7,0,0,0,0,0,0,0,0; 7,7256,3,0,0,0,0,0,0,0,0; 8,1012,1,0,0,1,1,0,0,0,0; 9,207,1,10000,10000,0,10,0,0,0,0; 10,195,196,0,0,0,0,0,0,0,0; 11,266,1,200,1000,23,23,0,0,0,1,26,5,28,5,29,5,27,1,30,0; 12,7254,27,0,0,0,0,0,0,0,0; 13,1137,10,0,0,0,0,0,0,0,0; 14,7651,4,0,0,0,0,0,0,0,0; 15,7653,4,0,0,0,0,0,0,0,0; 16,3457,91,0,0,0,0,0,0,0,0; 17,1082,30,0,0,0,0,0,0,0,0; 18,7654,2,0,0,0,0,0,0,0,0; 19,7250,6,0,0,0,0,0,0,0,0; 20,1860,7,0,0,0,0,0,0,0,0; 21,3085,29,0,0,0,0,0,0,0,0; 22,3084,121,0,0,0,0,0,0,0,0; 23,179,133,0,0,0,0,0,0,0,0; 24,864,1,0,0,1,1,0,0,0,0; 25,3047,10,0,0,0,0,0,0,0,0; 26,6821,1,0,0,1,1,0,0,0,0; 27,3424,9,0,0,0,0,0,0,0,0; 28,3458,56,0,0,0,0,0,0,0,0; 29,1139,20,0,0,0,0,0,0,0,0; 30,3152,91,0,0,0,0,0,0,0,0; 31,6823,1,0,0,1,1,0,0,0,0; 32,7634,121,0,0,0,0,0,0,0,0; 33,7647,2,0,0,0,0,0,0,0,0; 34,7629,107,0,0,0,0,0,0,0,0; 35,7659,198,0,0,0,0,0,0,0,0; 36,4146,1,10000,10000,1000,1000,0,1000000000,0,1,35,0,36,0,39,0,40,0,41,0; 37,7628,167,0,0,0,0,0,0,0,0; 38,7633,116,0,0,0,0,0,0,0,0; 39,7636,2,0,0,0,0,0,0,0,0; 40,7635,114,0,0,0,0,0,0,0,0; 41,7631,14,0,0,0,0,0,0,0,0; 42,4231,1,0,0,0,0,0,0,0,0; 43,7632,67,0,0,0,0,0,0,0,0; 44,7640,2,0,0,0,0,0,0,0,0; 45,1092,47,0,0,0,0,0,0,0,0; 46,7652,1,0,0,0,0,0,0,0,0; 47,7630,185,0,0,0,0,0,0,0,0;1000291035 Номер предмета в ячейке, идентификатор предмета, количество предмета в ячейке, остальные данные(форж, характеристики, вставленные гемы и прочее) Там еще есть type: 0 - инвентарь 1 - временный мешок 2 - банк Могу ошибаться, но это легко проверить. Еще есть look - то что надето на персонажа: Select cha_id, look from GameDB.dbo.character
  9. Данный скриншот является вырезкой из оригинального кода игры, мы больше не используем этот менеджер ресурсов. Просто обращаем внимание разработчиков на те или иные моменты в легаси.
  10. Интересный факт. Менеджер ресурсов - норма для любого высоконагруженного приложения, в нём хранятся все ресурсы необходимые для работы приложения, так называемый кэш. Когда мы начали работать над эффектами, мы задумались о создании собственного менеджера ресурсов, который будет работать в многопоточном режиме для улучшения производительности. Пока мы анализировали код старого менеджера ресурсов, мы обратили внимание на две интересные реализации: 1. Менеджер ресурсов загружает все необходимые ресурсы в оперативную память при запуске игры и помещает в список std::vector. Это примерно 700 элементов. 2. При создании любого элемента в игре (эффект/объект/персонаж) менеджер ресурсов бегает по списку всех элементов внутри себя и вытаскивает необходимый. Если с первым пунктом это не сильно трогает, т.к лишние 200-300 МБ ОЗУ не является сейчас проблемой для современных ПК, то второй пункт открывает глаза на причины просадок при хороший замесах. С персонажами всё понятно, зашли в зону видимости, создали и работаем с ним, а вот с эффектами становится очень интересно. Каждый удар меча по цели создаёт на цели эффект хита, чем больше скорость атаки тем больше создаётся эффектов на цели, каждый раз при этом мы бегаем по списку из 700 элементов ищем подходящий и отдаём из менеджера ресурсов. Для нас это было очень забавно. Использовать ассоциативный контейнер (std::map) вместо обычного списка (std::vector) - это переписать от силы 10 строчек, может дать серьёзный прирост производительности при замесах. Еще больше интересных фактов вы можете узнать в нашем телеграмм канале https://vk.cc/chjcxR
  11. Время от времени мы публикуем интересные моменты при работе со старым кодом игры, новости разработки и другие интересные фишки в нашем телеграмм канале https://vk.cc/chjcxR Присоединяйтесь, задавайте вопросы и учитывайте в своих проектах!
  12. Всем привет Мы чутка освободились и наконец-то пришли с новостями. Предисловие: Вот уже 2 года и 10 месяцев как мы находимся в разработке нашего продукта. Смотря сейчас на пройденный нами путь, мы понимаем, что разработка собственной игры, а тем более кроссплатформенной это не самое быстрое занятие и легкое хобби. Из-за желания сделать продукт идеальный, мы совершали ошибки, за которые уже поплатились самым ценным ресурсом человечества - временем. Если бы можно было вернуться в начало нашего пути и дать пару советов, то мы бы сэкономили как минимум целый год. Но не всё так плохо, самое важное что мы получили - это опыт, опыт который считается бесценным для нас. Позвонить разработчику на мобильный номер и будить его, потому что он в процессе спринта проспал начало работы? - Да, это про нас. Уснуть на стуле или на столе в ночное время пока вы решаете, как в этом чертовом MindPower'e реализована система эффектов? - Да и это про нас. Сломать, построить, сломать и ещё раз построить чтобы потом опять сломать? - Да, увы и это про нас. Мы предусматриваем даже неразумные вещи, которые могут произойти с продуктом в процессе его эксплуатации. Больше 5 млн рублей в нашей excel таблице сейчас в расходах, больше чем десятки тысяч коммитов в репозиториях, мы разобрали эту чертову игру на кусочки и собрали её заново, мы даже знаем кому звонить когда ошибка в графическом движке при воспроизведении анимации (поищите в исходниках "crash!!!, call"), мы уже не просто команда, а уже большая семья. Всё это время мы искали ту самую, единственную, верную тропу по которой нам необходимо идти, и мы её нашли. Ну и к чему же мы наконец-то пришли? Клиент: На данный момент мы переписываем весь функционал клиента прописанный в C++ на скриптовой язык LUA. Для чего? Скриптовой язык LUA является простым на наш взгляд, как минимум проще чем C++, средняя стоимость оплаты труда на порядок меньше, разграничение скриптовой логики и логики движка предоставляет куча безопасности, избавляет раз и навсегда от утечек памяти, скорости работы и самое важное - ускоряет процесс разработки. Множество важных элементов игрового и графического движка мы переписали с 0, такие как рендер карты, игровые эффекты, рендер в принципе. Наш девиз - Кара должна запускаться даже на кофемолке © alex2772. Мы помешаны на оптимизации и не позволяем себе потратить лишние 10 миллисекунд в UI потоке, поэтому всё что можно мы стараемся вытащить в другие потоки без частого использования мьютексов. И конечно, мы понимаем, что какой-то наш забугорный клиент может иметь телефон на какой-то 4.x версии android’a с ограниченным количество CPU и предусматриваем это. Хочется отметить важный факт, что мы делаем клиент игры, который способен работать на 1.38 версии клиента, а с некоторыми доработками и на 2.0. И не исключаем возможность тестирования нашего клиента совместно с руководством и игроками существующих серверов по их желанию. CI/CD: Мы очень активно пользуемся технологией CI и CD. Каждый раз когда разработчик делает коммит в репозиторий, то клиент игры автоматически собирается под все платформы и обновляется на всех платформах. Чтобы залить обновление для клиента, нам достаточно 1 коммита. Сервер: GateServer, GroupServer и AccountServer переписали с нуля, GameServer пока фулл рефактор скриптов. Все сервера переписали под CMake и адаптировали под работу в Linux, затянули их под технологию Docker и сразу же под технологию Kubernetes. Lua игрового мира: Все вы знаете, как выглядит легаси код сервера, как в нем не понятно что к чему - все навалено в один файл и покрыто китайскими комментариями с битой кодировкой. А если копнуть дальше, то можно заметить в коде очень много проблем с глобальными переменными, а также все это сопровождается алгоритмическими ошибками. Когда к нам в команду пришел опытный луа-разработчик, он сказал: “это все говно нужно переписывать, как оно работало - я хз”. Теперь у нас ООП в Луа, мы переписываем легаси архитектуры, к примеру вот так сейчас выглядит обычный диалог с НПС. Теперь не нужно продумывать сложную логику из взаимосвязи страниц, даже разработчики с низким уровнем знания lua разбираются с этим быстрее, чем это было раньше. “У вас много магических чисел - магические числа — это плохо”, он не исправил это, но теперь весь код наполнен комментариями по всем магическим числам, по которым можно дать комментарии. Большинство функций, поведение которых не тривиально описаны и задокументированы. Пример: Вы знаете самые нагруженные функции в луа на вашем сервере? Вы знаете, как их найти? Вот и мы тоже не знали, а теперь в нашем арсенале 3 профилировщика, которые покажут нам, где мы просаживаемся по производительности при росте онлайна. А где же мы берем онлайн, у нас на сайте все время 4% нагруженности было… Наш луа код на сервере покрыт комментариями на 90%, а все что можно шаблонизировать - шаблонизировано или продолжает шаблонизироваться: Кстати, на скриншоте можно еще увидеть новое логирование, которое вываливает traceback и систему мультиязычности сервера. Вы знаете сколько игрок прошел заданий и сколько денег он потратил на лечение? Вот и мы тоже не знали, но добавили больше 100 различных метрик, которые можем анализировать и выводить в красивые и информативные графики. Перебалансированные квесты по наградам и уровням. Теперь мы можем решать чем заниматься игрокам на сервере: - прокачка через убийство мобов: повышаем рейты на убийство опыта, понижаем рейты на получение опыта с заданий, - прокачка через историческую цепочку: понижаем рейты за убийство мобов, понижаем опыт за обычные сайд задания, повышаем за историческую цепочку. При всех этих изменениях мы продолжаем поддерживать старую, добрую Пиратию и в любой момент все наши изменения баланса/экономики за 10 минут откатываются обратно, кроме квестов, наверное. Это все благодаря одному конфигурационному файлу, который отвечает за константные переменные, а также за активацию тех или иных систем. Каждой системе отдельный файл, каждой системе отдельный флаг отключения - мы разбили весь луа код из 10-15 файлов в 250+ и это позволяет лучше понимать работу систем, что снижает порог вхождения новых разработчиков. Наш репозиторий сервера насчитывает более 2500 коммитов, свою руку к коду приложило около 20 специалистов, различной направленности. А через наши файлы в целом прошло больше 60 человек: они рисовали иконки и картинки, писали новые задания, рефакторили старый код, писали новые системы, писали музыку и звуки, изменяли карты, страдали и наслаждались результатом. С каждым разом описывая наши достижения мы хотим поделиться всем, но пока мы писали данный пост мы понимаем что всё описать невозможно, по этому оставим тут самые интересные и важные на наш взгляд новости.
  13. Распишу на будущее как искать подобные проблемы подсматривая в исходный код. При форже LUA вызывают функцию lua_AddItemFinalAttr inline int lua_AddItemFinalAttr(lua_State* pLS) { ... long lAttrID = static_cast<int>(lua_tonumber(pLS, 2)); short sAttr = static_cast<short>(lua_tonumber(pLS, 3)); if (!pSItem->AddAttr(lAttrID, sAttr)) { lua_pushinteger(pLS, 0); return 1; } ... } Тут нам интересна функция AddAttr inline short SItemGrid::AddAttr(long lAttrID, short sAttr) { if (!CheckAttr()) return 0; return CAttr.AddAttr(short(lAttrID), sAttr); } Тут мы видим, что тип аргумента должен быть short Для того чтоб все работало нужно изменить аргументы функции и этот массив + все места где он используется. class CItemAttr { ... private: short m_sAttr[ITEMATTR_MAX_NUM]; ... }
  14. К сожалению, нет возможности изучить код который там представлен. Могу только обратить внимание на то, что нужно четко понимать какой параметр персонажа начисляется и при наложении эффекта и какой вычитается при снятии эффекта. Думаю, проблема кроется где-то там. Речь про параметры, используемые в этих функциях. function Str(a) local str = GetChaAttr(a, ATTR_STR) return str end function StrSa(a) local strsa = GetChaAttr(a, ATTR_STATEC_STR) / ATTR_RADIX return strsa end function StrSb(a) local strsb = GetChaAttr(a, ATTR_STATEV_STR) return strsb end function StrIa(a) local stria = GetChaAttr(a, ATTR_ITEMC_STR) / ATTR_RADIX return stria end function StrIb(a) local strib = GetChaAttr(a, ATTR_ITEMV_STR) return strib end function Str_final(a) local str_final = (BSStr(a) * StrIa(a) + StrIb(a)) * math.max(0, StrSa(a)) + StrSb(a) return str_final end
  15. Создать карту, при запуске ГСа создавать копий карты столько, сколько всего гильдий разрешено(80 штук по умолчанию). При попытке ТП, смотреть ИД гильдии игрока и телепортировать на копию карты под этим номером - профит.
×
×
  • Create New...