Возможно эта статья покажется Вам странной, ведь вопрос одного из самых популярных мультиплееров для игры GTA: San Andreas давно решён, так или иначе поддержка неофициального фреймворка, если его можно так назвать, для языка GO всё ещё идёт.
Ответ на один из возможных вопросов читателей:
- Зачем писать статью о никому неизвестном фреймворке для SAMP-мультиплеера?
Вопрос вполне корректный, честно я и сам пока что не нашёл правильного ответа. Но думаю что кому-то это и потребуется. Когда-то я и сам начинал программировать, а моё начало было с написания игрового мода для сервера SAMP, впрочем, это другая история.
Предупреждение: это моя первая статья о программировании, вернее это первая статья о программировании, которую написал лично я. Вероятно, я могу ошибаться в каких-либо высказываниях. Прошу не судить меня строго.
Введение
Не так давно я начал изучать язык программирования Go, знакомиться с горутинами, многопоточностью, осваивать стандартные библиотеки, бла-бла-бла. Вдруг мне стало интересно узнать об одной вещи: можно ли писать скрипты игрового мода для SAMP в Go? Буквально пару лет назад я видел библиотеку SAMP-GDK, которая позволяла писать игровые моды на языках C и C++. Тогда я не обратил на это внимания, но меня довольно сильно заинтересовала эта тема, конечно уже с другим языком, как и упоминалось ранее.
Основная информация о пакете для разработки
Дак вот, начав гуглить я столкнулся с одной интересной библиотекой на GitHub: SAMPGO.
У репозитория есть собственный Wiki-раздел, который позволяет более подробно ознакомиться с пакетом и узнать его тонкости.
Плюсы, которые я нашёл:
Пакет инструментов содержит в себе все функции из стандартной библиотеки SAMP. Иными словами, разработчики пакета перенесли все хендлеры, коллбеки и команды на язык Go.
Игровые сценарии на языке Go позволят ускорить работу в 3-5 раз.
Есть поддержка ООП (при классическом написании игрового мода на языке PAWN Вы её не найдёте).
Есть поддержка Linux и Windows.
Минусы, которые могут стать критичными:
Есть определённые мороки с компиляцией и запуском игровых скриптов (об этом поговорим ниже).
Некоторые функции работают не так как должны (в библиотеке есть ряд багов, которые решаются костылями в коде).
Пример кода от разработчиков библиотеки:
sampgo.On("goModeInit", func() bool {
sampgo.Print("Hello from Go!")
v1 := sampgo.CreateVehicle(503, 0, 0, 5.0, 0, 1, 1, 30, true)
sampgo.Print(fmt.Sprintf("Vehicle id %d created", v1))
v2 := sampgo.CreateVehicle(504, 0, 2, 5, 0, 3, 3, 30, false)
sampgo.Print(fmt.Sprintf("Vehicle id %d created", v2))
return true
})
sampgo.On("goModeExit", func() bool {
sampgo.Print("goModeExit!")
return true
})
sampgo.On("onPlayerConnect", func(p sampgo.Player) bool {
sampgo.Print(fmt.Sprintf("Player ID is %d", p.ID))
p.SendMessage(0xFFFFFF, "Welcome to the sampgo base gamemode!")
return true
})
Проблемы с компиляцией
Поскольку SAMP-Сервер нацелен на исполнение скриптов с 32-битной архитектурой, Вам придётся повозиться с настройкой компилятора.
Весь проект нужно собирать в DLL-библиотеку, следовательно Вам потребуется кросскомпилятор, об этом авторы написали в одной из Wiki-статей.
Одна из вытекающих проблем, по непонятной для меня причине, скомпилированный проект не запускается на машине с 64-битной архитектурой. Я пробовал разные методы компиляции, старался запускать сервер с правами рута, думал что всё дело в доступе сервера к файлам. К большому сожалению это не так, вероятно и я мог допустить какую-либо ошибку, но при запуске этого же скрипта на машине с 32-битной архитектурой всё заработало.
Выводы
Пусть SAMP как и его ответвление CRMP уже не пользуется той популярностью что раньше, но на нём всё ещё действует огромное множество проектов. Которые приносят деньги владельцам и пользуются спросом у игроков. Думаю что эта статья станет полезной для Go-Разработчиков, которым по какой-либо причине стало скучно.