Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 14
  1. #1
    Аватар для Elrmrnt-Kritik
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±

    Использование флагов в полном объеме

    Всем привет. Собственно, такой вопросик нарисовался у меня. Как известно, в некоторых командных процессорах есть возможность создавать флаги.
    Ну, понятное дело, что общество, как и всегда, делится на тех, кто за и против их использования. Пусть каждый останется при своем мнении.
    Однако, я лишь хочу научиться использовать их в полном объеме. А для того в первую очередь понять суть их. Судя по INC, макросом flags заменяется на создание отдельной функции с названием самой команды (упускаю факт существования префикса). А что дальше-то сервер делает с этой функцией и каким образом идет это установление маски?

    И немного конкретного примера. Есть, например, система админ-уровней:
    Код:
    #define ADMIN_MIN				1
    #define ADMIN_MED				2
    #define ADMIN_MAX				3
    
    flags:command_1(ADMIN_MIN);
    flags:command_2(ADMIN_MED);
    flags:command_3(ADMIN_MAX);
    
    public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
    {
    	if((flags & ADMIN_MIN) > AdminLevel[playerid])
    		return SendClientMessage(playerid, -1, "your text min") & 0;
    	else if((flags & ADMIN_MED) > AdminLevel[playerid])
    		return SendClientMessage(playerid, -1, "your text med") & 0;
    	else if((flags & ADMIN_MAX) > AdminLevel[playerid])
    		return SendClientMessage(playerid, -1, "your text max") & 0;
    	return 1;
    }
    То есть для commad_1 нужен как минимум первый уровень, для command_2 нужен второй, а command_3 - как минимум третий. Правильно ли реализован данный код и как он сработает?

    Пока писал, задумался, а как лучше же будет?
    Код:
    #define ADMIN_MIN				1
    #define ADMIN_MED				2
    #define ADMIN_MAX				3
    или
    Код:
    enum
    {
    	ADMIN_NONE,
    	ADMIN_MIN,
    	ADMIN_MED,
    	ADMIN_MAX
    };
    Последний раз редактировалось Elrmrnt-Kritik; 18.01.2018 в 00:25.

  2. #2
    Аватар для pawnoholic
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.01.2018
    Сообщений
    128
    Репутация:
    15 ±
    Согласно из Википедии:
    В программировании понятие флаг относится к одному или нескольким битам памяти, используемым для хранения двоичной комбинации или кода, который характеризует состояние некоторого объекта. Флаги обычно входят в определённые структуры данных, такие как записи баз данных, и их значения, как правило, связаны со значением структур данных, частью которых они являются. Во многих случаях двоичное значение флага представляет собой кодированное представление одного из нескольких возможных состояний или статусов объекта. В других случаях двоичные значения флагов могут представлять собой один или несколько атрибутов в битовом поле, зачастую связанных с возможностями или доступом, например, «может быть записано в», или «может быть удалено». Однако флагам могут быть назначены и другие значения. Один из вариантов использования флагов состоит в маркировке для назначения структуры данных к последующей обработке.
    Исходя из вашего вопроса, судя по синтаксису вы интересуетесь реализацией флагов в Pawn.CMD.

    Ваш код должен иметь примерно такой вид:

    PHP код:
    #include <Pawn.CMD>

    enum(<<=1

        
    ADMIN_LEVEL_1 1,
        
    ADMIN_LEVEL_2,
        
    ADMIN_LEVEL_3
    };

    flags:command_1(ADMIN_LEVEL_1); 
    cmd:command_1(playeridparams[]) 

        
    // code here 
        
    return 1



    flags:command_2(ADMIN_LEVEL_2);
    cmd:command_2(playeridparams[]) 

        
    // code here 
        
    return 1
    }

    flags:command_3(ADMIN_LEVEL_3); 
    cmd:command_3(playeridparams[]) 

        
    // code here 
        
    return 1
    }

    public 
    OnPlayerCommandReceived(playeridcmd[], params[], flags
    {
        if ((
    flags ADMIN_LEVEL_1) && AdminLevel[playerid] < 1)
            return 
    0;

        if ((
    flags ADMIN_LEVEL_2) && AdminLevel[playerid] < 2)
            return 
    0

        if ((
    flags ADMIN_LEVEL_3) && AdminLevel[playerid] < 3)
            return 
    0

        return 
    1
    }

    public 
    OnPlayerCommandPerformed(playeridcmd[], params[], resultflags

        if(
    result == -1
        { 
            if (
    flags ADMIN_LEVEL_1)
                
    SendClientMessage(playerid, -1"Your error text");

            if (
    flags ADMIN_LEVEL_2)
                
    SendClientMessage(playerid, -1"Your error text");

            if (
    flags ADMIN_LEVEL_3)
                
    SendClientMessage(playerid, -1"Your error text");

            return 
    0
        }
        return 
    1


  3. Пользователь сказал cпасибо:
    Elrmrnt-Kritik (18.01.2018)
  4. #3
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  5. Пользователь сказал cпасибо:
    Elrmrnt-Kritik (18.01.2018)
  6. #4
    Аватар для Elrmrnt-Kritik
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±
    А если рассмотреть, например, ситуацию, когда доступ к команде имеют игроки фракций 1 и 5, либо 1,2 и 4... Для каждой комбинации таких фракций придется создавать свой флаг и вручную проверять в паблике, вызываемом при отправке команды?

    Типа такого:
    Код:
    public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
    {
    	if((flags & TEAM_GOS) && Player[playerid][pTeam] != 1 && Player[playerid][pTeam] != 4)
    		return SendClientMessage(playerid, -1, "your text min") & 0;
    	return 1;
    }
    И переменную TEAM_GOS для флага нужно будет лепить в единый enum со всеми флагами (как в примере выше, туда же, где и права администратора), либо же иначе?
    Последний раз редактировалось Elrmrnt-Kritik; 18.01.2018 в 17:45.

  7. #5
    Аватар для pawnoholic
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.01.2018
    Сообщений
    128
    Репутация:
    15 ±
    Цитата Сообщение от Elrmrnt-Kritik Посмотреть сообщение
    А если рассмотреть, например, ситуацию, когда доступ к команде имеют игроки фракций 1 и 5, либо 1,2 и 4... Для каждой комбинации таких фракций придется создавать свой флаг и вручную проверять в паблике, вызываемом при отправке команды?

    Типа такого:
    Код:
    public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
    {
    	if((flags & TEAM_GOS) && Player[playerid][pTeam] != 1 && Player[playerid][pTeam] != 4)
    		return SendClientMessage(playerid, -1, "your text min") & 0;
    	return 1;
    }
    И переменную TEAM_GOS для флага нужно будет лепить в единый enum со всеми флагами (как в примере выше, туда же, где и права администратора), либо же иначе?
    Все флаги должны быть перечислены в одном множестве, иначе их значения будут совпадать.

  8. Пользователь сказал cпасибо:
    Elrmrnt-Kritik (18.01.2018)
  9. #6
    Аватар для Elrmrnt-Kritik
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±
    Цитата Сообщение от pawnoholic Посмотреть сообщение
    Все флаги должны быть перечислены в одном множестве, иначе их значения будут совпадать.
    Я же правильно понимаю, больше тридцати двух флагов нельзя?

  10. #7
    Аватар для Long-
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.11.2016
    Сообщений
    131
    Репутация:
    23 ±
    Цитата Сообщение от Elrmrnt-Kritik Посмотреть сообщение
    Я же правильно понимаю, больше тридцати двух флагов нельзя?
    Нельзя больше 32 в одном энуменаторе
    Последний раз редактировалось Long-; 27.01.2018 в 12:49.

  11. Пользователь сказал cпасибо:
    Elrmrnt-Kritik (27.01.2018)
  12. #8
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
     Не так понял суть вопроса. Код в спойлере не рабочий
    Цитата Сообщение от Elrmrnt-Kritik Посмотреть сообщение
    Я же правильно понимаю, больше тридцати двух флагов нельзя?
    Если что, никто не запрещал указывать начало отсчёта для перечисления
    PHP код:
    enum(<<=1

        
    ADMIN_LEVEL_1 1,
        
    ADMIN_LEVEL_2,
        
    ADMIN_LEVEL_3,
        ...,
        
    ADMIN_LEVEL_32
    };
    enum(<<=1

        
    ADMIN_LEVEL_33 ADMIN_LEVEL_32,
        
    ADMIN_LEVEL_34,
        
    ADMIN_LEVEL_35,
        ...,
        
    ADMIN_LEVEL_64
    }; 
    Последний раз редактировалось DeimoS; 16.02.2018 в 09:45.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  13. Пользователь сказал cпасибо:
    Elrmrnt-Kritik (08.02.2018)
  14. #9
    Аватар для Elrmrnt-Kritik
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±
    Уж больше недели наивно думал, что все же соображу. Но не судьба.В вашем коде ADMIN_LEVEL_32 и ADMIN_LEVEL_33 приравнены. А они не пересекутся?

  15. #10
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    А, самому проверить? Через print/printf?

    По идей пересечение должно быть, но я не уверен. Так, что совету не ждать, а проверить. Если все же пересечения есть, то +1 к началу отсчёта в 2 переселении.
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

  16. Пользователь сказал cпасибо:
    Elrmrnt-Kritik (24.03.2018)
 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

Информация о теме

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

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •