PDA

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



ALIT13
05.02.2019, 15:37
Добрый вечер, хочу узнать почему так, вот взял мод за основу и такая проблема. Примеру кубил дом всё хорошо работает, если выхожу через esc далее выход, после выключаю samp-server, всё отлично сохраняет, а если же я делаю эту же процедуру только не через esc я сворачиваю игру, выключаю samp-server, а не через esc то у меня дом не сохраняется Почему так.

x86
05.02.2019, 15:45
Как вы выключается сервер? Нажимаете на крестик? Если нет, то проверьте автовызываемую функцию OnGameModeExit/OnPlayerDisconnect на сохранение информации.

ALIT13
05.02.2019, 16:02
Да если я нажимаю сразу samp-server то не сохраняет покупку дома

http://ihost.pro-pawn.ru/image.php?di=6R6I

А если через esc выхожу а после только закрываю samp-server, то всё норм

public OnGameModeExit()
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(!IsPlayerConnected(i) || PLogged[i] == false) continue;
save_player(i);
}
for(new h = h; h < totalhouses; h++) save_house(h);
for(new b = b; b < totalbiz; b++) biz_save();
SaveVehicles();
other_save();
mysql_close();
return true;
}

x86
05.02.2019, 16:14
Так вот, так делать не нужно. Нужно вводить команду exit, чтобы сервер нормально завершил выполнение, иначе OnGameModeExit не вызывается.

ALIT13
05.02.2019, 16:21
В другом варенате не как, в случий сохранений акка примеру, зарегался я не выхожу через esc я сварачиваю игру, выключаю сразу samp-server после в mysql даю админку и просто запускаю опять же samp-server всё же сохраняется

x86
05.02.2019, 16:27
В другом варенате не как, в случий сохранений акка примеру, зарегался я не выхожу через esc я сварачиваю игру, выключаю сразу samp-server после в mysql даю админку и просто запускаю опять же samp-server всё же сохраняется

Вероятно, сервер при регистрации отправляет данные о вставке новой записи в таблицу, поэтому запись появляется там. Когда аккаунт уже создан и вы не выходите и закрываете сервер (на кнопку "X"), сервер просто не может отправить информацию, так как в таком случае не вызывается ни OnPlayerDisconnect, ни OnGameModeExit.

ALIT13
05.02.2019, 16:45
А как бароться с такой проблемой, в случаи как во многих случай бывает, бывает из-за любой ошибки вылететь samp-server.

x86
05.02.2019, 16:49
А как бароться с такой проблемой, в случаи как во многих случай бывает, бывает из-за любой ошибки вылететь samp-server.

В таком случае, лучше циклически сохранять данные, то есть через определенный промежуток времени. Для это можно использовать таймер.

Nexius_Tailer
05.02.2019, 16:51
Крестик убивает процесс сервера, а не закрывает с вызовом всех функций вроде OnGameModeExit.

UPD: Не обновил страницу, а тут уже ответили, сорян.

ALIT13
05.02.2019, 17:06
Блин, да тоже не ризон ставить таймер на 5 минут если в среднем сохранения

x86
05.02.2019, 18:26
Блин, да тоже не ризон ставить таймер на 5 минут если в среднем сохранения

Отправляйте запросы при каждом действии, либо группируйте запросы в транзакции, а после отправляйте единым запросом.

m1n1vv
05.02.2019, 23:14
Или таймер или сохранение после каждого действия

Andrik851
06.02.2019, 02:48
а как найти этот таймер автосохранения

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

а как найти этот таймер автосохранения

m1n1vv
06.02.2019, 12:25
а как найти этот таймер автосохранения

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

а как найти этот таймер автосохранения

Искать название функции SetTimer. Где в параметрах будет SavePlayer или что-то в этом роде - таймер автосохранения.

Andrik851
06.02.2019, 15:34
у меня вот такое есть но здесь я не вижу никакого таймера


forward SaveAcc();
public SaveAcc()
{
new timeUser = GetTickCount();
SendAdminMessage(COLOR_BLUE, "{FF8C00}[A] {DEB887}>> {3399FF}Выполняется сохранение всех аккаунтов");
for(new j = 0; j <= MAX_PLAYERS; j++)
{
if(!IsPlayerConnected(j) || PlayerLogged[j] == 0) continue;
SaveAccount(j);
SetPlayerSkills(j);
}
format(totalstring, 128, "{FF8C00}[A] {DEB887}>> {3399FF}Сохранение прошло успешно, следующее через 5 минут. ({FF8C00} %i {3399FF}мс)", GetTickCount() - timeUser);
SendAdminMessage(COLOR_BLUE, totalstring); return true;
}

и есть еще вот такая команда



CMD:saveacc(playerid, params[])
{
if(PlayerLogged[playerid] == 0) return true;
if(a_dostup[playerid] == 0) return true;
if(admin_check_time[playerid] > gettime())
return SendClientMessage(playerid, COLOR_RED, "Ваши админ-действия заблокированы на время.");
if(PlayerInfo[playerid][pAdmin] < 6 || AdmLogged[playerid] == false) return true;
SaveAcc();
SendClientMessage(playerid, COLOR_GREY, "[Old] Все аккаунты были сохранены администратором!");
format(totalstring, 100, "[A] Администратор %s[%d] сохранил все аккаунты", PlayerInfo[playerid][pSendername],playerid,PlayerInfo[params[0]],params[0]);
SendAdminMessage(COLOR_GREY, totalstring);
return true;
}

m1n1vv
06.02.2019, 17:00
В твоем моде сохранение через команду. Для автосохранения в OnGameModeInit нужно добавить:

SetTimer("SaveAcc", 300000, true); //300000 раз в 5 минут