• Уважаем(ый/ая) Гость! Все скрипты, стили, дополнения и статьи старайтесь размещать в ресурсах.
Shop API

AmxModX Shop API 1.1.0

Нет прав для скачивания
Функциональная система создания магазина
Shop_API.gif
Автор: Kaido Ren

Это достаточно функциональная система создания магазина с возможностью почти полного контроля над его предметами (почти потому что версия еще только первая и функционал будет увеличиваться исходя из ваших пожеланий и моих недофантазий). Функционал позволяет добавлять, изменять и удалять предметы, имеет весьма удобные события о которых узнаете чуть ниже, возможность при необходимых условиях давать игрокам скидки, запрещать покупку и т.д.

shop_set_title - изменение заголовка меню.
shop_register_openmenu - отлов открытия меню игроком.
shop_push_item - добавление предмета.
shop_remove_item - удаление предмета.
shop_set_prop - изменение предмета.
shop_user_remove_item - удаление предмета из инвентаря игрока, если предмет указан как "сохраняемый".
shop_has_user_item - проверка на существование предмета в инвентаре игрока.
Обработчик предмета (предметов, если обработчик у всех одинаковый) принимает несколько возможных событий:
  • EventBuy - успешная покупка, а точнее игрок удовлетворяет всем требованиям для предмета: денег достаточно, доступ есть, такого предмета в инвентаре нет. Но покупку в любом случае можно отменить или добавить необходимые вам условия и опять же отменить покупку, вернув в событии SHOP_RESPONSE_CANCEL или разрешить покупку - SHOP_RESPONSE_IGNORED.
  • EventTimeStart - событие вызывается для предметов которые ограничены по времени (параметр duration в функции shop_push_item). Событие означает, что время стартовало.
  • EventTimeThink - событие подобно set_task'у/think'у вызывается ежесекундно пока время предмета не закончилось (последний параметр обработчика содержит в себе оставшиеся секунды предмета).
  • EventTimePassed - событие вызывается при завершении времени предмета.
  • EventNotEnoughMoney - событие вызывается когда у игрока недостаточно денег для покупки предмета.

Подключим include shopapi:
[SRC]#include <shopapi>[/SRC]

Создадим переменную которая будет содержать идентификатор предмета
[SRC]new ShopItem: gl_iGravity;[/SRC]

В plugin_init создадим предмет - Гравитация
[SRC]
public plugin_init() {
gl_iGravity = shop_push_item(
.name = "Гравитация", // Название предмета
.price = 9000, // Цена предмета
.save = true, // Сохранять ли предмет в инвентарь до его удаления с помощью функции shop_user_remove_item
.duration = 0, // Ограничение по времени в секундах (0 - отключить ограничение)
.access = -1, // Флаг доступа (-1 для всех)
.handler = "CommonHandler" // Функция обработчик
);
}
[/SRC]
  • параметр save помогает предотвратить повторную покупку предмета, когда нам это не нужно. Предмет нельзя будет купить до тех пор пока он не будет удален у пользователя с помощью функции shop_user_remove_item. Для большего понимания я называю это инвентарем.
  • параметр save автоматически становится true, когда предмет имеет ограничение по времени и сам удалится из инвентаря при завершении времени.
  • при удалении предмета из инвентаря с помощью функции shop_user_remove_item если предмет еще не закончился по времени, то время будет принудительно завершено и вызвано событие EventTimePassed.

Добавим в plugin_init также регистрацию события смерти игрока, чтобы удалить в нем предмет из инвентаря игрока. То есть грубо говоря предмет можно будет купить один раз за жизнь
[SRC]
public plugin_init() {
gl_iGravity = shop_push_item(
.name = "Гравитация", // Название предмета
.price = 9000, // Цена предмета
.save = true, // Сохранять ли предмет в инвентарь до его удаления с помощью функции shop_user_remove_item
.duration = 0, // Ограничение по времени в секундах (0 - отключить ограничение)
.access = -1, // Флаг доступа (-1 для всех)
.handler = "CommonHandler" // Функция обработчик
);

RegisterHam(Ham_Killed, "player", "CBase_PlayerKilled_Post", 1);
}
[/SRC]

