Sziasztok!
Saját modba kitaláltam egy jármû rendszert, viszont nem mûködik minden normálisan benne (pawno elfogadja).
Az autók betöltenek rendesen, viszont a mentésnél keverednek az adatok (benzin, pozíció).
Itt a részlet:
Ongamemodeinit alatt:
for(new vi = 0; vi < 2000; vi++)
{
format(vfile, sizeof(vfile), \"/vehicles/%i.ini\", vi);
if(dini_Exists(vfile))
{
format(vInfo[vi][tulaj], MAX_PLAYER_NAME+1, \"%s\", dini_Get(vfile, \"Tulaj\"));
vInfo[vi][col1] = dini_Int(vfile, \"Col1\");
vInfo[vi][col2] = dini_Int(vfile, \"Col2\");
vInfo[vi][posx] = dini_Float(vfile, \"PosX\");
vInfo[vi][posy] = dini_Float(vfile, \"PosY\");
vInfo[vi][posa] = dini_Float(vfile, \"PosZ\");
vInfo[vi][fuel] = dini_Float(vfile, \"Fuel\");
format(vInfo[vi][rendszam], 20, \"%s\", dini_Get(vfile, \"Rendszám\"));
veh[vi] = AddStaticVehicleEx(dini_Int(vfile, \"Model\"), vInfo[vi][posx], vInfo[vi][posy], vInfo[vi][posz], vInfo[vi][posa], vInfo[vi][col1], vInfo[vi][col2],6*60*60*1000);
SetVehicleHealth(veh[vi], dini_Float(vfile, \"Vhp\"));
SetVehicleNumberPlate(veh[vi], vInfo[vi][rendszam]);
SetVehicleParamsEx(veh[vi], true, false, false, false, false, false, false);
SetTimerEx(\"KocsiTimer\", 1*1000, true, \"i\", vi);
}
}
Ongamemodeexit alatt:
for(new vi = 0; vi < 2000; vi++)
{
format(vfile, sizeof(vfile), \"/vehicles/%i.ini\", vi);
if(dini_Exists(vfile))
{
dini_Set(vfile, \"Tulaj\", vInfo[vi][tulaj]);
dini_IntSet(vfile, \"Col1\", vInfo[vi][col1]);
dini_IntSet(vfile, \"Col2\", vInfo[vi][col2]);
dini_FloatSet(vfile, \"PosX\", vInfo[vi][posx]);
dini_FloatSet(vfile, \"PosY\", vInfo[vi][posy]);
dini_FloatSet(vfile, \"PosZ\", vInfo[vi][posz]);
dini_FloatSet(vfile, \"PosA\", vInfo[vi][posa]);
dini_FloatSet(vfile, \"Fuel\", vInfo[vi][fuel]);
dini_Set(vfile, \"Rendszám\", vInfo[vi][tulaj]);
new Float:vhhp;
vhhp = GetVehicleHealth(veh[vi], vhhp);
dini_FloatSet(vfile, \"Vhp\", vhhp);
}
}
Timer:
public kocsitimer(vehid)
{
new Float:cdis[MAX_VEHICLES];
GetVehicleParamsEx(veh[vehid], engine, lights, alarm, doors, bonnet, boot, objective);
cdis[vehid] = GetVehicleDistanceFromPoint(veh[vehid], vInfo[vehid][posx], vInfo[vehid][posy], vInfo[vehid][posz]);
if(engine == 1)
{
if(cdis[vehid] == 0)
{
vInfo[veh[vehid]][fuel] = vInfo[veh[vehid]][fuel]-0.0001;
}else{
vInfo[veh[vehid]][fuel] = vInfo[veh[vehid]][fuel]-(cdis[vehid]/100);
}
}
GetVehiclePos(veh[vehid], vInfo[vehid][posx], vInfo[vehid][posy], vInfo[vehid][posz]);
GetVehicleZAngle(veh[vehid], vInfo[vehid][posz]);
return 1;
}
Köszi a segítséget elõre is :)
Szerk: útközben beállítottam, hogy csak járó motornál csökkenjen a benzin, így nem fog vontatásnál fogyasztani a jármû.
szia
nem akarok beleszólni, mit hogyan oldasz meg, de szerintem ez a megoldás eléggé terheli a szervert, a sok timer, meg másodpercenkénti adatlekérdezés, de ha neked megfelel akkor használd egészséggel :)
jeleznék néhány észrevételt:
format(vInfo[vi][tulaj], MAX_PLAYER_NAME+1, \"%s\", dini_Get(vfile, \"Tulaj\"));
MAX_PLAYER_NAME+1
SA-MP-ben engedett játékosnév max hossza 20 karakter, MAX_PLAYER_NAME értéke 24, szóval nem kell a +1
6*60*60*1000
én a helyedben inkább beírnám a számot és comment-el oda írnám, hogy 6 óra
PosA tulajdonságot nem töltöd be, csak elmented
SetTimerEx(\"KocsiTimer\", 1*1000, true, \"i\", vi);
lehet lusta vagy számolgatni, de azért ez túlzás :D
1*1000
new Float:cdis[MAX_VEHICLES];
miért kell ekkora tömb amikor így adod meg a timert?
SetTimerEx(\"KocsiTimer\", 1*1000, true, \"i\", vi);
de még akkor sem lenne rá szükséged ha ciklussal mennél végig a jármûveken, mivel egyszerre egy jármûvel foglalkozol
GetVehicleParamsEx(veh[vehid], engine, lights, alarm, doors, bonnet, boot, objective);
itt hol tárolod az adatot?
vInfo[veh[vehid]][fuel] = vInfo[veh[vehid]][fuel]-0.0001;
vInfo[veh[vehid]][fuel] = vInfo[veh[vehid]][fuel]-(cdis[vehid]/100);
helyett:
vInfo[veh[vehid]][fuel] -= 0.0001;
vInfo[veh[vehid]][fuel] -= (cdis[vehid]/100);
Ami az egyik problémát okozza az ez a sor:
GetVehicleZAngle(veh[vehid], vInfo[vehid][posz]);
itt szerintem a posa-ba akartad lekérdezni és nem a posz-be
Nagyjából, ennyi amit így ránézésbõl megtudtam állapítani.
Köszi a segítséget, tanácsokat, autószínek, model id, az pozíciók és a rendszám jól tölt be. Adatmentés paranccsal megy mostantól, nem timerrel.
Viszont van még 2 problémám.
public kocsisave()
{
GetVehiclePos(veh[vehid[vi]], vInfo[vehid[vi]][posx], vInfo[vehid[vi]][posy], vInfo[vehid[vi]][posz]);
GetVehicleZAngle(veh[vehid[vi]], vInfo[vehid[vi]][posa]);
format(vfile, sizeof(vfile), \"/vehicles/%i.ini\", vehid[vi]);
if(dini_Exists(vfile))
{
dini_IntSet(vfile, \"Col1\", vInfo[vehid[vi]][col1]);
dini_IntSet(vfile, \"Col2\", vInfo[vehid[vi]][col2]);
dini_FloatSet(vfile, \"PosX\", vInfo[vehid[vi]][posx]);
dini_FloatSet(vfile, \"PosY\", vInfo[vehid[vi]][posy]);
dini_FloatSet(vfile, \"PosZ\", vInfo[vehid[vi]][posz]);
dini_FloatSet(vfile, \"PosA\", vInfo[vehid[vi]][posa]);
dini_FloatSet(vfile, \"Fuel\", vInfo[vehid[vi]][fuel]);
/*new Float:vhhp[MAX_VEHICLES];
GetVehicleHealth(veh[vehid[vi]], vhhp[vehid[vi]]);
dini_FloatSet(vfile, \"Vhp\", vhhp[vehid[vi]]);
if(vhhp[vehid[vi]] << 250.0)
{
DestroyVehicle(veh[vehid[vi]]);
dini_Remove(vfile);
}*/
}
return 1;
}
[A mentésnél lekérném, hogy a jármû hp-ja kisebb-e 250-nél és ha igaz, törölje a kocsit és a file-t. Sajnos az összes kocsit törli fájlostul, pedig mindnek az élete nagyobb 250-nél biztosan.] << Hülye voltam, javítottam... :D
A másik, hogy hogyan csökkentsem a benzint, ha a vagy megy a motorja vagy áll és a kocsi mozog?
(ha meg nem megy a motorja, ne csökkenjen a benzin) :)
Ezt a sort is nézd át légy szíves:
vInfo[vi][posa] = dini_Float(vfile, \"PosZ\");
a posa nem az arcot jelenti? a PosZ van ott a vfile-nél.
Ezt a sort is nézd át légy szíves:
vInfo[vi][posa] = dini_Float(vfile, \"PosZ\");
a posa nem az arcot jelenti? a PosZ van ott a vfile-nél.
[/quote]
Nem arcot jelent. :D :D :D :D
Angle = szög