Помогите пожалуйста сделать фитчу, когда игрок заходит в игру то выходит диалог с новостями! Глявное чтоб работал не после каждого спавна а только при заходе в игру
Помогите пожалуйста сделать фитчу, когда игрок заходит в игру то выходит диалог с новостями! Глявное чтоб работал не после каждого спавна а только при заходе в игру
Сделай вод так:
Создай переменную:
Дальше в OmPlayerConnectPHP код:
new bool:NewsInPlayerConnect;
Делаем допустим сток, сток можешь использовать при спавне игрокаPHP код:
NewsInPlayerConnect = true;
PHP код:
stock ShowPlayerNews()
{
if(NewsInPlayerConnect == true)
{
NewsInPlayerConnect = false;
// тут выводим новости
}
return 1;
}
Сделал как ты сказал и не выходит диалог при заходе в игру
PHP код:
stock ShowPlayerNews()
{
if(NewsInPlayerConnect == true)
{
NewsInPlayerConnect = false;
ShowPlayerDialog(playerid, 0 , DIALOG_STYLE_MSGBOX, "Новости сервера", "{FFFF00}Версия сервера 0.1\n\n{FFFF00}Добавлено:\n\n{FFFFFF}- Воздушный шар\n- Исправление мелких багов\n- Магнитафон в Магазин 24/7", "Принять", "");
}
return 1;
}
Да надо после авторизации и регистрации, чтоб не показывало диалог после смерти и так далее
Ну так сделай показ новостей при авторизации/регистрации, просто в конец загрузки кинь код запроса на бд и найди самую позднюю запись, и покажи ее текст (чтобы админы могли вручную прописывать новости на сервере, не прибегая к изменению мода)
Накидал быстренько свою идею, на практике не проверял, думаю поймёшь задумку этой системы
// Ко всем глобальным переменным new last_new = 0; // Ко всем стокам stock ShowNewsInServer(playerid) { new string[128+1]; for(new i; i < 10; i++) // В БД будут хранится топ 10 последних новостей { mysql_function_query(ID_ПОДКЛЮЧЕНИЯ_MYSQL, string, true, "@_NewsLastFind", "d", i); } mysql_function_query(ID_ПОДКЛЮЧЕНИЯ_MYSQL, string, true, "@_NewsLoad", "dd", playerid, last_new); } // Ко всем пабликам @_NewsLastFind(news); @_NewsLastFind(news) { new rows, fields; cache_get_data(rows, fields); if(rows) { new news_load = cache_get_field_content_int(0, "newsid"); if(news_load > last_new) last_new = news_load; } return true; } @_NewsLoad(playerid, newsid); @_NewsLoad(playerid, newsid) { new rows, fields; cache_get_data(rows, fields); if(rows) { new news_text[128+1], string[144+1]; cache_get_field_content(0, "newstext", news_text, ID_ПОДКЛЮЧЕНИЯ_MYSQL, sizeof(news_text)); format(string, sizeof(string), "На сервере появились нововведения, ознакомьтесь с ними:\n\n%s", news_text); /*(рекомендую использовать 0, или значение, которое используется для диалогов информации, не несущих функционал)*/ DIALOG_STYLE_MSGBOX, !"{FFFFFF}Новости", string, !"{FFFFFF}Понятно", !""); return true; } } // И где-нибудь при/после авторизации ShowNewsInServer(playerid);
И потом создаешь бд `news` со столбцами `newsid` (AI) и сам текст `newstext`, и где-нибудь при добавлении новости если айди предыдущей новости больше или равен 9, то удаляешь эту новость
Как-то так
Последний раз редактировалось SteveStage; 30.12.2019 в 22:28.
Ты больше путаешь, нежели помогаешь.
Не понятно зачем это всё, какая в ней логика. Зачем удалять все записи, когда показал 10? Для других игроков не надо что ли показывать?)
Как-то так.
#define MYSQL_CONNECTION_ID 1 //ID подключения бд #define DIALOG_NEWS_ID 255 // ID диалога stock ShowNewsInServer(playerid) { mysql_function_query(MYSQL_CONNECTION_ID, !"\ SELECT \ newstext \ FORM \ news \ ORDER BY \ newsid \ LIMIT 10", true, !"@_NewsLoad", !"d", playerid); } @_NewsLoad(playerid); @_NewsLoad(playerid) { new rows, fields; cache_get_data(rows, fields); if (rows) { const MAX_NEWS_TEXT_LENGTH = 128; static string[MAX_NEWS_TEXT_LENGTH * 10 + 1], news_text[MAX_NEWS_TEXT_LENGTH + 1]; string = "На сервере появились нововведения, ознакомьтесь с ними:\n\n"; new i = -1; while (++i < rows) { cache_get_field_content(i, "newstext", news_text, MYSQL_CONNECTION_ID); } } playerid, DIALOG_NEWS_ID, DIALOG_STYLE_MSGBOX, !"Новости", string, !"Окей", !"" ); }
И ещё создай столбец в таблице где хранятся аккаунты, где ты будешь помечать - показывал ли ты новости или нет.
Чиво??? 0_O
Смотри, в бд хранится 10 записей максимум (сначала 0, потом 1 и так до 10, а потом старые будут очищаться для новых), а при создании новой записи айди возрастает, соответственно чтобы найти последнюю запись, надо найти самый высокий из существующих айди, что у меня и реализовано. Далее по самому высокому из существующих айди делаем запрос в бд, т.к. последний айди = последняя запись (при создании каждой новой записи айди будет возрастать), и находим актуальные (последние) новости в бд
Что тут непонятного?
Ну следуя из твоей логи, то зачем нам вообще нужно перебирать все 10 (почему именно 10, зачем вообще эти все махинации), если можно показать сразу последнюю новость?
mysql_function_query(MYSQL_CONNECTION_ID, !"\ SELECT \ newstext \ FORM \ news \ ORDER BY \ newsid \ DESC \ LIMIT 1", true, !"@_NewsLoad", !"d", playerid);
или
mysql_function_query(MYSQL_CONNECTION_ID, !"\ SELECT \ newstext, MAX(newsid) \ FORM \ news", true, !"@_NewsLoad", !"d", playerid);
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)