PDA

Просмотр полной версии : [Вопрос] Сохранение, другой вариант



StevenH
02.07.2017, 01:14
Здравствуйте. У меня в моде сохранение следующим образом будет (только начал переводить):


PlayerInfo[playerid][pSkin] = 30;
UpdatePlayerData(playerid, "skin", PlayerInfo[playerid][pSkin]);


Может есть какой то похожий другой вариант, чтобы не писать каждый раз так.

$continue$
02.07.2017, 02:29
Можешь в саму функцию UpdatePlayerData передавать переменную для сохранения и значения для это переменной. Т.е:


UpdatePlayerData(const playerid, const column[], var, value);
// playerid - ид игрока для которого обновлять
// column - обновляемая "ячейка"
// var - переменная, которая обновляется
// value - значение для обновляемой переменной

StevenH
02.07.2017, 02:52
Можешь в саму функцию UpdatePlayerData передавать переменную для сохранения и значения для это переменной. Т.е:


UpdatePlayerData(const playerid, const column[], var, value);
// playerid - ид игрока для которого обновлять
// column - обновляемая "ячейка"
// var - переменная, которая обновляется
// value - значение для обновляемой переменной


Как вариант тоже можно.

Пока подожду, может еще какие будут варианты..

DeimoS
02.07.2017, 03:37
UpdatePlayerData(playerid, "skin", (PlayerInfo[playerid][pSkin] = 30));
? :)

А вообще, как по мне, следует для таких дел написать отдельную функцию, которая сразу и в игре будет обновлять скин (содержать SetPlayerSkin в себе), и данные в БД (ну или же сделать перехват SetPlayerSkin, в котором добавить параметр, который обозначал бы синхронизацию данных). А плодить миллион функций ради совершения одного действия или в одну функцию пихать миллион задач - такая себе затея

StevenH
02.07.2017, 12:36
UpdatePlayerData(playerid, "skin", (PlayerInfo[playerid][pSkin] = 30));
? :)

А вообще, как по мне, следует для таких дел написать отдельную функцию, которая сразу и в игре будет обновлять скин (содержать SetPlayerSkin в себе), и данные в БД (ну или же сделать перехват SetPlayerSkin, в котором добавить параметр, который обозначал бы синхронизацию данных). А плодить миллион функций ради совершения одного действия или в одну функцию пихать миллион задач - такая себе затея

Хм.. тогда подробнее на счет перехвата или подобного..

