Русское сообщество по скриптингу

как можно сделать, покупать только в каждом раунде?

Флуд, который не касается других разделов форума.

Модератор: Модераторы

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

как можно сделать, покупать только в каждом раунде?

Сообщение Xeyka_ » 10 апр 2024, 20:34

Код: Выделить всё
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fakemeta>
#include <fun>
#include <engine>
#include <hamsandwich>

public plugin_init()
{
    register_plugin("shop_menu", "0.1", "Xeyka_")
    
    register_menucmd
(register_menuid("Show_ShopMenu"), (1<<0|1<<1|1<<2|1<<9), "Handle_ShopMenu");
    
    register_clcmd
("say /Shop", "Show_ShopMenu")
    register_clcmd("Shop", "Show_ShopMenu")
}

public Show_ShopMenu(id)
{
    new name[32]
    get_user_name(id, name, 31)
    new szMenu[512], iKeys = (1<<9), iLen = formatex(szMenu, charsmax(szMenu), "\yМеню Сервера^nПривет Инрок, \r%s^n^n", name);
    
    if
(!is_user_alive(id) || cs_get_user_money(id) < 300)
    {
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r1.\r \dЗдоровие + 50\d \d[300$]\d^n");
    }
    else
    
{
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r1.\r \yЗдоровие + 50\y \r[300$]\r^n");
        iKeys |= (1<<0);
    }
    
    if
(!is_user_alive(id) || cs_get_user_money(id) < 500)
    {
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r2.\r \dБронжлеть + 100\d \d[500$]\d^n");
    }
    else
    
{
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r2.\r \yБронжлеть + 100\y \r[500$]\r^n");
        iKeys |= (1<<1);
    }
    
    if
(!is_user_alive(id) || cs_get_user_money(id) < 900)
    {
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r3.\r \dGold Deagle\d \d[900$]\d^n^n^n");
    }
    else
    
{
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r3.\r \yGold Deagle\y \r[900$]\r^n^n^n");
        iKeys |= (1<<2);
    }
    
    formatex
(szMenu[iLen], charsmax(szMenu) - iLen, "\r0.\w Выход")
    return show_menu(id, iKeys, szMenu, -1, "Show_ShopMenu");
}

public Handle_ShopMenu(id, iKey)
{
    switch(iKey)
    {
        case 0:{
            set_user_health(id, get_user_health(id) + 50)
            cs_set_user_money(id, cs_get_user_money(id) - 300)
        }
        case 1:{
            set_user_armor(id, get_user_armor(id) + 100)
            cs_set_user_money(id, cs_get_user_money(id) - 500)
        }
        case 2:{
            give_item(id, "weapon_deagle");
            cs_set_user_money(id, cs_get_user_money(id) - 900)
        }
    }
    return PLUGIN_HANDLED;
}
Аватара пользователя
Xeyka_
 
Сообщения: 0
Зарегистрирован: 09 апр 2024, 22:49
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше месяца
Языки программирования: Я Знаю толко сделать меню

Re: как можно сделать, покупать только в каждом раунде?

Сообщение nemec21 » 11 апр 2024, 02:07

как можно сделать, покупать только в каждом раунде? Это как понять? :thumbs_up. Может 1 раз в раунд?

Из ряда древнего кода:
Код: Выделить всё
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fun>

new bool:gl_bCount[33];

public plugin_init()
{
    register_plugin("shop_menu", "0.2", "Xeyka_");
    
    register_menucmd
(register_menuid("Show_ShopMenu"), (1<<0|1<<1|1<<2|1<<9), "Handle_ShopMenu");

    register_clcmd("say /Shop", "Show_ShopMenu");
    register_clcmd("Shop", "Show_ShopMenu");

    register_event("HLTV", "EVENT_round", "a", "1=0", "2=0");
}

public client_disconnect(id)
    gl_bCount[id] = false;

public EVENT_round()
    arrayset(gl_bCount, false, sizeof gl_bCount);

public Show_ShopMenu(const id)
{
    if(!is_user_connected(id))
        return;

    new name[32];
    get_user_name(id, name, charsmax(name));

    if(gl_bCount[id]) {
        client_print(id, print_chat, "[SERVER] %s, вы исчерпали лимит!!!", name);
        return;
    }

    new
        szMenu
[512],
        iKeys = (1<<9),
        iLen = formatex(szMenu, charsmax(szMenu), "\yМеню Сервера^nПривет Инрок, \r%s^n^n", name),
        bool:bUserAlive = bool:(is_user_alive(id)),
        iUserMoney = cs_get_user_money(id);

    if(!bUserAlive || iUserMoney < 300)
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r1.\r \dЗдоровие + 50\d \d[300$]\d^n");

    else {
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r1.\r \yЗдоровие + 50\y \r[300$]\r^n");
        iKeys |= (1<<0);
    }

    if(!bUserAlive || iUserMoney < 500)
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r2.\r \dБронжлеть + 100\d \d[500$]\d^n");

    else
    
{
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r2.\r \yБронжлеть + 100\y \r[500$]\r^n");
        iKeys |= (1<<1);
    }

    if(!bUserAlive || iUserMoney < 900)
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r3.\r \dGold Deagle\d \d[900$]\d^n^n^n");

    else
    
{
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r3.\r \yGold Deagle\y \r[900$]\r^n^n^n");
        iKeys |= (1<<2);
    }

    formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r0.\w Выход");
    show_menu(id, iKeys, szMenu, -1, "Show_ShopMenu");
}

public Handle_ShopMenu(const id, const iKey)
{
    if(!is_user_alive(id) || iKey == 9)
        return;

    new iUserMonay = cs_get_user_money(id);

    switch(iKey)
    {
        case 0: {
            set_user_health(id, get_user_health(id) + 50);
            cs_set_user_money(id, iUserMonay - 300);
        }

        case 1: {
            set_user_armor(id, get_user_armor(id) + 100);
            cs_set_user_money(id, iUserMonay - 500);
        }

        case 2:{
            give_item(id, "weapon_deagle");
            cs_set_user_money(id, iUserMonay - 900);
        }
    }

    gl_bCount[id] = true;
}


Ну а если нужно что - то поинтереснее:
Требования: версия amx (1.9.0 - 1.10), Reapi
Код: Выделить всё
#include <amxmodx>
#include <reapi>

const SM_MAX_LEN_BUFFER = 32;

enum any: SM_PRIVELEGES {
    SM_FIRST,
    SM_SECOND
};

enum any: SM_TYPE {
    Float:VIEW,
    VALUE
};

enum any: SM_WEAPONS {
    SM_NAME[SM_MAX_LEN_BUFFER +1],
    any:SM_ID,
    SM_AMMO,
    SM_MONAY
};

/*
 * Начало установок
 */
const SM_MAX_VALUE = 100; // Максимальное количество HP.

new const gl_eGamePriveleges[SM_PRIVELEGES][SM_TYPE] = {
    {50.0,  300},  // Первый пункт меню.
    {100.0, 500}   // Второй пункт меню (первое значение смысла трогать нет).
};

/*
 * Тут хранятся данный третьего пункта.
 *
 * Первое значение, это имя оружия для установки.
 * Второе значени, это индекс устанавляемого оружия.
 * Патроны в запасе.
 * Стоймость покупки.
 */
new const gl_eGameItemThird[SM_WEAPONS] = {
    "weapon_deagle",
    WEAPON_DEAGLE,
    35,
    900
};

#define CHECK_ZONE  // Если не требуется проверка на зону закупке, закоментируй строку.
/*
* Конец установок
*/

new bool:gl_bCount[MAX_PLAYERS +1];

public plugin_init() {             
    new szNamePlugins
[] = "Shop_Menu";

    register_plugin(szNamePlugins, "12.04.24", "AMX-X.RU");

    /*
     * С первым символом '/' - это команды для чата.
     * Без, это консольный команды.
     * Команды добавлять, если протребуется, в массив (szComands).
     */

    new szComands[][] = {
        "/shop",
        "shop"
    };

    register_dictionary(fmt("%s.txt", szNamePlugins));

    if(!REGISTER_AllClcmd(szComands, sizeof(szComands), "SHOW_ShopMenu"))
        set_fail_state("ERROR: *%l", "THE_CAUSE_OF_THE_OUTAGE", szNamePlugins);

    RegisterHookChain(RG_CSGameRules_RestartRound, "RG_CSGameRules_RestartRound_Pre");
}

public client_disconnected(id)
    gl_bCount[id] = false;

public RG_CSGameRules_RestartRound_Pre()
    arrayset(gl_bCount, false, MaxClients);

