Skinauswahl ist ein bissle Buggy :P

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
  • Hey,
    ich habe mir eine Skinauswahl gemacht!
    jedoch werden die daten aus dem array nicht richtig gelesen :P
    Hier ist der Array:

    new skins[][] = {
    {280,281,282,284,283,288}
    };
    und hier der aufruf

    if(GetPlayerFraktion(pid) == 1){SetPlayerSkin(pid,skins[0][0]);}
    //edit okey es liegt nicht dran sondern daran:
    //OnPlayerText
    if(Skinauswahl[playerid] == 1)
    {
    new idx;
    new tmp[256];
    tmp = strtok(text, idx);
    if ((strcmp("weiter", tmp, true, strlen(tmp)) == 0) && (strlen(tmp) == strlen("weiter")))
    {
    if(GetPlayerFraktion(playerid) == 1)
    {
    if(CheckLeader(playerid))
    {
    if(GetPlayerSkin(playerid) == skins[0][4]){SetPlayerSkin(playerid,skins[0][5]);}
    if(GetPlayerSkin(playerid) == skins[0][5]){SetPlayerSkin(playerid,skins[0][4]);}
    return 0;
    }
    else if(CheckMember(playerid))
    {
    if(GetPlayerSkin(playerid) == skins[0][0]){SetPlayerSkin(playerid,skins[0][1]);}
    if(GetPlayerSkin(playerid) == skins[0][1]){SetPlayerSkin(playerid,skins[0][2]);}
    if(GetPlayerSkin(playerid) == skins[0][2]){SetPlayerSkin(playerid,skins[0][3]);}
    if(GetPlayerSkin(playerid) == skins[0][3]){SetPlayerSkin(playerid,skins[0][0]);}
    return 0;
    }
    }
    }
    else if ((strcmp("fertig", tmp, true, strlen(tmp)) == 0) && (strlen(tmp) == strlen("fertig")))
    {
    SetPlayerInt(playerid,"Skin",GetPlayerSkin(playerid));
    OnPlayerSpawn(playerid);
    SetCameraBehindPlayer(playerid);
    return 0;
    }
    }
    Also, er erkennt die Wörter stezt aber nicht das was darin ist um, und macht dannach noch den normalen realen chat O.o
    mfg

    Einmal editiert, zuletzt von FoL-Community ()

  • Was macht ihr denn da :( ?
    EvilToastBrot,
    Ne,so würde er immernoch folgendes machen müssen:
    skins[INDEX][0]


    So ist es doch am einfachsten:
    new
    skins[] = {
    280,
    281,
    282,
    284,
    283,
    288
    };


    Dann machst du
    skins[ INDEX ]
    anstatt
    skins[0][ INDEX ]
    // bzw
    skins[ INDEX ][0]


    Würde dann so aussehen:
    //OnPlayerText
    if(Skinauswahl[playerid] == 1)
    {
    new idx;
    new tmp[256];
    tmp = strtok(text, idx);
    if ((strcmp("weiter", tmp, true, strlen(tmp)) == 0) && (strlen(tmp) == strlen("weiter")))
    {
    if(GetPlayerFraktion(playerid) == 1)
    {
    if(CheckLeader(playerid))
    {
    if(GetPlayerSkin(playerid) == skins[4]){SetPlayerSkin(playerid,skins[5]);}
    if(GetPlayerSkin(playerid) == skins[5]){SetPlayerSkin(playerid,skins[4]);}
    return 0;
    }
    else if(CheckMember(playerid))
    {
    if(GetPlayerSkin(playerid) == skins[0]){SetPlayerSkin(playerid,skins[1]);}
    if(GetPlayerSkin(playerid) == skins[1]){SetPlayerSkin(playerid,skins[2]);}
    if(GetPlayerSkin(playerid) == skins[2]){SetPlayerSkin(playerid,skins[3]);}
    if(GetPlayerSkin(playerid) == skins[3]){SetPlayerSkin(playerid,skins[0]);}
    return 0;
    }
    }
    }
    else if ((strcmp("fertig", tmp, true, strlen(tmp)) == 0) && (strlen(tmp) == strlen("fertig")))
    {
    SetPlayerInt(playerid,"Skin",GetPlayerSkin(playerid));
    OnPlayerSpawn(playerid);
    SetCameraBehindPlayer(playerid);
    return 0;
    }
    }
    // Replace-Funktion von PAWNO benutzt

  • das liegt nicht mehr an dem array sondern an dem "weiter" bzw "fertig"
    wenn ich weiter tippe spawne ich legendlich neu und habe keinen anderen skin und es gibt immer der normale chat!
    dann kommt bei "fertig" auch immer der normale chat und ich werde dann einfach gespawnt( was ja auch richtig ist)

  • Ist ja auch normal.
    Du müsstest dann per http://wiki.sa-mp.com/wiki/SetSpawnInfo den Skin des Spielers ändern. Dazu müsstest du aber auch wieder alle Daten wie Spawn-Pos usw wissen.Nicht die beste Lösung.


    Eine Andere Möglichkeit wäre,so mach Ich es zB, eine Variable zu haben und daran festlegen,ob der Skin geändert werden muss.



    #define INVALID_PLAYERSKIN -1
    new
    iPlayerSkin[MAX_PLAYERS];


    //OnPlayerConnect


    iPlayerSkin[playerid] = INVALID_PLAYERSKIN;


    // bei "fertig" mit SkinChange
    iPlayerSkin[playerid] = GetPlayerSkin(playerid);


    //OnPlayerSpawn


    if( iPlayerSkin[playerid] != INVALID_PLAYERSKIN) {
    SetPlayerSkin(playerid,iPlayerSkin[playerid]);
    }


  • das geht ja auch soweit :P
    nur bei weiter bzw fertig kapiert der das net das ich das getippt habe

  • new idx;
    new tmp[256];
    tmp = strtok(text, idx);


    Haste ausm GF oder?


    Wiso eigentlich tmp = strtok(cmdtext, idx);
    Kann man da nicht einfach if(!strcmp(text, "weiter", true)) machen? Weil 'text' ist ja dann 'weiter'.

  • new idx;
    new tmp[256];
    tmp = strtok(text, idx);


    Haste ausm GF oder?


    Wiso eigentlich tmp = strtok(cmdtext, idx);
    Kann man da nicht einfach if(!strcmp(text, "weiter", true)) machen? Weil 'text' ist ja dann 'weiter'.


    hatte ich erst aber funktioniert auch nicht :P


    //edit: Push

    Einmal editiert, zuletzt von FoL-Community ()

  • Zeig mal den Abschnitt direkt unter OnPlayerText der mit "Weiter" bzw "fertig" zusammen hängt.


    public OnPlayerText(playerid, text[])
    {
    if( !strcmp(text,"weiter") ) {
    }
    return 1;
    }
    So wie EvilToastBrot schon sagte,würde es so auch klappen.


    Bist du dir denn sicher,dass die if Abfrage mit if(Skinauswahl[playerid] == 1) nicht scheitert ? Füg einfach mal Debug-Notes ein über der if Abfrage:

    printf("Skinauswahl[%d] = %d",playerid,Skinauswahl[playerid]);
    if(Skinauswahl[playerid] == 1){
    printf("text = '%s'",text);
    }


  • okey du hast recht! Es liegt an der CheckLeader Funktion!



    stock CheckLeader(id)
    {
    new Query[128];
    format(Query, sizeof(Query), "SELECT * FROM leader WHERE SpielerID = '%d'", id);
    mysql_query(Query);
    mysql_store_result();
    return mysql_num_rows();
    }
    Der Mysqleintrag ist jedoch vorhanden!
    //edit
    genauso wie bei CheckMember!



    stock CheckMember(id)
    {
    new Query[128];
    format(Query, sizeof(Query), "SELECT * FROM members WHERE SpielerID = '%d'", id);
    mysql_query(Query);
    mysql_store_result();
    return mysql_num_rows();
    }



    //edit jedoch funktionieren beiede Funktionen bei der Abfrage von Befehlen!

    2 Mal editiert, zuletzt von FoL-Community ()

  • Wieso machst du das denn überhaupt mit MYSQL ? Auch gut wäre zu wissen,welches MYSQL Plugin du benutzt. Du solltest nämlich auch mal mysql_free_result() benutzen, sonst kommt es irgendwann zu Fehlern ( Falls Ich es noch richtig in Erinnerung habe )
    Ich erkenn ehrlich gesagt nicht den Sinn hinter den Funktionen. Wieso willst du denn Anhand der ID überprüfen,ob ein Spieler Leader ist oder Member,wobei du bei Member nirgendwo sagst Member von was. Seh Ich jedenfalls nicht. Macht sowas nicht mehr Sinn,anhand des Spielernamens ? ( ID ist natürlich auch möglich, sofern es pro Spieler eine einzigartige ID gibt. So wie USERID's hier im Forum ).


    Zeig mal wie du CheckLeader bzw CheckMember aufrufst.