Datei für jedes Haus optimal?

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Guten Tag.


    Ich bin gerade am Anfang des Haussystemes und möchte fragen, ob es gut ist, wenn für jedes Haus eine Datei erstellt wird?
    Gibt es eine bessere Lösung? wenn ja bitte auch vorführen :thumbup:
    Werde jetzt aber mit den allgemeinen Sachen beginnen.


    Hoffe auf Antwort
    mfg.
    Opa


    EDIT//Überschrift

  • Also mit Datei meine ich, das eine Textdatei erstellt wird. Ich verwende dini.
    Nun gibt es z.B. einen Befehl, mit dem man neue Häuser erstellt.
    Sobald man diesen eingegeben hat wird eine neue Datei für das Haus erstellt.
    Nun ist meine Frage, ob diese Variante gut ist oder ob es eine bessere Lösung gibt.

  • an deiner stelle würde ich nicht für jedes haus eine datei erstellen, wenn du etwas mit fwrite/fread umgehen kannst, kannst du alle daten in eine datei packen, in die dann daten von einem haus pro zeile kommen, das sollte um einiges effektiver sein.
    wenn du schwierigkeiten haben solltest, kannst du dich z.B. hier orientieren, ist ein gutes beispiel für ein dynamisches haussystem, das alle notendigen daten in einer datei speichert.

    Keine Scripting-Fragen per PM!

  • Ok Danke.
    Ich habe mir den Code mal näher angesehen und ich habe schon die erste Frage:
    public OnFilterScriptInit()
    {
    iGameModeInit_X();
    new line[255],File:hausx = fopen(HAUS_DATEI,io_read),
    haus_index;
    if(hausx)
    {
    while(fread(hausx,line))
    {
    if(line[strlen(line)-2] == '\r')line[strlen(line)-2] = '\0';
    if(line[strlen(line)-1] == '\n')line[strlen(line)-1] = '\0';
    strmid(HausDaten[_cache_haus][Besitzer],strtok(line,haus_index,','),0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
    HausDaten[_cache_haus][ax] = floatstr(strtok(line,haus_index,','));
    HausDaten[_cache_haus][ay] = floatstr(strtok(line,haus_index,','));
    HausDaten[_cache_haus][az] = floatstr(strtok(line,haus_index,','));
    HausDaten[_cache_haus][ix] = floatstr(strtok(line,haus_index,','));
    HausDaten[_cache_haus][iy] = floatstr(strtok(line,haus_index,','));
    HausDaten[_cache_haus][iz] = floatstr(strtok(line,haus_index,','));
    HausDaten[_cache_haus][interior] = strval(strtok(line,haus_index,','));
    HausDaten[_cache_haus][virtual_world] = strval(strtok(line,haus_index,','));
    HausDaten[_cache_haus][kosten] = strval(strtok(line,haus_index,','));
    HausDaten[_cache_haus][play_time] = strval(strtok(line,haus_index,','));
    HausDaten[_cache_haus][nicht_zum_kauf] = strval(strtok(line,haus_index,','));
    HausDaten[_cache_haus][verschlossen] = strval(strtok(line,haus_index,','));
    format(line,sizeof line,"Besitzer : %s\nScore : %d\nKosten : %d$",HausDaten[_cache_haus][Besitzer],HausDaten[_cache_haus][play_time],HausDaten[_cache_haus][kosten]);
    HausDaten[_cache_haus][lbl_haus] = Create3DTextLabel(line,(!HausDaten[_cache_haus][nicht_zum_kauf]) ? (0x00FF00FF) : (0xFF0000FF),HausDaten[_cache_haus][ax],HausDaten[_cache_haus][ay],HausDaten[_cache_haus][az],10.0,0,0);
    HausDaten[_cache_haus][pickid] = CreatePickup(1273,1,HausDaten[_cache_haus][ax],HausDaten[_cache_haus][ay],HausDaten[_cache_haus][az],0);
    HausDaten[_cache_haus][icon_id] = iAddStreamIcon(HausDaten[_cache_haus][ax],HausDaten[_cache_haus][ay],HausDaten[_cache_haus][az],(HausDaten[_cache_haus][nicht_zum_kauf]) ? (32) : (31),0);
    haus_index = 0;
    _cache_haus++;

    }
    fclose(hausx);
    }
    return 1;
    }
    Diese Zeilen gehen noch weiter.
    Wie man sehen kann ist "eig." jede zeile gleich.
    Jetzt wollte ich Fragen, ob da automatisch auf den nächsten Wert in der Zeile gegriffen wird.
    Sonst wären ja alle Zeilen mit den Gleichen Wert besetzt.
    Nun wollte ich auch noch sagen, ob das auch mit dini funktioniert.


    Danke erstmal.
    mfg.
    Opa

  • optisch sind die zeilen zwar gleich, aber dennoch besteht ein unterschied, nämlich ändert sich der wert von "haus_index", und zwar wird bei jedem aufruf von "strtok", die anzahl der zeichen bis zum nächsten komma addiert, das komma ist hier also ein trennzeichen, so kannst du dir aus jeder zeile die nötigen informationen holen, und diese werden halt durch kommas voneiander getrennt.


    /E: mit dini würde das in dieser form nicht funktionieren, das ist ungeeignet, weil es nicht mehrere informationen in einer zeile speichert.

    Keine Scripting-Fragen per PM!

    Einmal editiert, zuletzt von Crank93 ()

  • die stelle findest du, wenn du dir die funktion "strtok" mal genauer anschaust.



    strtok(const string[], &index, trenner = ' ')
    {
    new length = strlen(string);
    while ((index < length) && (string[index] <= trenner))
    {
    index++;
    }


    new offset = index;
    new result[20];
    while ((index < length) && (string[index] > trenner) && ((index - offset) < (sizeof(result) - 1)))
    {
    result[index - offset] = string[index];
    index++;
    }
    result[index - offset] = EOS;
    return result;
    }


    strtok dursucht einen string nach einem bestimmten teichen (trenner). dabei startet es im string an der position mit dem wert "index". (in deinem fall "haus_index"). für jedes zeichen das ungleich dem trenner ist, wird "index" um 1 erhöht. (das geschieht im ersten while-loop). wenn das trennzeichen gefunden wurde, wird dieser "teilstring" sozusagen aus dem urprünglichen string isoliert und du hast als ergebnis den string zwischen zwei trennzeichen (kommas). wenn nun strtok ein weiteres mal mit "index" als parameter aufgerufen wird, hat ja "index" einen höheren wert als vorher, d.h. strtok beginnt an einer anderen position im string nach dem trennzeichen zu suchen und dann geht es wieder von vorne los.

    Keine Scripting-Fragen per PM!