2. Gangzone erstellen funktioniert nicht. (MySQL)

In 10 Minuten startet der nächtliche Backupvorgang! Es kann währenddessen (ca. 10 Minuten) zu Einschränkungen bei der Nutzung des Forums kommen
Weitere Infos findet ihr im Thema Backup des Forums
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
  • Ich habe meinen Code getestet, der tut einwandfrei.
    Du kannst allerdings
    strins(str, "|", strlen(str));
    entfernen, das ist unnötig in diesem Fall, da MySQL schon den letzten | hinmacht.


    Falls der Code von IPrototypeI auch nicht funktioniert (wovon ich ausgehe), dann poste mal dein SektorInfo enum.

  • 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.

  • Die Namen werden doch gespeichert. Du printest den Namen ja aus der Variable aus. Die Frage ist wo du sie einsetzen willst.


    Steck die for schleife von OnPlayerConnect mal in OnPlayerSpawn rein.


    Ansonsten sehe ich in dem was du gepostet hast keinen Fehler.

    Ich helfe gerne, aber nur wenn die andere Person wenigstens versucht es zu schaffen.
    Solange sie nicht so dreist sind und mich beim Zocken zuspammen.

  • 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:

  • Hast du dein enum hierzu geändert?
    enum sektor_daten {
    sCID,
    sName[16],
    Float:sX1,
    Float:sY1,
    Float:sX2,
    Float:sY2,
    sArt
    };
    new SektorInfo[10][sektor_daten];


    Wenn ja, zeig nochmal den gesamten Code samt enum wie er jetzt ist, damit ich es nachtesten kann.


  • enum sektor_daten {
    sCID,
    sName[16],
    Float:sX1,
    Float:sY1,
    Float:sX2,
    Float:sY2,
    sArt
    };
    new SektorInfo[10][sektor_daten];
    new Sektor[10];
    enum s_system {
    PlayerOnServer,
    SektorOnline, // Das hier
    OldHour,
    Text:MoneyBack, Text:BoxBack,
    Text:Uhrzeit,
    Text:Handel,
    HandelMin,
    HandelSec
    };
    new System[s_system];

    enum p_spielerdaten {
    pName[MAX_PLAYER_NAME],
    pPass[16],
    pAdmin,
    pGeld,
    pSAD,
    pEXP,
    pEhre,
    pLevel,
    pClan,
    pMission,
    pTrank,
    pUID,
    pEtape,
    pFindPflanze,
    pHandel,
    pIsSektor, // das hier
    pShowSektor, // das hier
    bool:pUseTrank,
    Text:MoneyPlayer,
    Text:Needs,
    Text:Speedo,
    Text:SpeedoBack,
    Text3D:pText,
    Text:Erfolg
    };
    new SpielerInfo[MAX_PLAYERS][p_spielerdaten];


    OnGameModeInit()
    CreateSektor();


    OnPlayerConnect(playerid)
    switch(SpielerInfo[playerid][pShowSektor]) {
    case 0: {
    for(new i = 0; i <System[SektorOnline]; i++) {
    GangZoneShowForPlayer(playerid,Sektor[i], 0xFFFF0096); SpielerInfo[playerid][pShowSektor] = 1;
    }
    }
    }

    Ein Timer bei mir alle Sekunde

    for(new playerid = 0; playerid <System[PlayerOnServer]; playerid++)
    {
    if(!GetPVarInt(playerid,"Eingeloggt")) continue;
    if(!IsPlayerInArea(playerid, SektorInfo[SpielerInfo[playerid][pIsSektor]][sX1],SektorInfo[SpielerInfo[playerid][pIsSektor]][sY1],SektorInfo[SpielerInfo[playerid][pIsSektor]][sX2],SektorInfo[SpielerInfo[playerid][pIsSektor]][sY2]))
    {
    GenerateNeeds(playerid);
    }
    if(SektorInfo[SpielerInfo[playerid][pIsSektor]][sArt] == 1)
    {
    if(SpielerInfo[playerid][pIsSektor] == -1) continue;
    if(GetPlayerWeapon(playerid) >= 1)
    {
    ResetPlayerWeapons(playerid);
    SendClientMessage(playerid, COLOR_WHITE, "Das ist eine Waffenfreie Zone.");
    }
    }
    }


    CreateSektor() und CheckSektorName(playerid)

    stock CreateSektor()
    {
    new str[128], 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))
    {
    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: SektorInfo[i][sCID] = strval(tmpstring);
    case 3: format(SektorInfo[i][sName], 16, "%s", strlen(tmpstring));
    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: SektorInfo[i][sArt] = strval(tmpstring);
    }
    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();
    }


    stock CheckSektorName(playerid)
    {
    new str[16];
    SpielerInfo[playerid][pIsSektor] = -1;
    for(new i = 0; i <System[SektorOnline]; i++)
    {
    if(IsPlayerInArea(playerid, SektorInfo[i][sX1],SektorInfo[i][sY1],SektorInfo[i][sX2],SektorInfo[i][sY2]))
    {
    SpielerInfo[playerid][pIsSektor] = i;
    break;
    }
    }
    switch(SpielerInfo[playerid][pIsSektor])
    {
    case -1: { format(str, sizeof(str), "..."); }
    default: { format(str, sizeof(str), "%s", SektorInfo[SpielerInfo[playerid][pIsSektor]][sName]); }
    }
    return str;
    }


    Der auf dem Bild Rechte Textdraw
    stock GenerateNeeds(playerid)
    {
    new string[256];
    format(string, 256, "~r~%s [UID: %d]~n~~n~~r~SAD: ~y~%d~n~~r~Erfahrung: ~w~%d~n~~r~Ehre: ~w~%d~n~~r~Level: ~w~%d~n~~r~Clan: ~w~%s~n~~r~Sektor: ~w~%s",
    SpielerInfo[playerid][pName], SpielerInfo[playerid][pUID], SpielerInfo[playerid][pSAD], SpielerInfo[playerid][pEXP],
    SpielerInfo[playerid][pEhre], SpielerInfo[playerid][pLevel],PlayerClan(SpielerInfo[playerid][pClan]), CheckSektorName(playerid));
    TextDrawSetString(SpielerInfo[playerid][Needs], string);
    return 1;
    }


    So das ist mein ganzes System was ich zu dem Thema habe

  • #include <a_samp>
    #include <streamer>
    #include <a_mysql_r6>
    #include <sscanf2>






    new c_handler;


    #define MAX_SECTOR 10


    enum sektor_daten {
    sCID,
    sName[16],
    Float:sX1,
    Float:sY1,
    Float:sX2,
    Float:sY2,
    sArt,
    sSektorGZ,
    sSektorA,
    };
    new SektorInfo[MAX_SECTOR][sektor_daten];



    enum {
    CREATE_SEKTOR= 1,
    };


    CreateConnection(){
    c_handler = mysql_connect("localhost","root","sektors","");
    mysql_debug(1);
    if(!mysql_ping(c_handler))return printf("Could not connect to the database!");
    return printf("Connect with the database");
    }
    main(){


    }
    public OnQueryFinish(query[], resultid, extraid, connectionHandle)
    {
    switch(resultid)
    {
    case CREATE_SEKTOR:
    {
    mysql_store_result(connectionHandle);
    printf(" %d Sektoren geladen.",mysql_num_rows(connectionHandle));
    new i, result[128];
    while(mysql_fetch_row_format(result,"|",connectionHandle)){
    sscanf(result,"p<|>e<is[16]ffffi-ii->",SektorInfo[i]);
    SektorInfo[i][sSektorGZ]= GangZoneCreate(SektorInfo[i][sX1],SektorInfo[i][sY1],SektorInfo[i][sX2],SektorInfo[i][sY2]);
    SektorInfo[i][sSektorA]= CreateDynamicRectangle(SektorInfo[i][sX1],SektorInfo[i][sY1],SektorInfo[i][sX2],SektorInfo[i][sY2]);
    ++i;
    }
    mysql_free_result(connectionHandle);
    }
    }
    return 1;
    }
    public OnPlayerEnterDynamicArea(playerid, areaid){
    new i,str[30];
    for(; i != MAX_SECTOR; ++i){
    if(areaid != i)continue;
    format(str,30,"Zone %s betreten",SektorInfo[i][sName]);
    SendClientMessage(playerid,-1,str);
    break;
    }
    return 1;


    }
    public OnPlayerLeaveDynamicArea(playerid, areaid){
    new i,str[30];
    for(; i != MAX_SECTOR; ++i){
    if(areaid != i)continue;
    format(str,30,"Zone %s verlassen",SektorInfo[i][sName]);
    SendClientMessage(playerid,-1,str);
    break;
    }
    return 1;
    }


    CreateTable(){
    mysql_query("CREATE TABLE IF NOT EXISTS `sektor`(`ID` INT AUTO_INCREMENT, `Name` VARCHAR(16),`X1` FLOAT, `Y1` FLOAT,`X2` FLOAT,`Y2` FLOAT, `Kind` TINYINT, PRIMARY KEY(`ID`)) AUTO_INCREMENT = 1, ENGINE = MYISAM;");
    return 1;
    }



    public OnGameModeInit()
    {
    CreateConnection();
    CreateTable();
    // mysql_query("INSERT INTO `sektor`(`ID`,`Name`,`X1`,`Y1`,`X2`,`Y2`,`Kind`) VALUES (0,'No-Name',344.7781,-2115.6372,654.8240,-1579.5255,1);",0,0,c_handler);
    // mysql_query("INSERT INTO `sektor`(`ID`,`Name`,`X1`,`Y1`,`X2`,`Y2`,`Kind`) VALUES (0,'DM-Zone',278.3560,-1721.2578,331.6490,-1677.0620,2);",0,0,c_handler);
    // mysql_query("INSERT INTO `sektor`(`ID`,`Name`,`X1`,`Y1`,`X2`,`Y2`,`Kind`) VALUES (0,'Test',309.0497,-1792.3577,335.5938,-1772.6873,0);",0,0,c_handler);
    mysql_query("SELECT * FROM `sektor`;",CREATE_SEKTOR,0,c_handler);
    SetGameModeText("Blank Script");
    AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
    return 1;
    }


    public OnGameModeExit()
    {
    mysql_close(c_handler);
    return 1;
    }


    Hier bitte das ganze funktioniert so wie es soll

  • case 3: format(SektorInfo[i][sName], 16, "%s", strlen(tmpstring));
    zu
    case 3: format(SektorInfo[i][sName], 16, "%s",tmpstring);


    Dann sollte es gehen. strlen gibt dir ja nur die Länge des namens zurück.


    meiner meinung nach gehört sowieso jeder geschlagen der zwei strings mit format zusammenfügen möchte.
    für was gibt es memcpy oder strcat. Nur ist hierzu zu beachten das man die länge angibt da sizeof in dem fall bei den optionalen Parametern eine Funktion nix nutzt.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • meiner meinung nach gehört sowieso jeder geschlagen der zwei strings mit format zusammenfügen möchte.
    für was gibt es memcpy oder strcat. Nur ist hierzu zu beachten das man die länge angibt da sizeof in dem fall bei den optionalen Parametern eine Funktion nix nutzt.


    Für jemanden der nicht 100% optimiert den Code schreibt ist das völlig egal. Letzendlich ist es so übersichtlicher und für Anfänger einfacher zu verstehen. Es wird weder die RAM noch die CPU interessieren, da es bei 1.000.000 Aufrufen nicht einmal 100ms (@3,4GHz) ausmachen, runtergerechnet auf einen Aufruf sind das 0,0001ms = 0,000.000.1s. Ich nenne das mal unwesentlich im normalen Gebrauch, was ca. 99.99% aller SA-MP Server betrifft, auf denen jemals mehr als 10 Spieler online sind. Da halt ich es für schwachsinnig mit Funktionen umzuwerfen, bei denen die meisten hier keine Ahnung haben, was diese machen, bzw. wie sie funktionieren, was als Folge hat, dass nur noch mehr Fehler passieren. Hier gilt es abzuwegen.
    Ich wüsste nicht was Tochnas gelernt hat/hätte, wenn er sich einfach deinen Code kopiert und das wars, den kann er zwar benutzen, aber kann ihn nicht nachvollziehen.


    Wer wirklich einen effizienten Code schreiben will, der sollte auf MySQL verzichten, das ist tausend mal schlimmer als solch kleine Funktionen.
    Ich habe kein Problem über Effizienz zu diskutieren, das sollte aber nicht in diesem Thread geschehen.