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

    Статус
    Оффлайн
    Регистрация
    05.11.2019
    Сообщений
    2
    Репутация:
    0 ±

    Как получить переменную в инклуде из мода

    Добрый день

    Описание:

    В моде есть массив с данными аккаунта,
    1. static SelectCMName[24][MAX_PLAYERS];
    2.  
    3. #define SYNC_TYPES (6)
    4.  
    5. enum pInfo {
    6. pID,
    7. pName[MAX_PLAYER_NAME],
    8. pKey[32],
    9. pEmail[64],
    10. pRefer[MAX_PLAYER_NAME],
    11. SyncTime[SYNC_TYPES],
    12. LastSyncUpdate[SYNC_TYPES]
    13. }
    14. new PlayerInfo[MAX_PLAYERS][pInfo];
    15.  
    16. //цветами чата и т.п.
    17.  
    18. #define COLOR_LIGHTBLUE 0x33CCFFFF


    Планирую разделить мод на модули
    К нему будут подключены несколько инклудов с различными системами, такими как кланы, работы, дома, машины ну и в таком духе.
    Хочу сделать их полностью независимыми, чтоб можно было отключать каждую систему без вреда для работы мода.
    Использую перехваты функций.

    В каждом инклуде будут использоваться одинаковые цвета и переменные.
    К примеру:

    #include "clan_system.inc"
    1. //Пример одного из диалогов
    2.  
    3. case D_CLAN_RANK:
    4. {
    5. if(!response) return true;
    6. new string[128],giveplayerid;
    7. if(sscanf(SelectCMName[playerid],"u",giveplayerid)) return true;
    8. if(sscanf(inputtext,"i",strval(inputtext))) return ShowPlayerDialog(playerid,D_CLAN_RANK,DIALOG_STYLE _INPUT,""FPHEAD"Повысuть/Понuзuть",""FPMSG"Какой ранг Вы хотuте выдать uгроку?","Выбрать","Отмена");
    9.  
    10. if(strval(inputtext) < 1 || strval(inputtext) > 8) return ErrorMes(playerid, "Ранг может быть от 1 до 8.");
    11.  
    12. if(IsPlayerConnected(giveplayerid))
    13. {
    14. if(FamilyInfo[playerid][fID] != FamilyInfo[giveplayerid][fID]) return ErrorMes(playerid, "Этот uгрок не состоuт в вашем клане.");
    15. if(playerid == giveplayerid) return ErrorMes(playerid, "Вы не можете uзменuть себе ранг.");
    16. if(FamilyInfo[giveplayerid][fType]) return ErrorMes(playerid, "Вы не можете uзменuть ранг этому uгроку.");
    17.  
    18. if(strval(inputtext) > FamilyInfo[giveplayerid][fRank])
    19.  
    20. format(string, sizeof(string), "Вы былu повышены до %d ранга лuдером %s",strval(inputtext), PlayerInfo[playerid][pName]);
    21. SendClientMessage(giveplayerid, COLOR_LIGHTBLUE, string);
    22. format(string, sizeof(string), "Вы повысuлu uгрока %s до %d ранга.", PlayerInfo[giveplayerid][pName], strval(inputtext));
    23. SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
    24. }
    25. else
    26. {
    27. format(string, sizeof(string), "Вы былu понuжены до %d ранга лuдером %s",strval(inputtext), PlayerInfo[playerid][pName]);
    28. SendClientMessage(giveplayerid, COLOR_LIGHTBLUE, string);
    29. format(string, sizeof(string), "Вы понuзuлu uгрока %s до %d ранга.", PlayerInfo[giveplayerid][pName], strval(inputtext));
    30. SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
    31. }
    32. UpdatePlayerClanTeam(giveplayerid, 0, strval(inputtext));
    33. }
    34. else
    35. {
    36. format(string, sizeof(string), "Вы выдалu uгроку %s %d ранг.", SelectCMName[playerid], strval(inputtext));
    37. SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
    38. format(string,sizeof(string),"UPDATE `samp_clanteam` SET `Rank` = '%d' WHERE `Name`='%s'",
    39. strval(inputtext), SelectCMName[playerid]);
    40. mysql_tquery(MYSQL_DEFAULT_HANDLE, string);
    41. }
    42. }


    Собственно сам вопрос:

    Как лучше всего получать значения этих переменных из мода, чтоб не объявлять их в каждый раз для каждого инклуда? И не было конфликтов.

    - - - Добавлено - - -

    В голову приходит следующий способ:

    1. #if !defined COLOR_LIGHTBLUE
    2. #define COLOR_LIGHTBLUE 0x33CCFFFF
    3. #endif

    Но каждый раз объявлять его и прочие переменные в каждом инклуде считаю не совсем корректно.
    Может есть способ получше?
    Последний раз редактировалось Mr.X; 05.11.2019 в 12:57.

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

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

    Во-вторых, твоя проблема решается заголовочными файлами. То есть, вынеси все общие макросы/переменные в отдельный файл и подключи его выше всех остальных инклудов, в которых уже будут использоваться эти макросы/переменные.
    Либо можно сделать отдельный инклуд с функциями, которые уже будут возвращать нужные значения цвета и т.п., если речь идёт именно о константных значениях.
    Связаться со мной в VK можно через личные сообщения этой группы

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

    Steve Pavlina

  3. Пользователь сказал cпасибо:
    Mr.X (05.11.2019)
  4. #3
    Аватар для Mr.X
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.11.2019
    Сообщений
    2
    Репутация:
    0 ±
    Касательно подключения макросов понял.
    А по поводу модульности, как лучше делать если не перехватами?

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

    Статус
    Оффлайн
    Регистрация
    09.08.2019
    Сообщений
    30
    Репутация:
    6 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Во-первых, использовать перехваты для реализации "модульности" скрипта - такая себе затея. Что ты будешь делать, когда в одном из новых инклудов тебе нужно, например, OnGameModeInit вызывать самым первым из всех инклудов, а OnPlayerConnect, при этом, вызывать последним? :)
    А зачем нам зависимость от порядка исполнения? Можно использовать y_hooks, которая позволяет для специфичных библиотек, вроде samp-fixes, вызвать их код горантированно раньше вашего.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,166
    Репутация:
    1840 ±
    Цитата Сообщение от Mr.X Посмотреть сообщение
    Касательно подключения макросов понял.
    А по поводу модульности, как лучше делать если не перехватами?
    В инклудах создавать функции и вызывать их в пабликах основного мода. Таким образом ты наглядно будешь видеть порядок вызова твоего кода и сможешь его в любой момент изменить.
    Вот тут подробно обсуждали этот вопрос - http://pro-pawn.ru/showthread.php?15165-Geebrox

    Цитата Сообщение от vvw Посмотреть сообщение
    А зачем нам зависимость от порядка исполнения? Можно использовать y_hooks, которая позволяет для специфичных библиотек, вроде samp-fixes, вызвать их код горантированно раньше вашего.
    Потому что есть множество систем, код которых нужно вызывать в конкретный момент, а не абы как? Например, из таблицы данные загружать обязательно после подключения к БД, а проверки в каком-либо паблике делать перед большинством инклудов, но не после инклуда античита.
    Можно, конечно, извратиться с перехватами, но придётся в голове держать порядок вызова всех функций в инклудах для каждого паблика. И всё непонятно ради чего, когда можно сделать проще и удобнее.


    UPD: Перехваты, объективно, удобны в инклудах, которые публикуются для использования другими людьми, дабы обеспечить упрощённое подключение инклуда. Но использовать их в модульном моде - затея такая себе. Максимум - для перехвата нативных функций, по типу выдачи денег и т.п. Хотя я и тут советовал бы делать свои функции, дабы потом не беспокоиться о том, что все инклуды, в которых будет использоваться GivePlayerMoney, должны быть ниже инклуда с перехватом. Да и код, в целом, будет понятнее.
    Последний раз редактировалось DeimoS; 06.11.2019 в 12:00.
    Связаться со мной в VK можно через личные сообщения этой группы

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

    Steve Pavlina

  7. Пользователь сказал cпасибо:
    Mr.X (06.11.2019)
 

 

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

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

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

Ваши права

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