Pull to refresh

Go в SAMP

Level of difficultyEasy
Reading time3 min
Views4.4K

Возможно эта статья покажется Вам странной, ведь вопрос одного из самых популярных мультиплееров для игры 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-Разработчиков, которым по какой-либо причине стало скучно.

Tags:
Hubs:
Total votes 6: ↑3 and ↓3+2
Comments6

Articles