Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Shop API v0.1

Статус пользователя KaidoRen
сообщение 22.6.2017, 7:29
Сообщение #1


Стаж: 6 лет 9 месяцев

Сообщений: 3
Благодарностей: 12
Полезность: 0

Автор: 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: Прикрепленный файл  ShopAPI_0.1.rar ( 4,37 килобайт ) Кол-во скачиваний: 41

2. Готовый магазин на основе Shop API: Прикрепленный файл  ShopAPI_0.1_StubPlugin.rar ( 5,45 килобайт ) Кол-во скачиваний: 48
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 9 раз
   Цитировать сообщение
Статус пользователя fl0werD
сообщение 22.6.2017, 16:33
Сообщение #2
Стаж: 7 лет

Сообщений: 155
Благодарностей: 114
Полезность: 692

Код:
#define CHECK_PLAYER(%1,%2) \
if (!(0 < %1 <= %2)) \

это так не работает и воспринимается как if (!((0 < %1) <= %2)), то есть условие (0 < %1) будет или 0, и оно, конечно же меньше %2.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя JIuXeP
сообщение 23.6.2017, 15:52
Сообщение #3


Стаж: 10 лет

Сообщений: 338
Благодарностей: 205
Полезность: 792

Цитата(fl0werD @ 22.6.2017, 16:33) *
Код:
#define CHECK_PLAYER(%1,%2) \
if (!(0 < %1 <= %2)) \

это так не работает и воспринимается как if (!((0 < %1) <= %2)), то есть условие (0 < %1) будет или 0, и оно, конечно же меньше %2.

nea.gif

чего это? Если возьмешь первую часть выражения в скобки, то конечно, эта часть вернет тебе 1 or 0.

Cкрытый текст
Прикрепленное изображение

Код:
#include <amxmodx>

#define CHECK_PLAYER(%1,%2) 0 < %1 <= %2

public plugin_init()
{
new iMaxPlayers = 10;

for(new id = 0; id <= iMaxPlayers + 1; id++)
server_print("^t0 < %d <= %d^t| is %s", id, iMaxPlayers, CHECK_PLAYER(id, iMaxPlayers) ? "true" : "false");
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя KaidoRen
сообщение 25.6.2017, 19:03
Сообщение #4


Стаж: 6 лет 9 месяцев

Сообщений: 3
Благодарностей: 12
Полезность: 0

Изменения версии 1.1.0

  • Функция shop_push_item получила новый параметр visible которая позволяет установить состояние видимости предмета по умолчанию. Подробнее смотрите в include shopapi.
  • Добавлена функция shop_get_user_visible которая возвращает текущее состояние видимости предмета у игрока.
  • Добавлена функция shop_set_user_visible которая позволяет изменить видимость предмета у игрока, а именно:

    VISIBLE_DEFAULT - видимость по умолчанию указанная при регистрации предмета
    VISIBLE_ENABLED - видимость включена
    VISIBLE_DISABLED - видимость выключена


Прикрепленный файл  ShopAPI1.1.0.rar ( 9,1 килобайт ) Кол-во скачиваний: 16
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
Статус пользователя KaidoRen
сообщение 25.6.2017, 19:06
Сообщение #5


Стаж: 6 лет 9 месяцев

Сообщений: 3
Благодарностей: 12
Полезность: 0

Просьба к модераторам заменить в заголовке версию, либо вовсе ее убрать.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: