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

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    541
    Репутация:
    78 ±

    Проверка существования инклуда

    По очереди подключены 2 инклуда. Как в верхнем проверить существование нижнего, а в нижнем - верхнего, через директивы? Чтобы без посредника.
    Последний раз редактировалось m1n1vv; 29.11.2018 в 11:36.

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Не думаю, что директивами нормально получится сделать проверку существования нижнего инклуда в верхнем, так как препроцессор всего раз проходит по скрипту, как я знаю. Хотя вообще непонятно зачем это. Достаточно просто в нижнем проверять существование верхнего, а в верхнем всё объявлять через stock, чтоб если нижний инклуд исчез, то и код верхнего сам по себе "отключался".

    Ну так же, как вариант - создать функцию в каждом инклуде и вызывать функцию одного инклуда в другом. Будет ошибка о том, что функции нет - инклуд не подключён :D Хотя можно просто ошибку выдавать не при компиляции, а при запуске сервера, например, объявляя в инклудах GVar, а потом проверяя их наличие
    Последний раз редактировалось DeimoS; 29.11.2018 в 11:59.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  3. #3
    Аватар для m1n1vv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    541
    Репутация:
    78 ±
    В верхнем:
    PHP код:
    #if defined PROTOCOLS
        
    GivePlayerProtocolPoints(playeridPROTOCOL_MANAGER5);
    #endif 
    В нижнем:
    PHP код:
    #if defined BIGMONEY
        
    pvar GetPVarInt(playerid, !"BigMoneyPlayer");
    #endif 

  4. #4
    Аватар для DeimoS
    Модератор?

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


    Или таком
      Открыть/закрыть
    1. /*
    2.   Инклуд 1
    3. */
    4.  
    5.  
    6. {
    7. SetSVarInt("CheckInc1", 1);
    8. SetTimer("@_CheckInc", 5000, false);
    9.  
    10.  
    11. #if defined checkinc1_OnGameModeInit
    12. return checkinc1_OnGameModeInit();
    13. #else
    14. return 1;
    15. #endif
    16. }
    17. #if defined _ALS_OnGameModeInit
    18. #undef OnGameModeInit
    19. #else
    20. #define _ALS_OnGameModeInit
    21. #endif
    22.  
    23. #define OnGameModeInit checkinc1_OnGameModeInit
    24. #if defined checkinc1_OnGameModeInit
    25. forward checkinc1_OnGameModeInit();
    26. #endif
    27.  
    28. @_CheckInc();
    29. @_CheckInc()
    30. {
    31. if(GetSVarType("CheckInc2") == SERVER_VARTYPE_NONE)
    32. {
    33. //Второй инклуд не подключён
    34. }
    35. DeleteSVar("CheckInc1");
    36. DeleteSVar("CheckInc2");
    37. return;
    38. }



    1. /*
    2.   Инклуд 2
    3. */
    4.  
    5. {
    6. if(GetSVarType("CheckInc1") == SERVER_VARTYPE_NONE)
    7. {
    8. //Первый инклуд не подключён
    9. DeleteSVar("CheckInc1");
    10. DeleteSVar("CheckInc2");
    11. }
    12. else
    13. SetSVarInt("CheckInc2", 1);
    14.  
    15. #if defined checkinc2_OnGameModeInit
    16. return checkinc2_OnGameModeInit();
    17. #else
    18. return 1;
    19. #endif
    20. }
    21. #if defined _ALS_OnGameModeInit
    22. #undef OnGameModeInit
    23. #else
    24. #define _ALS_OnGameModeInit
    25. #endif
    26.  
    27. #define OnGameModeInit checkinc2_OnGameModeInit
    28. #if defined checkinc2_OnGameModeInit
    29. forward checkinc2_OnGameModeInit();
    30. #endif
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    541
    Репутация:
    78 ±
    Если нужного инклуда нет, часть код связанная с ним условно будет в памяти.

  6. #6
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Во-первых, это никакой особой погоды не сделает (ты же не на калькуляторе собрался сервер запускать).
    Во-вторых, в моих вариантах подразумевается, что ты вырубаешь сервер через SendRconCommand("exit"), если инклуд не найден.

    Хотя всё ещё не вижу в этом большого смысла. Паблик-моды и с большими проблемами существуют, работая, при этом.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  7. #7
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Не думаю, что директивами нормально получится сделать проверку существования нижнего инклуда в верхнем, так как препроцессор всего раз проходит по скрипту, как я знаю.
    Компилятор проходит по скрипту как минимум 2 раза. Первый проход нужен в основном для того, чтобы собрать информацию обо всех глобальных идентификаторах (переменных, функциях, константах). Кроме того, на 1-м проходе возникает много ошибок (например, когда функция где-то вызывается, но ещё не объявлена/реализована), но все они подавляются и не выводятся в консоль.
    Сама же компиляция происходит на 2-м проходе, когда компилятор уже один раз "просмотрел" содержимое скрипта и знает о существовании всех констант/переменных/функций. Как пример, именно за счёт такого принципа работает оператор defined, которым можно проверить существование функции до её объявления (что часто можно увидеть при перехвате функций).
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  8. Пользователь сказал cпасибо:
    DeimoS (29.11.2018)
  9. #8
    Аватар для m1n1vv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    541
    Репутация:
    78 ±
    Так какой выход из ситуации?

  10. #9
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от m1n1vv Посмотреть сообщение
    В верхнем:
    PHP код:
    #if defined PROTOCOLS
        
    GivePlayerProtocolPoints(playeridPROTOCOL_MANAGER5);
    #endif 
    В нижнем:
    PHP код:
    #if defined BIGMONEY
        
    pvar GetPVarInt(playerid, !"BigMoneyPlayer");
    #endif 
    ИМХО, по-хорошему таких ситуаций с перекрёстными ссылками не должно быть, проблема здесь именно в проектировании. Как вариант, можно указанные вами части кода "двойного назначения", т.е. которые работают и с серверными деньгами, и с протоколами, вынести в третий инклуд.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  11. #10
    Аватар для m1n1vv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    541
    Репутация:
    78 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    ИМХО, по-хорошему таких ситуаций с перекрёстными ссылками не должно быть, проблема здесь именно в проектировании. Как вариант, можно указанные вами части кода "двойного назначения", т.е. которые работают и с серверными деньгами, и с протоколами, вынести в третий инклуд.
    В первом посте написал:
    Цитата Сообщение от m1n1vv Посмотреть сообщение
    Чтобы без посредника.
    - - - Добавлено - - -

    PHP код:
    #include <SFCR/player/protocols.inc>
    #include <SFCR/player/bigmoney.inc> 
    В первом объявить директиву PROTOCOL_SET_BIGMONEY, и через нее проверять сам protocols и bigmoney
    Последний раз редактировалось m1n1vv; 29.11.2018 в 13:49.

 

 

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

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

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

Ваши права

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