GMod: PointShop и донат-магазин
Установка PointShop 2 на сервер Garry's Mod, настройка валюты, категорий, интеграция с DarkRP и продажа предметов за реальные деньги.
Кратко: PointShop 2 устанавливается через Workshop или вручную в addons/, настройка занимает 30-60 минут. Категории, предметы и валюта конфигурируются через Lua-файлы в папке аддона. Интеграция с DarkRP - через хуки, продажа за деньги - через RCON-вебхук от платёжного сервиса.
GMod: PointShop и донат-магазин
PointShop - один из самых популярных аддонов для Garry’s Mod серверов, превращающий обычный сервер в полноценную игровую экономику. Система очков мотивирует игроков проводить больше времени на сервере, а донат-магазин позволяет монетизировать сервер без нарушения баланса. В 2026 году актуальная версия - PointShop 2 (PS2), которая активно поддерживается сообществом и совместима с последними версиями GMod. Эта статья охватывает полный цикл: от установки до настройки платной системы очков с интеграцией в DarkRP.
Pterohost - игровой хостинг для Garry’s Mod с NVMe-дисками, DDoS-защитой и поддержкой 24/7. Промокод 4START даёт -20% на первый заказ. Заказать Garry’s Mod сервер
Выбор версии: PointShop 1 или PointShop 2
Перед установкой нужно определиться с версией. Обе работают в 2026 году, но имеют принципиальные различия.
| Параметр | PointShop 1 | PointShop 2 |
|---|---|---|
| Workshop ID | 219466343 | 1347550917 |
| Несколько валют | Нет | Да |
| Кастомный UI | Ограниченно | Полностью |
| API для аддонов | Базовый | Расширенный |
| Поддержка | Устаревшая | Активная |
| Категории | Плоские | Вложенные |
Рекомендация для новых серверов - PointShop 2. PS1 имеет смысл использовать только если у тебя уже есть готовые предметы под него или если DarkRP-сборка собрана на базе PS1.
Для DarkRP серверов с большим числом игроков PS2 предпочтительнее из-за лучшей производительности при больших каталогах предметов.
Установка PointShop 2
Способ 1 - через Workshop (рекомендуется)
Добавь Workshop ID в файл запуска сервера или в garrysmod/cfg/workshop.cfg:
+host_workshop_collection <ID_КОЛЛЕКЦИИ>
Либо добавь отдельный аддон через resource.AddWorkshop:
-- в файле garrysmod/addons/yourserver/lua/autorun/server/workshop.lua
resource.AddWorkshop("1347550917")
Способ 2 - ручная установка
- Скачай последнюю версию с GitHub:
https://github.com/xirius1337/PointShop2 - Распакуй архив в
garrysmod/addons/pointshop2/ - Проверь структуру: в папке должны быть
lua/,pointshop2_data/,README.md - Перезапусти сервер
После установки в консоли сервера должна появиться строка:
[PointShop 2] Loaded successfully. X items in Y categories.
Проверка установки
Войди на сервер и нажми F3 (дефолтная кнопка) - должно открыться меню PointShop. Если не открывается - проверь логи на ошибки Lua:
# в консоли сервера
lua_run print(PS2 and "PS2 OK" or "PS2 NOT LOADED")
Настройка основного конфига
Главный конфигурационный файл находится по пути:
garrysmod/addons/pointshop2/lua/pointshop2/config/sh_config.lua
Ключевые параметры для базовой настройки:
-- Название валюты (отображается в UI)
PS2.Config.CurrencyName = "Points"
PS2.Config.CurrencyNameSingular = "Point"
-- Иконка валюты (путь к материалу или emoji-символ)
PS2.Config.CurrencyIcon = "icon16/coins.png"
-- Стартовый баланс для новых игроков
PS2.Config.StartingPoints = 100
-- Клавиша для открытия магазина
PS2.Config.OpenKey = KEY_F3
-- Включить логирование транзакций
PS2.Config.LogTransactions = true
-- Путь для сохранения данных (mysql или sqlite)
PS2.Config.DataStore = "sqlite"
Подключение MySQL (для серьёзных серверов)
Если на сервере более 50 игроков в пике, SQLite начинает тормозить. Переключи хранилище на MySQL:
PS2.Config.DataStore = "mysql"
-- Параметры подключения (настраиваются отдельно в sh_mysql_config.lua)
PS2.Config.MySQL = {
hostname = "127.0.0.1",
username = "gmod_ps2",
password = "yourpassword",
database = "gmod_pointshop",
port = 3306
}
Для MySQL требуется дополнительный модуль mysqloo - установи его в garrysmod/lua/bin/.
Создание категорий предметов
Категории хранятся в папке:
garrysmod/addons/pointshop2/lua/pointshop2/categories/
Пример файла категории sh_hats.lua:
local CATEGORY = {}
CATEGORY.Name = "Шляпы"
CATEGORY.Icon = "icon16/hat.png"
CATEGORY.Order = 1
-- Ограничить категорию по группам
-- CATEGORY.AllowedUserGroups = {"vip", "admin"}
PS2:RegisterCategory("hats", CATEGORY)
Создай отдельные файлы для каждой категории. Стандартный набор категорий для DarkRP сервера:
| Категория | Имя файла | Описание |
|---|---|---|
| Модели игрока | sh_playermodels.lua | Скины и модели персонажей |
| Шляпы | sh_hats.lua | Аксессуары на голову |
| Трейлы | sh_trails.lua | Следы за игроком |
| Аура | sh_auras.lua | Эффекты вокруг персонажа |
| Оружие | sh_weapons.lua | Декоративное или боевое |
| VIP-бонусы | sh_vip.lua | Эксклюзивные предметы для доноров |
Добавление предметов
Предметы хранятся в папке:
garrysmod/addons/pointshop2/lua/pointshop2/items/
Предмет - модель игрока
Создай файл sh_citizen.lua в папке items:
local ITEM = {}
ITEM.Name = "Гражданин"
ITEM.Price = 0
ITEM.Category = "playermodels"
ITEM.Model = "models/player/group01/male_01.mdl"
ITEM.Icon = "models/player/group01/male_01"
-- Цвет иконки (опционально)
ITEM.IconColor = Color(255, 255, 255)
-- Описание предмета
ITEM.Description = "Стандартная модель гражданина Half-Life 2."
-- Применение предмета при экипировке
function ITEM:OnEquip(ply, modifications)
ply:SetModel(self.Model)
end
-- Снятие предмета
function ITEM:OnHolster(ply)
ply:SetModel("models/player/group01/male_01.mdl")
end
PS2:RegisterItem("citizen_model", ITEM)
Предмет - шляпа (prop на голове)
local ITEM = {}
ITEM.Name = "Топ-хэт"
ITEM.Price = 500
ITEM.Category = "hats"
ITEM.Model = "models/hats/tophat.mdl"
ITEM.Description = "Классический цилиндр для настоящего джентльмена."
-- Позиция на голове (x, y, z смещение)
ITEM.Offset = Vector(0, 0, 5)
ITEM.Angle = Angle(0, 0, 0)
ITEM.Scale = 1.0
function ITEM:OnEquip(ply, modifications)
-- Для шляп используется специальная функция аттача
ply:SetNWString("ps2_hat", self.UniqueID)
end
function ITEM:OnHolster(ply)
ply:SetNWString("ps2_hat", "")
end
PS2:RegisterItem("tophat", ITEM)
Предмет - трейл
local ITEM = {}
ITEM.Name = "Огненный след"
ITEM.Price = 1000
ITEM.Category = "trails"
ITEM.Description = "Огненный трейл за персонажем."
-- Параметры трейла
ITEM.Material = "trails/fire"
ITEM.StartSize = 15
ITEM.EndSize = 0
ITEM.Length = 0.5
ITEM.Color = Color(255, 100, 0)
function ITEM:OnEquip(ply, modifications)
ply:SetNWString("ps2_trail_mat", self.Material)
ply:SetNWInt("ps2_trail_start", self.StartSize)
ply:SetNWInt("ps2_trail_end", self.EndSize)
end
function ITEM:OnHolster(ply)
ply:SetNWString("ps2_trail_mat", "")
end
PS2:RegisterItem("fire_trail", ITEM)
Интеграция с DarkRP
DarkRP и PointShop 2 отлично работают вместе. Добавь хуки в файл:
garrysmod/addons/yourserver/lua/autorun/server/darkrp_ps2_integration.lua
Начисление очков за игровую активность
-- Очки за убийство NPC
hook.Add("OnNPCKilled", "PS2_NPCKill", function(npc, attacker, weapon)
if IsValid(attacker) and attacker:IsPlayer() then
PS2:GivePoints(attacker, 5)
attacker:ChatPrint("[PointShop] +5 очков за убийство NPC!")
end
end)
-- Очки за убийство игрока (в зависимости от работы)
hook.Add("PlayerDeath", "PS2_PlayerKill", function(victim, inflictor, attacker)
if IsValid(attacker) and attacker:IsPlayer() and attacker ~= victim then
-- Больше очков за убийство полицейского (для DarkRP RP)
local bonus = 10
if victim:getDarkRPVar("job") and
string.find(victim:getDarkRPVar("job"), "Police") then
bonus = 25
end
PS2:GivePoints(attacker, bonus)
end
end)
-- Очки за зарплату (каждый раз, когда DarkRP выдаёт зарплату)
hook.Add("DarkRPPlayerGotMoney", "PS2_Salary", function(ply, amount, reason)
if reason == "salary" then
-- 1 очко за каждые 100$ зарплаты
local pts = math.floor(amount / 100)
if pts > 0 then
PS2:GivePoints(ply, pts)
end
end
end)
-- Очки за время на сервере (каждые 10 минут)
timer.Create("PS2_PlaytimeReward", 600, 0, function()
for _, ply in ipairs(player.GetAll()) do
if IsValid(ply) then
PS2:GivePoints(ply, 10)
end
end
end)
Доступ к предметам через DarkRP-работы
-- VIP-предметы только для определённых работ
-- В файле предмета добавь проверку:
function ITEM:CanPlayerBuy(ply)
local job = ply:getDarkRPVar("job")
if job and (job == "Наркоторговец" or job == "Мафия") then
return false, "Эта работа не может покупать данный предмет."
end
return true
end
Настройка системы прав
PointShop 2 интегрируется с ULX и другими системами прав через группы пользователей.
Ограничение предметов по группам
В файле предмета:
-- Предмет только для VIP и выше
ITEM.AllowedUserGroups = {"vip", "vip+", "admin", "superadmin"}
-- Скидка для VIP (покупают за половину цены)
function ITEM:GetPrice(ply)
if ply:IsUserGroup("vip") then
return math.floor(self.Price * 0.5)
end
return self.Price
end
Команды администратора
Через консоль сервера или RCON:
# Дать очки игроку (по SteamID)
pointshop2_give_points STEAM_0:0:12345678 1000
# Забрать очки
pointshop2_take_points STEAM_0:0:12345678 500
# Установить баланс
pointshop2_set_points STEAM_0:0:12345678 2000
# Выдать предмет
pointshop2_give_item STEAM_0:0:12345678 tophat
# Посмотреть баланс
pointshop2_get_points STEAM_0:0:12345678
ULX-команды (если установлен ULX Admin)
# В чате сервера (для администраторов)
!givepoints <игрок> <количество>
!takepoints <игрок> <количество>
!setpoints <игрок> <количество>
Продажа очков за реальные деньги
Монетизация сервера через PointShop требует внешнего платёжного сервиса. В 2026 году для рунета популярны следующие решения:
GamePay (популярен в СНГ)
- Зарегистрируй сервер на
gamepay.ru - Настрой продукты (пакеты очков): 100 очков, 500 очков, 1000 очков
- Укажи RCON-команду для каждого продукта:
pointshop2_give_points {steamid} {amount} - GamePay автоматически подставит SteamID покупателя и выполнит команду через RCON
DonationStore (международный)
Аналогичная настройка через donation.store:
- Создай магазин, привяжи сервер через RCON
- Добавь пакеты очков с командами:
pointshop2_give_points {uuid} 500 - Настрой вебхук для подтверждения платежей
Собственный сайт с RCON-вебхуком
Для максимального контроля можно использовать готовую PHP-библиотеку:
<?php
// После успешной оплаты на сайте
require 'rcon.php';
$rcon = new RCON('your.server.ip', 27015, 'your_rcon_password');
$rcon->connect();
$rcon->sendCommand("pointshop2_give_points {$steam_id} {$points}");
$rcon->disconnect();
?>
Важные моменты при монетизации
- Не продавай Pay-to-Win предметы - оружие или преимущества в бою отталкивают игроков и нарушают правила некоторых платформ.
- Возвраты - укажи политику возврата в публичном описании. Продажа игровых ценностей за реальные деньги имеет юридические нюансы.
- Логирование - включи
PS2.Config.LogTransactions = trueи храни логи минимум 30 дней. - Проверка SteamID - платёжный сервис должен валидировать SteamID перед выполнением команды. Никогда не принимай SteamID из незащищённых источников.
Кастомизация интерфейса
PointShop 2 позволяет менять внешний вид через кастомные темы.
Создай файл темы:
garrysmod/addons/yourserver/lua/pointshop2/themes/cl_custom_theme.lua
-- Базовая кастомизация цветов
PS2.Theme = PS2.Theme or {}
-- Основной цвет интерфейса
PS2.Theme.Primary = Color(40, 120, 200)
PS2.Theme.Secondary = Color(30, 90, 160)
PS2.Theme.Background = Color(20, 20, 30, 240)
PS2.Theme.Text = Color(255, 255, 255)
PS2.Theme.TextDark = Color(180, 180, 180)
-- Цвет кнопки покупки
PS2.Theme.BuyButton = Color(50, 180, 50)
PS2.Theme.BuyButtonHover = Color(70, 220, 70)
Добавление иконок категорий
Размести кастомные иконки в:
garrysmod/addons/pointshop2/materials/pointshop2/categories/
Формат - VTF или PNG, рекомендуемый размер 64x64 пикселя.
Оптимизация производительности
Несколько советов для серверов с большим каталогом предметов:
Кэширование предметов. Если предметов более 200, включи кэширование в конфиге:
PS2.Config.CacheItems = true
PS2.Config.CacheTime = 300 -- секунды
Ленивая загрузка моделей. Не загружай все модели сразу при открытии магазина:
PS2.Config.LazyLoadModels = true
Ограничение запросов к БД. Не делай запросы к базе данных при каждом открытии меню - используй сессионный кэш:
PS2.Config.SessionCache = true
PS2.Config.SessionCacheTime = 60 -- секунды
Разделение предметов на страницы. При большом каталоге включи пагинацию:
PS2.Config.ItemsPerPage = 20
Типичные проблемы и решения
| Проблема | Причина | Решение |
|---|---|---|
| Магазин не открывается | Ошибка Lua при загрузке | Проверь консоль на [PS2] ошибки |
| Модель не меняется | Неверный путь к модели | Проверь путь через spawnmenu |
| Очки не начисляются | Хук не работает | Проверь через hook.GetTable() |
| MySQL не подключается | Нет модуля mysqloo | Установи mysqloo в lua/bin/ |
| Предмет куплен, но не работает | Нет функции OnEquip | Добавь функцию применения |
| Иконки не отображаются | Неверный путь к материалу | Путь начинается без materials/ |
Связанные материалы
Для полноценного сервера с PointShop нужна хорошая административная основа - читай про ULX Admin для GMod. Если только начинаешь настраивать сервер с нуля, начни со сборки GMod сервера. Для серверов на DarkRP с полноценной экономикой и работами - смотри настройку DarkRP.
Заключение
PointShop 2 - зрелый и гибкий аддон, который превращает GMod-сервер в платформу с собственной экономикой. Базовая установка занимает около часа, а тонкая настройка интеграции с DarkRP, правами и платёжной системой - ещё несколько часов. Главное правило успешного донат-магазина: продавай косметику, не преимущества - это удерживает игроков дольше и формирует репутацию честного сервера. Используй RCON-команды через надёжный платёжный сервис с валидацией SteamID, веди логи транзакций и регулярно делай резервные копии базы данных очков.
Pterohost - хостинг для Garry’s Mod серверов с мгновенным деплоем, NVMe-хранилищем и круглосуточной поддержкой - идеально для серверов с PointShop и активным донатом. Промокод 4START даёт -20% на первый заказ. Заказать Garry’s Mod сервер