Beiträge von Kaliber

    Und wie kann ich diese durchzählen ?


    Naja, einfach so:


    new ids[MAX_PLAYERS],counter;
    for(new i,l=GetPlayerPoolSize()+1; i<l; i++)
    {
    if(IsPlayerInRangeOfPoint(playerid,5.0,x,y,z)) //Hier halt deine Position angeben
    {
    ids[counter++] = i;
    }
    }
    //Naja und counter hat jetzt die Anzahl der Personen die da sind und in ids sind die Playerids aufgelistet:
    //Wenn du die nun alle an eine Position setzen willst, machst du das z.B. so:
    for(new i; i<counter; i++)
    {
    SetPlayerPos(ids[i],x,y,z); //Hier setzt du dann alle Spieler die da standen an eine gewisse Position
    }


    mfg. :thumbup:

    Kann mir jemand ein beispiel für eine Abfrage schicken ob sich drei leute an einen gewissen ort befinden wenn Sie einen Befehl eingebeN ?


    Naja...da gibt es mehrere Möglichkeiten das zu realisieren.


    Entweder du lässt sie einen Command eingeben, dann setzt du einen boolean für die playerid auf true und freezt sie.


    Dann kannst du ja ganz einfach dadurch loopen und schauen wer alles an dem Ort ist und noch connected ist.


    Oder du machst einfach eine Schleife durch alle Spieler und schaust ob diese Spieler an diesem Punkt sind.


    /sit und möchte ihn in einem Timer benutzen


    Schau dir am besten nochmal den Wiki eintrag dazu an, besonders den "time" Parameter: ApplyAnimation


    Für sit selbst gibt es mehrere Animationen, ich geb dir einfach mal 2:


    "BEACH", "ParkSit_M_loop"
    //oder
    "PED","SEAT_IDLE"


    mfg. :thumbup:

    Nutze dafür folgende Funktion:


    stock GetIDByName(const name[])
    {
    new n[MAX_PLAYER_NAME];
    for(new i,l=GetPlayerPoolSize()+1; i<l; i++) if(GetPlayerName(i,n,MAX_PLAYER_NAME) && !strcmp(n,name)) return i;
    return -1;
    }


    //Dann in deinem Dialog:
    new id = GetIDByName(inputtext);
    if(id == -1) return SendClientMessage(playerid,-1,"Dieser Admin ist nicht mehr online!");


    mfg. :thumbup:

    Kaliber


    Also ich kenne das Problem mit dem sscanf Plugin nicht ^^, deshalb bin ich davon ziemlich überrascht.


    Ich auch nicht...aber in solchen Fällen verwende ich es auch nie :D


    Deshalb...war das nur vermutet...was da passieren kann ^^


    Das überschreiben wäre nicht wirklich denkbar und zwar wird der Speixher dynamisch bei localen variablen frei gegeben jedoch nur die große , welche auch beansprucht wird,


    Beim Stack (Lokalen Variablen) kann man das NULL Byte überschreiben...es folgt zwar ein Runtime Error, dennoch geht es:


    #include <a_samp>


    main() {
    new test[2];
    func(test);
    print(test); //->Gibt Hallo aus
    }


    func(...) {
    setarg(0,0,'H');
    setarg(0,1,'a');
    setarg(0,2,'l');
    setarg(0,3,'l');
    setarg(0,4,'o');
    }


    Bei globalen Variablen wird es begrenzt, sprich da kommt nur Ha raus...ohne Error :)


    mfg. :thumbup:

    Mal kurz nebenbei, es ist total redundant hier sscanf zu nutzen, schreibe es einfach so:


    if(strlen(params) > 64)return SendClientMessageEx(playerid, COLOR_WHITE, "%d Zeichen.", strlen(params));
    //Und text = params...


    Doch du kannst keine 128 Zeichen in einen string packen der auf 64 Zeichen limitiert ist


    Nun, ich weiß nicht genau wie das verarbeitet ist...aber es kann doch gut sein, dass das NULL Byte überschrieben wird...somit kann der String dadurch natürlich größer werden...


    Naja, wie dem auch, es ist in der Doku beschrieben, dass man sscanf nicht nutzen soll für diesen Fall, also mach es einfach nur so ;)

    Andere Lösung?


    Nun, da gibt es mehrere, das kommt auf die Deklaration an.


    Angenommen du machst es so:


    static const array[][] = {
    "String1",
    "String2",
    "String3"
    };


    printf("Anzahl der Strings: %d",sizeof array); //->Gibt 3 aus


    Das was du aber willst, ist viel mehr eine Liste an Elementen.


    new string[30][128];
    string[0] = "String1";
    string[1] = "String2";
    string[3] = "String4";


    So jetzt können wir nicht mehr mit sizeof oder strlen arbeiten.
    Zusätzliches Problem ist, dass Lücken entstehen können wie z.B. in diesem Fall cell 2 leer ist.
    Lösung ist eine Funktion:


    stock CountStrings(const str[][],len=sizeof str)
    {
    new counter;
    for(new i; i<len; i++)
    {
    switch(str[i][0])
    {
    case '\0','\1': continue;
    default: counter++;
    }
    }
    return counter;
    }


    //Nutzen können wir sie in unserem Beispiel so:
    new string[30][128];
    string[0] = "String1";
    string[1] = "String2";
    string[3] = "String4";
    printf("Anzahl der Strings: %d",CountStrings(string)); //->3


    mfg. :thumbup:

    Kannst du mir das Bitte erleutern, Ich möchte das wenn man Enter drückt das die die Animation die man ausführt aufhört.


    //Edit:


    Obwohl nimm lieber einen Befehl dafür:


    //Irgendein Command:
    if(GetPlayerAnimationIndex(playerid)) ClearAnimations(playerid);


    Da du sonst die Animation selbst abbrichst die ein Spieler ausführen würde...

    So macht es mehr Sinn:


    stock ServerLaden()
    {
    Server[Staatskasse] = mysql_GetInt("server", "Staatskasse","id", "0");
    Server[Zinsen] = mysql_GetFloat("server", "Zinsen", "id", "0");
    Server[Steuern] = mysql_GetFloat("server", "Steuern", "id", "0");
    return 1;
    }

    Naja einfach so:


    stock GetRandomPlayer()
    {
    new idx[MAX_PLAYERS],t;
    for(new i; i<MAX_PLAYERS; i++) if(IsPlayerConnected(i)) idx[t] = i,t++;
    return (t) ? idx[random(t)] : 0;
    }


    Die Funktion returnt dir deine zufällige Spielerid auf dem Server :)


    mfg. :thumbup: