PDA

Просмотр полной версии : [Вопрос] Не сохраняются координаты после рестарта



John_Danilov
29.11.2016, 16:21
Добрый день , столкнулся с такой ситуацией что после рестарта не сохраняются координаты выхода.

Вот команда :


COMMAND:restart(playerid,params[])
{
new string[150];
if(AdminLog[playerid] != 1) return SendClientMessage(playerid,COLOR_FADE1,ADMINLOG);
if(Player[playerid][pAdmin] <= 5) return SendClientMessage(playerid, COLOR_WHITE, "Недостаточно прав");
format(string,sizeof(string),"Администратор %s сделал технический рестарт сервера",Names(playerid));
foreach(Player, i) { SaveAccount(i); }
SendClientMessageToAll(0xFF8C00,string); GameModeExit();
return true;
}

Вот Само сохранение :


function SaveAccount(playerid)
{
if(PlayerLogin[playerid] > 0)
{
CheckMySQLConnection();
new query[256], sqlname[MAX_PLAYER_NAME], sqlpass[64];
new Pname[MAX_PLAYER_NAME];
GetPlayerName(playerid, Pname, sizeof(Pname));
mysql_real_escape_string(Pname, sqlname);
mysql_real_escape_string(Player[playerid][pPass], sqlpass);
new weapon,ammo;
GetPlayerWeaponData(playerid, 1, weapon, ammo);
Player[playerid][pSlot1] = weapon;
Player[playerid][pAmmo1] = ammo;
GetPlayerWeaponData(playerid, 2, weapon, ammo);
Player[playerid][pSlot2] = weapon;
Player[playerid][pAmmo2] = ammo;
GetPlayerWeaponData(playerid, 3, weapon, ammo);
Player[playerid][pSlot3] = weapon;
Player[playerid][pAmmo3] = ammo;
GetPlayerWeaponData(playerid, 4, weapon, ammo);
Player[playerid][pSlot4] = weapon;
Player[playerid][pAmmo4] = ammo;
GetPlayerWeaponData(playerid, 5, weapon, ammo);
Player[playerid][pSlot5] = weapon;
Player[playerid][pAmmo5] = ammo;
GetPlayerWeaponData(playerid, 6, weapon, ammo);
Player[playerid][pSlot6] = weapon;
Player[playerid][pAmmo6] = ammo;
GetPlayerWeaponData(playerid, 7, weapon, ammo);
Player[playerid][pSlot7] = weapon;
Player[playerid][pAmmo7] = ammo;
GetPlayerWeaponData(playerid, 8, weapon, ammo);
Player[playerid][pSlot8] = weapon;
Player[playerid][pAmmo8] = ammo;
GetPlayerWeaponData(playerid, 9, weapon, ammo);
Player[playerid][pSlot9] = weapon;
Player[playerid][pAmmo9] = ammo;
GetPlayerWeaponData(playerid, 10, weapon, ammo);
Player[playerid][pSlot10] = weapon;
Player[playerid][pAmmo10] = ammo;
GetPlayerWeaponData(playerid, 11, weapon, ammo);
Player[playerid][pSlot11] = weapon;
Player[playerid][pAmmo11] = ammo;
new Float:X;
new Float:Y;
new Float:Z;
new Float:R;
new Float:health;
new world = GetPlayerVirtualWorld(playerid);
GetPlayerHealth(playerid, health);
GetPlayerPos(playerid,X,Y,Z);
GetPlayerFacingAngle(playerid, R);
Player[playerid][pCorX] = X;
Player[playerid][pCorY] = Y;
Player[playerid][pCorZ] = Z;
Player[playerid][pCorR] = R;
Player[playerid][pInt] = GetPlayerInterior(playerid);
//
Player[playerid][pWorld] = world;
Player[playerid][p HP] = health;
Player[playerid][pMoney] = GetPlayerCash(playerid);
format(query, sizeof(query), "UPDATE `players` SET `Names` = '%s', `Pass` = '%s' WHERE `ID` = '%i'", sqlname, sqlpass, Player[playerid][pID]);
mysql_query(query);
format(query, sizeof(query), "UPDATE `players` SET `Money` = '%i', `Slot1` = '%i' WHERE `ID` = '%i'", Player[playerid][pMoney],Player[playerid][pSlot1], Player[playerid][pID]);
mysql_query(query);
format(query, sizeof(query), "UPDATE `players` SET `Ammo1` = '%i', `Slot2` = '%i' WHERE `ID` = '%i'", Player[playerid][pAmmo1], Player[playerid][pSlot2], Player[playerid][pID]);
mysql_query(query);
format(query, sizeof(query), "UPDATE `players` SET `Ammo2` = '%i', `Slot3` = '%i' WHERE `ID` = '%i'", Player[playerid][pAmmo2], Player[playerid][pSlot3], Player[playerid][pID]);
mysql_query(query);
format(query, sizeof(query), "UPDATE `players` SET `Ammo3` = '%i', `Slot4` = '%i' WHERE `ID` = '%i'", Player[playerid][pAmmo3], Player[playerid][pSlot4], Player[playerid][pID]);
mysql_query(query);
format(query, sizeof(query), "UPDATE `players` SET `Ammo4` = '%i', `Slot5` = '%i' WHERE `ID` = '%i'", Player[playerid][pAmmo4], Player[playerid][pSlot5], Player[playerid][pID]);
mysql_query(query);
format(query, sizeof(query), "UPDATE `players` SET `Ammo5` = '%i', `Slot6` = '%i' WHERE `ID` = '%i'", Player[playerid][pAmmo5], Player[playerid][pSlot6], Player[playerid][pID]);
mysql_query(query);
format(query, sizeof(query), "UPDATE `players` SET `Ammo6` = '%i', `Slot7` = '%i' WHERE `ID` = '%i'", Player[playerid][pAmmo6], Player[playerid][pSlot7], Player[playerid][pID]);
mysql_query(query);
format(query, sizeof(query), "UPDATE `players` SET `Ammo7` = '%i', `Slot8` = '%i' WHERE `ID` = '%i'", Player[playerid][pAmmo7], Player[playerid][pSlot8], Player[playerid][pID]);
mysql_query(query);
format(query, sizeof(query), "UPDATE `players` SET `Ammo8` = '%i', `Slot9` = '%i' WHERE `ID` = '%i'", Player[playerid][pAmmo8], Player[playerid][pSlot9], Player[playerid][pID]);
mysql_query(query);
format(query, sizeof(query), "UPDATE `players` SET `Ammo9` = '%i', `Slot10` = '%i' WHERE `ID` = '%i'", Player[playerid][pAmmo9], Player[playerid][pSlot10], Player[playerid][pID]);
mysql_query(query);
format(query, sizeof(query), "UPDATE `players` SET `Ammo10` = '%i', `Slot11` = '%i' WHERE `ID` = '%i'", Player[playerid][pAmmo10], Player[playerid][pSlot11], Player[playerid][pID]);
mysql_query(query);
format(query, sizeof(query), "UPDATE `players` SET `Ammo11` = '%i', `HP` = '%f' WHERE `ID` = '%i'", Player[playerid][pAmmo11], Player[playerid][p HP], Player[playerid][pID]);
mysql_query(query);
format(query, sizeof(query), "UPDATE `players` SET `CorX` = '%f', `Hunger` = '%i' WHERE `ID` = '%i'", Player[playerid][pCorX], Player[playerid][pHunger], Player[playerid][pID]);
mysql_query(query);
format(query, sizeof(query), "UPDATE `players` SET `CorY` = '%f', `CorZ` = '%f' WHERE `ID` = '%i'", Player[playerid][pCorY], Player[playerid][pCorZ], Player[playerid][pID]);
mysql_query(query);
format(query, sizeof(query), "UPDATE `players` SET `CorR` = '%f', `Int` = '%i' WHERE `ID` = '%i'", Player[playerid][pCorR], Player[playerid][pInt], Player[playerid][pID]);
mysql_query(query);
}
return 1;
}

Надеюсь на вашу помощь , за ранее спасибо .

qwezert
29.11.2016, 17:28
Ну во первых - такого говнокода еще поискать нужно. Не в обиду сказанно но учитесь нормально код писать. Для сохранения координат игроков при рестарте используется паблик OnPlayerDisconnect, потому как он вызывается как только игрок отключается от сервера(если сервер не падает с ошибкой). Также соедини все UPDATE в один запрос а не в 10. Как обычно я говорю для всех - научись дебагать свой код. Выводи в чате что у тебя лежит в переменных и ошибки mysql.

John_Danilov
29.11.2016, 18:02
В OnPlayerDissconect стоит сохранение

qwezert
29.11.2016, 18:10
В OnPlayerDissconect стоит сохранение

Вот тебе и возможная причина ошибки. Зачем 2 раза сохранять данные игроков?

John_Danilov
29.11.2016, 19:11
так в OnPlayerDissconect идет как бы путь к паблику

vovandolg
30.11.2016, 23:28
Лучше всего сейвить всё в ручную до рестарта, но бывают моменты когда сервера где то попали под тех работы или просто рестартанулись для каких то настроек на самих машинах, так вот иметь всю сохранку на дисконнекте то же нужно и положено вдруг что, а сервер всё сохранит если это будет не краш, а просто рестарт обычный, но вернёмся к тому что есть - это, в команде сейвы + выключение которое срабатывает сразу же, так вот нужно высчитать примерное время сколько нужно сохранить максимально информации и задать таймер уже на выключение или перезагрузку, ну я так делаю по крайней мере(когда с бд работаю)...



#define TIME_ALL_ACC_SAVE (5000) // 5 секунд к примеру

new restart_check;


COMMAND:restart(playerid, params[])
{
if(AdminLog[playerid] != 1)
return SendClientMessage(playerid, COLOR_FADE1, ADMINLOG);
if(Player[playerid][pAdmin] <= 5)
return SendClientMessage(playerid, COLOR_WHITE, !"Недостаточно прав");
format(string, 77, "Администратор %s запустил технический рестарт сервера", Names(playerid));
SendClientMessageToAll(0xFF8C00, string);
foreach(Player, i) SaveAccount(i); // тут я канеш по другому сделал бы, если имел бы сервер с большим онлайном(более плавный сейв)
restart_check = 1; // засейвили всё по идее
new string[77];
SetTimer(!"OnServerRestart", TIME_ALL_ACC_SAVE, false);
return 1;
}


forward OnServerRestart();
public OnServerRestart()
{
SendClientMessageToAll(0xFF8C00, !"Сервер ушёл на покой");
//ну и тут ниже функцию для выключения или рестарта
return 1;
}


public OnPlayerDisconnect(playerid, reason)
{
if(restart_check == 0) SaveAccount(playerid); // Если сервер не собирается в рестарт, то просто сейвим игрока
return 1;
}