Просмотр полной версии : [Вопрос] Сохранение, другой вариант
Здравствуйте. У меня в моде сохранение следующим образом будет (только начал переводить):
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 - значение для обновляемой переменной
Можешь в саму функцию UpdatePlayerData передавать переменную для сохранения и значения для это переменной. Т.е:
UpdatePlayerData(const playerid, const column[], var, value);
// playerid - ид игрока для которого обновлять
// column - обновляемая "ячейка"
// var - переменная, которая обновляется
// value - значение для обновляемой переменной
Как вариант тоже можно.
Пока подожду, может еще какие будут варианты..
UpdatePlayerData(playerid, "skin", (PlayerInfo[playerid][pSkin] = 30));
? :)
А вообще, как по мне, следует для таких дел написать отдельную функцию, которая сразу и в игре будет обновлять скин (содержать SetPlayerSkin в себе), и данные в БД (ну или же сделать перехват SetPlayerSkin, в котором добавить параметр, который обозначал бы синхронизацию данных). А плодить миллион функций ради совершения одного действия или в одну функцию пихать миллион задач - такая себе затея
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)
Тут. (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
Может он имел что-то другое, но думая суть понятна.
Перехват массивов? Что, простите?
Насколько я знаю, можно перехватить только функцию и коллбэк.
А 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, и?
Нет, я имел ввиду это
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 ???
а как потом временный скин выдавать? Это штуковина не будет затмевать работу обычной 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
Для этого в коде и есть обязательный параметр (новый).
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);
постоянный
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot