-
Hali!
Úgy akarom megcsinálni a szerveremre,hogy MySQL táblába mentsen minden jármûvet és onnan is töltse be,a betöltés meg van,csak a mentés valahogy nem megy,a koórdinátát nem menti le,de szerintem azzal lesz a gond,hogy nem tudja hogy hova mentse le.
Tehát így néz ki:
itt az enum:
enum carInfo
{
vID,
vModel,
Float:vPosX,
Float:vPosY,
Float:vPosZ,
Float:vRot,
vCol1,
vCol2
};
new cInfo[MAX_VEHICLES][carInfo];
CMD:vehicles(playerid, params[])
{
VehicleSaveAll();
printf(\"Jarmuvek elmentve!\");
return 1;
}
Ezzel meghívom a \'VehicleSaveAll\' -t
Ez meg hívja a VehicleGet és VehicleSave -t:
stock VehicleSaveAll()
{
new index = 0;
for(new i = 0; i < MAX_VEHICLES ; i++)
{
VehicleGet(index);
VehicleSave(index);
index++;
}
printf(\"Jarmuvek mentve: %d\", index);
return 1;
}
Itt pedig a VehicleSave és VehicleGet:
stock VehicleGet(jarmuID)
{
GetVehiclePos(cInfo[jarmuID][vID],cInfo[jarmuID][vPosX],cInfo[jarmuID][vPosY],cInfo[jarmuID][vPosZ]);
GetVehicleZAngle(cInfo[jarmuID][vID], cInfo[jarmuID][vRot]);
return 1;
}
stock VehicleSave(jarmuID)
{
new query[1024];
format(query,sizeof(query),\"UPDATE sveh SET VehX=\'%f\',VehY=\'%f\',VehZ=\'%f\',VehRot=\'%f\' WHERE ID=\'%d\'\",cInfo[jarmuID][vPosX],cInfo[jarmuID][vPosY],cInfo[jarmuID][vPosZ],cInfo[jarmuID][vRot],cInfo[jarmuID][vID]);
mysql_function_query(dbhandle,query,true,\"\",\"\");
printf(\"Jarmuvek elmentve!\");
SendClientMessageToAll(COLOR_WHITE,\"(( Jármûvek elmentve! ))\");
return 1;
}
VehicleGet lekéri a koórdinátát és a forgást (Rotationt),VehicleSave egy jármûvet ment csak le,a VehicleSaveAll -nál pedig for ciklussal lementem az összes jármûvet.
Mi lehet itt a gond ? Elõre is köszi annak aki segít.
EDIT: Azt elfelejtettem hozzá tenni,hogy az elsõ autót amit lerakok egy parancsal,annak a koórdinátáját már elmenti,viszont a többit nem,mintha nem jó ID -re mentené le a többi kocsikat.
-
ide nem kell még egy változó az indexeléshez:
for(new i = 0; i < MAX_VEHICLES ; i++)
{
VehicleGet(i);
VehicleSave(i);
}
ja látom, miért volt külön index...de úgy is MAX_VEHICLES-1-ig fut a ciklus...az ciklus változót (i) is létrehozhatod kívül és akkor így néz ki:
new i = 0;
for(; i < MAX_VEHICLES ; i++)
A VehicleSave alatt ez a 2 sor miatt 2000-szer (MAX_VEHICLE) fogja írni az üzeneteket:
printf(\"Jarmuvek elmentve!\");
SendClientMessageToAll(COLOR_WHITE,\"(( Jármûvek elmentve! ))\");
írasd ki ennek az értékét:
cInfo[jarmuID][vID]
és nézd meg, hogy nem e ugyanaz mindenhol...
amúgy amikor lefuttatod ezt a parancsot milyen üzenetek jönnek a chatben?
-
ide nem kell még egy változó az indexeléshez:
for(new i = 0; i < MAX_VEHICLES ; i++)
{
VehicleGet(i);
VehicleSave(i);
}
ja látom, miért volt külön index...de úgy is MAX_VEHICLES-1-ig fut a ciklus...az ciklus változót (i) is létrehozhatod kívül és akkor így néz ki:
new i = 0;
for(; i < MAX_VEHICLES ; i++)
A VehicleSave alatt ez a 2 sor miatt 2000-szer (MAX_VEHICLE) fogja írni az üzeneteket:
printf(\"Jarmuvek elmentve!\");
SendClientMessageToAll(COLOR_WHITE,\"(( Jármûvek elmentve! ))\");
írasd ki ennek az értékét:
cInfo[jarmuID][vID]
és nézd meg, hogy nem e ugyanaz mindenhol...
amúgy amikor lefuttatod ezt a parancsot milyen üzenetek jönnek a chatben?
Köszi a segítséget,még nem teljesen megy,most úgy van, hogy van 3 jármû,3 különbözõ helyen,ha /vehicles -t írok akkor mind a 3 jármûnek ugyanazt a pozíciót menti le,ami az egyik kocsié.
Betölteni betölt rendesen.
Most kicsit átírtam,tehát most így néz ki:
Mód eleje:
new jarmuID;
enum carInfo
{
vID,
vModel,
Float:vPosX,
Float:vPosY,
Float:vPosZ,
Float:vRot,
vCol1,
vCol2
};
new cInfo[MAX_VEHICLES][carInfo];
CMD:vehicles(playerid, params[])
{
VehicleSaveAll();
printf(\"Jarmuvek elmentve!\");
return 1;
}
stock VehicleSaveAll()
{
//for(new i = 0; i < MAX_VEHICLES ; i++) // Loop through the maximum amount of vehicles allowed by sa-mp.
for(; cInfo[jarmuID][vID]< sizeof(cInfo);cInfo[jarmuID][vID]++)
{
VehicleGet();
VehicleSave();
}
printf(\"Jarmuvek mentve: %d\", cInfo[jarmuID][vID]); // Print out how many vehicles has been saved.
return 1;
}
stock VehicleGet()
{
GetVehiclePos(jarmuID,cInfo[jarmuID][vPosX],cInfo[jarmuID][vPosY],cInfo[jarmuID][vPosZ]);
// Get the current position of that vehicle and assign it to our system\'s vehicle information.
GetVehicleZAngle(jarmuID, cInfo[jarmuID][vRot]);
// Get the current rotation of that vehicle and assign it to our system\'s vehicle information.
return 1;
}
stock VehicleSave()
{
new query[1024];
format(query,sizeof(query),\"UPDATE sveh SET VehX=\'%f\',VehY=\'%f\',VehZ=\'%f\',VehRot=\'%f\' WHERE ID=\'%d\'\",cInfo[jarmuID][vPosX],cInfo[jarmuID][vPosY],cInfo[jarmuID][vPosZ],cInfo[jarmuID][vRot],cInfo[jarmuID][vID]);
mysql_function_query(dbhandle,query,true,\"\",\"\");
return 1;
}
Szerver logban pedig ezt írja,indításkor mikor betölt: \"Jarmuvek betoltve: 3\"
Mivel 3 jármû van, /vehicles parancsot ha beírom pedig 1 sort ír csak ennyit \"Jarmuvek elmentve: 2000\"
Mi lehet a gond ?
-
jarmuID globális változó lett? sehol nem látom, hogy változtatnád az értékét...és nem értem miért globális változó
-
jarmuID globális változó lett? sehol nem látom, hogy változtatnád az értékét...és nem értem miért globális változó
Igen,globális,bár most már nem nagyon értem hogy akkor hogy csináljam.
És hogyha így csinálnám ?
/vehicles parancsal meghívom a \"SaveVehicleAll\" -t,és akkor elég lenne csak egy stock ?
CMD:vehicles(playerid, params[])
{
VehicleSaveAll();
return 1;
}
stock VehicleSaveAll()
{
new query[1024];
//for(new i = 0; i < MAX_VEHICLES ; i++) // Loop through the maximum amount of vehicles allowed by sa-mp.
for(new i=0; i < jarmuID+1; i++)
{
GetVehiclePos(jarmuID,cInfo[vPosX],cInfo[vPosY],cInfo[vPosZ]);
GetVehicleZAngle(jarmuID, cInfo[vRot]);
format(query,sizeof(query),\"UPDATE sveh SET VehX=\'%f\',VehY=\'%f\',VehZ=\'%f\',VehRot=\'%f\' WHERE ID=\'%d\'\",cInfo[vPosX],cInfo[vPosY],cInfo[vPosZ],cInfo[vRot],jarmuID);
mysql_function_query(dbhandle,query,true,\"\",\"\");
//VehicleGet();
//VehicleSave(jarmuID);
}
printf(\"Jarmuvek mentve: %d\", jarmuID); // Print out how many vehicles has been saved.
return 1;
}
Tehát így?
-
ez biztos nem lenne jó...1 jármû ID-ra frissíti az összeset...
próbáld ki ezt:
CMD:vehicles(playerid, params[])
{
new str[22];
format(str,sizeof(str),\"Jármûvek mentve: %d\",VehicleSaveAll());
return 1;
}
stock VehicleSaveAll()
{
// Leghosszabb query: UPDATE sveh SET VehX=\'-1234.12\',VehY=\'-1234.12\',VehZ=\'-1234.12\',VehRot=\'-1234.12\' WHERE ID=\'1234\'
new query[98],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]);
// mentés
format(query,sizeof(query),\"UPDATE sveh SET VehX=\'%.2f\',VehY=\'%.2f\',VehZ=\'%.2f\',VehRot=\'%.2f\' WHERE ID=\'%d\'\",cInfo[vPosX],cInfo[vPosY],cInfo[vPosZ],cInfo[vRot],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
}
ja és ha szeretnéd használni ezt a funkciót GM módosítás nélkül akkor ajánlom, hogy public-al hozd létre...így megtudod hívni scriptekbõl is...mentés funkciót azért jó ha letudod futtatni scriptbõl esetleges hiba esetén...de ezt te döntöd el :)
-
[gmod]Megkérném a kedves témanyitót hogy ne hanyagolja el a témáját ha már megnyitotta![/gmod]
-
ez biztos nem lenne jó...1 jármû ID-ra frissíti az összeset...
próbáld ki ezt:
CMD:vehicles(playerid, params[])
{
new str[22];
format(str,sizeof(str),\"Jármûvek mentve: %d\",VehicleSaveAll());
return 1;
}
stock VehicleSaveAll()
{
// Leghosszabb query: UPDATE sveh SET VehX=\'-1234.12\',VehY=\'-1234.12\',VehZ=\'-1234.12\',VehRot=\'-1234.12\' WHERE ID=\'1234\'
new query[98],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]);
// mentés
format(query,sizeof(query),\"UPDATE sveh SET VehX=\'%.2f\',VehY=\'%.2f\',VehZ=\'%.2f\',VehRot=\'%.2f\' WHERE ID=\'%d\'\",cInfo[vPosX],cInfo[vPosY],cInfo[vPosZ],cInfo[vRot],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
}
ja és ha szeretnéd használni ezt a funkciót GM módosítás nélkül akkor ajánlom, hogy public-al hozd létre...így megtudod hívni scriptekbõl is...mentés funkciót azért jó ha letudod futtatni scriptbõl esetleges hiba esetén...de ezt te döntöd el :)
Köszi szépen,sikerült megoldani! :)