Dados deletados ao reiniciar o servidor - Ryzen_ - 16/03/2024
Em alguns momentos quando reinicio meu servidor, algum player acaba voltando com sua conta tendo o dinheiro, level, cargo, emprego e skins deletadas. Estou utilizando DOF2 para realizar o salvamento, mas simplesmente não consigo encontrar o que pode estar causando isso (Obs.: a parte de salvamento foi feita por um colega da equipe que também codifica na GM). De começo eu notei que estava faltando a função DOF2_SaveFile() ao final da SaveAccount(playerid), mas mesmo após a inserir, continua acontecendo o mesmo problema. Não é sempre que acontece, geralmente é quando eu reinicio o servidor várias vezes enquanto estou adicionando novas funcionalidades, daí em uma delas, ao voltar para o game ele acaba dando uma mensagem de crash ou fechando do nada, e quando volto estou setado com a skin do CJ e caindo no limbo. Se alguém puder me ajudar com isso, ficarei grato! Caso precisem de mais informações, basta me perguntar.
SaveAccount:
Código PHP: stock SaveAccount(playerid) { format(File, sizeof(File), PASTA_CONTAS, GetPlayerNameEx(playerid));
DOF2_SetInt(File, "Level", PlayerInfo[playerid][pLevel]); DOF2_SetInt(File, "EXP", PlayerInfo[playerid][pExp]); DOF2_SetInt(File, "Admin", PlayerInfo[playerid][pAdmin]); DOF2_SetInt(File, "Dinheiro", PlayerInfo[playerid][pGrana]); DOF2_SetInt(File, "Skin", PlayerInfo[playerid][pSkin]); DOF2_SetInt(File, "Sexo", PlayerInfo[playerid][pSexo]); DOF2_SetInt(File, "Fome", PlayerInfo[playerid][pFome]); DOF2_SetInt(File, "Sede", PlayerInfo[playerid][pSede]); DOF2_SetInt(File, "Sono", PlayerInfo[playerid][pSono]); DOF2_SetInt(File, "Emprego", PlayerInfo[playerid][pEmprego]); DOF2_SetInt(File, "CategoriaEmprego", PlayerInfo[playerid][pEmpregoCategoria]); DOF2_SetInt(File, "NivelProcurado", PlayerInfo[playerid][pWantedLevel]); DOF2_SetInt(File, "TempoPreso", PlayerInfo[playerid][pTempoPreso]); DOF2_SetBool(File, "Preso", PlayerInfo[playerid][pPreso]); DOF2_SetBool(File, "Mutado", PlayerInfo[playerid][pMutado]); DOF2_SetInt(File, "TempoMutado", PlayerInfo[playerid][pTempoMutado]);
DOF2_SetBool(File, "Contrato", PlayerInfo[playerid][pContrato]); DOF2_SetInt(File, "ValorContrato", PlayerInfo[playerid][pValorContrato]);
DOF2_SetInt(File, "Organizacao", PlayerInfo[playerid][pOrganizacao]); DOF2_SetInt(File, "Cargo", PlayerInfo[playerid][pCargo]);
new day, month, year; getdate(year, month, day); format(STRX, 128, "%02d/%02d/%04d", day, month, year); DOF2_SetString(File, "UltimoLogin", STRX);
new Float:X, Float:Y, Float:Z, intid; GetPlayerPos(playerid, X, Y, Z); intid = GetPlayerInterior(playerid);
PlayerInfo[playerid][pPosX] = X; PlayerInfo[playerid][pPosY] = Y; PlayerInfo[playerid][pPosZ] = Z; PlayerInfo[playerid][pInterior] = intid;
DOF2_SetFloat(File, "PosX", PlayerInfo[playerid][pPosX]); DOF2_SetFloat(File, "PosY", PlayerInfo[playerid][pPosY]); DOF2_SetFloat(File, "PosZ", PlayerInfo[playerid][pPosZ]); DOF2_SetInt(File, "Interior", PlayerInfo[playerid][pInterior]); DOF2_SaveFile(); return 1; }
OnPlayerDisconnect:
Código PHP: public OnPlayerDisconnect(playerid, reason) { SaveAccount(playerid);
if(GetPVarInt(playerid, "Fardado")) { DeletePVar(playerid, "Fardado"); SetPlayerSkin(playerid, GetPVarInt(playerid, "PreviousSkin")); DeletePVar(playerid, "PreviousSkin"); }
if(GetPVarInt(playerid, "Alugou")) { DestroyVehicle(GetPVarInt(playerid, "AlugadoID"));
DestroyDynamic3DTextLabel(TrashTruckInfo[GetPVarInt(playerid, "AlugadoID")][tLabel]); TrashTruckInfo[GetPVarInt(playerid, "AlugadoID")][tLabel] = Text3D:INVALID_3DTEXT_ID;
DeletePVar(playerid, "AlugadoID"); DeletePVar(playerid, "Alugou"); }
if(GetPVarInt(playerid, "criouv")) { DeletePVar(playerid, "criouv");
if(GetPVarInt(playerid, "cvehid") != INVALID_VEHICLE_ID) DestroyVehicle(GetPVarInt(playerid, "cvehid"));
DeletePVar(playerid, "cvehid"); }
if(PlayerInfo[playerid][pPreso]) { DOF2_SetInt(FormatAccFile(playerid), "TempoPreso", PlayerInfo[playerid][pTempoPreso]); KillTimer(TimerPrisao[playerid]); } // Timers KillTimer(ClockTimer[playerid]); KillTimer(TimerHunger[playerid]); KillTimer(TimerSono[playerid]); KillTimer(TimerSede[playerid]); KillTimer(TimerCar[playerid]); KillTimer(TimerExpirarLogin[playerid]); KillTimer(TimerAbastecer[playerid]); KillTimer(TimerProcurado[playerid]);
DeletePVar(playerid, "Abastecendo"); HideGlobalGasolinaText(playerid); HidePlayerGasolinaText(playerid);
if(HotelInfo[playerid][hInHotel]) { SetPlayerInterior(playerid, 0); SetPlayerPos(playerid, 332.0835,-1515.6294,35.8672); SetPlayerVirtualWorld(playerid, 0);
HotelInfo[playerid][hInHotel] = false; HotelInfo[playerid][hVWorld] = 0; }
// Reset PlayerInfo[playerid][pRcon] = false; PlayerInfo[playerid][pAFK] = false;
if(GetPVarInt(playerid, "Algemado")) { SendClientMessageToAllEx(Verde, "| INFO | %s saiu algemado e portanto foi punido automaticamente", GetPlayerNameEx(playerid));
GivePlayerWanted(playerid, GetPlayerWanted(playerid) * 2); GivePlayerLevel(playerid, -3); GivePlayerCash(playerid, -15000); }
if(PlayerInfo[playerid][pPegouEmprego]) { RemovePlayerMapIcon(playerid, 1); PlayerInfo[playerid][pPegouEmprego] = false; DeletePVar(playerid, "EmpregoID"); }
if (GetPVarInt(playerid, "Called")) { CallStarted[playerid] = false; InCall[playerid] = false; DeletePVar(playerid, "Called"); } return 1; }
Caso sirva de algo, aqui está a mensagem de crash:
Código: SA-MP 0.3.7-R5
Exception At Address: 0x0460D9D1
Base: 0x04570000
Registers:
EAX: 0x00000045 EBX: 0xFFFFFFFF ECX: 0x00000040 EDX: 0x00619000
ESI: 0x49F764FF EDI: 0x00000003 EBP: 0x0177F688 ESP: 0x0177F618
EFLAGS: 0x00010206
Stack:
+0000: 0x0421EB08 0x007F99B0 0x045E4836 0x007F99B0
+0010: 0x007F99C7 0x041312C0 0x007FB1C3 0x0421EB08
+0020: 0x00060E7E 0x00000000 0x01974178 0x041BE8B4
+0030: 0x007EE388 0x0421EB08 0x00060E7E 0x00000000
+0040: 0x0177F708 0x0074526A 0x041BE8B4 0x00060E7E
+0050: 0x00000000 0x0053EC06 0x041BE8B4 0x041BE8B4
+0060: 0x44700000 0x44070000 0x5F82FC50 0x00000001
+0070: 0x0177F6D0 0x5F82B8E9 0x0177F6DC 0x0198D120
+0080: 0x5F888A9C 0x01974178 0x00060E7E 0x00000000
+0090: 0x0177F6C0 0x7548E74B 0x00000113 0x00000001
+00A0: 0x00000000 0x0177F698 0x0177F698 0x0177F6F4
+00B0: 0x5F883B40 0x00000001 0x0177F6E4 0x5F82FC02
+00C0: 0x0198D134 0x00000001 0x0177F888 0x0177F700
+00D0: 0x5F82E267 0x0177F708 0x0177F888 0x0177F868
+00E0: 0x5F883B58 0x00000000 0x0177F874 0x5F830246
+00F0: 0x5F8889A4 0x01974178 0x00060E7E 0xDCBAABCD
+0100: 0x00000000 0x0177F868 0x5F883D85 0xFFFFFFFF
+0110: 0x0177F874 0x00000000 0x0177F888 0x0000001A
+0120: 0x00000001 0x00000000 0x00000000 0x003B7000
+0130: 0x00000001 0xA8A5E770 0x00000000 0x77698850
+0140: 0x00000001 0x00000000 0x00000000 0x00000070
+0150: 0x00000000 0x00760994 0x00000000 0x0177F74C
+0160: 0x02262DD0 0x0177F7D8 0x75475A70 0xDC9FFB14
+0170: 0xFFFFFFFE 0x0177F7C8 0x7546D6DF 0x0233F9F0
+0180: 0x776767AC 0x7546D6F7 0x0177F7B0 0x00000018
+0190: 0x00000000 0x0177F8F8 0x00000000 0x00000000
+01A0: 0x00000000 0x00000000 0x00000000 0x00000000
+01B0: 0x0177F850 0x77678D6D 0x0177F7E4 0x00000020
+01C0: 0x0177F980 0x7FFE8000 0x0000AA64 0x77661532
+01D0: 0x0177F840 0x0177F844 0x00000000 0xFFFFFFFF
+01E0: 0x72D5AE20 0x77698850 0x00000000 0x7546C70F
+01F0: 0x0177F8F8 0x00000000 0x00000000 0x00000000
+0200: 0x6576CE2C 0x0177F894 0x77661220 0xFFFFFFFF
+0210: 0x0177F844 0x7766133A 0x5F8889A4 0x01974178
+0220: 0x00000000 0x00000001 0xA8A58664 0x0000014C
+0230: 0x9FBFDFA1 0x00B1750F 0x00192FD4 0x00000000
+0240: 0x01974178 0x01973930 0x7FFE8000 0x546C6148
+0250: 0x0177F980 0x5F883CEC 0x00000000 0x0177F880
+0260: 0x5F83013C 0x0177F888 0x754D78F0 0x0053ECC2
+0270: 0x00000001 0x00619B71 0x0000001A 0x00000001
SCM Op: 0x248, lDbg: 0 LastRendObj: 3276
Game Version: US 1.0
State Information: Ped Context: 0
RE: Dados deletados ao reiniciar o servidor - White_Blue - 16/03/2024
Se possível, também mande a callback OnGameModeExit. Não entendi por que você enviou o crash report, já que você disse que isso só acontece quando o servidor é reiniciado.
RE: Dados deletados ao reiniciar o servidor - Ryzen_ - 16/03/2024
(16/03/2024 08:17)White_Blue Escreveu: Se possível, também mande a callback OnGameModeExit. Não entendi por que você enviou o crash report, já que você disse que isso só acontece quando o servidor é reiniciado.
Achei que poderia servir de algo.
OnGameModeExit()
Código PHP: public OnGameModeExit() { foreach(new i: Player) { if(IsPlayerConnected(i)) { SaveAccount(i); } }
DOF2_Exit(); print("Servidor reiniciado"); return 1; }
RE: Dados deletados ao reiniciar o servidor - Notknown - 16/03/2024
(16/03/2024 02:35)Ryzen_ Escreveu: Em alguns momentos quando reinicio meu servidor, algum player acaba voltando com sua conta tendo o dinheiro, level, cargo, emprego e skins deletadas. Estou utilizando DOF2 para realizar o salvamento, mas simplesmente não consigo encontrar o que pode estar causando isso (Obs.: a parte de salvamento foi feita por um colega da equipe que também codifica na GM). De começo eu notei que estava faltando a função DOF2_SaveFile() ao final da SaveAccount(playerid), mas mesmo após a inserir, continua acontecendo o mesmo problema. Não é sempre que acontece, geralmente é quando eu reinicio o servidor várias vezes enquanto estou adicionando novas funcionalidades, daí em uma delas, ao voltar para o game ele acaba dando uma mensagem de crash ou fechando do nada, e quando volto estou setado com a skin do CJ e caindo no limbo. Se alguém puder me ajudar com isso, ficarei grato! Caso precisem de mais informações, basta me perguntar.
SaveAccount:
Código PHP: stock SaveAccount(playerid) { format(File, sizeof(File), PASTA_CONTAS, GetPlayerNameEx(playerid));
DOF2_SetInt(File, "Level", PlayerInfo[playerid][pLevel]); DOF2_SetInt(File, "EXP", PlayerInfo[playerid][pExp]); DOF2_SetInt(File, "Admin", PlayerInfo[playerid][pAdmin]); DOF2_SetInt(File, "Dinheiro", PlayerInfo[playerid][pGrana]); DOF2_SetInt(File, "Skin", PlayerInfo[playerid][pSkin]); DOF2_SetInt(File, "Sexo", PlayerInfo[playerid][pSexo]); DOF2_SetInt(File, "Fome", PlayerInfo[playerid][pFome]); DOF2_SetInt(File, "Sede", PlayerInfo[playerid][pSede]); DOF2_SetInt(File, "Sono", PlayerInfo[playerid][pSono]); DOF2_SetInt(File, "Emprego", PlayerInfo[playerid][pEmprego]); DOF2_SetInt(File, "CategoriaEmprego", PlayerInfo[playerid][pEmpregoCategoria]); DOF2_SetInt(File, "NivelProcurado", PlayerInfo[playerid][pWantedLevel]); DOF2_SetInt(File, "TempoPreso", PlayerInfo[playerid][pTempoPreso]); DOF2_SetBool(File, "Preso", PlayerInfo[playerid][pPreso]); DOF2_SetBool(File, "Mutado", PlayerInfo[playerid][pMutado]); DOF2_SetInt(File, "TempoMutado", PlayerInfo[playerid][pTempoMutado]);
DOF2_SetBool(File, "Contrato", PlayerInfo[playerid][pContrato]); DOF2_SetInt(File, "ValorContrato", PlayerInfo[playerid][pValorContrato]);
DOF2_SetInt(File, "Organizacao", PlayerInfo[playerid][pOrganizacao]); DOF2_SetInt(File, "Cargo", PlayerInfo[playerid][pCargo]);
new day, month, year; getdate(year, month, day); format(STRX, 128, "%02d/%02d/%04d", day, month, year); DOF2_SetString(File, "UltimoLogin", STRX);
new Float:X, Float:Y, Float:Z, intid; GetPlayerPos(playerid, X, Y, Z); intid = GetPlayerInterior(playerid);
PlayerInfo[playerid][pPosX] = X; PlayerInfo[playerid][pPosY] = Y; PlayerInfo[playerid][pPosZ] = Z; PlayerInfo[playerid][pInterior] = intid;
DOF2_SetFloat(File, "PosX", PlayerInfo[playerid][pPosX]); DOF2_SetFloat(File, "PosY", PlayerInfo[playerid][pPosY]); DOF2_SetFloat(File, "PosZ", PlayerInfo[playerid][pPosZ]); DOF2_SetInt(File, "Interior", PlayerInfo[playerid][pInterior]); DOF2_SaveFile(); return 1; }
OnPlayerDisconnect:
Código PHP: public OnPlayerDisconnect(playerid, reason) { SaveAccount(playerid);
if(GetPVarInt(playerid, "Fardado")) { DeletePVar(playerid, "Fardado"); SetPlayerSkin(playerid, GetPVarInt(playerid, "PreviousSkin")); DeletePVar(playerid, "PreviousSkin"); }
if(GetPVarInt(playerid, "Alugou")) { DestroyVehicle(GetPVarInt(playerid, "AlugadoID"));
DestroyDynamic3DTextLabel(TrashTruckInfo[GetPVarInt(playerid, "AlugadoID")][tLabel]); TrashTruckInfo[GetPVarInt(playerid, "AlugadoID")][tLabel] = Text3D:INVALID_3DTEXT_ID;
DeletePVar(playerid, "AlugadoID"); DeletePVar(playerid, "Alugou"); }
if(GetPVarInt(playerid, "criouv")) { DeletePVar(playerid, "criouv");
if(GetPVarInt(playerid, "cvehid") != INVALID_VEHICLE_ID) DestroyVehicle(GetPVarInt(playerid, "cvehid"));
DeletePVar(playerid, "cvehid"); }
if(PlayerInfo[playerid][pPreso]) { DOF2_SetInt(FormatAccFile(playerid), "TempoPreso", PlayerInfo[playerid][pTempoPreso]); KillTimer(TimerPrisao[playerid]); } // Timers KillTimer(ClockTimer[playerid]); KillTimer(TimerHunger[playerid]); KillTimer(TimerSono[playerid]); KillTimer(TimerSede[playerid]); KillTimer(TimerCar[playerid]); KillTimer(TimerExpirarLogin[playerid]); KillTimer(TimerAbastecer[playerid]); KillTimer(TimerProcurado[playerid]);
DeletePVar(playerid, "Abastecendo"); HideGlobalGasolinaText(playerid); HidePlayerGasolinaText(playerid);
if(HotelInfo[playerid][hInHotel]) { SetPlayerInterior(playerid, 0); SetPlayerPos(playerid, 332.0835,-1515.6294,35.8672); SetPlayerVirtualWorld(playerid, 0);
HotelInfo[playerid][hInHotel] = false; HotelInfo[playerid][hVWorld] = 0; }
// Reset PlayerInfo[playerid][pRcon] = false; PlayerInfo[playerid][pAFK] = false;
if(GetPVarInt(playerid, "Algemado")) { SendClientMessageToAllEx(Verde, "| INFO | %s saiu algemado e portanto foi punido automaticamente", GetPlayerNameEx(playerid));
GivePlayerWanted(playerid, GetPlayerWanted(playerid) * 2); GivePlayerLevel(playerid, -3); GivePlayerCash(playerid, -15000); }
if(PlayerInfo[playerid][pPegouEmprego]) { RemovePlayerMapIcon(playerid, 1); PlayerInfo[playerid][pPegouEmprego] = false; DeletePVar(playerid, "EmpregoID"); }
if (GetPVarInt(playerid, "Called")) { CallStarted[playerid] = false; InCall[playerid] = false; DeletePVar(playerid, "Called"); } return 1; }
Caso sirva de algo, aqui está a mensagem de crash:
Código: SA-MP 0.3.7-R5
Exception At Address: 0x0460D9D1
Base: 0x04570000
Registers:
EAX: 0x00000045 EBX: 0xFFFFFFFF ECX: 0x00000040 EDX: 0x00619000
ESI: 0x49F764FF EDI: 0x00000003 EBP: 0x0177F688 ESP: 0x0177F618
EFLAGS: 0x00010206
Stack:
+0000: 0x0421EB08 0x007F99B0 0x045E4836 0x007F99B0
+0010: 0x007F99C7 0x041312C0 0x007FB1C3 0x0421EB08
+0020: 0x00060E7E 0x00000000 0x01974178 0x041BE8B4
+0030: 0x007EE388 0x0421EB08 0x00060E7E 0x00000000
+0040: 0x0177F708 0x0074526A 0x041BE8B4 0x00060E7E
+0050: 0x00000000 0x0053EC06 0x041BE8B4 0x041BE8B4
+0060: 0x44700000 0x44070000 0x5F82FC50 0x00000001
+0070: 0x0177F6D0 0x5F82B8E9 0x0177F6DC 0x0198D120
+0080: 0x5F888A9C 0x01974178 0x00060E7E 0x00000000
+0090: 0x0177F6C0 0x7548E74B 0x00000113 0x00000001
+00A0: 0x00000000 0x0177F698 0x0177F698 0x0177F6F4
+00B0: 0x5F883B40 0x00000001 0x0177F6E4 0x5F82FC02
+00C0: 0x0198D134 0x00000001 0x0177F888 0x0177F700
+00D0: 0x5F82E267 0x0177F708 0x0177F888 0x0177F868
+00E0: 0x5F883B58 0x00000000 0x0177F874 0x5F830246
+00F0: 0x5F8889A4 0x01974178 0x00060E7E 0xDCBAABCD
+0100: 0x00000000 0x0177F868 0x5F883D85 0xFFFFFFFF
+0110: 0x0177F874 0x00000000 0x0177F888 0x0000001A
+0120: 0x00000001 0x00000000 0x00000000 0x003B7000
+0130: 0x00000001 0xA8A5E770 0x00000000 0x77698850
+0140: 0x00000001 0x00000000 0x00000000 0x00000070
+0150: 0x00000000 0x00760994 0x00000000 0x0177F74C
+0160: 0x02262DD0 0x0177F7D8 0x75475A70 0xDC9FFB14
+0170: 0xFFFFFFFE 0x0177F7C8 0x7546D6DF 0x0233F9F0
+0180: 0x776767AC 0x7546D6F7 0x0177F7B0 0x00000018
+0190: 0x00000000 0x0177F8F8 0x00000000 0x00000000
+01A0: 0x00000000 0x00000000 0x00000000 0x00000000
+01B0: 0x0177F850 0x77678D6D 0x0177F7E4 0x00000020
+01C0: 0x0177F980 0x7FFE8000 0x0000AA64 0x77661532
+01D0: 0x0177F840 0x0177F844 0x00000000 0xFFFFFFFF
+01E0: 0x72D5AE20 0x77698850 0x00000000 0x7546C70F
+01F0: 0x0177F8F8 0x00000000 0x00000000 0x00000000
+0200: 0x6576CE2C 0x0177F894 0x77661220 0xFFFFFFFF
+0210: 0x0177F844 0x7766133A 0x5F8889A4 0x01974178
+0220: 0x00000000 0x00000001 0xA8A58664 0x0000014C
+0230: 0x9FBFDFA1 0x00B1750F 0x00192FD4 0x00000000
+0240: 0x01974178 0x01973930 0x7FFE8000 0x546C6148
+0250: 0x0177F980 0x5F883CEC 0x00000000 0x0177F880
+0260: 0x5F83013C 0x0177F888 0x754D78F0 0x0053ECC2
+0270: 0x00000001 0x00619B71 0x0000001A 0x00000001
SCM Op: 0x248, lDbg: 0 LastRendObj: 3276
Game Version: US 1.0
State Information: Ped Context: 0
O problema me parece aqui
Código: format(File, sizeof(File), PASTA_CONTAS, GetPlayerNameEx(playerid));
"PASTA_CONTAS" ele não está achando o arquivo do player para salvar, você apenas informou a pasta de onde é para salvar os dados.
acho que o certo séria assim.
Código: format(File, sizeof(File), PASTA_CONTAS/%s.txt (ou .ini), GetPlayerNameEx(playerid));
O erro também pode ser como você estaria fechando o samp server, recomendo criar uma função para sempre estar salvando os dados dos players e ir testando para saber se realmente seria isso.
em OnGameModeExit() tente isto
Código: for(new i = 0; i < MAX_PLAYERS; i++)
{
if(!IsPlayerConnected(i)) SaveAccount(i);
print("Verifica se os dados estão salvando");
}
RE: Dados deletados ao reiniciar o servidor - White_Blue - 16/03/2024
(16/03/2024 19:56)Notknown Escreveu: (16/03/2024 02:35)Ryzen_ Escreveu: Em alguns momentos quando reinicio meu servidor, algum player acaba voltando com sua conta tendo o dinheiro, level, cargo, emprego e skins deletadas. Estou utilizando DOF2 para realizar o salvamento, mas simplesmente não consigo encontrar o que pode estar causando isso (Obs.: a parte de salvamento foi feita por um colega da equipe que também codifica na GM). De começo eu notei que estava faltando a função DOF2_SaveFile() ao final da SaveAccount(playerid), mas mesmo após a inserir, continua acontecendo o mesmo problema. Não é sempre que acontece, geralmente é quando eu reinicio o servidor várias vezes enquanto estou adicionando novas funcionalidades, daí em uma delas, ao voltar para o game ele acaba dando uma mensagem de crash ou fechando do nada, e quando volto estou setado com a skin do CJ e caindo no limbo. Se alguém puder me ajudar com isso, ficarei grato! Caso precisem de mais informações, basta me perguntar.
SaveAccount:
Código PHP: stock SaveAccount(playerid) { format(File, sizeof(File), PASTA_CONTAS, GetPlayerNameEx(playerid));
DOF2_SetInt(File, "Level", PlayerInfo[playerid][pLevel]); DOF2_SetInt(File, "EXP", PlayerInfo[playerid][pExp]); DOF2_SetInt(File, "Admin", PlayerInfo[playerid][pAdmin]); DOF2_SetInt(File, "Dinheiro", PlayerInfo[playerid][pGrana]); DOF2_SetInt(File, "Skin", PlayerInfo[playerid][pSkin]); DOF2_SetInt(File, "Sexo", PlayerInfo[playerid][pSexo]); DOF2_SetInt(File, "Fome", PlayerInfo[playerid][pFome]); DOF2_SetInt(File, "Sede", PlayerInfo[playerid][pSede]); DOF2_SetInt(File, "Sono", PlayerInfo[playerid][pSono]); DOF2_SetInt(File, "Emprego", PlayerInfo[playerid][pEmprego]); DOF2_SetInt(File, "CategoriaEmprego", PlayerInfo[playerid][pEmpregoCategoria]); DOF2_SetInt(File, "NivelProcurado", PlayerInfo[playerid][pWantedLevel]); DOF2_SetInt(File, "TempoPreso", PlayerInfo[playerid][pTempoPreso]); DOF2_SetBool(File, "Preso", PlayerInfo[playerid][pPreso]); DOF2_SetBool(File, "Mutado", PlayerInfo[playerid][pMutado]); DOF2_SetInt(File, "TempoMutado", PlayerInfo[playerid][pTempoMutado]);
DOF2_SetBool(File, "Contrato", PlayerInfo[playerid][pContrato]); DOF2_SetInt(File, "ValorContrato", PlayerInfo[playerid][pValorContrato]);
DOF2_SetInt(File, "Organizacao", PlayerInfo[playerid][pOrganizacao]); DOF2_SetInt(File, "Cargo", PlayerInfo[playerid][pCargo]);
new day, month, year; getdate(year, month, day); format(STRX, 128, "%02d/%02d/%04d", day, month, year); DOF2_SetString(File, "UltimoLogin", STRX);
new Float:X, Float:Y, Float:Z, intid; GetPlayerPos(playerid, X, Y, Z); intid = GetPlayerInterior(playerid);
PlayerInfo[playerid][pPosX] = X; PlayerInfo[playerid][pPosY] = Y; PlayerInfo[playerid][pPosZ] = Z; PlayerInfo[playerid][pInterior] = intid;
DOF2_SetFloat(File, "PosX", PlayerInfo[playerid][pPosX]); DOF2_SetFloat(File, "PosY", PlayerInfo[playerid][pPosY]); DOF2_SetFloat(File, "PosZ", PlayerInfo[playerid][pPosZ]); DOF2_SetInt(File, "Interior", PlayerInfo[playerid][pInterior]); DOF2_SaveFile(); return 1; }
OnPlayerDisconnect:
Código PHP: public OnPlayerDisconnect(playerid, reason) { SaveAccount(playerid);
if(GetPVarInt(playerid, "Fardado")) { DeletePVar(playerid, "Fardado"); SetPlayerSkin(playerid, GetPVarInt(playerid, "PreviousSkin")); DeletePVar(playerid, "PreviousSkin"); }
if(GetPVarInt(playerid, "Alugou")) { DestroyVehicle(GetPVarInt(playerid, "AlugadoID"));
DestroyDynamic3DTextLabel(TrashTruckInfo[GetPVarInt(playerid, "AlugadoID")][tLabel]); TrashTruckInfo[GetPVarInt(playerid, "AlugadoID")][tLabel] = Text3D:INVALID_3DTEXT_ID;
DeletePVar(playerid, "AlugadoID"); DeletePVar(playerid, "Alugou"); }
if(GetPVarInt(playerid, "criouv")) { DeletePVar(playerid, "criouv");
if(GetPVarInt(playerid, "cvehid") != INVALID_VEHICLE_ID) DestroyVehicle(GetPVarInt(playerid, "cvehid"));
DeletePVar(playerid, "cvehid"); }
if(PlayerInfo[playerid][pPreso]) { DOF2_SetInt(FormatAccFile(playerid), "TempoPreso", PlayerInfo[playerid][pTempoPreso]); KillTimer(TimerPrisao[playerid]); } // Timers KillTimer(ClockTimer[playerid]); KillTimer(TimerHunger[playerid]); KillTimer(TimerSono[playerid]); KillTimer(TimerSede[playerid]); KillTimer(TimerCar[playerid]); KillTimer(TimerExpirarLogin[playerid]); KillTimer(TimerAbastecer[playerid]); KillTimer(TimerProcurado[playerid]);
DeletePVar(playerid, "Abastecendo"); HideGlobalGasolinaText(playerid); HidePlayerGasolinaText(playerid);
if(HotelInfo[playerid][hInHotel]) { SetPlayerInterior(playerid, 0); SetPlayerPos(playerid, 332.0835,-1515.6294,35.8672); SetPlayerVirtualWorld(playerid, 0);
HotelInfo[playerid][hInHotel] = false; HotelInfo[playerid][hVWorld] = 0; }
// Reset PlayerInfo[playerid][pRcon] = false; PlayerInfo[playerid][pAFK] = false;
if(GetPVarInt(playerid, "Algemado")) { SendClientMessageToAllEx(Verde, "| INFO | %s saiu algemado e portanto foi punido automaticamente", GetPlayerNameEx(playerid));
GivePlayerWanted(playerid, GetPlayerWanted(playerid) * 2); GivePlayerLevel(playerid, -3); GivePlayerCash(playerid, -15000); }
if(PlayerInfo[playerid][pPegouEmprego]) { RemovePlayerMapIcon(playerid, 1); PlayerInfo[playerid][pPegouEmprego] = false; DeletePVar(playerid, "EmpregoID"); }
if (GetPVarInt(playerid, "Called")) { CallStarted[playerid] = false; InCall[playerid] = false; DeletePVar(playerid, "Called"); } return 1; }
Caso sirva de algo, aqui está a mensagem de crash:
Código: SA-MP 0.3.7-R5
Exception At Address: 0x0460D9D1
Base: 0x04570000
Registers:
EAX: 0x00000045 EBX: 0xFFFFFFFF ECX: 0x00000040 EDX: 0x00619000
ESI: 0x49F764FF EDI: 0x00000003 EBP: 0x0177F688 ESP: 0x0177F618
EFLAGS: 0x00010206
Stack:
+0000: 0x0421EB08 0x007F99B0 0x045E4836 0x007F99B0
+0010: 0x007F99C7 0x041312C0 0x007FB1C3 0x0421EB08
+0020: 0x00060E7E 0x00000000 0x01974178 0x041BE8B4
+0030: 0x007EE388 0x0421EB08 0x00060E7E 0x00000000
+0040: 0x0177F708 0x0074526A 0x041BE8B4 0x00060E7E
+0050: 0x00000000 0x0053EC06 0x041BE8B4 0x041BE8B4
+0060: 0x44700000 0x44070000 0x5F82FC50 0x00000001
+0070: 0x0177F6D0 0x5F82B8E9 0x0177F6DC 0x0198D120
+0080: 0x5F888A9C 0x01974178 0x00060E7E 0x00000000
+0090: 0x0177F6C0 0x7548E74B 0x00000113 0x00000001
+00A0: 0x00000000 0x0177F698 0x0177F698 0x0177F6F4
+00B0: 0x5F883B40 0x00000001 0x0177F6E4 0x5F82FC02
+00C0: 0x0198D134 0x00000001 0x0177F888 0x0177F700
+00D0: 0x5F82E267 0x0177F708 0x0177F888 0x0177F868
+00E0: 0x5F883B58 0x00000000 0x0177F874 0x5F830246
+00F0: 0x5F8889A4 0x01974178 0x00060E7E 0xDCBAABCD
+0100: 0x00000000 0x0177F868 0x5F883D85 0xFFFFFFFF
+0110: 0x0177F874 0x00000000 0x0177F888 0x0000001A
+0120: 0x00000001 0x00000000 0x00000000 0x003B7000
+0130: 0x00000001 0xA8A5E770 0x00000000 0x77698850
+0140: 0x00000001 0x00000000 0x00000000 0x00000070
+0150: 0x00000000 0x00760994 0x00000000 0x0177F74C
+0160: 0x02262DD0 0x0177F7D8 0x75475A70 0xDC9FFB14
+0170: 0xFFFFFFFE 0x0177F7C8 0x7546D6DF 0x0233F9F0
+0180: 0x776767AC 0x7546D6F7 0x0177F7B0 0x00000018
+0190: 0x00000000 0x0177F8F8 0x00000000 0x00000000
+01A0: 0x00000000 0x00000000 0x00000000 0x00000000
+01B0: 0x0177F850 0x77678D6D 0x0177F7E4 0x00000020
+01C0: 0x0177F980 0x7FFE8000 0x0000AA64 0x77661532
+01D0: 0x0177F840 0x0177F844 0x00000000 0xFFFFFFFF
+01E0: 0x72D5AE20 0x77698850 0x00000000 0x7546C70F
+01F0: 0x0177F8F8 0x00000000 0x00000000 0x00000000
+0200: 0x6576CE2C 0x0177F894 0x77661220 0xFFFFFFFF
+0210: 0x0177F844 0x7766133A 0x5F8889A4 0x01974178
+0220: 0x00000000 0x00000001 0xA8A58664 0x0000014C
+0230: 0x9FBFDFA1 0x00B1750F 0x00192FD4 0x00000000
+0240: 0x01974178 0x01973930 0x7FFE8000 0x546C6148
+0250: 0x0177F980 0x5F883CEC 0x00000000 0x0177F880
+0260: 0x5F83013C 0x0177F888 0x754D78F0 0x0053ECC2
+0270: 0x00000001 0x00619B71 0x0000001A 0x00000001
SCM Op: 0x248, lDbg: 0 LastRendObj: 3276
Game Version: US 1.0
State Information: Ped Context: 0
O problema me parece aqui
Código: format(File, sizeof(File), PASTA_CONTAS, GetPlayerNameEx(playerid));
"PASTA_CONTAS" ele não está achando o arquivo do player para salvar, você apenas informou a pasta de onde é para salvar os dados.
acho que o certo séria assim.
Código: format(File, sizeof(File), PASTA_CONTAS/%s.txt (ou .ini), GetPlayerNameEx(playerid));
O erro também pode ser como você estaria fechando o samp server, recomendo criar uma função para sempre estar salvando os dados dos players e ir testando para saber se realmente seria isso.
em OnGameModeExit() tente isto
Código: for(new i = 0; i < MAX_PLAYERS; i++)
{
if(!IsPlayerConnected(i)) SaveAccount(i);
print("Verifica se os dados estão salvando");
}
Não, o format está correto. "PASTA_CONTAS" provavelmente é um macro cujo valor é o caminho da pasta. Creio que o DOF2 é muito lento e às vezes falha em salvar os dados ou os corrompe.
P.S.: Também não faz sentido verificar se o jogador não está conectado para salvar e trocar o foreach por for.
RE: Dados deletados ao reiniciar o servidor - Maycon_Felipe - 17/03/2024
O melhor a se fazer é verificar se o player estava jogando dentro do SaveAccount..
Só isso já vai evitar que dados limpos sejam salvos que é o que deve tá acontecendo,
vc reinicia o sv na tela de login ou desloga e ele salva com dados limpos..
Código: stock SaveAccount(playerid) {
if(!PlayerInfo[playerid][pJogando]) return 1;
}
Quando ele logar, seta para 1 ou true a variavel PlayerInfo[playerid][pJogando]..
RE: Dados deletados ao reiniciar o servidor - Ryzen_ - 17/03/2024
(16/03/2024 20:39)White_Blue Escreveu: (16/03/2024 19:56)Notknown Escreveu: (16/03/2024 02:35)Ryzen_ Escreveu: Em alguns momentos quando reinicio meu servidor, algum player acaba voltando com sua conta tendo o dinheiro, level, cargo, emprego e skins deletadas. Estou utilizando DOF2 para realizar o salvamento, mas simplesmente não consigo encontrar o que pode estar causando isso (Obs.: a parte de salvamento foi feita por um colega da equipe que também codifica na GM). De começo eu notei que estava faltando a função DOF2_SaveFile() ao final da SaveAccount(playerid), mas mesmo após a inserir, continua acontecendo o mesmo problema. Não é sempre que acontece, geralmente é quando eu reinicio o servidor várias vezes enquanto estou adicionando novas funcionalidades, daí em uma delas, ao voltar para o game ele acaba dando uma mensagem de crash ou fechando do nada, e quando volto estou setado com a skin do CJ e caindo no limbo. Se alguém puder me ajudar com isso, ficarei grato! Caso precisem de mais informações, basta me perguntar.
SaveAccount:
Código PHP: stock SaveAccount(playerid) { format(File, sizeof(File), PASTA_CONTAS, GetPlayerNameEx(playerid));
DOF2_SetInt(File, "Level", PlayerInfo[playerid][pLevel]); DOF2_SetInt(File, "EXP", PlayerInfo[playerid][pExp]); DOF2_SetInt(File, "Admin", PlayerInfo[playerid][pAdmin]); DOF2_SetInt(File, "Dinheiro", PlayerInfo[playerid][pGrana]); DOF2_SetInt(File, "Skin", PlayerInfo[playerid][pSkin]); DOF2_SetInt(File, "Sexo", PlayerInfo[playerid][pSexo]); DOF2_SetInt(File, "Fome", PlayerInfo[playerid][pFome]); DOF2_SetInt(File, "Sede", PlayerInfo[playerid][pSede]); DOF2_SetInt(File, "Sono", PlayerInfo[playerid][pSono]); DOF2_SetInt(File, "Emprego", PlayerInfo[playerid][pEmprego]); DOF2_SetInt(File, "CategoriaEmprego", PlayerInfo[playerid][pEmpregoCategoria]); DOF2_SetInt(File, "NivelProcurado", PlayerInfo[playerid][pWantedLevel]); DOF2_SetInt(File, "TempoPreso", PlayerInfo[playerid][pTempoPreso]); DOF2_SetBool(File, "Preso", PlayerInfo[playerid][pPreso]); DOF2_SetBool(File, "Mutado", PlayerInfo[playerid][pMutado]); DOF2_SetInt(File, "TempoMutado", PlayerInfo[playerid][pTempoMutado]);
DOF2_SetBool(File, "Contrato", PlayerInfo[playerid][pContrato]); DOF2_SetInt(File, "ValorContrato", PlayerInfo[playerid][pValorContrato]);
DOF2_SetInt(File, "Organizacao", PlayerInfo[playerid][pOrganizacao]); DOF2_SetInt(File, "Cargo", PlayerInfo[playerid][pCargo]);
new day, month, year; getdate(year, month, day); format(STRX, 128, "%02d/%02d/%04d", day, month, year); DOF2_SetString(File, "UltimoLogin", STRX);
new Float:X, Float:Y, Float:Z, intid; GetPlayerPos(playerid, X, Y, Z); intid = GetPlayerInterior(playerid);
PlayerInfo[playerid][pPosX] = X; PlayerInfo[playerid][pPosY] = Y; PlayerInfo[playerid][pPosZ] = Z; PlayerInfo[playerid][pInterior] = intid;
DOF2_SetFloat(File, "PosX", PlayerInfo[playerid][pPosX]); DOF2_SetFloat(File, "PosY", PlayerInfo[playerid][pPosY]); DOF2_SetFloat(File, "PosZ", PlayerInfo[playerid][pPosZ]); DOF2_SetInt(File, "Interior", PlayerInfo[playerid][pInterior]); DOF2_SaveFile(); return 1; }
OnPlayerDisconnect:
Código PHP: public OnPlayerDisconnect(playerid, reason) { SaveAccount(playerid);
if(GetPVarInt(playerid, "Fardado")) { DeletePVar(playerid, "Fardado"); SetPlayerSkin(playerid, GetPVarInt(playerid, "PreviousSkin")); DeletePVar(playerid, "PreviousSkin"); }
if(GetPVarInt(playerid, "Alugou")) { DestroyVehicle(GetPVarInt(playerid, "AlugadoID"));
DestroyDynamic3DTextLabel(TrashTruckInfo[GetPVarInt(playerid, "AlugadoID")][tLabel]); TrashTruckInfo[GetPVarInt(playerid, "AlugadoID")][tLabel] = Text3D:INVALID_3DTEXT_ID;
DeletePVar(playerid, "AlugadoID"); DeletePVar(playerid, "Alugou"); }
if(GetPVarInt(playerid, "criouv")) { DeletePVar(playerid, "criouv");
if(GetPVarInt(playerid, "cvehid") != INVALID_VEHICLE_ID) DestroyVehicle(GetPVarInt(playerid, "cvehid"));
DeletePVar(playerid, "cvehid"); }
if(PlayerInfo[playerid][pPreso]) { DOF2_SetInt(FormatAccFile(playerid), "TempoPreso", PlayerInfo[playerid][pTempoPreso]); KillTimer(TimerPrisao[playerid]); } // Timers KillTimer(ClockTimer[playerid]); KillTimer(TimerHunger[playerid]); KillTimer(TimerSono[playerid]); KillTimer(TimerSede[playerid]); KillTimer(TimerCar[playerid]); KillTimer(TimerExpirarLogin[playerid]); KillTimer(TimerAbastecer[playerid]); KillTimer(TimerProcurado[playerid]);
DeletePVar(playerid, "Abastecendo"); HideGlobalGasolinaText(playerid); HidePlayerGasolinaText(playerid);
if(HotelInfo[playerid][hInHotel]) { SetPlayerInterior(playerid, 0); SetPlayerPos(playerid, 332.0835,-1515.6294,35.8672); SetPlayerVirtualWorld(playerid, 0);
HotelInfo[playerid][hInHotel] = false; HotelInfo[playerid][hVWorld] = 0; }
// Reset PlayerInfo[playerid][pRcon] = false; PlayerInfo[playerid][pAFK] = false;
if(GetPVarInt(playerid, "Algemado")) { SendClientMessageToAllEx(Verde, "| INFO | %s saiu algemado e portanto foi punido automaticamente", GetPlayerNameEx(playerid));
GivePlayerWanted(playerid, GetPlayerWanted(playerid) * 2); GivePlayerLevel(playerid, -3); GivePlayerCash(playerid, -15000); }
if(PlayerInfo[playerid][pPegouEmprego]) { RemovePlayerMapIcon(playerid, 1); PlayerInfo[playerid][pPegouEmprego] = false; DeletePVar(playerid, "EmpregoID"); }
if (GetPVarInt(playerid, "Called")) { CallStarted[playerid] = false; InCall[playerid] = false; DeletePVar(playerid, "Called"); } return 1; }
Caso sirva de algo, aqui está a mensagem de crash:
Código: SA-MP 0.3.7-R5
Exception At Address: 0x0460D9D1
Base: 0x04570000
Registers:
EAX: 0x00000045 EBX: 0xFFFFFFFF ECX: 0x00000040 EDX: 0x00619000
ESI: 0x49F764FF EDI: 0x00000003 EBP: 0x0177F688 ESP: 0x0177F618
EFLAGS: 0x00010206
Stack:
+0000: 0x0421EB08 0x007F99B0 0x045E4836 0x007F99B0
+0010: 0x007F99C7 0x041312C0 0x007FB1C3 0x0421EB08
+0020: 0x00060E7E 0x00000000 0x01974178 0x041BE8B4
+0030: 0x007EE388 0x0421EB08 0x00060E7E 0x00000000
+0040: 0x0177F708 0x0074526A 0x041BE8B4 0x00060E7E
+0050: 0x00000000 0x0053EC06 0x041BE8B4 0x041BE8B4
+0060: 0x44700000 0x44070000 0x5F82FC50 0x00000001
+0070: 0x0177F6D0 0x5F82B8E9 0x0177F6DC 0x0198D120
+0080: 0x5F888A9C 0x01974178 0x00060E7E 0x00000000
+0090: 0x0177F6C0 0x7548E74B 0x00000113 0x00000001
+00A0: 0x00000000 0x0177F698 0x0177F698 0x0177F6F4
+00B0: 0x5F883B40 0x00000001 0x0177F6E4 0x5F82FC02
+00C0: 0x0198D134 0x00000001 0x0177F888 0x0177F700
+00D0: 0x5F82E267 0x0177F708 0x0177F888 0x0177F868
+00E0: 0x5F883B58 0x00000000 0x0177F874 0x5F830246
+00F0: 0x5F8889A4 0x01974178 0x00060E7E 0xDCBAABCD
+0100: 0x00000000 0x0177F868 0x5F883D85 0xFFFFFFFF
+0110: 0x0177F874 0x00000000 0x0177F888 0x0000001A
+0120: 0x00000001 0x00000000 0x00000000 0x003B7000
+0130: 0x00000001 0xA8A5E770 0x00000000 0x77698850
+0140: 0x00000001 0x00000000 0x00000000 0x00000070
+0150: 0x00000000 0x00760994 0x00000000 0x0177F74C
+0160: 0x02262DD0 0x0177F7D8 0x75475A70 0xDC9FFB14
+0170: 0xFFFFFFFE 0x0177F7C8 0x7546D6DF 0x0233F9F0
+0180: 0x776767AC 0x7546D6F7 0x0177F7B0 0x00000018
+0190: 0x00000000 0x0177F8F8 0x00000000 0x00000000
+01A0: 0x00000000 0x00000000 0x00000000 0x00000000
+01B0: 0x0177F850 0x77678D6D 0x0177F7E4 0x00000020
+01C0: 0x0177F980 0x7FFE8000 0x0000AA64 0x77661532
+01D0: 0x0177F840 0x0177F844 0x00000000 0xFFFFFFFF
+01E0: 0x72D5AE20 0x77698850 0x00000000 0x7546C70F
+01F0: 0x0177F8F8 0x00000000 0x00000000 0x00000000
+0200: 0x6576CE2C 0x0177F894 0x77661220 0xFFFFFFFF
+0210: 0x0177F844 0x7766133A 0x5F8889A4 0x01974178
+0220: 0x00000000 0x00000001 0xA8A58664 0x0000014C
+0230: 0x9FBFDFA1 0x00B1750F 0x00192FD4 0x00000000
+0240: 0x01974178 0x01973930 0x7FFE8000 0x546C6148
+0250: 0x0177F980 0x5F883CEC 0x00000000 0x0177F880
+0260: 0x5F83013C 0x0177F888 0x754D78F0 0x0053ECC2
+0270: 0x00000001 0x00619B71 0x0000001A 0x00000001
SCM Op: 0x248, lDbg: 0 LastRendObj: 3276
Game Version: US 1.0
State Information: Ped Context: 0
O problema me parece aqui
Código: format(File, sizeof(File), PASTA_CONTAS, GetPlayerNameEx(playerid));
"PASTA_CONTAS" ele não está achando o arquivo do player para salvar, você apenas informou a pasta de onde é para salvar os dados.
acho que o certo séria assim.
Código: format(File, sizeof(File), PASTA_CONTAS/%s.txt (ou .ini), GetPlayerNameEx(playerid));
O erro também pode ser como você estaria fechando o samp server, recomendo criar uma função para sempre estar salvando os dados dos players e ir testando para saber se realmente seria isso.
em OnGameModeExit() tente isto
Código: for(new i = 0; i < MAX_PLAYERS; i++)
{
if(!IsPlayerConnected(i)) SaveAccount(i);
print("Verifica se os dados estão salvando");
}
Não, o format está correto. "PASTA_CONTAS" provavelmente é um macro cujo valor é o caminho da pasta. Creio que o DOF2 é muito lento e às vezes falha em salvar os dados ou os corrompe.
P.S.: Também não faz sentido verificar se o jogador não está conectado para salvar e trocar o foreach por for.
Sim, isso mesmo, ela é uma macro. Creio que o problema possa ser algo referente ao DOF2 msm, já que sempre salva tudo certinho, e o problema só ocorre quando eu reinicio o server (Não sempre, mas do nada dá isso). O ruim é que é meio complicado eu precisar reiniciar pra atualizar, e algum jogador simplesmente voltar com sua conta resetada.
|