Szerző Téma: Online mapeditoros object betöltése  (Megtekintve 664 alkalommal)

Nem elérhető SnooP

  • 1798
  • SnooP
    • Profil megtekintése
Online mapeditoros object betöltése
« Dátum: 2013. Március 31. - 11:47:07 »
0 Show voters
Helló, nagy erõfeszítések árán megpróbáltam megírni egy object betöltést és mentést. A mentés tökéletes, le is menti az adott fájlba az adatokat, ám a beolvasás az nem mûködik. Ha valaki megtudná oldani, azért nagyon hálás lennék.
Az object betöltés-mentés:
 

stock Objectment()
{
new idx = 1, File:file;
new string[1300];
while(idx < S_MAX_OBJECTS)
{
    format(string, sizeof(string), \"%d|%f|%f|%f|%f|%f|%f|%d\\r\\n\",
        Object[idx][oID],
Object[idx][oPos][0],
Object[idx][oPos][1],
Object[idx][oPos][2],
Object[idx][oPos][3],
Object[idx][oPos][4],
Object[idx][oPos][5],
Object[idx][oCreated]
);
    if(idx == 1)
    {
        file = fopen(\"objectek.cfg\", io_write);
    }
    else
    {
       file = fopen(\"objectek.cfg\", io_append);
    }
fwrite(file, string);
fclose(file);
idx++;
}
print(\"Az Online munkához tartozó elmentett objectek sikeresen mentve.\");
}
 
stock Objectbetolt()
{
new oinfo[8][48];
new string[512];
new File:file = fopen(\"objectek.cfg\", io_read);
if(file)
{
    new idx = 1;
while(idx < S_MAX_OBJECTS)
{
    fread(file, string);
    split(string, oinfo, \'|\');
    Object[idx][oID] = strval(oinfo[0]);
    Object[idx][oPos][0] = floatstr(oinfo[1]);
    Object[idx][oPos][1] = floatstr(oinfo[2]);
    Object[idx][oPos][2] = floatstr(oinfo[3]);
    Object[idx][oPos][3] = floatstr(oinfo[4]);
    Object[idx][oPos][4] = floatstr(oinfo[5]);
    Object[idx][oPos][5] = floatstr(oinfo[6]);
    Object[idx][oCreated] = strval(oinfo[7]);
            if(Object[idx][oCreated])
   {
     Object[idx][oCreated] = CreateDynamicObject(Object[idx][oID],Object[idx][oPos][0], Object[idx][oPos][1], Object[idx][oPos][2], Object[idx][oPos][3], Object[idx][oPos][4],Object[idx][oPos][5]);
   }
   idx++;
     }
}
print(\"Az objectek sikeresen betöltve\");
return 1;
}

 
Esetleg, ha könnyebb írnotok vagy mutatnotok egy olyan témát ahol le van írva és nem használ semmilyen fájlmentõt csak SA:MP függvénnyel való mentést nekem az is tökéletes.
Nagyon szépen köszönöm elõre is.  :)

Online mapeditoros object betöltése
« Válasz #1 Dátum: 2013. Március 31. - 13:02:33 »
+1 Show voters
De sokszor láttam én már ezt kiírva, \"sikerült megcsinálnom\" és mindig ugyanaz a hibás kód kerül kiírásra.
Elárulnátok melyik módból szkriptbõl másoljátok ki?

Nem elérhető SnooP

  • 1798
  • SnooP
    • Profil megtekintése
Online mapeditoros object betöltése
« Válasz #2 Dátum: 2013. Március 31. - 15:39:13 »
0 Show voters
Khm,. nem másoltam ezzel töltöttem vagy 3 napot, e példát nézve és témákat átolvasva : http://sampforum.hu/index.php?topic=36190.0 ám én másképp, számomra egyszerûbben oldottam meg, enumosan tárolva a kordinátákat.
Nos, tudsz segíteni vagy sem?

Online mapeditoros object betöltése
« Válasz #3 Dátum: 2013. Március 31. - 16:17:14 »
+1 Show voters
Tudnék segíteni, csak teljesen másképp elgondolva.
Az lenne a kérdés hogy egyáltalán minek kell annyi változó hogy S_MAX_OBJECTS definícióra van szükséged?
Gyakorlatilag lefoglalsz annyi memória területet amennyi objectet használsz de azt nem veszed figyelembe hogy a samp szerver is lefoglal ugyanennyit hiszen létrehozza az objectek-et, amit majd a GetObjectPos és társai native függvényekkel le lehet kérdezni, tehát eleve kétszer kerül tárolásra a memóriában.
Ezek megtalálhatóak a Streamer pluginban is IsValidDynamicObject, GetDynamicObjectPos, GetDynamicObjectRot.
A mentésénél már eleve nem kell olyan for ciklus ami egy változó maximális értékéig megy el, addig fut amíg létezik object, maximum ellenõrizni kell létezik-e az object
http://wiki.sa-mp.com/wiki/IsValidObject.
Betöltésnél meg addig olvasunk amíg van sor, és arra kell figyelni hogy az alap samp native funkció használatakor ne érje el a maximális értéket ami jelenleg 1000.
 
while(fread(File:file, str))

 
Így rögtön megszûnik az a feladat hogy oda kell figyelni a S_MAX_OBJECTS értékének beállításában, mivel eleve nincs rá szükség.
Fájlba való írásnál is felesleges minden sor után bezárni majd újra megnyitni a fájlt.


Tudtam hogy láttam korábban ugyanezt csak azt nem tudtam hogy te nyitottad azt is: http://sampforum.hu/index.php?topic=39600.msg405200#msg405200
Kérj meg egy moderátort hogy törölje.
« Utoljára szerkesztve: 2013. Március 31. - 16:19:49 írta ɐʞzssǝlosz »

Nem elérhető SnooP

  • 1798
  • SnooP
    • Profil megtekintése
Online mapeditoros object betöltése
« Válasz #4 Dátum: 2013. Április 01. - 21:48:33 »
0 Show voters
Nagyon szépen köszönöm, mostmár értem, hogy hol hibáztam és nem is gondoltam, hogy ennyire pazarlóan írok. Ám a ciklusokkal való gyakorlatot le tudnád kérlek írni nekem, mert értem elméletben hol hibáztam és, hogy mit kéne kijavítsak meg is próbáltam ám gyakoraltban nem sikerült pedig próbálkoztam vele de vagy tiszta erroros volt és egyszer sikerült kihoznom hibátlanra, de úgy meg nem mentette és még nem is írt bele ezért visszaállítottam a régit, mert az legalább beírta a fileba ha nagy pazarlások árán is.Nem szeretem, ha mások oldják meg helyettem a feladatom, inkább magam szeretnék rájönni (mert ugye abból tanulok is), de most tényleg nem tudom ezt leírni gyakorlatban.
Ha ebben is tudnál segíteni nagyon hálás lennék.  :)
E: Elõre is köszönöm szépen.
« Utoljára szerkesztve: 2013. Április 01. - 21:53:14 írta SnooP »

Online mapeditoros object betöltése
« Válasz #5 Dátum: 2013. Április 01. - 22:37:12 »
+1 Show voters
Egyetlen egy gond van hogy samp native funkciók közt nincs olyan ami visszaadná egy object modelid számát.
Ezért csak a streamer plugin által kínált lehetõséggel lehet megoldani egyszerûen.
Sajnos a mentés részét nem igazán értem miért szeretnéd hiszen már eleve megvan!! (abból töltöd be az objecteket)
Ha új objecteket készítesz akkor már eleve elegendõ mindig csak az újonnan létrehozott object adatait hozzáírni a meglévõhöz.
Persze itt egy idõ után gondot okoz hogyan kell törölni egy objectet.
Mivel magadtól szeretnéd megírni, talán annyit hogy betöltésnél a következõ kód szépen kiírja konzolba mit olvasott be a fájlból, az utolsó sorig:
 
//OnFilterScriptInit alá:
ReadFile(\"objectek.cfg\");
stock
ReadFile(filename[])
{
new
buff[256],
File:opened = fopen(filename, io_read);
if(opened)
{
while(fread(opened, buff))
{
   print(buff);
}
}
}

Nem elérhető SnooP

  • 1798
  • SnooP
    • Profil megtekintése
Online mapeditoros object betöltése
« Válasz #6 Dátum: 2013. Április 01. - 22:48:49 »
0 Show voters
Idézetet írta: ɐʞzssǝlosz date=1364848632\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"35517\" data-ipsquote-contentclass=\"forums_Topic
Egyetlen egy gond van hogy samp native funkciók közt nincs olyan ami visszaadná egy object modelid számát.
Ezért csak a streamer plugin által kínált lehetõséggel lehet megoldani egyszerûen.
Sajnos a mentés részét nem igazán értem miért szeretnéd hiszen már eleve megvan!! (abból töltöd be az objecteket)
Ha új objecteket készítesz akkor már eleve elegendõ mindig csak az újonnan létrehozott object adatait hozzáírni a meglévõhöz.
Persze itt egy idõ után gondot okoz hogyan kell törölni egy objectet.
Mivel magadtól szeretnéd megírni, talán annyit hogy betöltésnél a következõ kód szépen kiírja konzolba mit olvasott be a fájlból, az utolsó sorig:
 
//OnFilterScriptInit alá:
ReadFile(\"objectek.cfg\");
stock
ReadFile(filename[])
{
new
buff[256],
File:opened = fopen(filename, io_read);
if(opened)
{
while(fread(opened, buff))
{
   print(buff);
}
}
}

 

Á, nagyon hálás vagyok neked, valószínüleg holnap ezt meg is csinálom :) Ezer köszönet és hála.
A témát nyitva hagyom, ha baj lenne, de van egy elképzelésem, hogy hogyan lehet megcsinálni.  :) Nagyon szépen köszönöm mégegyszer.
« Utoljára szerkesztve: 2013. Április 01. - 23:00:21 írta SnooP »

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal