- Версия мультиплеера
- SA:MP 0.3.7
- SA:MP 0.3e
- CR:MP 0.3.7
- CR:MP 0.3e
- open.mp
PENIS — Ultra-Fast Key-Value Config Handler for SA-MP
Почему PENIS?
Мгновенный доступ к данным — всё содержимое файла хранится в оперативной памяти.
Нулевые задержки при чтении — парсинг выполняется один раз при открытии.
Безопасная запись — изменения сохраняются только при закрытии файла.
Поддержка строк, целых и дробных чисел — всё, что нужно для конфигов.
Автоматическое создание/добавление ключей — не нужно вручную редактировать файлы.
Полная совместимость с SA-MP 0.3.x и компилятором Pawn 3.10+.
Установка
- Скачайте файл penis.inc.
- Поместите его в папку pawno\include вашего SA-MP сервера.
- В начале вашего скрипта добавьте
#include <penis>
Доступные функции
penis_create(const path[], const content[] = "") | Создаёт новый файл в памяти (запись на диск — при закрытии). |
penis_open(const path[]) | Открывает существующий файл и загружает его в память. |
penis_close(file_id) | Сохраняет изменения (если были) и освобождает память. |
penis_set_str(file_id, "key", "value") | Устанавливает строковое значение ключа. |
penis_set_int(file_id, "key", 123) | Устанавливает целочисленное значение. |
penis_set_float(file_id, "key", 3.14) | Устанавливает дробное значение. |
penis_get_str(file_id, "key", output[], size = sizeof(output)) | Получает строку по ключу. |
penis_get_int(file_id, "key", &value) | Получает целое число. |
penis_get_float(file_id, "key", &Float:value) | Получает дробное число. |
penis_remove(file_id, "key") | Удаляет ключ и его значение из файла. |
penis_error_msg(code) | Возвращает человекочитаемое описание ошибки. |
Пример использования
#include <a_samp>
#include <penis>
main()
{
new cfg = penis_create("players/123.pen");
if (cfg < 0)
cfg = penis_open("players/123.pen");
if (cfg >= 0)
{
// Запись данных
penis_set_str(cfg, "name", "John_Doe");
penis_set_int(cfg, "score", 9876);
penis_set_float(cfg, "health", 99.5);
// Чтение данных
new name[32]; new score; new Float:hp;
penis_get_str(cfg, "name", name);
penis_get_int(cfg, "score", score);
penis_get_float(cfg, "health", hp);
printf("[PENIS] Игрок: %s, Счёт: %d, Здоровье: %.1f", name, score, hp);
// Удаление ключа
penis_remove(cfg, "temp_flag");
// Сохранение и закрытие
penis_close(cfg);
}
else
{
printf("[PENIS ERROR] %s", penis_error_msg(cfg));
}
}
Настройка под ваш проект
Вы можете переопределить лимиты до подключения библиотеки:#define PENIS_MAX_FILES 10 // макс. одновременно открытых файлов
#define PENIS_MAX_SIZE 262144 // макс. размер файла (256 КБ)
#define PENIS_MAX_PATH 256 // макс. длина пути к файлу
#define PENIS_MAX_KEYS 4096 // макс. ключей в одном файле
#include <penis>
Безопасность и ограничения
- Имена ключей не могут содержать символы \r и \n.
- Значения автоматически обрезаются по концу строки.
- Пробелы и табуляции до и после = игнорируются.
- Формат float: %.6f (6 знаков после запятой).
- Все операции неблокирующие — идеально для игровых циклов.
Заключение
PENIS — это не просто замена mxINI. Это эволюция: меньше кода, выше скорость, чище архитектура.Идеально подходит для:
- Сохранения профилей игроков,
- Хранения настроек сервера,
- Временных конфигураций,
- Лёгких баз данных без SQL.
Автор @pawneror специально для портала pawno-help.ru
Если у вас есть вопросы или предложения — пишите в комментариях.
Удачного кодинга!
