-
Hali!
Jármű beolvasást próbálom megcsinálni MySQL -ből, mivel ott tárolnám a járműveket, már régóta próbálgatom, de nem nagyon akar működni. Addig megy,hogy beolvassa a pozíciót,létrehozza,stb, viszont a \"Tulaj,Rendszám,Üzemanyag,Jármű HP\" ezeket nem jól olvassa be.
Ez az ENUM:
enum carInfo
{
vID,
vTulaj[32],
vRendszam[32],
vModel,
Float:vPosX,
Float:vPosY,
Float:vPosZ,
Float:vRot,
vCol1,
vCol2,
KmSzamlalo,
Float:VehHP,
VehFuel
};
new cInfo[50][carInfo];
GameModeInitnél ez meghívódik:
loadVehicles()
{
new query[128];
format(query,sizeof(query),\"SELECT * FROM sveh\");
mysql_function_query(dbhandle,query,true,\"OnQueryFinish\",\"i\",THREAD_LOAD_VEHICLES);
return 1;
}
OnQueryFinish -be pedig betölti és létrehozza:
public OnQueryFinish(resultid, extraid, ConnectionHandle)
{
new num_rows, num_fields;
if(resultid != THREAD_NO_RESULT)
{
cache_get_data(num_rows, num_fields);
}
switch(resultid)
{
case THREAD_LOAD_VEHICLES:
{
if(num_rows)
{
new v;
for(new i = 0; i < num_rows ; i++)
{
cInfo[vModel] = cache_get_field_content_int(i,\"cID\",dbhandle);
cInfo[vTulaj] = cache_get_field_content(i, \"Tulaj\", KocsiTulaj);
cInfo[vRendszam] = cache_get_field_content(i, \"Rendszam\", KocsiRendszam);
cInfo[vPosX] = cache_get_field_content_float(i,\"VehX\",dbhandle);
cInfo[vPosY] = cache_get_field_content_float(i,\"VehY\",dbhandle);
cInfo[vPosZ] = cache_get_field_content_float(i,\"VehZ\",dbhandle);
cInfo[vRot] = cache_get_field_content_float(i,\"VehRot\",dbhandle);
cInfo[vCol1] = cache_get_field_content_int(i,\"VehCol1\",dbhandle);
cInfo[vCol2] = cache_get_field_content_int(i,\"VehCol2\",dbhandle);
cInfo[KmSzamlalo] = cache_get_field_content_int(i,\"KmSzamlalo\",dbhandle);
cInfo[VehHP] = cache_get_field_content_float(i,\"VehHP\",dbhandle);
cInfo[VehFuel] = cache_get_field_content_int(i,\"Uzemanyag\",dbhandle);
CreateVehicle(cInfo[vModel],cInfo[vPosX],cInfo[vPosY],cInfo[vPosZ],cInfo[vRot],cInfo[vCol1],cInfo[vCol2],-1);
SetVehicleHealth(i,Float:cInfo[VehHP]);
SetVehicleNumberPlate(i,KocsiRendszam);
v++;
printf(\"Jarmuvek betoltve: %d\", v);
}
}
printf(\"Jarmuvek betoltve: 0\");
}
}
return 1;
}
A MySQL-be van 3 sor,első sorba 420as Jármű ID (taxi),a második 401 azaz manana,illetve a harmadik sorba pedig 400-as ID van ami Landstalker.
Na most, 420-as járműnek azt a rendszámot tölti be ami a második sorba van. Ami második sorba van jármű model ID, annak pedig a harmadik sor rendszámát tölti be. Ilyen gondom van, nagyon szépen megköszönném ha valaki tudna segíteni, előre is köszönöm szépen! :)
-
sql táblát tudnád csatolni mert lehet ott van elcsúszva valami
-
sql táblát tudnád csatolni mert lehet ott van elcsúszva valami
Természetesen,remélem így is megfelel.
http://kepfeltoltes.hu/150702/719567967N_vtelen_www.kepfeltoltes.hu_.png[/img]
http://kepfeltoltes.hu/150702/N_vtele2n_www.kepfeltoltes.hu_.png[/img]
-
A cache_get_field_content() függvény nem tér vissza a szöveggel. Így nem tudod egyenlőség jel után írni. Csinálhatod úgyis, ahogy azt te elképzelted, hogy eltárolod az értéket egy másik változóba, majd az eltárolt értéket bemásolod a jármű tulaj tömbjébe, de ezt így teljesen felesleges. Nyugodtan mehet egyből a kiolvasott érték a jármű tömbjébe. Tehát a \"KocsiTualj\" stringet felesleges deklarálni.
cache_get_field_content(i, \"Tulaj\", cInfo[vTulaj]);
És így tovább a többi stringnél is..
-
A cache_get_field_content() függvény nem tér vissza a szöveggel. Így nem tudod egyenlőség jel után írni. Csinálhatod úgyis, ahogy azt te elképzelted, hogy eltárolod az értéket egy másik változóba, majd az eltárolt értéket bemásolod a jármű tulaj tömbjébe, de ezt így teljesen felesleges. Nyugodtan mehet egyből a kiolvasott érték a jármű tömbjébe. Tehát a \"KocsiTualj\" stringet felesleges deklarálni.
cache_get_field_content(i, \"Tulaj\", cInfo[vTulaj]);
És így tovább a többi stringnél is..
Köszönöm szépen, próbáltam, de így még rosszabb. Ahogy felmegyek a szerverre az összes jármű rendszáma \"XYZR 999\"\"
Jelenleg így néz ki:
public OnQueryFinish(resultid, extraid, ConnectionHandle)
{
new num_rows, num_fields;
if(resultid != THREAD_NO_RESULT)
{
cache_get_data(num_rows, num_fields);
}
switch(resultid)
{
case THREAD_LOAD_VEHICLES:
{
if(num_rows)
{
new v;
for(new i = 0; i < num_rows ; i++)
{
cInfo[vModel] = cache_get_field_content_int(i,\"cID\",dbhandle);
cache_get_field_content(i, \"Tulaj\", cInfo[vTulaj]);
cache_get_field_content(i, \"Rendszam\", cInfo[vRendszam]);
cInfo[vPosX] = cache_get_field_content_float(i,\"VehX\",dbhandle);
cInfo[vPosY] = cache_get_field_content_float(i,\"VehY\",dbhandle);
cInfo[vPosZ] = cache_get_field_content_float(i,\"VehZ\",dbhandle);
cInfo[vRot] = cache_get_field_content_float(i,\"VehRot\",dbhandle);
cInfo[vCol1] = cache_get_field_content_int(i,\"VehCol1\",dbhandle);
cInfo[vCol2] = cache_get_field_content_int(i,\"VehCol2\",dbhandle);
cInfo[KmSzamlalo] = cache_get_field_content_int(i,\"KmSzamlalo\",dbhandle);
cInfo[VehHP] = cache_get_field_content_float(i,\"VehHP\",dbhandle);
cInfo[VehFuel] = cache_get_field_content_int(i,\"Uzemanyag\",dbhandle);
CreateVehicle(cInfo[vModel],cInfo[vPosX],cInfo[vPosY],cInfo[vPosZ],cInfo[vRot],cInfo[vCol1],cInfo[vCol2],-1);
SetVehicleHealth(i,Float:cInfo[VehHP]);
SetVehicleNumberPlate(i,cInfo[vRendszam]);
v++;
printf(\"Jarmuvek betoltve: %d\", v);
}
}
printf(\"Jarmuvek betoltve: 0\");
}
}
return 1;
}
Mi lehet a gond ? :\'(
-
Jó lenne meghatározni, hogy melyik járműnek állítod át a rendszámát, életét, stb... Mivel ha más sorrendben hozod létre a járműveket, akkor ez az egész dolog eltolódhat. Ahhoz meg létre kéne hozni az enumban egy úgy értéket, legyen az mondjuk \"vServerID\", mert már a vID foglalt, ami gondolom a MySQL ID-t tárolja.
cInfo[vServerID] = CreateVehicle(cInfo[vModel],cInfo[vPosX],cInfo[vPosY],cInfo[vPosZ],cInfo[vRot],cInfo[vCol1],cInfo[vCol2],-1);
SetVehicleHealth(cInfo[vServerID],Float:cInfo[VehHP]);
SetVehicleNumberPlate(cInfo[vServerID],cInfo[vRendszam]);
-
Jó lenne meghatározni, hogy melyik járműnek állítod át a rendszámát, életét, stb... Mivel ha más sorrendben hozod létre a járműveket, akkor ez az egész dolog eltolódhat. Ahhoz meg létre kéne hozni az enumban egy úgy értéket, legyen az mondjuk \"vServerID\", mert már a vID foglalt, ami gondolom a MySQL ID-t tárolja.
cInfo[vServerID] = CreateVehicle(cInfo[vModel],cInfo[vPosX],cInfo[vPosY],cInfo[vPosZ],cInfo[vRot],cInfo[vCol1],cInfo[vCol2],-1);
SetVehicleHealth(cInfo[vServerID],Float:cInfo[VehHP]);
SetVehicleNumberPlate(cInfo[vServerID],cInfo[vRendszam]);
Nagyon szépen köszönöm,tökéletesen működik! Már csak a mentést kéne megoldani,szintén működik lement mindent kivéve a \"Kocsi Tulajdonost illetve Kocsi Rendszámát\" mivel a MySQL -be üreset stringet ment.
A Mentés pedig így működik,meghívódik egy parancsnál:
stock VehicleSaveAll()
{
// Leghosszabb query: UPDATE sveh SET VehX=\'-1234.12\',VehY=\'-1234.12\',VehZ=\'-1234.12\',VehRot=\'-1234.12\' WHERE ID=\'1234\'
new query[1024],v;
for(new i = 0; i < MAX_VEHICLES ; i++)
{
if(!GetVehicleModel(i)) { continue; } // ha nincs ilyen jármű akkor ugrik a következőre
// adatok lekérése
GetVehiclePos(i,cInfo[vPosX],cInfo[vPosY],cInfo[vPosZ]);
GetVehicleZAngle(i, cInfo[vRot]);
GetVehicleHealth(i, Float:cInfo[VehHP]);
GetVehicleColor(i, cInfo[vCol1],cInfo[vCol2]);
// mentés
format(query,sizeof(query),\"UPDATE sveh SET Tulaj=\'%s\',Rendszam=\'%s\',VehX=\'%.2f\',VehY=\'%.2f\',VehZ=\'%.2f\',VehRot=\'%.2f\',VehCol1=\'%d\',VehCol2=\'%d\',KmSzamlalo=\'%d\',VehHP=\'%.2f\',Uzemanyag=\'%d\' WHERE ID=\'%d\'\",cInfo[vTulaj],cInfo[vRendszam],cInfo[vPosX],cInfo[vPosY],cInfo[vPosZ],cInfo[vRot],cInfo[vCol1],cInfo[vCol2],cInfo[KmSzamlalo],cInfo[VehHP],cInfo[VehFuel],i);
mysql_function_query(dbhandle,query,true,\"\",\"\");
//
v++;
}
printf(\"Jarmuvek mentve: %d\", v);
return v; // visszatérési érték a mentett járművek száma
}
Itt mi lehet a gond ? Ez lenne az utolsó kérdésem,előre is nagyon szépen köszönöm a választ! :)
-
Tudnád debuggoltatni? Magyarán kiprintelni a MySQL kódot amikor lefut, hátha megtudunk belőle valamit.
print(query);
De szerintem a gond ott lesz, hogy a ciklus az összes járműre vonatkozik, még azokra is amik csak sima járművek és nem vehetőek meg a szerveren. Vannak ilyenek?
-
Tudnád debuggoltatni? Magyarán kiprintelni a MySQL kódot amikor lefut, hátha megtudunk belőle valamit.
print(query);
De szerintem a gond ott lesz, hogy a ciklus az összes járműre vonatkozik, még azokra is amik csak sima járművek és nem vehetőek meg a szerveren. Vannak ilyenek?
Na debugoltattam,a következőket írja:
[20:20:37] UPDATE sveh SET Tulaj=\'\',Rendszam=\'\',VehX=\'1620.26\',VehY=\'-2313.68\',VehZ=\'13.29\',VehRot=\'137.64\',VehCol1=\'6\',VehCol2=\'6\',KmSzamlalo=\'0\',VehHP=\'906.11\',Uzemanyag=\'100\' WHERE ID=\'1\'
[20:20:37] UPDATE sveh SET Tulaj=\'\',Rendszam=\'\',VehX=\'1643.07\',VehY=\'-2329.10\',VehZ=\'13.65\',VehRot=\'126.19\',VehCol1=\'1\',VehCol2=\'1\',KmSzamlalo=\'0\',VehHP=\'900.00\',Uzemanyag=\'100\' WHERE ID=\'2\'
[20:20:37] UPDATE sveh SET Tulaj=\'\',Rendszam=\'\',VehX=\'1673.49\',VehY=\'-2316.26\',VehZ=\'13.14\',VehRot=\'146.74\',VehCol1=\'0\',VehCol2=\'0\',KmSzamlalo=\'0\',VehHP=\'1000.00\',Uzemanyag=\'100\' WHERE ID=\'3\'
[20:20:37] UPDATE sveh SET Tulaj=\'\',Rendszam=\'\',VehX=\'1663.66\',VehY=\'-2317.51\',VehZ=\'13.15\',VehRot=\'208.70\',VehCol1=\'4\',VehCol2=\'4\',KmSzamlalo=\'0\',VehHP=\'300.00\',Uzemanyag=\'0\' WHERE ID=\'4\'
[20:20:37] Jarmuvek mentve: 4
Nincs,mivel a módba sehol nincs AddStaticVehicle vagy CreateVehicle,tehát csak azok a járművek vannak a szerveren, amiket a MySQL Tábla tartalmaz. :-[
-
Szerintem vagy módosultak valahol az adatok, vagy rossz járműt kér le a szerver, de inkább a második. Szerintem teleportálj oda a koordinátára amit kidebuggoltattál és győződj meg róla, hogy valóban azt a járművet kérte le a szerver, aminek van tulaja, rendszáma, stb..
-
Szerintem vagy módosultak valahol az adatok, vagy rossz járműt kér le a szerver, de inkább a második. Szerintem teleportálj oda a koordinátára amit kidebuggoltattál és győződj meg róla, hogy valóban azt a járművet kérte le a szerver, aminek van tulaja, rendszáma, stb..
Próbáltam, oda teleportáltam és van neki rendszáma mégpedig \"1\" illetve oda is teleportáltam, és ott van mellettem a kocsi és a tulaj -t illetve rendszámot nem menti le de a pozíció,stb azokat mind szépen lementi, viszont észre vettem, hogy a server_log -ba ott üres stringet ment tehát Tulaj= \" \",viszont a konzol ablakba pedig ilyet:
http://kepfeltoltes.hu/150703/1154820598N_vtelen_www.kepfeltoltes.hu_.png[/img]
A Jármű lementés még mindig ezzel történik, hogy meg hívódik egy parancsnál:
stock VehicleSaveAll()
{
new query[512],v;
for(new i = 0; i < MAX_VEHICLES ; i++)
{
if(!GetVehicleModel(i)) { continue; } // ha nincs ilyen jármű akkor ugrik a következőre
// adatok lekérése
GetVehiclePos(i,cInfo[vPosX],cInfo[vPosY],cInfo[vPosZ]);
GetVehicleZAngle(i, cInfo[vRot]);
GetVehicleHealth(i, Float:cInfo[VehHP]);
GetVehicleColor(i, cInfo[vCol1],cInfo[vCol2]);
// mentés
format(query,sizeof(query),\"UPDATE sveh SET Tulaj=\'%s\',Rendszam=\'%s\',VehX=\'%.2f\',VehY=\'%.2f\',VehZ=\'%.2f\',VehRot=\'%.2f\',VehCol1=\'%d\',VehCol2=\'%d\',KmSzamlalo=\'%d\',VehHP=\'%.2f\',Uzemanyag=\'%d\' WHERE ID=\'%d\'\",cInfo[vTulaj],cInfo[vRendszam],cInfo[vPosX],cInfo[vPosY],cInfo[vPosZ],cInfo[vRot],cInfo[vCol1],cInfo[vCol2],cInfo[KmSzamlalo],cInfo[VehHP],cInfo[VehFuel],i);
mysql_function_query(dbhandle,query,true,\"\",\"\");
//
v++;
print(query);
}
printf(\"Jarmuvek mentve: %d\", v);
return v; // visszatérési érték a mentett járművek száma
}
Az szerintem nem lehet gond, hogy rosszul tölti be a rendszámot ezért rosszul is menti le, mivel betöltésnél olyan rendszámot kapnak amilyet beolvas MySQL -ből.
Mi lehet a gond ? Előre is köszi!
-
Nem sok ötletem van már, de szerintem akkor is a mentéssel és a tömb indexxel van a gond.
Eleve felesleges a MAX_VEHICLES-el lepörgetni a ciklust, mivel csak 50 a max létrehozható jármű a tömb indexéből ítélve (new cInfo[50][carInfo];).
Picit módosítottam a kódot, ez csak a privát járművekre fog vonatkozni.
A vID változóból olvassa ki a szerver a MySQL ID-t mentésnél, mert ha \'i\'-t használsz, akkor csak össze fog keveredni minden ha pl törölsz egy járművet az adatbázisból. Tehát módosítsd a jármű betöltést és töltsd be az \"ID\" oszlopot a cInfo[vID] változóba.
#define MAX_PRIVATE_VEH 50
new cInfo[MAX_PRIVATE_VEH][carInfo];
stock VehicleSaveAll()
{
new query[512], v;
for(new i = 0; i < MAX_PRIVATE_VEH ; i++)
{
if( !cInfo[vModel] ) { continue; } // ha nincs ilyen jármű akkor ugrik a következőre
// adatok lekérése
GetVehiclePos (cInfo[vServerID], cInfo[vPosX], cInfo[vPosY], cInfo[vPosZ]);
GetVehicleZAngle(cInfo[vServerID], cInfo[vRot]);
GetVehicleHealth(cInfo[vServerID], cInfo[VehHP]);
GetVehicleColor (cInfo[vServerID], cInfo[vCol1], cInfo[vCol2]);
// mentés
format(query,sizeof(query),\"UPDATE sveh SET Tulaj=\'%s\',Rendszam=\'%s\',VehX=\'%.2f\',VehY=\'%.2f\',VehZ=\'%.2f\',VehRot=\'%.2f\',VehCol1=\'%d\',VehCol2=\'%d\',KmSzamlalo=\'%d\',VehHP=\'%.2f\',Uzemanyag=\'%d\' WHERE ID=\'%d\'\", cInfo[vTulaj],cInfo[vRendszam],cInfo[vPosX],cInfo[vPosY],cInfo[vPosZ],cInfo[vRot],cInfo[vCol1],cInfo[vCol2],cInfo[KmSzamlalo],cInfo[VehHP],cInfo[VehFuel], cInfo[vID]);
mysql_function_query(dbhandle, query, true, \"\", \"\");
//
v++;
print(query);
}
printf(\"Jarmuvek mentve: %d\", v);
return v; // visszatérési érték a mentett járművek száma
}
-
Nem sok ötletem van már, de szerintem akkor is a mentéssel és a tömb indexxel van a gond.
Eleve felesleges a MAX_VEHICLES-el lepörgetni a ciklust, mivel csak 50 a max létrehozható jármű a tömb indexéből ítélve (new cInfo[50][carInfo];).
Picit módosítottam a kódot, ez csak a privát járművekre fog vonatkozni.
A vID változóból olvassa ki a szerver a MySQL ID-t mentésnél, mert ha \'i\'-t használsz, akkor csak össze fog keveredni minden ha pl törölsz egy járművet az adatbázisból. Tehát módosítsd a jármű betöltést és töltsd be az \"ID\" oszlopot a cInfo[vID] változóba.
#define MAX_PRIVATE_VEH 50
new cInfo[MAX_PRIVATE_VEH][carInfo];
stock VehicleSaveAll()
{
new query[512], v;
for(new i = 0; i < MAX_PRIVATE_VEH ; i++)
{
if( !cInfo[vModel] ) { continue; } // ha nincs ilyen jármű akkor ugrik a következőre
// adatok lekérése
GetVehiclePos (cInfo[vServerID], cInfo[vPosX], cInfo[vPosY], cInfo[vPosZ]);
GetVehicleZAngle(cInfo[vServerID], cInfo[vRot]);
GetVehicleHealth(cInfo[vServerID], cInfo[VehHP]);
GetVehicleColor (cInfo[vServerID], cInfo[vCol1], cInfo[vCol2]);
// mentés
format(query,sizeof(query),\"UPDATE sveh SET Tulaj=\'%s\',Rendszam=\'%s\',VehX=\'%.2f\',VehY=\'%.2f\',VehZ=\'%.2f\',VehRot=\'%.2f\',VehCol1=\'%d\',VehCol2=\'%d\',KmSzamlalo=\'%d\',VehHP=\'%.2f\',Uzemanyag=\'%d\' WHERE ID=\'%d\'\", cInfo[vTulaj],cInfo[vRendszam],cInfo[vPosX],cInfo[vPosY],cInfo[vPosZ],cInfo[vRot],cInfo[vCol1],cInfo[vCol2],cInfo[KmSzamlalo],cInfo[VehHP],cInfo[VehFuel], cInfo[vID]);
mysql_function_query(dbhandle, query, true, \"\", \"\");
//
v++;
print(query);
}
printf(\"Jarmuvek mentve: %d\", v);
return v; // visszatérési érték a mentett járművek száma
}
Köszi,meg csináltam de így sem működik, ugyanaz a hiba,nem ment le semmit csak üres stringeket mindenhova.
Betöltésnél így olvasom be a rendszámot:
cInfo[vRendszam] = cache_get_field_content(i, \"Rendszam\", KocsiRendszam);
SetVehicleNumberPlate(cInfo[vServerID],KocsiRendszam);
Csak így működik,akárhogy máshogy megírom még a rendszámnak is üres stringet tölt be így viszont megy.