1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/runsnails-skynet_gameserver_study

В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
README.md 7.1 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 06.06.2025 06:29 f34aa18

-- создано NaiveBug^梁疯

Подготовка перед началом

1: Установите MySQL и добавьте пользователя с именем: iphone, пароль: iphoneGame (или измените пароль в mysql/sql) (ps: обратите внимание на права доступа)

2: Импортируйте sql/sql.sql в базу данных, после чего нажмите start.bat или skynet.exe для запуска сервера игры

-- Объяснение:

1 Этот код предназначен для изучения логики Skynet, а исполняемые файлы exe можно скачать с официального сайта Skynet для Windows (неофициальная версия), если требуется коммерческое использование, то следует перейти на Linux, так как код кросс-платформен и будет работать одинаково.

2 Код находится в code/script, остальное - это оригинальные элементы Skynet.

--

Структура кода: (сначала изучите примеры кода в Skynet)

1 Для каждого игрока существует свой Agent, клиент отправляет данные, которые перенаправляются в netcommon.netPackCommon в Agent, затем данные обрабатываются в net/netcommon.netPackCommon для каждого сетевого пакета, как в самом простом примере netchat.

2 who является игроком, используйте GetPlayer() для его получения.

3 Сетевые протоколы кодируются с использованием Protobuf, для клиента вы можете посмотреть примеры в google Protobuf, в Skynet используется версия Protobuf на C языке от брата Yunfeng, протоколы находятся в protos, pb файлы можно сгенерировать с помощью поиска в интернете по запросу "protobufinit инициализация и загрузка protobuf".4 Для входа в систему с использованием учетной записи сначала выполните netbase.C2SLogin, затем загрузите данные игрока в account/LoadPlayerData. Данные загружаются и обрабатываются в списках m_DBList и m_WhenUpdateSaveList (список m_WhenUpdateSaveList обновляется только при наличии изменений и сохраняется через определенное время). После загрузки данные передаются в функцию EnterGame игрока. После выполнения всех операций данные отправляются обратно клиенту.

5 m_DBList и m_WhenUpdateSaveList являются одними из самых важных элементов этого фреймворка для работы с данными, код находится в db/dbmgr.

6 data — это данные из таблицы, генерация данных из таблицы может быть изучена в моем проекте python_read_excel_to_lua, данные из таблицы инициализируются в data/share.lua, это делается для экономии памяти, не требуется загружать каждую таблицу в каждом виртуальном окружении, достаточно загрузить только те, которые используются. Используется функция sharedata Skynet.

7 Хранение данных NPC осуществляется в herodb/load и herodb/save, загрузка данных происходит в dbmgr/load и dbmgr/save, в конечном итоге данные сериализируются в строку с помощью g_pickle.serializeTable и сохраняются в MySQL.8 Хранение данных осуществляется в виде блоков, то есть больших строк, которые сохраняются в базе данных и загружаются. Поэтому после упаковки, даже если вы пишете логику на верхнем уровне, вам не нужно беспокоиться о других вопросах хранения данных. Это потому что в функции AutoSave игрока каждые несколько минут вызывается Save для проверки базы данных на наличие изменений, и только если изменения есть, они сохраняются.9 Что касается обновления, вызывается функция UpdateSave. Если вызывается herodb для проверки обновлений с помощью функции CheckUpdate, то проверяется каждый объект на наличие обновлений. Каждый Chero наследует DictKeysCtrl или CDictKeysCtrl из base/only (их различие заключается в том, что один использует точку, а другой — двоеточие для определенного стиля записи). Поэтому при записи данных можно использовать операции Set и Query для работы с таблицей, например, Chero:SetName и Chero:GetName(). При вызове этих функций данные автоматически сохраняются и обновляются, что позволяет не беспокоиться о данных, делая работу очень удобной и быстрой.10. Способ написания класса BaseClass(CNpc) определен в base/BaseClass, это Lua-класс, написанный Yunfeng в 2006 году. Я использую его только для множества объектов NPC, чтобы сэкономить немного памяти. На самом деле, его можно не использовать, а просто создать объект с помощью createdbmgr, что позволяет использовать self.xx вместо self:xx, что удобнее для унифицированного использования.

-------------------------окончание----------------

Если у вас есть предложения, вы можете оставить комментарий или обратиться к Yunfeng в группе Skynet с упоминанием @clear. Yunfeng обладает большой способностью и делает большой вклад, а я, имея меньшие способности, делаю небольшой вклад.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/runsnails-skynet_gameserver_study.git
git@api.gitlife.ru:oschina-mirror/runsnails-skynet_gameserver_study.git
oschina-mirror
runsnails-skynet_gameserver_study
runsnails-skynet_gameserver_study
master