Beiträge von Kaliber

    Ich hab hier auch mal wieder paar Sachen :D


    SWAP
    Als erstes die gute alte SWAP Funktion ohne Variablen (ich weiß ist schon alt, habe ich hier aber noch nicht gesehen):


    #define SWAP(%0,%1) (((%0)^=(%1)),((%1)^=(%0)),((%0)^=(%1)))


    new a=5,b=10;
    SWAP(a,b);
    printf("a: %d | b: %d",a,b); //->Output: a: 10 | b: 5


    TotalBits
    Als nächstes eine sehr nützliche Funktion, wenn man die Anzahl an 1nser Bits in einer Zahl bestimmen will:


    Beispiele:


    1. 0xF = 15 = 0b1111 //Wir sehen hier 4x die 1
    2. 0xA = 10 = 0b1010 //Hier sehen wir 2x die 1


    Ich denke jedem ist klar, was ich meine um dies zu ermitteln, ohne Schleife, kann man Bit-Shifting verwenden:


    #include <a_samp>


    main() {
    printf("%d",GetTotalBits(0xF)); //-> 4
    printf("%d",GetTotalBits(10)); //-> 2
    }


    stock GetTotalBits(v) {
    v -= ((v >> 1) & 0x55555555),v = (v & 0x33333333) + ((v >> 2) & 0x33333333);
    return (((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 0x18);
    }


    Kleiner bzw Größer
    Wenn man 2 Variablen hat, x = 13 und y = 14 und prüfen will welche kleiner bzw größer ist, kann man das so machen:


    #define min(%0,%1) (((%0)<(%1))?(%0):(%1))
    #define max(%0,%1) (((%0)>(%1))?(%0):(%1))


    new x = 13, y = 14;
    new r = min(x,y); //r = 13
    new z = max(x,y); //z = 14


    /*
    Man könnte das auch durch Bit-Shifting lösen (da das der Titel ist :D):
    new x = 13, y = 14;
    new r = y ^ ((x ^ y) & -(x < y)); //Das gibt das minimum zurück (13)
    new z = x ^ ((x ^ y) & -(x < y)); //Das gibt das maximum zurück (14)


    Allerdings ist diese Variante wesentlich langsamer, als der ternary Operator :)
    */


    Viel Spaß damit :D


    mfg. :thumbup:

    Wie frage ich die kleinste id die online ist ab, und wie die 2 kleinste id die online ist, usw.


    Du speicherst die Werte in einem Array:


    new tmp[MAX_PLAYERS],idx;
    for(new i; i<MAX_PLAYERS; i++) if(IsPlayerConnected(i)) tmp[idx] = i,idx++;


    //und dann sortierst du das Array:
    d_Sort(tmp, idx);


    //und jetzt steht die kleinste ID in:
    tmp[0]; //Kleinste ID
    tmp[1]; //zweit kleinste ID ...usw


    //Das unten ins Skript
    stock d_Sort(x[], const anz) {
    for (new i,tmp,j; i < anz; i++) {
    for (j=0; j < anz - i - 1; j++) {
    if (x[j] > x[j + 1]) tmp = x[j],x[j] = x[j + 1],x[j + 1] = tmp;
    }
    }
    return 1;
    }


    mfg. :thumbup:

    Das merkwürdige ist ja, dass er den Server bei SA:MP als Online sehen kan


    Dann ist es entweder ein Versionen Problem, oder er nutzt einen unzulässigen Namen, oder er wird vom Skript aus direkt gebannt / gekickt :D


    Mach doch einfach mal unter OnPlayerConnect einen print-Debug rein und schau was da so passiert ;)


    mfg. :thumbup:

    if(CallLocalFunction(ocmdStr,"ds",playerid,cmdtext[i+1])) return 1;


    CallLocalFunction kann kein einzelnes NULL-Byte als String übermitteln.


    Also schreibe es mal so:


    if(CallLocalFunction(ocmdStr,"ds",playerid,((cmdtext[i+1] == '\0')?(" "):(cmdtext[i+1])))) return 1;


    mfg. :thumbup:

    Und was ich gemacht habe, solllte doch funktionieren ?


    Nein, wenn du mit cache Funktionen arbeitest, musst du auch entweder mysql_function_query oder mysql_pquery oder mysql_tquery verwenden...aber nicht nur mysql_query!


    Mit mysql_query und mysql_store_result kannst du nicht auf cache Funktionen zugreifen, sondern hast dann halt direkt ein result vorliegen.


    Wie gesagt, schau dir doch einfach die Tutorials an, ist ja nicht soviel.


    mfg. :rolleyes:

    Ist mir schon kla, bloß wie kann ein Script ein Befehl senden?


    Einfach so:


    SetTimer("@destroy",1000*30,0);


    @destroy();@destroy() return OnPlayerCommandText(0,"/destroycars");


    Wenn du allerdings eine Admin-Abfrage o.ä. in diesem Command hast, musst du einfach den Code in den Timer kopieren ;)


    mfg. :thumbup:

    Die Tiere sind attached am Körper des Spielers.


    Also...du attachst eine Kuh an den Spieler und ehm was passiert, wenn er in ein Auto steigt :o


    Machst du das mit AttachObjectToPlayer oder SetPlayerAttachedObject...dann wenn die Kuh eine Kollision hat, kann man damit wunderbar andere Spieler trollen, indem man sich so stellt, dass die Kuh auf der Straße steht oder, dass man sich ganz schnell dreht und dann haut man alles mögliche um :D Besonders im GangFight oder so, kann man damit schüsse abwehren..etc xD

    Schreib dein Skript mal so:


    #include <a_samp>
    #define SCM SendClientMessage
    new govbarrier1;
    forward govbarrier1close();



    public OnGameModeInit()
    {
    // Hier wird es erstellt:
    govbarrier1=CreateObject(968, 1284.22388, -2059.59863, 58.54250, 0.00000, 90.00000, 90.00000); // Gov Barrier
    return 1;
    }


    COMMAND:mv(playerid, params[])
    {
    if(!IsPlayerInRangeOfPoint(playerid,1284.24829, -2056.05029, 58.23990,5)) return SCM(playerid,-1,"Du befindest dich nicht am Tor!");
    MoveObject(govbarrier1,1284.22388, -2059.59863, 58.5425, 5.0, 0.00000, 0.00000, 90.00000);
    SetTimer("govbarrier1close",10000,0);
    SendClientMessage(playerid, COLOR_LIGHTBLUE,"Die Schranke schliesst in 10 Sekunden von selbst!");
    return 1;
    }


    public govbarrier1close() return MoveObject(govbarrier1,1284.22388, -2059.59863, 58.54250, 5.0, 0.00000, 90.00000, 90.00000);

    mysql_escape_string(Spielername(playerid), Spielername(playerid));


    Ich wollte mal kurz etwas dazu sagen, dass ist absoluter Schwachsinn.


    Das wäre wie wenn man folgendes versucht:


    func() = "Hey";
    /*
    In Pawn kann man func() = "Hallo"; zwar wirklich ohne Fehler compilen, aber das macht keinen Sinn. Denn man kann einer Funktion keine neuen Werte zuweisen, da diese durch das return festgelegt werden.
    */
    printf("%s",func()); //Ich hoffe jedem ist klar, dass hier 'hallo' rauskommt...und nicht Hey


    stock func() {
    new var[] = "'hallo'";
    return var;
    }


    mfg. :rolleyes: