Beiträge von KornChief

    Klar.
    Es ist allgemein so:" Wörter statt Zahlen"
    zB:

    enum Mahlzeiten
    {
    Abendessen,
    Mittagessen,
    Frühstück
    };


    Nun kannst du machen:


    new Gewohnheiten[MAX_PLAYERS][Mahlzeiten];


    Ebenso wäre dafür möglich:
    new Gewohnheiten[MAX_PLAYERS][3];


    Vorteil vom Enum:
    - Gewohneit[playerid][Mittagessen] = 1;
    statt: Gewohnheit[playerid][1] = 1;
    denn weißt du nach einiger Zeit noch,was 1,oder 2, oder 0 nochmal war? Es dient, wie gesagt, zur besseren Orientierung.


    Allg. ist es ein Arry.

    Nur der sscanf Code daran ist kompliziert ;>.
    Führerschein kann man mit Grundkenntnissen, zB so:

    // Ganz oben:
    #define rot 0xAA3333AA
    new Fuhrerschein[MAX_PLAYERS];


    // Unter OnPlayerCommandText
    if(strcmp("/schein",cmdtext,false,7) == 0) // Einfache Variante,ausschmücken kannst denk ich selber ;D
    {
    new tmp[130];
    tmp = zcmd(1,cmdtext);
    new id = strval(tmp);
    if(!strlen(tmp)) return SendClientMessage(playerid,rot,"Keine ID angegegeben!");
    if(!IsPlayerConnected(id)) return SendClientMessage(playerid,rot,"Angegebene ID nicht on!");
    Fuhrerschein[id] = 1;
    SendClientMessage(playerid,rot,"Führerschein vergeben!");
    SendClientMessage(id,rot,"Führerschein erhalten!");
    return 1;
    }
    // Unter OnPlayerEnterVehicle
    if(Fuhrerschein[playerid] == 0)
    {
    RemovePlayerFromVehicle(playerid);
    SendClientMessage(playerid,rot,"Du hast keinen Führerschein ;D!");
    }

    // Und nun bei OnPlayerDisconnect
    Fuhrerschein[playerid] == 0


    // Falls du den zcmd Cod nicht hast, hier:
    zcmd(param, cmdtext[])
    {
    new string[128], pos, var;
    format(string, sizeof(string), "%s ", cmdtext);

    while((pos = strfind(string, " ", true)) != -1)
    {
    if(var == param) return string;
    var++;

    strdel(string, 0, pos + 1);
    if(strcmp(string, " ", true, pos) == 0) goto end;
    }

    end:
    string[0] = '\0';
    return string;
    }



    Teste mal

    Du deklarierst  
    new vehcar;
    new vehcar2;
    immer wieder neu bei jedem Befehl.
    Lösche dies und füg oben
    enum Cars
    {
    vehcar,
    vehcar2,
    };
    stock PlayCarInfo[MAX_PLAYERS][Cars]; //ersetz natürlich dann im Command vehcar mit PlayerCarInfo[playerid][vehcar] zB DestroyVehicle(PlayerCar...);


    // ======= oder da es nur wenige sind:
    const Cars = 2;
    stock PlayCarInfo[MAX_PLAYERS][Cars]; // dafür dann PlayCarInfo[playerid][0]; und 1

    Teste das mal :)

    Dein Code würde wenn niemand mit dem Namen on ist und es auch KEINE ID ist 0 returnen, also playerid 0.


    Return -1, dann dürfte alles passen.

    hmm....sicher?
    Return's:
    Wenn kein Name gefunden = (Count = 1) = INVALID_PLAYER_ID;
    Wenn Name gefunden = playerid;
    Wenn kein Name (bzw. eine ID) = strval(string);
    :huh: oder? Trotzdem geändert, thx.

    Update: Nun wird, wenn es 3 Zeichen lang ist, erst als Name hergenommen, dann als ID.
    stock ReturnUser(string[])
    {
    static i;
    new count = 0;
    new len = strlen(string);
    if(len >= 3)
    {
    while(i++<MAX_PLAYERS)
    {
    new name[MAX_PLAYER_NAME];
    GetPlayerName(i,name,sizeof(name));
    if(strcmp(name,string,false) == 0)
    {
    return i;
    }
    else
    {
    if(len == 3)
    {
    count = 2;
    }
    else
    {
    count = 1;
    }
    }
    }
    }
    else
    {
    return strval(string);
    }
    return (count == 1) ? (INVALID_PLAYER_ID) : (strval(string));
    }

    Vielen Dank, hab dennoch ein paar Fragen dazu:




    if(slen < 3) return INVALID_PLAYER_ID;
    Was ist, wenn er Beispielsweise eingibt: "/cmd 4" ? Durch strtok oder zcmd gibt er ja "4" oder auch " 4" als String wieder, der jedoch in diesem Fall kleiner 3 ist - somit INVALID_PLAYER_ID returnt wird, was aber nicht der Fall sein soll. Insgesamt wird ja nur "Falsch(INVALID_PLAYER_ID) - ID(durch Namen) - Falsch(INVALID_PLAYER_ID) " wiedergegeben, aber eine Zahl (bzw. die Eingabe einer ID) wird nicht berücksichtigt.
    Geht es nicht zudem darum, dass das Script nicht mind. 3 Zeichen, sondern 3 Buchstaben finden soll (wodurch wir ausgehen können, dass es ein Name ist und weitere Überprüfung der Zeichen nicht nötig ist) und dann diesen mit den Namen vergleichen soll und schließlich dessen ID wiedergeben soll?
    Bitte klärt mir auf :)

    Hallo,
    da ich den "ReturnUser" Code nicht gefunden habe, habe ich selbst mal versucht es scripten und nun möchte ich wissen, ob er auf funktionieren würde.
    Es soll bewirken, dass der eingegebene String (bei strtok/zcmd üblich "tmp" genannt") überprüft wird, ob....
    ... er nur eine Zahl ist (diese wird dann zurückgegeben)
    ... ein Name (wenn der Name einem User zugeordnet werden kann,wird dessen ID zurückgegeben, wenn nicht, wird zurückgegeben, dass diese falsch ist).

    stock ReturnUser(string[])
    {
    static i;
    new ID;
    new s = 0;
    new Val = 0;
    for(;s < strlen(string); s++)
    {
    if(string[s] >= 'A' && string[s] <= 'Z' || string[s] >= 'a' && string[s] <= 'z' || string[s] == '[' || string[s] == ']' || string[s] == '_')
    {
    Namen++;
    }
    if(Namen == 3)
    {
    Val = 1;
    break;
    }
    }
    if(Val == 1)
    {
    i = 0;
    while(i++< MAX_PLAYERS)
    {
    new name[MAX_PLAyER_NAME];
    GetPlayerName(i,name,sizeof(name));
    if(strcmp(string,name,false) == 0)
    {
    Val = 2
    ID = i;
    break;
    }
    else
    {
    Val = 3;
    }
    }
    }
    return (Val == 2) ? (ID) : (Val == 3) ? (INVALID_PLAYER_ID) : (Val == 0) ? (strval(strings));
    }


    // Keiner eine Lösung?

    Bin mir nicht sicher was du meinst, du kannst "beides" abfragen, sprich "GetPlayerVehicleID(playerid)" (= returnte ID vom Auto in deinem Script,was von Script zu Script ja unterschiedlich ist) und "GetVehicleModel(playerid)" (= ModelID, wie Infernus = 411).

    Ich glaube, dass dies eine sehr einfache und geschickte Lösung ist, denn wo sonst (ausgenommen meine 2 genannten CallBacks) sollte man überprüfen, ob jemand in ein Auto steigt (bzw. ist) - ein Timer, der das prüft, wäre ungeeignet. u könntest statt "if" nur "?" verwenden, läuft aber auf's selber hinaus

    Ein Ansatz wäre bei ... public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger) oder public OnPlayerStateChange(playerid, newstate, oldstate)

    bei der Abfrage zB

    if(!Fahrstunde[playerid] && !IsPlayerBauer (playerid)) //wenn er NICHT Bauer ist und wenn er NICHT in einer Fahrstunde ist
    {
    RemovePlayerFromVehicle(playerid);
    SendClientMessage(playerid,FARBE,"Du bist kein Bauer!"); //bzw. kein Fahrlehrer, der eine Fahrstunde macht
    }


    Natürlich brauchst du dann auch new bool:Fahrstunde[MAX_PLAYERS];
    Beim CMD eben wie "/fahrstunde ID" das Fahrstunde[ID] = true; setzen. Unterscheidet sich je nach System (dcmd,zcmd,strtok,..).