| 22.6.2017, 7:29 |
Shop API v0.1
|
Автор: Kaido Ren Версия: 0.1 Благодарности: Описание: Это достаточно функциональная система создания магазина с возможностью почти полного контроля над его предметами (почти потому что версия еще только первая и функционал будет увеличиваться исходя из ваших пожеланий и моих недофантазий). Функционал позволяет добавлять, изменять и удалять предметы, имеет весьма удобные события о которых узнаете чуть ниже, возможность при необходимых условиях давать игрокам скидки, запрещать покупку и т.д. Доступные функции: 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: Код:
#include <shopapi> Создадим переменную которая будет содержать идентификатор предмета Код:
new ShopItem: gl_iGravity; В plugin_init создадим предмет - Гравитация Код:
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" // Функция обработчик ); }- параметр save помогает предотвратить повторную покупку предмета, когда нам это не нужно. Предмет нельзя будет купить до тех пор пока он не будет удален у пользователя с помощью функции shop_user_remove_item. Для большего понимания я называю это инвентарем.
- параметр save автоматически становится true, когда предмет имеет ограничение по времени и сам удалится из инвентаря при завершении времени.
- при удалении предмета из инвентаря с помощью функции shop_user_remove_item если предмет еще не закончился по времени, то время будет принудительно завершено и вызвано событие EventTimePassed.
Добавим в plugin_init также регистрацию события смерти игрока, чтобы удалить в нем предмет из инвентаря игрока. То есть грубо говоря предмет можно будет купить один раз за жизнь Код:
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); } Добавим обработчик предмета Код:
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)); } } }Удалим предмет из инвентаря игрока после его смерти Код:
public CBase_PlayerKilled_Post(const this) { if (is_user_connected(this)) { shop_user_remove_item(this, gl_iGravity); } }"Скидка для администраторов" Используя функцию shop_register_openmenu в plugin_init зарегистрируем событие открытия меню Код:
public plugin_init() { shop_register_openmenu("ShopOpenMenuHandler"); } В обработчике при необходимом нам условии выдаем скидку игроку с помощью RETURN_SHOP_DISCOUNTКод:
public ShopOpenMenuHandler(const this) { if (get_user_flags(this) & ADMIN_LEVEL_A) { RETURN_SHOP_DISCOUNT(50); // выдаем скидку 50% администратору с флагом ADMIN_LEVEL_A } RETURN_SHOP_DISCOUNT(0); // иначе если флага нет, то скидка равна нулю } "Ограничение предмета по времени" Добавим ограничение по времени для предмета "Гравитация" из первого примера, для этого укажем в параметр duration время в секундах, например 10 Код:
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); }Изменим обработчик, добавив новые события Код:
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)); } } }Что из этого вышло Прикрепляю два архива: 1. Сам ShopAPI: [attachment=44764:ShopAPI_0.1.rar] 2. Готовый магазин на основе Shop API: [attachment=44765:ShopAPI_...ubPlugin.rar] |
d3m37r4, fl0werD, JekaPro, JIuXeP, mazdan, OnlySteam, SoLover, tenb63rus, x1DD |