Pterohost docs

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 1PointShop 2
Workshop ID2194663431347550917
Несколько валютНетДа
Кастомный 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 - ручная установка

  1. Скачай последнюю версию с GitHub: https://github.com/xirius1337/PointShop2
  2. Распакуй архив в garrysmod/addons/pointshop2/
  3. Проверь структуру: в папке должны быть lua/, pointshop2_data/, README.md
  4. Перезапусти сервер

После установки в консоли сервера должна появиться строка:

[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 (популярен в СНГ)

  1. Зарегистрируй сервер на gamepay.ru
  2. Настрой продукты (пакеты очков): 100 очков, 500 очков, 1000 очков
  3. Укажи RCON-команду для каждого продукта:
    pointshop2_give_points {steamid} {amount}
  4. GamePay автоматически подставит SteamID покупателя и выполнит команду через RCON

DonationStore (международный)

Аналогичная настройка через donation.store:

  1. Создай магазин, привяжи сервер через RCON
  2. Добавь пакеты очков с командами:
    pointshop2_give_points {uuid} 500
  3. Настрой вебхук для подтверждения платежей

Собственный сайт с 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 сервер