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

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

    Выход диалога с новостями

    Помогите пожалуйста сделать фитчу, когда игрок заходит в игру то выходит диалог с новостями! Глявное чтоб работал не после каждого спавна а только при заходе в игру

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

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Сообщений
    161
    Репутация:
    3 ±
    Сделай вод так:
    Создай переменную:
    PHP код:
    new bool:NewsInPlayerConnect
    Дальше в OmPlayerConnect
    PHP код:
    NewsInPlayerConnect true
    Делаем допустим сток, сток можешь использовать при спавне игрока
    PHP код:
    stock ShowPlayerNews()
    {
    if(
    NewsInPlayerConnect == true)
    {
    NewsInPlayerConnect false;
    // тут выводим новости
    }
    return 
    1;


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

    Статус
    Оффлайн
    Регистрация
    30.12.2019
    Сообщений
    8
    Репутация:
    0 ±
    Сделал как ты сказал и не выходит диалог при заходе в игру

    PHP код:
    stock ShowPlayerNews()
    {
    if(
    NewsInPlayerConnect == true)
    {
        
    NewsInPlayerConnect false;
        
    ShowPlayerDialog(playeridDIALOG_STYLE_MSGBOX"Новости сервера""{FFFF00}Версия сервера 0.1\n\n{FFFF00}Добавлено:\n\n{FFFFFF}- Воздушный шар\n- Исправление мелких багов\n- Магнитафон в Магазин 24/7""Принять""");
        }
        return 
    1;


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

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Цитата Сообщение от Сергей Посмотреть сообщение
    Сделай вод так:
    Создай переменную:
    PHP код:
    new bool:NewsInPlayerConnect
    Дальше в OmPlayerConnect
    PHP код:
    NewsInPlayerConnect true
    Делаем допустим сток, сток можешь использовать при спавне игрока
    PHP код:
    stock ShowPlayerNews()
    {
    if(
    NewsInPlayerConnect == true)
    {
    NewsInPlayerConnect false;
    // тут выводим новости
    }
    return 
    1;

    Что это за мазахизм? Не проще ли показывать после авторизации/регистрации?

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

    Статус
    Оффлайн
    Регистрация
    30.12.2019
    Сообщений
    8
    Репутация:
    0 ±
    Да надо после авторизации и регистрации, чтоб не показывало диалог после смерти и так далее

  6. #6
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от MAXI-BENZ Посмотреть сообщение
    Да надо после авторизации и регистрации, чтоб не показывало диалог после смерти и так далее
    Ну так сделай показ новостей при авторизации/регистрации, просто в конец загрузки кинь код запроса на бд и найди самую позднюю запись, и покажи ее текст (чтобы админы могли вручную прописывать новости на сервере, не прибегая к изменению мода)

    Накидал быстренько свою идею, на практике не проверял, думаю поймёшь задумку этой системы

    1. // Ко всем глобальным переменным
    2. new
    3. last_new = 0;
    4. // Ко всем стокам
    5. stock ShowNewsInServer(playerid)
    6. {
    7. new
    8. string[128+1];
    9. for(new i; i < 10; i++) // В БД будут хранится топ 10 последних новостей
    10. {
    11. format(string, sizeof(string), "SELECT * FROM `news` WHERE `newsid` = '%d'", i);
    12. mysql_function_query(ID_ПОДКЛЮЧЕНИЯ_MYSQL, string, true, "@_NewsLastFind", "d", i);
    13. }
    14. format(string, sizeof(string), "SELECT * FROM `news` WHERE `newsid` = '%d'", last_new);
    15. mysql_function_query(ID_ПОДКЛЮЧЕНИЯ_MYSQL, string, true, "@_NewsLoad", "dd", playerid, last_new);
    16. }
    17. // Ко всем пабликам
    18. @_NewsLastFind(news);
    19. @_NewsLastFind(news)
    20. {
    21. new
    22. rows, fields;
    23. cache_get_data(rows, fields);
    24. if(rows)
    25. {
    26. new
    27. news_load = cache_get_field_content_int(0, "newsid");
    28. if(news_load > last_new) last_new = news_load;
    29. }
    30. return true;
    31. }
    32. @_NewsLoad(playerid, newsid);
    33. @_NewsLoad(playerid, newsid)
    34. {
    35. new
    36. rows, fields;
    37. cache_get_data(rows, fields);
    38. if(rows)
    39. {
    40. new
    41. news_text[128+1],
    42. string[144+1];
    43. cache_get_field_content(0, "newstext", news_text, ID_ПОДКЛЮЧЕНИЯ_MYSQL, sizeof(news_text));
    44. format(string, sizeof(string), "На сервере появились нововведения, ознакомьтесь с ними:\n\n%s", news_text);
    45. ShowPlayerDialog(playerid, ID_ДИАЛОГА,
    46. /*(рекомендую использовать 0, или значение, которое используется для диалогов информации, не несущих функционал)*/
    47. DIALOG_STYLE_MSGBOX, !"{FFFFFF}Новости", string, !"{FFFFFF}Понятно", !"");
    48. return true;
    49. }
    50. }
    51. // И где-нибудь при/после авторизации
    52. ShowNewsInServer(playerid);


    И потом создаешь бд `news` со столбцами `newsid` (AI) и сам текст `newstext`, и где-нибудь при добавлении новости если айди предыдущей новости больше или равен 9, то удаляешь эту новость
    Как-то так
    Последний раз редактировалось SteveStage; 30.12.2019 в 22:28.

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

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    Ну так сделай показ новостей при авторизации/регистрации, просто в конец загрузки кинь код запроса на бд и найди самую позднюю запись, и покажи ее текст (чтобы админы могли вручную прописывать новости на сервере, не прибегая к изменению мода)

    Накидал быстренько свою идею, на практике не проверял, думаю поймёшь задумку этой системы

    1. // Ко всем глобальным переменным
    2. new
    3. last_new = 0;
    4. // Ко всем стокам
    5. stock ShowNewsInServer(playerid)
    6. {
    7. new
    8. string[128+1];
    9. for(new i; i < 10; i++) // В БД будут хранится топ 10 последних новостей
    10. {
    11. format(string, sizeof(string), "SELECT * FROM `news` WHERE `newsid` = '%d'", i);
    12. mysql_function_query(ID_ПОДКЛЮЧЕНИЯ_MYSQL, string, true, "@_NewsLastFind", "d", i);
    13. }
    14. format(string, sizeof(string), "SELECT * FROM `news` WHERE `newsid` = '%d'", last_new);
    15. mysql_function_query(ID_ПОДКЛЮЧЕНИЯ_MYSQL, string, true, "@_NewsLoad", "dd", playerid, last_new);
    16. }
    17. // Ко всем пабликам
    18. @_NewsLastFind(news);
    19. @_NewsLastFind(news)
    20. {
    21. new
    22. rows, fields;
    23. cache_get_data(rows, fields);
    24. if(rows)
    25. {
    26. new
    27. news_load = cache_get_field_content_int(0, "newsid");
    28. if(news_load > last_new) last_new = news_load;
    29. }
    30. return true;
    31. }
    32. @_NewsLoad(playerid, newsid);
    33. @_NewsLoad(playerid, newsid)
    34. {
    35. new
    36. rows, fields;
    37. cache_get_data(rows, fields);
    38. if(rows)
    39. {
    40. new
    41. news_text[128+1],
    42. string[144+1];
    43. cache_get_field_content(0, "newstext", news_text, ID_ПОДКЛЮЧЕНИЯ_MYSQL, sizeof(news_text));
    44. format(string, sizeof(string), "На сервере появились нововведения, ознакомьтесь с ними:\n\n%s", news_text);
    45. ShowPlayerDialog(playerid, ID_ДИАЛОГА,
    46. /*(рекомендую использовать 0, или значение, которое используется для диалогов информации, не несущих функционал)*/
    47. DIALOG_STYLE_MSGBOX, !"{FFFFFF}Новости", string, !"{FFFFFF}Понятно", !"");
    48. return true;
    49. }
    50. }
    51. // И где-нибудь при/после авторизации
    52. ShowNewsInServer(playerid);


    И потом создаешь бд `news` со столбцами `newsid` (AI) и сам текст `newstext`, и где-нибудь при добавлении новости если айди предыдущей новости больше или равен 9, то удаляешь эту новость
    Как-то так
    Ты больше путаешь, нежели помогаешь.

    Не понятно зачем это всё, какая в ней логика. Зачем удалять все записи, когда показал 10? Для других игроков не надо что ли показывать?)

    Как-то так.

    1. #define MYSQL_CONNECTION_ID 1 //ID подключения бд
    2. #define DIALOG_NEWS_ID 255 // ID диалога
    3.  
    4. stock ShowNewsInServer(playerid)
    5. {
    6. mysql_function_query(MYSQL_CONNECTION_ID, !"\
    7. SELECT \
    8. newstext \
    9. FORM \
    10. news \
    11. ORDER BY \
    12. newsid \
    13. LIMIT 10",
    14. true, !"@_NewsLoad", !"d", playerid);
    15. }
    16.  
    17. @_NewsLoad(playerid);
    18. @_NewsLoad(playerid)
    19. {
    20. new
    21. rows, fields;
    22. cache_get_data(rows, fields);
    23. if (rows)
    24. {
    25. const MAX_NEWS_TEXT_LENGTH = 128;
    26. static
    27. string[MAX_NEWS_TEXT_LENGTH * 10 + 1],
    28. news_text[MAX_NEWS_TEXT_LENGTH + 1];
    29.  
    30. string = "На сервере появились нововведения, ознакомьтесь с ними:\n\n";
    31.  
    32. new
    33. i = -1;
    34. while (++i < rows)
    35. {
    36. cache_get_field_content(i, "newstext", news_text, MYSQL_CONNECTION_ID);
    37. strcat(string, news_text);
    38. strcat(string, "\n");
    39. }
    40. }
    41.  
    42. playerid,
    43. DIALOG_NEWS_ID,
    44. DIALOG_STYLE_MSGBOX,
    45. !"Новости",
    46. string,
    47. !"Окей", !""
    48. );
    49. }


    И ещё создай столбец в таблице где хранятся аккаунты, где ты будешь помечать - показывал ли ты новости или нет.

  8. #8
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от execution Посмотреть сообщение
    Не понятно зачем это всё, какая в ней логика. Зачем удалять все записи, когда показал 10? Для других игроков не надо что ли показывать?)
    Чиво??? 0_O
    Смотри, в бд хранится 10 записей максимум (сначала 0, потом 1 и так до 10, а потом старые будут очищаться для новых), а при создании новой записи айди возрастает, соответственно чтобы найти последнюю запись, надо найти самый высокий из существующих айди, что у меня и реализовано. Далее по самому высокому из существующих айди делаем запрос в бд, т.к. последний айди = последняя запись (при создании каждой новой записи айди будет возрастать), и находим актуальные (последние) новости в бд
    Что тут непонятного?

  9. #9
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    Чиво??? 0_O
    Смотри, в бд хранится 10 записей максимум (сначала 0, потом 1 и так до 10, а потом старые будут очищаться для новых), а при создании новой записи айди возрастает, соответственно чтобы найти последнюю запись, надо найти самый высокий из существующих айди, что у меня и реализовано. Далее по самому высокому из существующих айди делаем запрос в бд, т.к. последний айди = последняя запись (при создании каждой новой записи айди будет возрастать), и находим актуальные (последние) новости в бд
    Что тут непонятного?
    Ну следуя из твоей логи, то зачем нам вообще нужно перебирать все 10 (почему именно 10, зачем вообще эти все махинации), если можно показать сразу последнюю новость?

    1. mysql_function_query(MYSQL_CONNECTION_ID, !"\
    2. SELECT \
    3. newstext \
    4. FORM \
    5. news \
    6. ORDER BY \
    7. newsid \
    8. DESC \
    9. LIMIT 1",
    10. true, !"@_NewsLoad", !"d", playerid);


    или

    1. mysql_function_query(MYSQL_CONNECTION_ID, !"\
    2. SELECT \
    3. newstext, MAX(newsid) \
    4. FORM \
    5. news",
    6. true, !"@_NewsLoad", !"d", playerid);

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

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от execution Посмотреть сообщение
    Ну следуя из твоей логи, то зачем нам вообще нужно перебирать все 10 (почему именно 10, зачем вообще эти все махинации), если можно показать сразу последнюю новость?

    1. mysql_function_query(MYSQL_CONNECTION_ID, !"\
    2. SELECT \
    3. newstext \
    4. FORM \
    5. news \
    6. ORDER BY \
    7. newsid \
    8. DESC \
    9. LIMIT 1",
    10. true, !"@_NewsLoad", !"d", playerid);


    или

    1. mysql_function_query(MYSQL_CONNECTION_ID, !"\
    2. SELECT \
    3. newstext, MAX(newsid) \
    4. FORM \
    5. news",
    6. true, !"@_NewsLoad", !"d", playerid);
    Не сильно знаком с запросами mysql, знаю только основные 3 запроса SELECT/UPDATE/INSERT INTO (вместо CREATE вручную в бд через phpmyadmin создаю)

 

 

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

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

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

Ваши права

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