PDA

Просмотр полной версии : [F.A.Q] Выход диалога с новостями



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

Сергей
30.12.2019, 18:49
Сделай вод так:
Создай переменную:

new bool:NewsInPlayerConnect;
Дальше в OmPlayerConnect

NewsInPlayerConnect = true;
Делаем допустим сток, сток можешь использовать при спавне игрока

stock ShowPlayerNews()
{
if(NewsInPlayerConnect == true)
{
NewsInPlayerConnect = false;
// тут выводим новости
}
return 1;
}

MAXI-BENZ
30.12.2019, 19:30
Сделал как ты сказал и не выходит диалог при заходе в игру


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;
}

execution
30.12.2019, 19:51
Сделай вод так:
Создай переменную:

new bool:NewsInPlayerConnect;
Дальше в OmPlayerConnect

NewsInPlayerConnect = true;
Делаем допустим сток, сток можешь использовать при спавне игрока

stock ShowPlayerNews()
{
if(NewsInPlayerConnect == true)
{
NewsInPlayerConnect = false;
// тут выводим новости
}
return 1;
}

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

MAXI-BENZ
30.12.2019, 20:01
Да надо после авторизации и регистрации, чтоб не показывало диалог после смерти и так далее

SteveStage
30.12.2019, 21:39
Да надо после авторизации и регистрации, чтоб не показывало диалог после смерти и так далее

Ну так сделай показ новостей при авторизации/регистрации, просто в конец загрузки кинь код запроса на бд и найди самую позднюю запись, и покажи ее текст (чтобы админы могли вручную прописывать новости на сервере, не прибегая к изменению мода)

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

// Ко всем глобальным переменным
new
last_new = 0;
// Ко всем стокам
stock ShowNewsInServer(playerid)
{
new
string[128+1];
for(new i; i < 10; i++) // В БД будут хранится топ 10 последних новостей
{
format(string, sizeof(string), "SELECT * FROM `news` WHERE `newsid` = '%d'", i);
mysql_function_query(ID_ПОДКЛЮЧЕНИЯ_MYSQL, string, true, "@_NewsLastFind", "d", i);
}
format(string, sizeof(string), "SELECT * FROM `news` WHERE `newsid` = '%d'", last_new);
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);
ShowPlayerDialog(playerid, ID_ДИАЛОГА,
/*(рекомендую использовать 0, или значение, которое используется для диалогов информации, не несущих функционал)*/
DIALOG_STYLE_MSGBOX, !"{FFFFFF}Новости", string, !"{FFFFFF}Понятно", !"");
return true;
}
}
// И где-нибудь при/после авторизации
ShowNewsInServer(playerid);

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

execution
31.12.2019, 00:05
Ну так сделай показ новостей при авторизации/регистрации, просто в конец загрузки кинь код запроса на бд и найди самую позднюю запись, и покажи ее текст (чтобы админы могли вручную прописывать новости на сервере, не прибегая к изменению мода)

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

// Ко всем глобальным переменным
new
last_new = 0;
// Ко всем стокам
stock ShowNewsInServer(playerid)
{
new
string[128+1];
for(new i; i < 10; i++) // В БД будут хранится топ 10 последних новостей
{
format(string, sizeof(string), "SELECT * FROM `news` WHERE `newsid` = '%d'", i);
mysql_function_query(ID_ПОДКЛЮЧЕНИЯ_MYSQL, string, true, "@_NewsLastFind", "d", i);
}
format(string, sizeof(string), "SELECT * FROM `news` WHERE `newsid` = '%d'", last_new);
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);
ShowPlayerDialog(playerid, ID_ДИАЛОГА,
/*(рекомендую использовать 0, или значение, которое используется для диалогов информации, не несущих функционал)*/
DIALOG_STYLE_MSGBOX, !"{FFFFFF}Новости", string, !"{FFFFFF}Понятно", !"");
return true;
}
}
// И где-нибудь при/после авторизации
ShowNewsInServer(playerid);

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

Ты больше путаешь, нежели помогаешь.

Не понятно зачем это всё, какая в ней логика. Зачем удалять все записи, когда показал 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);
strcat(string, news_text);
strcat(string, "\n");
}
}

return ShowPlayerDialog(
playerid,
DIALOG_NEWS_ID,
DIALOG_STYLE_MSGBOX,
!"Новости",
string,
!"Окей", !""
);
}

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

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

Чиво??? 0_O
Смотри, в бд хранится 10 записей максимум (сначала 0, потом 1 и так до 10, а потом старые будут очищаться для новых), а при создании новой записи айди возрастает, соответственно чтобы найти последнюю запись, надо найти самый высокий из существующих айди, что у меня и реализовано. Далее по самому высокому из существующих айди делаем запрос в бд, т.к. последний айди = последняя запись (при создании каждой новой записи айди будет возрастать), и находим актуальные (последние) новости в бд
Что тут непонятного?

execution
31.12.2019, 11:41
Чиво??? 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);

SteveStage
31.12.2019, 16:41
Ну следуя из твоей логи, то зачем нам вообще нужно перебирать все 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);

Не сильно знаком с запросами mysql, знаю только основные 3 запроса SELECT/UPDATE/INSERT INTO (вместо CREATE вручную в бд через phpmyadmin создаю)