middlematt
02.07.2017, 15:18
Хм.. тогда подробнее на счет перехвата или подобного..
Тут. (http://pro-pawn.ru/showthread.php?10447-%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%B2%D0%B0%D1%82-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9-%D1%87%D0%B0%D1%81%D1%82%D1%8C-1-%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B)

StevenH
02.07.2017, 15:28
Тут. (http://pro-pawn.ru/showthread.php?10447-%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%B2%D0%B0%D1%82-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9-%D1%87%D0%B0%D1%81%D1%82%D1%8C-1-%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B)

В теме рассказывается как мы перехватывает обычные паблики, но никак не массивы

middlematt
02.07.2017, 16:08
В теме рассказывается как мы перехватывает обычные паблики, но никак не массивы
Перехват массивов? Что, простите?
Насколько я знаю, можно перехватить только функцию и коллбэк.

А DeimoS наверно имел ввиду такой вариант:

stock SetPlayerSkinEx(const playerid, const skin_modelid)
{
static const
fmt_str0[] = "UPDATE `accounts` SET `skin` = '%i' WHERE `id` = '%i'";
new
str0[sizeof (fmt_str0) + (3 + MAX_PLAYER_NAME)];
format(str0, sizeof (str0), fmt_str0,
PlayerInfo[playerid][pSkin], PlayerInfo[playerid][pID]);
mysql_tquery(db_handle, str0);

return SetPlayerSkin(playerid, skin_modelid);
}
#if defined _ALS_SetPlayerSkin
#undef SetPlayerSkinEx
#else
#define _ALS_SetPlayerSkin
#endif
#define SetPlayerSkin SetPlayerSkinEx
Может он имел что-то другое, но думая суть понятна.

$continue$
02.07.2017, 16:19
Плохая практика изменять работу функции. (добавлять в нее параметр и т.д). И если я захочу изменить скин в игре на временный, то запрос отправится в пустую.

Перехват массивов? Что, простите?
Насколько я знаю, можно перехватить только функцию и коллбэк.

А DeimoS наверно имел ввиду такой вариант:

stock SetPlayerSkinEx(const playerid, const skin_modelid)
{
static const
fmt_str0[] = "UPDATE `accounts` SET `skin` = '%i' WHERE `id` = '%i'";
new
str0[sizeof (fmt_str0) + (3 + MAX_PLAYER_NAME)];
format(str0, sizeof (str0), fmt_str0,
PlayerInfo[playerid][pSkin], PlayerInfo[playerid][pID]);
mysql_tquery(db_handle, str0);

return SetPlayerSkin(playerid, skin_modelid);
}
#if defined _ALS_SetPlayerSkin
#undef SetPlayerSkinEx
#else
#define _ALS_SetPlayerSkin
#endif
#define SetPlayerSkin SetPlayerSkinEx
Может он имел что-то другое, но думая суть понятна.

StevenH
02.07.2017, 16:48
Перехват массивов? Что, простите?
Насколько я знаю, можно перехватить только функцию и коллбэк.

А DeimoS наверно имел ввиду такой вариант:

stock SetPlayerSkinEx(const playerid, const skin_modelid)
{
static const
fmt_str0[] = "UPDATE `accounts` SET `skin` = '%i' WHERE `id` = '%i'";
new
str0[sizeof (fmt_str0) + (3 + MAX_PLAYER_NAME)];
format(str0, sizeof (str0), fmt_str0,
PlayerInfo[playerid][pSkin], PlayerInfo[playerid][pID]);
mysql_tquery(db_handle, str0);

return SetPlayerSkin(playerid, skin_modelid);
}
#if defined _ALS_SetPlayerSkin
#undef SetPlayerSkinEx
#else
#define _ALS_SetPlayerSkin
#endif
#define SetPlayerSkin SetPlayerSkinEx
Может он имел что-то другое, но думая суть понятна.

Почему SetPlayerSkin? То что в массиве был pSkin, это ни о чем не говорит. Допустим, в массиве игрока будет pMoney, и?

DeimoS
02.07.2017, 21:03
Нет, я имел ввиду это

stock SetPlayerSkinEx(playerid, skinid, bool:sync = false)
{
static
query_string[39+3+11+1];

if(sync == true)
{
PlayerInfo[playerid][pSkin] = skinid;

format(query_string, sizeof (query_string), "UPDATE accounts SET skin = %i WHERE id = %i",
skinid,
PlayerInfo[playerid][pID]);
mysql_tquery(db_handle, query_string);
}

return SetPlayerSkin(playerid, skinid);
}
#if defined _ALS_SetPlayerSkin
#undef SetPlayerSkinEx
#else
#define _ALS_SetPlayerSkin
#endif
#define SetPlayerSkin SetPlayerSkinEx

И теперь всякий раз, когда нужно выдать скин, который должен записаться в базу данных, нужно прописать

SetPlayerSkin(playerid, skinid, true);
Всё. И компактно, и не нужно запоминать лишнюю информацию, кроме того, что у функции появился дополнительный параметр.

Для денег, собственно, то же самое. Я в своём моде использовал такую конструкцию

stock update_GivePlayerMoney(playerid, money)
{
PlayerInfo[playerid][pMoney] += money;
if(money != 0)// Этот перехват является так же и античитом на деньги. Обновление денег для игрока происходит путём вызова "GivePlayerMoney(playerid, 0)" и дабы вхолостую не отправлять запрос, существует эта проверка
{

static
query_string[40+11+11+1];

format(query_string, sizeof (query_string), "UPDATE accounts SET money = %i WHERE id = %i",
PlayerInfo[playerid][pMoney],
PlayerInfo[playerid][pID]);
mysql_tquery(db_handle, query_string);
}
ResetPlayerMoney(playerid);
return GivePlayerMoney(playerid, PlayerInfo[playerid][pMoney]);
}
#if defined _ALS_GivePlayerMoney
#undef GivePlayerMoney
#else
#define _ALS_GivePlayerMoney
#endif

#define GivePlayerMoney update_GivePlayerMoney

phpadmin
04.07.2017, 19:03
а как потом временный скин выдавать? Это штуковина не будет затмевать работу обычной setplayerskin ???

StevenH
04.07.2017, 19:14
а как потом временный скин выдавать? Это штуковина не будет затмевать работу обычной setplayerskin ???

Для этого в коде и есть обязательный параметр (новый).
SetPlayerSkin(playerid, id_skin, true); // выдадим скин с сохранением в БД
SetPlayerSkin(playerid, id_skin, false); // выдадим скин БЕЗ сохранения в БД
Код:


stock SetPlayerSkinEx(playerid, skinid, bool:sync = false)
{
static
query_string[39+3+11+1];

if(sync == true)
{
PlayerInfo[playerid][pSkin] = skinid;

format(query_string, sizeof (query_string), "UPDATE accounts SET skin = %i WHERE id = %i",
skinid,
PlayerInfo[playerid][pID]);
mysql_tquery(db_handle, query_string);
}

return SetPlayerSkin(playerid, skinid);
}
#if defined _ALS_SetPlayerSkin
#undef SetPlayerSkinEx
#else
#define _ALS_SetPlayerSkin
#endif
#define SetPlayerSkin SetPlayerSkinEx

DeimoS
04.07.2017, 22:27
Для этого в коде и есть обязательный параметр (новый).
SetPlayerSkin(playerid, id_skin, true); // выдадим скин с сохранением в БД
SetPlayerSkin(playerid, id_skin, false); // выдадим скин БЕЗ сохранения в БД
Код:


stock SetPlayerSkinEx(playerid, skinid, bool:sync = false)
{
static
query_string[39+3+11+1];

if(sync == true)
{
PlayerInfo[playerid][pSkin] = skinid;

format(query_string, sizeof (query_string), "UPDATE accounts SET skin = %i WHERE id = %i",
skinid,
PlayerInfo[playerid][pID]);
mysql_tquery(db_handle, query_string);
}

return SetPlayerSkin(playerid, skinid);
}
#if defined _ALS_SetPlayerSkin
#undef SetPlayerSkinEx
#else
#define _ALS_SetPlayerSkin
#endif
#define SetPlayerSkin SetPlayerSkinEx


Наоборот он не обязательный, за счёт чего обычный

SetPlayerSkin(playerid, 5);
будет выдавать временный скин, а

SetPlayerSkin(playerid, 5, true);
постоянный