From 41307dbf82b27ad5ff923cb4350e6ce30a39b41a Mon Sep 17 00:00:00 2001 From: deidara Date: Fri, 1 May 2026 06:57:32 +0300 Subject: [PATCH] Initial commit: vip-custom-models plugin with documentation and config --- README.md | 88 +++++++++++++++++++++++++++++++++ configs/vip_custom_models.ini | 49 ++++++++++++++++++ scripting/vip_custom_models.sp | Bin 0 -> 24305 bytes 3 files changed, 137 insertions(+) create mode 100644 README.md create mode 100644 configs/vip_custom_models.ini create mode 100644 scripting/vip_custom_models.sp diff --git a/README.md b/README.md new file mode 100644 index 0000000..d6af55a --- /dev/null +++ b/README.md @@ -0,0 +1,88 @@ +# VIP Custom Models + +Плагин VIP-моделей игроков для CS:GO серверов на SourceMod. Позволяет VIP-игрокам выбирать кастомные скины (агентов) через меню — выбор сохраняется через ClientPrefs и SQLite. + +## Функции + +- До **128 кастомных моделей** из конфига +- Ограничение по **команде** (T / CT / любая) +- Ограничение по **VIP-группе** (через VIP Core API) +- Сохранение выбора через **ClientPrefs** (cookies) и **SQLite** (storage-local) +- Автоматическое применение модели при спавне и смене команды +- Корректное восстановление **стандартных рук** при сбросе модели +- Умная загрузка файлов модели: `.mdl`, `.vvd`, `.dx90.vtx` и сопутствующие +- Поддержка блочного и строкового форматов списка downloads +- Интеграция с VIP-меню через `VIP_RegisterFeature` + +## Зависимости + +- [SourceMod](https://www.sourcemod.net/) 1.10+ +- [ClientPrefs](https://wiki.alliedmods.net/Client_Preferences_%28SourceMod%29) (входит в SourceMod) +- [VIP Core](https://github.com/R1KO/VIP-Core) — плагин VIP-системы + +## Установка + +1. Скомпилировать `scripting/vip_custom_models.sp` +2. Положить `.smx` в `addons/sourcemod/plugins/` +3. Положить `configs/vip_custom_models.ini` в `addons/sourcemod/configs/` +4. Загрузить модели на сервер (в папку `models/`) +5. Перезапустить сервер или загрузить плагин: `sm plugins load vip_custom_models` + +## Конфиг + +Путь: `addons/sourcemod/configs/vip_custom_models.ini` + +``` +"VIP_CustomModels" +{ + "Models" + { + "agent_01" + { + "name" "FBI Agent" + "model" "models/player/custom/fbi_agent.mdl" + "arms" "models/weapons/ct_arms_fbi_custom.mdl" + "team" "CT" + "groups" "*" + "downloads" "models/player/custom/fbi_agent.mdl;models/player/custom/fbi_agent.vvd" + } + "agent_02" + { + "name" "Elite Crew" + "model" "models/player/custom/elite_crew.mdl" + "arms" "" + "team" "T" + "groups" "VIP;PREMIUM" + "downloads" + { + "1" "models/player/custom/elite_crew.mdl" + "2" "models/player/custom/elite_crew.vvd" + "3" "models/player/custom/elite_crew.dx90.vtx" + } + } + } +} +``` + +### Поля модели + +| Поле | Описание | +|---|---| +| `name` | Отображаемое имя в меню | +| `model` | Путь к `.mdl` файлу | +| `arms` | Путь к модели рук (оставить пустым для стандартных) | +| `team` | `T`, `CT` или `ANY` | +| `groups` | VIP-группы через `;` или `*` для всех | +| `downloads` | Файлы для скачивания клиентами (строка через `;` или блок) | + +## Команды + +| Команда | Доступ | Описание | +|---|---|---| +| `!vmodel` / `sm_vmodel` | VIP | Открыть меню выбора модели | +| `!models` / `sm_models` | VIP | Открыть меню выбора модели | +| `!agents` / `sm_agents` | VIP | Открыть меню выбора модели | + +## Версия + +`1.2.0` — Автор: OpenAI diff --git a/configs/vip_custom_models.ini b/configs/vip_custom_models.ini new file mode 100644 index 0000000..c53b788 --- /dev/null +++ b/configs/vip_custom_models.ini @@ -0,0 +1,49 @@ +"VIP_CustomModels" +{ + "Models" + { + // Пример: модель для CT, доступна всем VIP (groups = "*") + "agent_ct_01" + { + "name" "FBI Agent" + // Путь к .mdl (от корня игрового сервера) + "model" "models/player/custom/fbi_agent.mdl" + // Путь к .mdl рук. Оставить пустым — будут стандартные руки + "arms" "models/weapons/ct_arms_fbi_custom.mdl" + // Команда: T, CT или ANY + "team" "CT" + // VIP-группы через ";" или "*" для всех VIP + "groups" "*" + // Список файлов для скачивания клиентами (через ";") + "downloads" "models/player/custom/fbi_agent.mdl;models/player/custom/fbi_agent.vvd;models/player/custom/fbi_agent.dx90.vtx" + } + + // Пример: модель для T, только группы VIP и PREMIUM + "agent_t_01" + { + "name" "Elite Crew" + "model" "models/player/custom/elite_crew.mdl" + "arms" "" + "team" "T" + "groups" "VIP;PREMIUM" + // Блочный формат downloads (альтернатива строке через ";") + "downloads" + { + "1" "models/player/custom/elite_crew.mdl" + "2" "models/player/custom/elite_crew.vvd" + "3" "models/player/custom/elite_crew.dx90.vtx" + } + } + + // Пример: модель для обеих сторон + "agent_any_01" + { + "name" "Arcane Operative" + "model" "models/player/custom/arcane_op.mdl" + "arms" "models/weapons/arcane_arms.mdl" + "team" "ANY" + "groups" "PREMIUM" + "downloads" "models/player/custom/arcane_op.mdl;models/player/custom/arcane_op.vvd;models/player/custom/arcane_op.dx90.vtx;models/weapons/arcane_arms.mdl;models/weapons/arcane_arms.vvd" + } + } +} diff --git a/scripting/vip_custom_models.sp b/scripting/vip_custom_models.sp new file mode 100644 index 0000000000000000000000000000000000000000..f4a124b0a3e24e0fff0f7869a5c0e965fc4b71d3 GIT binary patch literal 24305 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