PDA

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



StevenH
25.04.2017, 21:23
Здравствуйте. У меня в моде (как и на других крупных проектах) сделано следующее сохранение: изменили переменную -> сохранили её в базу. Пример:


PlayerInfo[playerid][pJob] = listitem+1;
UpdatePlayerInfo(playerid, "job", PlayerInfo[playerid][pJob]); // вызывается сток с сохранением с данной переменной и значением


И так везде.. Может кто знает другой подобный способ сохранения?

SooBad
25.04.2017, 21:42
Здравствуйте. У меня в моде (как и на других крупных проектах) сделано следующее сохранение: изменили переменную -> сохранили её в базу. Пример:


PlayerInfo[playerid][pJob] = listitem+1;
UpdatePlayerInfo(playerid, "job", PlayerInfo[playerid][pJob]); // вызывается сток с сохранением с данной переменной и значением


И так везде.. Может кто знает другой подобный способ сохранения?

Сохранять при дисконнекте игрока.
Вообще, не вижу смысла сразу же обновлять. Потери данных даже при крашах и вылетах не случается.

Long-
25.04.2017, 21:47
Здравствуйте. У меня в моде (как и на других крупных проектах) сделано следующее сохранение: изменили переменную -> сохранили её в базу. Пример:


PlayerInfo[playerid][pJob] = listitem+1;
UpdatePlayerInfo(playerid, "job", PlayerInfo[playerid][pJob]); // вызывается сток с сохранением с данной переменной и значением


И так везде.. Может кто знает другой подобный способ сохранения?

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

StevenH
25.04.2017, 21:53
Сохранять при дисконнекте игрока.
Вообще, не вижу смысла сразу же обновлять. Потери данных даже при крашах и вылетах не случается.

Сохранять при дисконнекте? Зачем заниматься мазахизмом? К тому же на всех крупных серверах (SRP, Advance, Diamond, Arizona) сохранение проходит как у меня в примере (изменил переменную -> сохранил), это самый оптимальный вариант.

- - - Добавлено - - -


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

Да я знаю что так и нужно, но может есть какой то другой способ, например перехватить enum PlayerInfo и там отслеживать изменение переменной и сохранять (ЭТО МОИ ФАНТАЗИИ, ТАКОГО КОНЕЧНО СДЕЛАТЬ НЕЛЬЗЯ, НО КАК ПРИМЕР :blush2:)

Long-
25.04.2017, 21:56
Сохранять при дисконнекте игрока.
Вообще, не вижу смысла сразу же обновлять. Потери данных даже при крашах и вылетах не случается.

В некоторых случаях OnPlayerDisconnect тупо просто не вызывается, допустим играешь ты 6-ой час, и вдруг краш сервера, в этом случае OnPlayerDisconnect пропускает, и твои деньги/донат который ты наработал идут в пропасть.
Или если хочешь можешь сохранять данные в OnPlayerUpdate

- - - Добавлено - - -


Сохранять при дисконнекте? Зачем заниматься мазахизмом? К тому же на всех крупных серверах (SRP, Advance, Diamond, Arizona) сохранение проходит как у меня в примере (изменил переменную -> сохранил), это самый оптимальный вариант.

- - - Добавлено - - -



Да я знаю что так и нужно, но может есть какой то другой способ, например перехватить enum PlayerInfo и там отслеживать изменение переменной и сохранять (ЭТО МОИ ФАНТАЗИИ, ТАКОГО КОНЕЧНО СДЕЛАТЬ НЕЛЬЗЯ, НО КАК ПРИМЕР :blush2:)

Перехватить enum?
enum - это лишь набор констант, просто сделали это в обертку.
Может кто и занимался подобным, зайдет подскажет, но я бы ничего не менял, и оставил как есть - это самый оптимальный вариант

P.S Можно конечно сделать макрос что-то типо:


#define __[%0][%1][%2] = %3 PlayerInfo[%0][%1] = %3;\
UpdatePlayerInfo(%0, "%2", PlayerInfo[%0][%1]);

Или отдельную функцию вместе с присванием члену перечисления.

ziggi
25.04.2017, 22:32
Да я знаю что так и нужно, но может есть какой то другой способ, например перехватить enum PlayerInfo и там отслеживать изменение переменной и сохранять (ЭТО МОИ ФАНТАЗИИ, ТАКОГО КОНЕЧНО СДЕЛАТЬ НЕЛЬЗЯ, НО КАК ПРИМЕР :blush2:)

На самом деле, такое сделать можно: http://forum.sa-mp.com/showthread.php?t=611860 (github (https://github.com/oscar-broman/samp-observer)).
С этой библиотекой можно перехватить изменение любой переменной.

DeimoS
25.04.2017, 23:05
Да я знаю что так и нужно, но может есть какой то другой способ, например перехватить enum PlayerInfo и там отслеживать изменение переменной и сохранять (ЭТО МОИ ФАНТАЗИИ, ТАКОГО КОНЕЧНО СДЕЛАТЬ НЕЛЬЗЯ, НО КАК ПРИМЕР :blush2:)

А если тебе нужно будет изменить значение, но не сохранять его? :) Или не все значения сохранять. Как по мне, лучше уж писать на 20 символов больше, но контролировать происходящее в твоём скрипте. А подобный скрытый функционал лишь затрудняет понимание алгоритма работы кода