-
Sziasztok,eddig nem volt ilyen hiba a szerveremen,de most van:
Random parancsoktól crashel a szervermvan amikor mûködik,van amikor meg crashel tõle.
Pl.: /elet-tel a hp-mat 100-ra akarom rakni.Crashel.
Resi után már nem crashel,de utána a meg a frakció módosítástól.Resi után már az is mûködik.Szóval nem tudom mi a logika a crashek között.
[22:37:45] [debug] Server crashed while executing loginom.amx
[22:37:45] [debug] AMX backtrace:
[22:37:45] [debug] #0 native fwrite () [00405710] from samp-server.exe
[22:37:45] [debug] #1 000015f8 in ?? () from loginom.amx
[22:37:45] [debug] #2 00001868 in ?? () from loginom.amx
[22:37:45] [debug] #3 00046468 in public AutomatikusMentes () from loginom.amx
[22:37:45] [debug] System backtrace:
[22:37:46] [debug] #0 00491f90 in ?? () from C:\\Users\\Tici\\Desktop\\Programozás\\0.3eTELJES\\samp-server.exe
[22:37:46] [debug] #1 0040534e in ?? () from C:\\Users\\Tici\\Desktop\\Programozás\\0.3eTELJES\\samp-server.exe
Ezt írja crashdetect.Automatikus Mentes-ben nem lehet hiba,mert azt gyakran lefuttatja,és akkor kb 10 mp után crashelnie kellet volna.
Ui.: mindig ezt írja ki,még ha más parancsnál crashel,akkor is.
-
Ezek szerint mégis a loginom.amx-tõl. Facen írj rám küld el az FS-t és meglesem.
-
nem fs.Csak amikor elkezdtem írni a modomat,akkor elneveztem loginomnak és azóta az a neve. :D Ez a teljes gamemode.
-
Másold be azt az élet parancsot.
-
CMD:elet(playerid,params[])
{
/*------*/
new id, elet;
/*------*/
if(sscanf(params,\"ui\",id,elet))return SendClientMessage(playerid,SZURKE,\"Használat: /elet [Név/Játékos ID] [Élet összeg]\");
{
if(Belepve[playerid] != 0)
{
if(JatekosInfo[playerid][Admin] > 0)
{
if(id != INVALID_PLAYER_ID)
{
SetPlayerHealth(id, elet);
new string[256];
new string2[256];
GetPlayerName(playerid,nev,sizeof(nev));
GetPlayerName(id,fogadonev,sizeof(fogadonev));
format(string,sizeof(string),\"%s átállította az életedet %d-ra/re!\",nev,elet);
format(string2,sizeof(string2),\"%s átállította %s életet %d-ra/re!\",nev,fogadonev,elet);
AdminnakUzenet(VNARANCS, string2, 1);
SendClientMessage(id, VKEK, string);
}
else SendClientMessage(playerid, HIBA, \"Nincs ilyen játékos!\");
}
else SendClientMessage(playerid, HIBA, \"Minimum 1-es szintû adminnak kell lenned!\");
}
else SendClientMessage(playerid, HIBA, \"Be kell jelentkezned!\");
}
return 0;
}
-
Az fwrite függvény crashel ha nem sikerült az fopen-nek megnyitnia a számára megadott fájl elérési útvonalat.
Ezért mindig le kell ellenõrizni hogy sikerült-e megnyitni a fájlt.
new File:test = fopen(\"teszt.txt\", io_write);
if(test)
{
print(\"A fájl megnyitása sikeres.\");
} else {
print(\"A fájl-t nem sikerült megnyitni.\");
// Ebben az esetben crashel a samp, ha fwrite van használatban.
}
-
Az élet parancsban nincs file kezelés.
-
Az élet parancsban nincs file kezelés.
de a log szerint az miatt crashelt a szerver.
-
Hát de nem tudom,mert pl.: a frakció parancsban sincs fájlkezelés,és pont akkor crashel a szerver,amikor beírja valaki a parancsot.De ez teljesen véletlen,hogy éppen melyik parancstól fog crashelni.
-
A legelsõ postban benne van miért crashelt a szerver.
Azon nem tudom mit nem lehet megérteni.
Sziasztok,eddig nem volt ilyen hiba a szerveremen,de most van:
Random parancsoktól crashel a szervermvan amikor mûködik,van amikor meg crashel tõle.
Pl.: /elet-tel a hp-mat 100-ra akarom rakni.Crashel.
Resi után már nem crashel,de utána a meg a frakció módosítástól.Resi után már az is mûködik.Szóval nem tudom mi a logika a crashek között.
[22:37:45] [debug] Server crashed while executing loginom.amx
[22:37:45] [debug] AMX backtrace:
[22:37:45] [debug] #0 native fwrite () [00405710] from samp-server.exe
[22:37:45] [debug] #1 000015f8 in ?? () from loginom.amx
[22:37:45] [debug] #2 00001868 in ?? () from loginom.amx
[22:37:45] [debug] #3 00046468 in public AutomatikusMentes () from loginom.amx
[22:37:45] [debug] System backtrace:
[22:37:46] [debug] #0 00491f90 in ?? () from C:\\Users\\Tici\\Desktop\\Programozás\\0.3eTELJES\\samp-server.exe
[22:37:46] [debug] #1 0040534e in ?? () from C:\\Users\\Tici\\Desktop\\Programozás\\0.3eTELJES\\samp-server.exe
Ezt írja crashdetect.Automatikus Mentes-ben nem lehet hiba,mert azt gyakran lefuttatja,és akkor kb 10 mp után crashelnie kellet volna.
Ui.: mindig ezt írja ki,még ha más parancsnál crashel,akkor is.
A crash oka az automatikus mentés dolog \"public AutomatikusMentes()\".
Ott egy native funkcióra jelzi a hibát mégpedig az \"fwrite\".
Ennek az okát leírtam egy korábbi hozzászólásban.
Az hogy most te próbálod összekötni abszolút nem a hiba okához való parancsok használatával, azzal csak a te dolgodat nehezíted meg.
-
Azt nem értem,hogy igaz,hogy nem írtam if(fexist-et stb,de elõtte a timerben van az az if,hogy if(Belepve[playerid] == 1),és ez meg csak akkor 1,ha be van lépve,és cska akkor léphet be ha regisztrálva van,vagyis van fájl.És kilépéskor automatikusan 0 lesz a playerid Belepve változója.
Csak annyit kell csinálnom,hogy a timerhez rakjam be,hogy if(fexist - mentsen , if(!fexist - ne csináljon semmit?
-
Az \"AutomatikusMentes\" mentés részbe írd bele.
Az hogy nem érted attól még a probléma fennáll, elõfordulhat hogy pont az ottani fájlmegnyitás rész pontatlan, oda írd bele az ellenõrzést.
De ha ide másolod azt a részt (\"AutomatikusMentes\")talán többet tudok mondani, míg csak te látod mi van ott, addig más nem tud segíteni.
-
http://pastebin.com/A0a5gcDs
-
Csoda hogy nem füstöl el a winchester.
Olyan 10 játékos létszámnál nincs lagg egy pöttyet?
Cseréld le a dini fájl kezelést valami egyszerûbbre.
Korábban írtam én valami szöszenetet valamilyen topicban, miszerint:
Minek mentesz olyan adatot ami nem változott meg? (valami technika ördöge felülírta valami hamis adattal talán)
Cseréld le mysql-re vagy valami gyorsabb adatmentésre az egészet.
A dini fájl kezelés egy katasztrófa.
Egyetlen egy adatsor átírása a következõbõl áll:
fájl megnyitás olvasásra
azonosítósor keresés
közben .part kiterjesztéssel újra írja a meglévõ fájlt soronként
ha megtalálta az azonosító sort akkor az új adattal felülírja értékét
törlés az eredeti fájlnak
majd az egész .part kiterjesztésû fájlt vissza írja eredeti állapotába
törlés a .part kiterjesztésû fájlnak.
Na szóval mivel törli az eredeti fájlt akkor elõfordulhat könnyedén hogy a következõ adatfelülírás már nem tudja megnyitni.
Egy szó mint száz, dinivel ennyi adatfelülírás egyszerre ilyen hibákat eredményez.
Javaslat:
Mivel úgyis az egész fájl tartalmát írod újra, ne használj dini-t, maradj a sima format, fopen, fwrite, megoldásnál.
Ez még mindig gyorsabb mint a dini.
Mivel csak törlöd az eredeti fájlt és létrehozod az újat minden adattal.
-
Leírnád pls,hogy hogy kell normális módszerrel floatot,intet és stringet menteni ? köszi +1
-
format(filestr, sizeof(filestr, \"Adatbazis/Karakterek/%s.ini\", nev);
new
File:playerfile = fopen(filestr, io_write);
if(playerfile)
{
format(filestr, sizeof filestr, \"Pénz=%d\", JatekosInfo[playerid][Penz]);
fwrite(playerfile, filestr);
format(filestr, sizeof filestr, \"Pont=%d\", GetPlayerScore(playerid));
fwrite(playerfile, filestr);
format(filestr, sizeof filestr, \"Munka=%d\", JatekosInfo[playerid][Munka]);
fwrite(playerfile, filestr);
format(filestr, sizeof(filestr, \"Adatbazis/Karakterek/%s.ini\", nev);
new
File:playerfile = fopen(filestr, io_write);
if(playerfile)
{
format(filestr, sizeof filestr, \"Pénz=%d\\r\\nPont=%d\\r\\nMunka=%d\",
JatekosInfo[playerid][Penz],
GetPlayerScore(playerid),
JatekosInfo[playerid][Munka]);
fwrite(playerfile, filestr);
És hogy még jobban elvegyem a kedved a dini túlzott használatától.
A jelenlegi adatmentésed egyszeri alkalommal való lefutásakor, olyan 150 adatsort számoltam körülbelül ezt veszem alapul, tehát:
300 fájlmegnyitással
300 fájlbezárással
150 fájltörléssel
300 fájllétrehozással (150 .part és 150 eredeti kiterjesztéssel (ha jól láttam akkor .ini)
jár, és azt újból megemlítem hogy ez egyszeri lefutás alkalmával történik.
Ha ezt megtetézed egy idõzítõvel és egy 10 online játékossal.
Akkor egy perces ismétlõdéssel 10 játékos esetében, 10 darab regisztrációs fájl percenként
3000 fájlmegnyitással
3000 fájlbezárással
1500 fájltörléssel
3000 fájllétrehozással (1500 .part és 1500 .ini) jár, és ez csak a játékos adatai, és láttam ott valami jármû adatmentést is. :D :D
És akkor ha a fenti módszerre átírod (hagyományos módszer) szintén 10 játékos egy perces ismétlõdéssel számolva:
10 fájlmegnyitás
10 fájl újraírás
10 fájlbezárással jár percenként.
-
Köszönöm a felvilágosítást :D El is kezdtem átírni.Csak a reg,login és a kilépéskor való mentés marad így szerintem.
Ui.: a timer 5 mp-nként ment xd