public SHOW_ShopMenu(const id) {
    if(is_user_alive(id)) {
        if(gl_bCount[id]) {
            UTIL_ExecutionFailure(id, fmt("%l", "WAS_USED"));

            return;
        }

        #if defined CHECK_ZONE
            if(rg_has_user_signal(id, SIGNAL_BUY) != SIGNAL_BUY) {
                UTIL_ExecutionFailure(id, fmt("%l", "PURCHASE_AREA"));

                return;
            }
        #endif

        new pMenu = menu_create(fmt("\y%l, \r%n", "TITLE_MENU", id), "HANDLER_Menu");

        menu_additem(pMenu, fmt("%l + %.0f *[%i$]", "ITEM_1", gl_eGamePriveleges[SM_FIRST][VIEW], gl_eGamePriveleges[SM_FIRST][VALUE]));
        menu_additem(pMenu, fmt("%l + %.0f *[%i$]", "ITEM_2", gl_eGamePriveleges[SM_SECOND][VIEW], gl_eGamePriveleges[SM_SECOND][VALUE]));

        new szBuffer[SM_MAX_LEN_BUFFER +1];

        copy(szBuffer, SM_MAX_LEN_BUFFER, gl_eGameItemThird[SM_NAME]);
        ucfirst(szBuffer[7]);

        menu_additem(pMenu, fmt("Gold %s *[%i$]", szBuffer[7], gl_eGameItemThird[SM_MONAY]));

        menu_setprop(pMenu, MPROP_EXITNAME, fmt("%l", "MENU_EXIT"));
        menu_display(id, pMenu);
    }

    else UTIL_ExecutionFailure(id, fmt("%l", "THE_REASON_IS_NOT_ALIVE"));
}


public HANDLER_Menu(const id, iTmp, const Item) {
    menu_destroy(iTmp);

    if(is_user_alive(id) && Item != MENU_EXIT) {
        switch(Item) {
            case 0: {
                RG_GetAccountDeduction(id, gl_eGamePriveleges[SM_FIRST][VALUE], iTmp);

                if(iTmp) {
                    new Float:fBuffer = get_entvar(id, var_health);
                    fBuffer += gl_eGamePriveleges[SM_FIRST][VIEW];

                    if(fBuffer < (SM_MAX_VALUE +gl_eGamePriveleges[SM_FIRST][VIEW])) {
                        rg_add_account(id, iTmp, AS_SET, true);

                        new Float:fHealth = fBuffer < SM_MAX_VALUE ? fBuffer : float(SM_MAX_VALUE);
                        set_entvar(id, var_health, fHealth);

                        gl_bCount[id] = true;
                    }

                    else UTIL_ExecutionFailure(id, fmt("%l", "HEALTH_REFUSAL"), .bOpenMenu = true);
                }

                else UTIL_ExecutionFailure(id, fmt("%l", "LACK_OF_MONEY"), .bOpenMenu = true);
            }

            case 1: {
                RG_GetAccountDeduction(id, gl_eGamePriveleges[SM_SECOND][VALUE], iTmp);

                if(iTmp) {
                    new iArmor = rg_get_user_armor(id);

                    if(iArmor < SM_MAX_VALUE) {
                        rg_give_item(id, "item_assaultsuit", GT_APPEND);
                        rg_give_item(id, "item_thighpack", GT_APPEND)
                        rg_add_account(id, iTmp, AS_SET, true);

                        gl_bCount[id] = true;
                    }

                    else UTIL_ExecutionFailure(id, fmt("%l", "FULL_ARMOR"), .bOpenMenu = true);
                }

                else UTIL_ExecutionFailure(id, fmt("%l", "LACK_OF_MONEY"), .bOpenMenu = true);
            }

            case 2: {
                if(!user_has_weapon(id, gl_eGameItemThird[SM_ID])) {
                    RG_GetAccountDeduction(id, gl_eGameItemThird[SM_MONAY], iTmp);

                    if(iTmp) {
                        rg_give_item(id, gl_eGameItemThird[SM_NAME], GT_REPLACE);
                        rg_set_user_bpammo(id, gl_eGameItemThird[SM_ID], gl_eGameItemThird[SM_AMMO]);
                        rg_add_account(id, iTmp, AS_SET, true);

                        gl_bCount[id] = true;
                    }

                    else UTIL_ExecutionFailure(id, fmt("%l", "LACK_OF_MONEY"), .bOpenMenu = true);
                }

                else UTIL_ExecutionFailure(id, fmt("%l", "THE_PRESENCE_OF_WEAPONS", gl_eGameItemThird[SM_NAME]), .bOpenMenu = true);
            }
        }
    }
}

/*
 * Функция получает сумму в соотношении имеющихся денег на данный момент у игрока, которое нужно установить.
 *
 *@параметр pUser        Индекс игрока.
 *@параметр iAccount     Сумма которую нужно снять.
 *@параметр iAccount     Буфер для суммы, если у игрока ниже суммы которую нужно снять (запишет 0).
 *
 *Функция ничего не возвращает.
 */
RG_GetAccountDeduction(const pUser, iAccount, &iResult) {
    new iBuffer = get_member(pUser, m_iAccount) -iAccount;

    iResult = iBuffer < 0 ? 0 : iBuffer;
}

/*
 * Функция для отправки сообщения.
 *
 *@параметр pUser        Индекс игрока.
 *@параметр szBuffer     Текст для подстановки.
 *@параметр bOpenMenu    Если у параметра значение (true) - будет открыто меню, иначе будет только оповещание.
 *
 *Функция ничего не возвращает.
 */
UTIL_ExecutionFailure(const pUser, const szBuffer[], const bool:bOpenMenu = false) {
    client_print_color(pUser, print_team_default, "^4[SERVER] ^3%n^1, %s", pUser, szBuffer);

    if(bOpenMenu)
        SHOW_ShopMenu(pUser);
}

bool:REGISTER_AllClcmd(const szBuffer[][], const Len, const szComand[]) {
    new bool:bComand;

    for(new i; i < Len; ++i) {
        if(szBuffer[i][0]) {
            if(szBuffer[i][0] == '/' && szBuffer[i][1]) {
                register_clcmd(fmt("say %s", szBuffer[i]), szComand);
                bComand = bool:(register_clcmd(fmt("say_team %s", szBuffer[i]), szComand));
            }

            else bComand = bool:(register_clcmd(fmt("%s", szBuffer[i]), szComand));
        }
    }

    return bComand;
}

/*
 *SIGNAL_BUY         зона закупки.
 *SIGNAL_BOMB        зона установки бомбы.
 *SIGNAL_RESCUE      зона спасения заложника.
 *SIGNAL_ESCAPE      зона эвакуации VIP.
 *SIGNAL_VIPSAFETY   безопасная зона VIP.
 */
stock SignalState:rg_has_user_signal(const pUser, const SignalState:iSignalType) {
    new iSignals[UnifiedSignals];

    get_member(pUser, m_signals, iSignals);

    return SignalState:iSignals[US_State] & iSignalType;
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось nemec21 12 апр 2024, 13:43, всего редактировалось 9 раз(а).
Аватара пользователя
nemec21
Скриптер
 
Сообщения: 826
Зарегистрирован: 07 фев 2016, 17:08
Откуда: Беларусь
Благодарил (а): 216 раз.
Поблагодарили: 49 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

Re: как можно сделать, покупать только в каждом раунде?

Сообщение nemec21 » 11 апр 2024, 14:29

В втором варинте учитаны такие нюансы, как:
1. Пункт, если у игрока здровье состовляет 100 хп, то снятие денег и востоновление здоровья не произайдет, так же пункт не будет неактивным.
2. Пункт, также и с броней.
3. Пункт, если у игрока уже есть в наличии deagle, то опять же, пункт будет не активным и деньги остануться в полной сумме.

Так же присуствует оповещание в чат на каждый отказ, описывать не буду, проверишь сам. :yes:
Плюс ко всему присуствует мультиязычность :dntknw:
Добавил, покупка действует только в зоне закупки
Аватара пользователя
nemec21
Скриптер
 
Сообщения: 826
Зарегистрирован: 07 фев 2016, 17:08
Откуда: Беларусь
Благодарил (а): 216 раз.
Поблагодарили: 49 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

Re: как можно сделать, покупать только в каждом раунде?

Сообщение Xeyka_ » 03 май 2024, 21:44

На второй варианте ошибка дает
вот: fatal error 100: cannot read from file: "reapi"
Аватара пользователя
Xeyka_
 
Сообщения: 0
Зарегистрирован: 09 апр 2024, 22:49
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше месяца
Языки программирования: Я Знаю толко сделать меню

Re: как можно сделать, покупать только в каждом раунде?

Сообщение nemec21 » 03 май 2024, 23:34

Сервер 1.9.0, reapi есть? Я же указал требования к плагину
Аватара пользователя
nemec21
Скриптер
 
Сообщения: 826
Зарегистрирован: 07 фев 2016, 17:08
Откуда: Беларусь
Благодарил (а): 216 раз.
Поблагодарили: 49 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

Re: как можно сделать, покупать только в каждом раунде?

Сообщение Fedcomp » 05 май 2024, 16:34

Почему тема находится в болталке?
Не помогаю в ЛС - есть форум.
Плагины тоже не пишу, на форуме достаточно хороших скриптеров.


"я ставлю зависимости потому что мне приятно" - subb98 @ 2017
Аватара пользователя
Fedcomp
Администратор
 
Сообщения: 4946
Зарегистрирован: 28 авг 2009, 20:47
Благодарил (а): 817 раз.
Поблагодарили: 1319 раз.
Языки программирования: =>
pawn / php / python / ruby
javascript / rust


Вернуться в Болтовня

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2