GTA Közösség - A magyar GTA fórum

San Andreas Multiplayer (SA-MP) => SA-MP: Szerverfejlesztés => Segítségkérés => A témát indította: kiakovi - 2013. november 03. - 19:36:06

Cím: Egyedi jármû rendszer hiba
Írta: kiakovi - 2013. november 03. - 19:36:06
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û.
Cím: Egyedi jármû rendszer hiba
Írta: Kovacs_Richard - 2013. november 04. - 08:11:36
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.
Cím: Egyedi jármû rendszer hiba
Írta: kiakovi - 2013. november 04. - 18:17:59
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) :)
Cím: Egyedi jármû rendszer hiba
Írta: AdamHawer - 2013. november 04. - 18:35:14
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.
Cím: Egyedi jármû rendszer hiba
Írta: Zsolesszka - 2013. november 04. - 18:45:34

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
Cím: Egyedi jármû rendszer hiba
Írta: Kovacs_Richard - 2013. november 04. - 19:05:58
http://wiki.sa-mp.com/wiki/GetVehicleVelocity
erre gondoltál már?
Cím: Egyedi jármû rendszer hiba
Írta: AdamHawer - 2013. november 04. - 19:08:33

 

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
 
[/quote]
Igen, azt tudom, de a nézet szöget jelenti.
Cím: Egyedi jármû rendszer hiba
Írta: kiakovi - 2013. november 05. - 20:43:57
Köszönöm a segítséget, a jármûrendszer teljesen mûködik, a benzint meg fogom oldani. :)