Добавим обработчик предмета
[SRC]
public CommonHandler(const this, const ShopEvents: event, const ShopItem: item, const itemname[], const price, const duration, const access, const durationleft) {
switch (event) {
case EventBuy: {
if (!is_user_alive(this)) {
client_print(this, print_chat, "К сожалению вы мертвы!");
return SHOP_RESPONSE_CANCEL; // отменяем покупку
}

if (item == gl_iGravity) { // если это созданный нами предмет
set_pev(this, pev_gravity, 0.8); // выдаем гравитацию
}

client_print(this, print_chat, "Предмет %s успешно куплен.", itemname);
}

case EventNotEnoughMoney: {
client_print(this, print_chat, "У вас не хватает еще %d$", price - cs_get_user_money(this));
}
}
}
[/SRC]

Удалим предмет из инвентаря игрока после его смерти
[SRC]
public CBase_PlayerKilled_Post(const this) {
if (is_user_connected(this)) {
shop_user_remove_item(this, gl_iGravity);
}
}
[/SRC]
Используя функцию shop_register_openmenu в plugin_init зарегистрируем событие открытия меню
[SRC]
public plugin_init() {
shop_register_openmenu("ShopOpenMenuHandler");
}
[/SRC]

В обработчике при необходимом нам условии выдаем скидку игроку с помощью RETURN_SHOP_DISCOUNT
[SRC]
public ShopOpenMenuHandler(const this) {
if (get_user_flags(this) & ADMIN_LEVEL_A) {
RETURN_SHOP_DISCOUNT(50); // выдаем скидку 50% администратору с флагом ADMIN_LEVEL_A
}

RETURN_SHOP_DISCOUNT(0); // иначе если флага нет, то скидка равна нулю
}
[/SRC]
Добавим ограничение по времени для предмета "Гравитация" из первого примера, для этого укажем в параметр duration время в секундах, например 10
[SRC]
public plugin_init() {
gl_iGravity = shop_push_item(
.name = "Гравитация", // Название предмета
.price = 9000, // Цена предмета
.save = true, // Сохранять ли предмет в инвентарь до его удаления с помощью функции shop_user_remove_item
.duration = 10, // Ограничение по времени в секундах (0 - отключить ограничение)
.access = -1, // Флаг доступа (-1 для всех)
.handler = "CommonHandler" // Функция обработчик
);

RegisterHam(Ham_Killed, "player", "CBase_PlayerKilled_Post", 1);
}
[/SRC]

Изменим обработчик, добавив новые события
[SRC]
public CommonHandler(const this, const ShopEvents: event, const ShopItem: item, const itemname[], const price, const duration, const access, const durationleft) {
switch (event) {
case EventBuy: {
if (!is_user_alive(this)) {
client_print(this, print_chat, "К сожалению вы мертвы!");
return SHOP_RESPONSE_CANCEL; // отменяем покупку
}

if (item == gl_iGravity) { // если это созданный нами предмет
set_pev(this, pev_gravity, 0.8); // выдаем гравитацию
}

client_print(this, print_chat, "Предмет %s успешно куплен.", itemname);
}

case EventTimeStart: {
client_print(this, print_center, "Гравитация: время пошло!");
}

case EventTimeThink: {
client_print(this, print_center, "Гравитация: осталось %d сек.", durationleft);
}

case EventTimePassed: {
client_print(this, print_center, "Гравитация: время вышло, гравитация сброшена!");
set_pev(this, pev_gravity, 1.0);
}

case EventNotEnoughMoney: {
client_print(this, print_chat, "У вас не хватает еще %d$", price - cs_get_user_money(this));
}
}
}
[/SRC]

Что из этого вышло показано на скрине. В архиве два файла:
  1. Сам ShopAPI [ ShopAPI ]
  2. Готовый магазин на основе Shop API [ API StubPlugin ]
Благодарности:
Автор
Taulalan
Скачивания
6
Первый выпуск
Обновление
Оценка
0,00 звёзд 0 оценок

Другие ресурсы пользователя Taulalan

Поделиться ресурсом

Последние обновления

  1. Обновление 1.1.0

    Изменения версии 1.1.0 Функция shop_push_item получила новый параметр visible которая позволяет...
Сверху Снизу