Beiträge von [LP]Tochnas

    So wie schon gesagt SektorInfo[][sName] beinhaltet keinen String...


    Befehl zum testen:
    ocmd:test(playerid,params[])
    {
    #pragma unused params
    new str[32];
    format(str, sizeof str, "Sektor[%d] %s", Sektor[0], SektorInfo[0][sName]);
    SendClientMessage(playerid, COLOR_WHITE, str);
    format(str, sizeof str, "Sektor[%d] %s", Sektor[1], SektorInfo[1][sName]);
    SendClientMessage(playerid, COLOR_WHITE, str);
    format(str, sizeof str, "Sektor[%d] %s", Sektor[2], SektorInfo[2][sName]);
    SendClientMessage(playerid, COLOR_WHITE, str);
    return 1;
    }


    Ergebnis:

    So da das von IPrototypeI nicht funktioniert..

    Code
    [15:33:53] 3 Sektoren gelesen.
    [15:33:53] Sektor No-Name[0] geladen.
    0|0|No-Name|344.7781|-2115.6372|654.8240|-1579.5255|1
    [15:33:53] Sektor 
    [15:33:53] Sektor


    Der erste wird vollkommen geladen und die weiteren nicht.


    Bei Jeffry seinem Code sieht es wie folgt aus.

    Code
    [15:31:58] 3 Sektoren gelesen.
    [15:31:58] Sektor [0] geladen.
    [15:31:58] 0|0|No-Name|344.7781|-2115.6372|654.8240|-1579.5255|1
    [15:31:58] Sektor [1] geladen.
    [15:31:58] 1|0|DM-Zone|278.3560|-1721.2578|331.6490|-1677.0620|2
    [15:31:58] Sektor [2] geladen.
    [15:31:58] 3|0|Test|309.0497|-1792.3577|335.5938|-1772.6873|0


    Die Sektoren erscheinen alle aber die Namen werden aus was für Gründen nicht gespeichert.


    So nun Poste ich nun das Ganze System was ich erstellt habe, den ich bin nur noch Ratlos und werde Krank bin schon 7-8std nur an dem System um es zu entbuggen,
    mir fehlt langsam die Geduld.



    Erstellen der Variable:
    enum sektor_daten {
    sCID,
    sName[16],
    Float:sX1,
    Float:sY1,
    Float:sX2,
    Float:sY2,
    sArt
    };
    new SektorInfo[][sektor_daten];
    new Sektor[999];
    OnGameModeInit()
    CreateSektor();
    OnPlayerConnect(playerid)
    for(new i = 0; i <System[SektorOnline]; i++)
    {
    GangZoneShowForPlayer(playerid,Sektor[i], 0xFFFF0096);
    }


    So das ist das notwendigst, rest vom System sind nur Namensermitlung, das aber schon dank Jeffry funktioniert.

    Beavis
    die while-Schleife hat bereits die anzahl der Zonen
    hatte es auch dann festgestellt wo es mir erklärt wurde.


    Akuba
    Weiß zwar nicht warum aber hier


    OnPlayerConnect(playerid)
    for(new i = 0; i <System[SektorOnline]; i++)
    {
    GangZoneShowForPlayer(playerid,Sektor[i], 0xFFFF0096);
    }


    Das funktioniert...


    printf("Sektor >>%s<<[%d] geladen.", SektorInfo[i][sName],System[SektorOnline]);
    Das %s sollte ja den Namen der Zone haben, was aber nicht der Fall ist.
    d.h. die Variable SektorInfo[i][sName] ist leer und das ist momentan mein Problem.

    Habe einen Neuen Code von Jeffry erklärt bekommen
    und ihn eingefügt, dennoch gibt es Probleme mit der String ausgabe für die Variable SektorInfo[][sName]


    Code:
    stock CreateSektor()
    {
    new str[1024], Query[128], i = 0;
    format(Query, sizeof(Query), "SELECT * FROM `sektor`");
    mysql_query(Query);
    mysql_store_result();
    printf("%d Sektoren gelesen.", mysql_num_rows());
    while(mysql_fetch_row(str))
    {
    strins(str, "|", strlen(str));
    new oldx=0;
    new count=0;
    for(new x=0; x<strlen(str); x++)
    {
    if(str[x]=='|')
    {
    count++;#
    new tmpstring[sizeof(str)]; tmpstring=str;
    strdel(tmpstring, x, strlen(tmpstring));
    strdel(tmpstring, 0, oldx+1);
    switch(count)
    {
    case 2: {/* Clan-ID */}
    case 3: format(SektorInfo[i][sName], 16, "%s", strlen(tmpstring)); // Info: mit strlen() oder ohne kommt das selbe Ergebnis
    case 4: SektorInfo[i][sX1] = floatstr(tmpstring); //f
    case 5: SektorInfo[i][sY1] = floatstr(tmpstring); //f
    case 6: SektorInfo[i][sX2] = floatstr(tmpstring); //f
    case 7: SektorInfo[i][sY2] = floatstr(tmpstring); //f
    case 8: {/* Art der Zone*/}
    }
    oldx=x;
    }
    }
    Sektor[i] = GangZoneCreate(SektorInfo[i][sX1],SektorInfo[i][sY1],SektorInfo[i][sX2],SektorInfo[i][sY2]);
    printf("Sektor %s[%d] geladen.", SektorInfo[i][sName],System[SektorOnline]);
    printf("%s", str);
    i++;
    System[SektorOnline] = i;
    }
    mysql_free_result();
    }


    server_log:

    Code
    [21:24:31] 3 Sektoren gelesen.
    [21:24:31] Sektor [0] geladen.
    [21:24:31] 0|0|No-Name|344.7781|-2115.6372|654.8240|-1579.5255|1|
    [21:24:31] Sektor [1] geladen.
    [21:24:31] 1|0|DM-Zone|278.3560|-1721.2578|331.6490|-1677.0620|2|
    [21:24:31] Sektor [2] geladen.
    [21:24:31] 3|0|Test|309.0497|-1792.3577|335.5938|-1772.6873|0|


    InGame werden auch die SektorenNamen nicht angezeigt...

    Du musst mit GetVehicleModel(vehicleid); arbeiten


    http://wiki.sa-mp.com/wiki/GetVehicleModel


    Beispiel:

    if(GetVehicleModel(vehicleid) >= 400 && GetVehicleModel(vehicleid) <= 500)
    {
    TS = 1;
    }
    else if(GetVehicleModel(vehicleid) >= 501 && GetVehicleModel(vehicleid) <= 611)
    {
    TS = 2;
    }

    Erläuterung:
    >= : ist höher oder gleich
    <= : ist kleiner oder gleich
    && : Das folgende muss auch übereinstimmen


    /Edit: Erläuterung eingefügt.


    meines errachtens ist alles korrekt.

    ob i mysql_fetch_row() oder mysql_fetch_row_format() nehme bekomme ich meine Daten von sscanf habe den Fehler behoben,
    dennoch wie bei der Zweiten Zone in die Variable SektorInfo[i][sName] keinen String hinzugefügt. Habe viele Probleme gelöst,
    aber dieses ist Neuland für mich...


    samp_log:

    Code
    [19:25:25] [T_MySQL] Verbindung erfolgreich !
    [19:25:25] 2 Sektoren gelesen.
    [19:25:25] Sektor No-Name[0] geladen.
    [19:25:25] 0|0|No-Name|344.7781|-2115.6372|654.8240|-1579.5255|1
    [19:25:25] Sektor 
    [19:25:25] 1|0|DM-Zone|331.6490|-1677.0620|278.3560|-1721.2578|2


    wie man sieht beim zweiten Sektor wird die Message ab dem String abgebrochen... Hab ich noch nie gesehen.

    stock CreateSektor()
    {
    new str[1024], Query[128], i = 0;
    format(Query, sizeof(Query), "SELECT `ID` FROM `sektor`");
    mysql_query(Query);
    mysql_store_result();
    printf("%d Sektoren gelesen.", System[SektorOnline]);
    while(mysql_fetch_row(str))
    {
    sscanf(str, "e<p<|>{i}is[16]ffffd>",SektorInfo[i]);
    Sektor[i] = GangZoneCreate(SektorInfo[i][sX1],SektorInfo[i][sY1],SektorInfo[i][sX2],SektorInfo[i][sY2]);
    printf("Sektor %s[%d] geladen.\n%s", SektorInfo[i][sName],System[SektorOnline],str);
    i++;
    System[SektorOnline] = i;
    }
    mysql_free_result();
    }


    Code
    [15:24:48] [T_MySQL] Verbindung erfolgreich !
    [15:24:48] 0 Sektoren gelesen.
    [15:24:48] Sektor [0] geladen.
    1
    [15:24:48] Sektor [1] geladen.
    2


    Das ist mein Code was sscanf zurück gibt...

    Jetzt erklaere ich euch wie man mit

    switch(VARIABLE)

    und

    case 0:

    arbeitet.


    Warum soll ich die Funktion benutzen ?
    Aus Erfahrung und Recherchen her habe ich festgestellt das die Funktion schneller und uebersichtlicher ist.


    Bei einer if-Abfrage wuerde es wie folgt aussehen:

    if(wert == 1) // Variable wird das 1x ausgelesen
    {
    print("Die Variable beträgt 1");
    }
    else if(wert == 2) // Variable wird das 2x ausgelesen
    {
    print("Die Variable beträgt 2");
    }
    else if(wert == 3) // Variable wird das 3x ausgelesen
    {
    print("Die Variable beträgt 3");
    }
    else
    {
    print("Die Variable beträgt etwas anderes als 1, 2, 3");
    }

    Zur Erläuterung:
    Die If-Abfrage frägt die Variable "wert" ab welcher Integer sie beinhaltet,
    sollte dies nicht der Fall sein geht sie zur nächsten If-Abfrage (else if) und frägt erneut die Variable "wert".
    Und wenn man z.B. 20 verschieden Zahlen hat, kann es sein, das er die Variable "wert" 20x abfrägt.
    Und das ist ein richtiger umweg fürs Script. Es geht aber auch einfacher und Übersichtlicher.


    Mit der switch & case Funktion

    switch(wert)
    {
    case 1:
    {
    print("Die Variable beträgt 1");
    }
    case 2:
    {
    print("Die Variable beträgt 2");
    }
    case 3:
    {
    print("Die Variable beträgt 3");
    }
    default:
    {
    print("Die Variable beträgt etwas anderes als 1, 2, 3");
    }
    }

    Zur Erläuterung:
    switch speichert sozusagen das Ergebnis was sie aus der Variable "wert" abgefragt hat, so muss man die Variable nur 1x abfragen
    und nicht 3x wie im oberen beispiel.


    Jetzt haben wir den Integer was die Variable "wert" beinhaltet. Natürlich wollen wir jetzt das was passiert wenn wir die Zahl dazu haben.

    switch(wert)
    {
    case 1:
    {
    print("Die Variable beträgt 1");
    }
    case 3:
    {
    print("Die Variable beträgt 3");
    }
    case 2, 4, 5:
    {
    print("Die Variable beträgt 2, 4 oder 5");
    }
    case 6 .. 12:
    {
    print("Die Variable beträgt die Zahl zwischen 6 und 12. Mit Inbehaltet (6, 7, 8, 9, 10, 11 oder 12");
    }
    case 14 .. 16, 20 .. 25:
    {
    print("Die Variable beträgt die Zahl zwischen 14 - 16 und 20 - 25. Mit Inbehaltet (14, 15, 16, 20, 21, 22 ,23, 24 oder 25");
    }
    default: // Dies erscheint, wenn die Variable keine Zahl vom oberen Teil hat.
    {
    print("Die Variable beträgt nicht die Zahl 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 20, 21, 22 ,23, 24 oder 25");
    }
    }

    Zur Erläuterung:
    Da wir bei switch die Variable "wert" gespeichert hat, können wir problemlos und Ressourcenschonend zu unserem Kasten springen und unsere Funktionen aufrufen.


    Hoffe habe es gut genug fuer Anfaenger erklaert.


    - Fehler bitte melden :D
    - Schreibfehler kannste behalten :P

    Der erste Query ist ja nur dazu da, um auszulesen wieviele Zonen ich habe.
    Das funktioniert auch so weit.


    Der fehler müsste in dem Bereich liegen
    for(new i = 0; i <mysql_num_rows(); i++)
    {
    format(Query, sizeof(Query), "SELECT * FROM `sektor` WHERE `ID` = '%d' LIMIT 1",System[SektorOnline]+1);
    mysql_query(Query);//Läd alles aus der Zeile des Spielers (in dem fall ich) aus der Tabelle 'Accounts'
    mysql_store_result();
    while(mysql_fetch_row(str))
    {
    sscanf(str, "e<p<|>{i}is[16]ffffd>",SektorInfo[i]);
    Sektor[i] = GangZoneCreate(SektorInfo[i][sX1],SektorInfo[i][sY1],SektorInfo[i][sX2],SektorInfo[i][sY2]);
    System[SektorOnline] += 1;
    printf("Sektor %s[%d] geladen.\n%s", SektorInfo[i][sName],System[SektorOnline],str);
    }
    }

    Mein Problem ist es, das ich 2 Gangzonen in der Datenbank habe,
    er liest zwar beide aus erstellt aber nur die eine.


    stock CreateSektor()
    {
    new str[1024], Query[128];
    format(Query, sizeof(Query), "SELECT `ID` FROM `sektor`");
    mysql_query(Query);
    mysql_store_result();
    printf("%d Sektoren gelesen.", mysql_num_rows());
    for(new i = 0; i <mysql_num_rows(); i++)
    {
    format(Query, sizeof(Query), "SELECT * FROM `sektor` WHERE `ID` = '%d' LIMIT 1",System[SektorOnline]+1);
    mysql_query(Query);//Läd alles aus der Zeile des Spielers (in dem fall ich) aus der Tabelle 'Accounts'
    mysql_store_result();
    while(mysql_fetch_row(str))
    {
    sscanf(str, "e<p<|>{i}is[16]ffffd>",SektorInfo[i]);
    Sektor[i] = GangZoneCreate(SektorInfo[i][sX1],SektorInfo[i][sY1],SektorInfo[i][sX2],SektorInfo[i][sY2]);
    System[SektorOnline] += 1;
    printf("Sektor %s[%d] geladen.\n%s", SektorInfo[i][sName],System[SektorOnline],str);
    }
    }
    mysql_free_result();
    }


    Code
    [11:09:51] 2 Sektoren gelesen.
    [11:09:51] Sektor No-Name[1] geladen.
    1|0|No-Name|344.7781|-2115.6372|654.8240|-1579.5255|1

    enum s_system {
    PlayerOnServer,
    SektorOnline, // hier
    OldHour,
    Text:MoneyBack, Text:BoxBack,
    Text:Uhrzeit,
    Text:Handel,
    HandelMin,
    HandelSec
    };
    new System[s_system];


    Wie du siehst beim erstellen der Zone steigt die Variable um eins.
    Und ebenfalls in der Log steht hinter dem Sektorname die ID was die Variable ist.


    IsPlayerInArea ist im ersten Post beinhaltet.

    Danke Jeffry du hast mir den Bug behoben, das ich die Gangzone auf der ganzen Karte an gewissen stellen gesehen habe, aber der Name kommt immernoch nicht.


    Edit:


    Hier werden die Zonen geladen und erstellt.
    stock CreateSektor()
    {
    new MaxSektor, str[1024], Query[128];
    format(Query, sizeof(Query), "SELECT * FROM `sektor`");
    mysql_query(Query);
    mysql_store_result();
    MaxSektor = mysql_num_rows();
    for(new i = 0; i <MaxSektor; i++)
    {
    while(mysql_fetch_row(str))
    {
    sscanf(str, "e<p<|>{i}is[16]ffff>",SektorInfo[i]);
    Sektor[i] = GangZoneCreate(SektorInfo[i][sX1],SektorInfo[i][sY1],SektorInfo[i][sX2],SektorInfo[i][sY2]);
    System[SektorOnline] += 1;
    printf("Sektor %s[%d] geladen.\n%s", SektorInfo[i][sName],System[SektorOnline],str);
    }
    }
    mysql_free_result();
    }

    Also bin im Sektor und der zeigt mir "None" an.... also funktioniert eventuell "IsPlayerInArea" nicht....
    Doch der Sektor-Name wird im Array gespeichert, überprüfe ja alles per logs, und der Sektorname stimmt.


    Code
    [18:36:46] Sektor No-Name[1] geladen.
    1|0|No-Name|344.7781|-1579.5255|654.8240|-2115.6372