Простой пример алгоритма ветвления на PAWN

Сообщения
13
Реакции
11
Здравствуйте уважаемые пользователи Dev-CS
В данном разделе хочу продемонстрировать не большой пример алгоритма ветвления на PAWN.

Не большой код для примера
C++:
#include <amxmodx>

public plugin_init()
{
    register_plguin("Menu Server", "0.1", "By PyRoKiNeS")
    register_clcmd("say /menu", "ClCmd_Menu", ADMIN_LEVEL_H)
}

public ClCmd_Menu(id)
{
    if(get_user_flags(id) & ADMIN_LEVEL_H)
    {
        server_menu(id)
    }
    else
    {
        client_print_color(id, print_team_default, "^4[SERVER] ^3У вас нет доступа к этому меню")
    }
}

server_menu(id)
{
    new i_Menu = menu_create("\r[Server Menu] \wГлавное меню", "menu_server")
    menu_additem(i_Menu, "Тест1", "1", ADMIN_LEVEL_H)
    menu_additem(i_Menu, "Тест2", "2", ADMIN_LEVEL_H)
    
    menu_setprop(i_Menu, MPROP_EXITNAME, "Выход")
    
    menu_display(id, i_Menu, 0)
}

public menu_server(id, menu, item)
{
    if( item < 0 )
    return PLUGIN_CONTINUE;
    new cmd[3], access, callback;
    menu_item_getinfo(menu, item, access, cmd,2,_,_, callback);
    new key = str_to_num(cmd)
    switch (key)
    {
        case 1: {client_cmd(id, "amx_kickmenu")
        }
        case 2: {client_cmd(id, "amx_banmenu")
        }
    }
    return PLUGIN_HANDLED;
}
В основном надо обратить внимание на эту часть кода.
C++:
public ClCmd_Menu(id)
{
    if(get_user_flags(id) & ADMIN_LEVEL_H)
    {
        server_menu(id)
    }
    else
    {
        client_print_color(id, print_team_default, "^4[SERVER] ^3У вас нет доступа к этому меню")
    }
}
Давайте разберем эту часть кода детально.
При вызове меню через команду /menu сервер начинает выполнять функцию ClCmd_Menu и после нее идет конструкция if/else вот на ней мы и остановимся.
Т.е у нас идет проверка если(if) получить флаги пользователя(get_user_flags) с флагом (ADMIN_LEVEL_H), то открывается меню server_menu(id), а если функция if не прошла проверку, то идет к следующей функции else и будет это читаться полностью так:
если(if) получить флаги пользователя(get_user_flags) с флагом (ADMIN_LEVEL_H), то открывается меню, а если это не проходит проверку, то выводим сообщение.

Пример блок-схемой
Безымянный.jpg
 
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
Жду-недождусь урокИ про переменные.
17 Июн 2018
Уважаемый (нет), не нужно вводить людей в заблуждение. Для таких простых функций уже имеются специальные аргументы (https://dev-cs.ru/amxx/amxmodx/register_clcmd/view) в данном случае третий аргумент (flag), который в примере указан как ADMIN_LEVEL_H. Далее нам просто необходимо указать в самой функции возврат при отсутствие данного флага у игрока:
Код:
public ClCmd_Menu(id, level)
{
    if(~get_user_flags(id) & level)
    {
        client_print_color(id, print_team_default, "^4[SERVER] ^3У вас нет доступа к этому меню")
        return PLUGIN_HANDLED;
    }

    server_menu(id)
    return PLUGIN_HANDLED;
}
вот и вся функция без использования if/else. Если вы хотели донести как использовать, то могли найти более подходящий пример. Используя такие «статьи» юные разработчики получают лишь быдлокод, к котором потом привыкают и не меняются в лучшую сторону.

Ждём урок про return. Как и с чем его едят. Где используется.
 
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
zhorzh78, это выход из функции.
Ой, статью про ретурны ещё не выпустили что ли?
 
Сообщения
333
Реакции
290
Помог
9 раз(а)
fl0wer, Где-то выше статью про алгоритм писали. Зря не читаете. Да и все остальное- тоже, видимо, зря не читаете.
 
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
zhorzh78, если ты считаешь, что здесь загоняют умные вещи, то спешу тебя огорчить. И если выход из функции через return ничто иное, как выполнение else, так же спешу тебя огорчить.
 
Сообщения
432
Реакции
410
Помог
14 раз(а)
fl0wer, к чему столько негатива и презрения, если все что ты сделал это инвертнул условие? Тогда уже стоит вспомнить сток cmd_access
PyRoKiNeS, за старания плюс, но пример такой себе. Сам плагин не имеет никакого смысла, да и if-else там необязательно использовать
 
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
Вот простой алгоритм.
Код:
    // Оптимизиация: сохраняем в переменную кол-во жизней чтобы не вызывать каждый раз
    new Float: flHealth = Float: get_entvar( iPlayer, var_health );

    if( flHealth < 100.0 )
    {
        // Здовровье меньше 100
    }
    else if( flHealth == 100.0 )
    {
        // Здовровье игрока равно 100
    }
    else  // иначе
    {
        // Здовровье игрока больше 100
    }
К чему был кривой пример с созданием меню, который к ветвлению никакого отношения не имеет?
17 Июн 2018
fl0wer, к чему столько негатива и презрения, если все что ты сделал это инвертнул условие? Тогда уже стоит вспомнить сток cmd_access
Потому что толку от таких "туториалов" - ноль. Хотя бы потому что они криво составлены.
cmd_access будет крайне сложен для новичков. Или для кого это статься?
 
  • Нравится
Реакции: voed
Сообщения
333
Реакции
290
Помог
9 раз(а)
fl0wer, Вы странный.. Вы думаете, что эти статьи написаны для Вас или других, кто мало-мальски соображает?
Сомневаюсь, что вас со второго класса пичкали готовыми ответами тригонометрических функций без сложного разбора с больной "оптимизацией" или упрощением. Даже уверен, что не один день вдалбливали сложение простых чисел от 1 до 9.
Если Вам статьи не интересны- никто не заставляет их читать. Да и советы, от "нахватавшихся верхушек", вряд-ли здесь уместны.
 
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
zhorzh78, я думаю, что такие статьи написанны для таких как Вы никого, потому что нагруженны лишней информацией.
С больной оптимизации - не ко мне. Я взял информацию из оффициального источника по статьям работы амхх. Думаю они знают, что пишут, ведь я - нет. Статьи мне очень интересны, я черпаю из них полезную информацию, в этой, например, полезную не нашел :).
 
Сообщения
13
Реакции
11
zhorzh78, я думаю, что такие статьи написанны для таких как Вы никого, потому что нагруженны лишней информацией.
С больной оптимизации - не ко мне. Я взял информацию из оффициального источника по статьям работы амхх. Думаю они знают, что пишут, ведь я - нет. Статьи мне очень интересны, я черпаю из них полезную информацию, в этой, например, полезную не нашел :).
Я услышал твою критику. Буду более внимателен к примерам и давать материал более развернуто .
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу