PDA

Просмотр полной версии : [Вопрос] Способ сохранения



m1n1vv
14.11.2018, 13:06
Привет. Хорошо отдохнул от павн :grin:. Теперь нужно пройтись по возможным ошибкам прошлого.
Что лучше, использовать state или вызывать сток с нужным именем?

state save:money;
SaveAccount(playerid);

SavePlayerMoney(playerid);
Сохранения в таймерах и циклах не использую.

Alpano
14.11.2018, 13:42
я так понимаю первый вариант это что-то вроде

stock SavePlayerInt(playerid,const IntNameEx[],valve){
new query[72];
format(query, sizeof query, "UPDATE `accounts` SET `%s`='%d' WHERE `id`='%i'",IntNameEx,valve,Player[playerid][pSQLID]);
db_free_result(db_query(users_base,query));
return true;
}
? Если так то первое.
Ибо второй вариант создаст огромное количество однотипных функций, лишний код имхо.
Стабильность на высоте.

m1n1vv
14.11.2018, 13:45
я так понимаю первый вариант это что-то вроде

stock SavePlayerInt(playerid,const IntNameEx[],valve){
new query[72];
format(query, sizeof query, "UPDATE `accounts` SET `%s`='%d' WHERE `id`='%i'",IntNameEx,valve,Player[playerid][pSQLID]);
db_free_result(db_query(users_base,query));
return true;
}
? Если так то первое.
Ибо второй вариант создаст огромное количество однотипных функций, лишний код имхо.
Стабильность на высоте.

Не то


public SaveAccount(playerid) <save:money>
{
static const
str[] = "UPDATE `accounts` SET `pMoney` = '%d' WHERE `pID` = '%d'";

new
string[sizeof str + 11 + 11 - 2*2];

format(string, sizeof string, str,
pInfo[playerid][pMoney],
pInfo[playerid][pID]
);

return mysql_function_query(mysql_connect_id, string, false, "", "");
}

Daniel_Cortez
14.11.2018, 13:47
Для начала немного о том, как работают функции, к которым прикручен state. Возьмём такой пример:

MyFunc() <mystate:st1>
{
print("st1");
}

MyFunc() <mystate:st2>
{
print("st2");
}

MyFunc() <>
{
print("default state");
}

После компиляции получается код, аналогичный следующему:

enum
{
MYSTATE_DEFAULT,
MYSTATE_ST1,
MYSTATE_ST2
};
new mystate = MYSTATE_DEFAULT;

MyFunc()
{
switch (mystate)
{
case MYSTATE_ST1:
{
print("st1");
}
case MYSTATE_ST2:
{
print("st2");
}
default:
{
print("default state");
}
}
}

Т.е. вместо нескольких функций генерируется одна общая функция со switch в самом начале, и перед выполнением действий из MyFunc()<mystate:st1>, MyFunc()<mystate:st2> и MyFunc()<> интерпретатору нужно сначала пройти через switch, чтобы определить, какой вариант действий выполнять.
По сути state - это просто синтаксический сахар.

Теперь к вашему примеру:



state save:Money;
SaveAccount(playerid);

SavePlayerMoney(playerid);

Ок, т.е. вам нужно сохранить деньги игрока и вы знаете, что выполниться должны именно действия по сохранению кол-ва денег. Но интерпретатор не сможет об этом знать заранее и будет каждый раз выполнять switch, прежде чем понять, что да, нужно сохранить именно деньги. Так зачем создавать эту лишнюю нагрузку со switch, если можно просто сделать отдельную функцию для сохранения денег и вызывать её сразу, без всяких state? В плане исходного кода получится всё те же несколько функций, только без указания state в заголовке и с разными названиями.

Alpano
14.11.2018, 13:51
А, ну тогда это по сути эдентичные функции. Разве что у второго варианта функция вызывается на прямую, у первого же идет предварительное изменение переменной.
А так, не рассматирваешь вариант предложенный мной?
Универсальная функция, и использовать элементарно.

SavePlayerInt(playerid,"level",Player[playerid][pLevel]);
Разве что перевести с SQLite на MySQL...

m1n1vv
14.11.2018, 13:54
А, ну тогда это по сути эдентичные функции. Разве что у второго варианта функция вызывается на прямую, у первого же идет предварительное изменение переменной.
А так, не рассматирваешь вариант предложенный мной?
Универсальная функция, и использовать элементарно.

SavePlayerInt(playerid,"level",Player[playerid][pLevel]);
Разве что перевести с SQLite на MySQL...

В твоем варианте не предусмотрено сохранение оружия и патрон