problem mit LoadHouse

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
  • Moin,


    habe mich mal an ein Haus System gehockt und hänge derzeit beim LoadHouse()


    hier der Code


    public LoadHouse()
    {
    for(new i = 0; i < MAX_HOUSE; i++)
    {
    /*new string2[64];
    new File: UserFile = fopen(string2, io_read);
    if ( UserFile )
    new key[ 256 ] , val[ 256 ];
    new Data[ 256 ];
    while ( fread( UserFile , Data , sizeof( Data ) ) )
    {*/
    key = ini_GetKey( Data );
    if( strcmp( key , "Float:x" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][Float:x] = strval( val ); }
    if( strcmp( key , "Float:y" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][Float:y] = strval( val ); }
    if( strcmp( key , "Float:z" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][Float:z] = strval( val ); }
    if( strcmp( key , "Preis" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][Preis] = strval( val ); }
    if( strcmp( key , "Interior", true ) == 0 ) { val = ini_GetValue( Data ); house[i][Interior] = strval ( val ); }
    if( strcmp( key , "Besitzer", true ) == 0 ) { val = ini_GetValue( Data ); house[i][Besitzer] = strval ( val ); }
    CreatePickup(1242,23,house[i][Float:x,house[i][Float:y],house[i][Float:z]);
    }//end while
    fclose(UserFile);//close the file after everything has been read in the while
    }
    }


    Die Fehler :


    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12624) : error 017: undefined symbol "key"
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12624) : error 017: undefined symbol "Data"
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12625) : error 017: undefined symbol "key"
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12625) : error 017: undefined symbol "val"
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12625) : error 017: undefined symbol "Data"
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12625) : fatal error 107: too many error messages on one line


    Mit der LoadHouse() funktion möchte ich, das die .haus datein Geladen werden und dann Pickups erstellt werden ;)


    komm aber gerade nicht weiter :O


    MfG: Apoolecu

  • :D Du hast doch auch die definierten Variablen "key", "val" und "Data" auskommentiert, sprich " /* " bis " */ " verwendet. Das kommentiert einen Teil im Script aus, sodass dieser nicht berücksichtigt bzw. ausgeführt wird, als ob er gelöscht wäre. Entferne " /* " und " */ ".


    Also so, und string2 brauchst du nicht, kannst nämlich sofort den Dateinamen angeben. Dazu müssen die Koordinaten als floatstr entnommen werden und nicht als strval.


    Machs einfach so:



    #define MAX_HOUSES XX //Bei XX die Zahl deiner Häuser insgesamt


    enum houseinfo
    {
    Float:hX,
    Float:hY,
    Float:hZ,
    Preis,
    Interior,
    Besitzer[MAX_PLAYER_NAME], //Für einen Namen benötigst du eine Array mit vorher bestimmenen Größe, hier MAX_PLAYER_NAME
    };
    new house[MAX_HOUSES][houseinfo];


    public LoadHouse()
    {
    for(new i = 0; i < MAX_HOUSES; i++)
    {
    new key[ 256 ] , val[ 256 ];
    new Data[ 256 ];
    new File: hFile = fopen("DATEINAME", io_read); // <--- Den Namen der Datei in " " eintragen
    if ( hFile )
    {
    while ( fread( hFile , Data , sizeof( Data ) ) )
    {
    key = ini_GetKey( Data );
    if( strcmp( key , "x" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][hX] = floatstr( val ); } //Um koordinaten, also Floats, auszulesen, muss man floatstr(val) verwenden
    if( strcmp( key , "y" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][hY] = floatstr( val ); }
    if( strcmp( key , "z" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][hZ] = floatstr( val ); }
    if( strcmp( key , "Preis" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][Preis] = strval( val ); }
    if( strcmp( key , "Interior", true ) == 0 ) { val = ini_GetValue( Data ); house[i][Interior] = strval ( val ); }
    if( strcmp( key , "Besitzer", true ) == 0 ) { val = ini_GetValue( Data ); strmid(house[i][Besitzer], val, 0, strlen(val)-1, 255); } //Arrays mit z.b Buchstabenwerten werden so ausgelesen
    CreatePickup(1242,23,house[i][hX],house[i][hY],house[i][hZ]);
    }
    fclose(hFile);
    }
    }

  • Moin,



    dann bekomme ich aber die Fehler herraus:


    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12620) : error 003: declaration of a local variable must appear in a compound block
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12620) : error 017: undefined symbol "key"
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12620) : warning 215: expression has no effect
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12620) : error 001: expected token: ";", but found "]"
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12620) : fatal error 107: too many error messages on one line

  • Moin,


    @ Alex:


    Dein Code gibt nun n paar Fehler mehr aus ;) :


    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12620) : warning 213: tag mismatch
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12626) : error 017: undefined symbol "x"
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12626) : warning 213: tag mismatch
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12627) : error 017: undefined symbol "y"
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12627) : warning 213: tag mismatch
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12628) : error 017: undefined symbol "z"
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12628) : warning 213: tag mismatch
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12632) : error 017: undefined symbol "x"
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12638) : error 029: invalid expression, assumed zero
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12638) : error 004: function "SaveHouse" is not implemented
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12648) : error 017: undefined symbol "x"
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12648) : error 001: expected token: ",", but found ";"
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12649) : error 017: undefined symbol "y"
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12650) : error 017: undefined symbol "z"
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(12651) : error 017: undefined symbol "z"



    Code:
    public LoadHouse()
    {
    for(new i = 0; i < MAX_HOUSE; i++)
    {
    new key[ 256 ] , val[ 256 ];
    new Data[ 256 ];
    new File: hFile = fopen("haeuser/%s.haus", i); // <--- Den Namen der Datei in " " eintragen
    if ( hFile )
    {
    while ( fread( hFile , Data , sizeof( Data ) ) )
    {
    key = ini_GetKey( Data );
    if( strcmp( key , "Float:x" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][Float:x] = floatstr( val ); } //Um koordinaten, also Floats, auszulesen, muss man floatstr(val) verwenden
    if( strcmp( key , "Float:y" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][Float:y] = floatstr( val ); }
    if( strcmp( key , "Float:z" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][Float:z] = floatstr( val ); }
    if( strcmp( key , "Preis" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][Preis] = strval( val ); }
    if( strcmp( key , "Interior", true ) == 0 ) { val = ini_GetValue( Data ); house[i][Interior] = strval ( val ); }
    if( strcmp( key , "Besitzer", true ) == 0 ) { val = ini_GetValue( Data ); strmid(house[i][Besitzer], val, 0, strlen(val)-1, 255); } //Arrays mit z.b Buchstabenwerten werden so ausgelesen
    CreatePickup(1242,23,house[i][Float:x],house[i][Float:y],house[i][Float:z]);
    }
    fclose(hFile);
    }
    }

  • Änder einfach das:


    new File: hFile = fopen("haeuser/%s.haus", i); // <--- Den Namen der Datei in " " eintragen


    In das:


    new File: hFile = fopen("haeuser.cfg", io_read); // <--- Den Namen der Datei in " " eintragen


    Und übernimm das:


    #define MAX_HOUSES XX //Bei XX die Zahl deiner Häuser insgesamt


    enum houseinfo
    {
    Float:hX,
    Float:hY,
    Float:hZ,
    Preis,
    Interior,
    Besitzer[MAX_PLAYER_NAME],
    };
    new house[MAX_HOUSES][houseinfo];


    Und passe deine SaveHouse Funktion an diese LoadHouse an:


    public LoadHouse()
    {
    for(new i = 0; i < MAX_HOUSES; i++)
    {
    new key[ 256 ] , val[ 256 ];
    new Data[ 256 ];
    new File: hFile = fopen("haeuser.cfg", io_read); // <--- Den Namen der Datei in " " eintragen
    if ( hFile )
    {
    while ( fread( hFile , Data , sizeof( Data ) ) )
    {
    key = ini_GetKey( Data );
    if( strcmp( key , "x" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][hX] = floatstr( val ); } //Um koordinaten, also Floats, auszulesen, muss man floatstr(val) verwenden
    if( strcmp( key , "y" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][hY] = floatstr( val ); }
    if( strcmp( key , "z" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][hZ] = floatstr( val ); }
    if( strcmp( key , "Preis" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][Preis] = strval( val ); }
    if( strcmp( key , "Interior", true ) == 0 ) { val = ini_GetValue( Data ); house[i][Interior] = strval ( val ); }
    if( strcmp( key , "Besitzer", true ) == 0 ) { val = ini_GetValue( Data ); strmid(house[i][Besitzer], val, 0, strlen(val)-1, 255); } //Arrays mit z.b Buchstabenwerten werden so ausgelesen
    CreatePickup(1242,23,house[i][hX],house[i][hY],house[i][hZ]);
    }
    fclose(hFile);
    }
    }


    Passe deine Daten an meine Funktion oben an -> hX, hY, hZ, anstatt x, y, z

  • if(!strcmp(strget(cmdtext,0),"/createhouse"))
    {
    if(IsPlayerConnected(playerid))
    {
    new preish = strval(strget(cmdtext,1));
    new interiorh = strval(strget(cmdtext,2));
    if(!strlen(strget(cmdtext,1))) { SendClientMessage(playerid,COLOR_RED,"Benutzung: /Createhouse [Preis] [Interior]"); return 1; }
    if(!strlen(strget(cmdtext,2))) { SendClientMessage(playerid,COLOR_RED,"Benutzung: /Createhouse [Preis] [Interior]"); return 1; }
    if(preish > 10000000 || preish < 0) { SendClientMessage(playerid,COLOR_RED,"Der Preis darf nicht höher als 10.000.000 SAS oder weniger als 0 SAS sein!"); return 1; }
    new Float:xh, Float:yh, Float:zh, string[256];
    GetPlayerPos(playerid, xh, yh, zh);
    CreatePickup(1272,23,xh,yh,zh);
    SendClientMessage(playerid, COLOR_GREEN,"Du hast ein Haus erstellt.");
    format(string, 255,"Kordinaten: X(%d), Y(%d), Z(%d).",xh,yh,zh);
    SendClientMessage(playerid, COLOR_GREEN,string);
    house[][Preis] = preish;
    house[MAX_HOUSE][Interior] = interiorh;
    house[MAX_HOUSE][Besitzer] = NOOWNER;
    house[MAX_HOUSE][Float:housex] = xh;
    house[MAX_HOUSE][Float:housey] = yh;
    house[MAX_HOUSE][Float:housez] = zh; <---- was muss da statt MAX_HOUSES rein??
    SaveHouse();
    }

  • Zitat

    <---- was muss da statt MAX_HOUSES rein??

    Die ID die das Haus haben soll. ;)
    Du fasst die Häuser in einem Array (eine Art Zähler) zusammen.
    0 = das erste Haus (ACHTUNG: Es fängt mit 0 an!)
    1 = das zweite Haus
    2 = das dritte Haus
    usw.


    Wenn du Beispielsweise schon ein Haus gemacht hast, muss da "1" stehen.


    In deinem Fall, da du es per Befehl machst, muss du im CMD mit angeben, welche id das Haus haben soll und es dann an der Stelle "MAX_HOUSE" eintragen lassen.
    Würde dann so aussehen:


    if(!strcmp(strget(cmdtext,0),"/createhouse"))
    {
    if(IsPlayerConnected(playerid))
    {
    new preish = strval(strget(cmdtext,1));
    new interiorh = strval(strget(cmdtext,2));
    new HausID = strval(strget(cmdtext,3));
    if(!strlen(strget(cmdtext,1))) { SendClientMessage(playerid,COLOR_RED,"Benutzung: /Createhouse [Preis] [Interior] [ID]"); return 1; }
    if(!strlen(strget(cmdtext,2))) { SendClientMessage(playerid,COLOR_RED,"Benutzung: /Createhouse [Preis] [Interior] [ID]"); return 1; }
    if(!strlen(strget(cmdtext,3))) { SendClientMessage(playerid,COLOR_RED,"Benutzung: /Createhouse [Preis] [Interior] [ID]"); return 1; }
    if(preish > 10000000 || preish < 0) { SendClientMessage(playerid,COLOR_RED,"Der Preis darf nicht höher als 10.000.000 SAS oder weniger als 0 SAS sein!"); return 1; }
    new Float:xh, Float:yh, Float:zh, string[256];
    GetPlayerPos(playerid, xh, yh, zh);
    CreatePickup(1272,23,xh,yh,zh);
    SendClientMessage(playerid, COLOR_GREEN,"Du hast ein Haus erstellt.");
    format(string, 255,"Kordinaten: X(%d), Y(%d), Z(%d).",xh,yh,zh);
    SendClientMessage(playerid, COLOR_GREEN,string);
    house[HausID][Preis] = preish;
    house[HausID][Interior] = interiorh;
    house[HausID][Besitzer] = NOOWNER;
    house[HausID][Float:housex] = xh;
    house[HausID][Float:housey] = yh;
    house[HausID][Float:housez] = zh;
    SaveHouse();
    }
    Aber aufgepasst! Du musst dann oben bei new house[x][blablabla] beim x +1 machen (da du ja ein Haus hinzufügst. ;))

  • Ich habs dir schon gemacht. ;)


    Gib einfach in Zukunft ein wenn du ein Haus machst:
    /createhouse [Preis] [Interior] [0]
    Wenn du dann noch eins machst:
    /createhouse [Preis] [Interior] [1]
    Noch eins:
    /createhouse [Preis] [Interior] [2]
    Und immer so weiter.


    Aber wie gesagt, denk dran im Script den Array um 1 zu erhöhen, wenn du ein Haus erstellst. :)

  • ich möchte aber nicht das man die ID an geben muss weil wenn jemand die id 2 mal eingibt, dann sind ja 2 Datein da, wo dann ein Fehler enstehen lassen ich möchte nur das man den Preis und das Interior angeben muss xDD und das die ID selber bestimmt wird

  • Achso, okay, dann machs mal so:

    if(!strcmp(strget(cmdtext,0),"/createhouse"))
    {
    if(IsPlayerConnected(playerid))
    {
    new preish = strval(strget(cmdtext,1));
    new interiorh = strval(strget(cmdtext,2));
    if(!strlen(strget(cmdtext,1))) { SendClientMessage(playerid,COLOR_RED,"Benutzung: /Createhouse [Preis] [Interior]"); return 1; }
    if(!strlen(strget(cmdtext,2))) { SendClientMessage(playerid,COLOR_RED,"Benutzung: /Createhouse [Preis] [Interior]"); return 1; }
    if(preish > 10000000 || preish < 0) { SendClientMessage(playerid,COLOR_RED,"Der Preis darf nicht höher als 10.000.000 SAS oder weniger als 0 SAS sein!"); return 1; }
    new Float:xh, Float:yh, Float:zh, string[256];
    GetPlayerPos(playerid, xh, yh, zh);
    CreatePickup(1272,23,xh,yh,zh);
    SendClientMessage(playerid, COLOR_GREEN,"Du hast ein Haus erstellt.");
    format(string, 255,"Kordinaten: X(%d), Y(%d), Z(%d).",xh,yh,zh);
    SendClientMessage(playerid, COLOR_GREEN,string);
    house[MAX_HOUSE+1][Preis] = preish;
    house[MAX_HOUSE+1][Interior] = interiorh;
    house[MAX_HOUSE+1][Besitzer] = NOOWNER;
    house[MAX_HOUSE+1][Float:housex] = xh;
    house[MAX_HOUSE+1][Float:housey] = yh;
    house[MAX_HOUSE+1][Float:housez] = zh;
    SaveHouse();
    }

  • @ Ilex in deinem Code kommen folgende Fehler dann raus:


    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(9415) : error 032: array index out of bounds (variable "house")
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(9416) : error 032: array index out of bounds (variable "house")
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(9417) : error 032: array index out of bounds (variable "house")
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(9418) : error 032: array index out of bounds (variable "house")
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(9419) : error 032: array index out of bounds (variable "house")
    C:\Users\Christian\Desktop\SA-MPRc7\gamemodes\rl.pwn(9420) : error 032: array index out of bounds (variable "house")


    Neo einfach im CMD xyz++ reinhauen? oder wie sehe ich das?


    OK jetzt ist irgendwo ein Bug entweder im CMD oder SaveHouse()


    CMD:
    if(!strcmp(strget(cmdtext,0),"/createhouse"))
    {
    if(IsPlayerConnected(playerid))
    {
    new preish = strval(strget(cmdtext,1));
    new interiorh = strval(strget(cmdtext,2));
    if(!strlen(strget(cmdtext,1))) { SendClientMessage(playerid,COLOR_RED,"Benutzung: /Createhouse [Preis] [Interior]"); return 1; }
    if(!strlen(strget(cmdtext,2))) { SendClientMessage(playerid,COLOR_RED,"Benutzung: /Createhouse [Preis] [Interior]"); return 1; }
    if(preish > 10000000 || preish < 0) { SendClientMessage(playerid,COLOR_RED,"Der Preis darf nicht höher als 10.000.000 SAS oder weniger als 0 SAS sein!"); return 1; }
    new Float:xh, Float:yh, Float:zh, string[256];
    GetPlayerPos(playerid, xh, yh, zh);
    CreatePickup(1272,23,xh,yh,zh);
    SendClientMessage(playerid, COLOR_GREEN,"Du hast ein Haus erstellt.");
    format(string, 255,"Kordinaten: X(%d), Y(%d), Z(%d).",xh,yh,zh);
    SendClientMessage(playerid, COLOR_GREEN,string);
    hausid ++;
    house[hausid][Preis] = preish;
    house[hausid][Interior] = interiorh;
    house[hausid][Besitzer] = 1;
    house[hausid][Float:housex] = xh;
    house[hausid][Float:housey] = yh;
    house[hausid][Float:housez] = zh;
    SaveHouse();
    }return 1; }


    SaveHouse()
    public SaveHouse()
    {
    for(new i = 0; i < MAX_HOUSE; i++)
    {
    new string3[32];
    format(string3, sizeof(string3), "/haeuser/%d.haus", i);
    new File: hFile = fopen(string3, io_write);
    if (hFile)
    {
    new var[32];
    format(var, 32, "Float:x=%d\n",house[i][Float:housex]);fwrite(hFile, var);
    format(var, 32, "Float:y=%d\n",house[i][Float:housey]);fwrite(hFile, var);
    format(var, 32, "Float:z=%d\n",house[i][Float:housez]);fwrite(hFile, var);
    format(var, 32, "Preis=%d\n",house[i][Preis]);fwrite(hFile, var);
    format(var, 32, "Interior=%d\n",house[i][Interior]);fwrite(hFile, var);
    format(var, 32, "Besitzer=%s\n",house[i][Besitzer]);fwrite(hFile, var);
    fclose(hFile);
    }
    }
    return 1;
    }


    denn es werden auf einmal 499 .haus datein erstellt ohne die Cords sprich bei bei Preis usw. steht einfach 0 -.-