Nützliche Codeschnipsel

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
  • Jemand killt dich, und du willst wissen wer?
    KillCam , man Blickt 5 Sekunden lang auf denn Spieler der dich gekillt hat.


    public OnPlayerDeath(playerid, killerid, reason)
    {
    new string[125];
    format(string, sizeof(string), "~n~~n~~n~~n~~n~~n~~r~You Are Dead!");
    GameTextForPlayer(playerid, string, 5000, 4);



    if(killerid != INVALID_PLAYER_ID)
    {
    TogglePlayerSpectating(playerid, 1);
    PlayerSpectatePlayer(playerid, killerid);
    SetTimerEx("deathspec", 5000, false, "i", playerid);

    }
    return 1;
    }

    forward deathspec(playerid);
    public deathspec(playerid)
    {
    TogglePlayerSpectating(playerid, 0);
    return 1;

    }



    Wie lange Spielte der Spieler?
    public OnPlayerConnect(playerid)
    return SetPVarInt(playerid, "zeit", GetTickCount());


    public OnPlayerDisconnect(playerid)
    {
    new h, m, s, name[MAX_PLAYER_NAME], str[80];


    GetPlayerName(playerid, name, sizeof name);
    ConvertMS(GetTickCount()-GetPVarInt(playerid, "zeit"), h, m, s);
    format(str, sizeof str, "Spieler %s hat den server verlassen, er spielte %02d:%02d:%02d", name, h, m, s);
    SendClientMessageToAll(-1, str);
    return 1;
    }


    stock ConvertMS(Miliseconds, &hours, &minutes, &seconds)
    {
    hours = Miliseconds / 3600000;
    Miliseconds -= hours * 3600000;
    minutes = Miliseconds / 60000;
    Miliseconds -= minutes * 60000;
    seconds = Miliseconds / 1000;
    Miliseconds -= seconds * 1000;
    }

    Einmal editiert, zuletzt von Exclusive FiveM Scripts ()


  • stock Check_If_Point_In_Triangle(playerid,Float:X,Float:Y,Float:Z,Float:R,Float:MAX_Z)
    {
    new const Float:Winkel = 60.0;
    new const Float:Weite = 30.0;
    new Float:Pos[8];
    GetPlayerPos(playerid,Pos[0],Pos[1],Pos[2]);
    Pos[4] = Y+(Weite*floatsin(Winkel+R,degrees));
    Pos[5] = Y-(Weite*floatsin(R-Winkel,degrees));
    Pos[6] = X+(Weite*floatcos(Winkel+R,degrees));
    Pos[7] = X-(Weite*floatcos(R-Winkel,degrees));
    return (((Y-Pos[4])*(Pos[0]-X) + (Pos[6]-X)*(Pos[1]-Y)) <0 ||((Pos[4]-Pos[5])*(Pos[0]-Pos[6]) + (Pos[7]-Pos[6])*(Pos[1]-Pos[4])) <0 ||((Pos[5]-Y)*(Pos[0]-Pos[7]) + (X-Pos[7])*(Pos[1]-Pos[5])) <0 || Pos[2] > MAX_Z || Pos[2] < Z) ? 0:1;
    }


    Mit der Berechnung ist es möglich abzuprüfen ob sichjemand in einem Dreieck befindet gedacht war die berechnung für einen blitzer womit man einseitig blitzen kann.



    Grafik noch dazu


  • Mit der Berechnung ist es möglich abzuprüfen ob sichjemand in einem Dreieck befindet gedacht war die berechnung für einen blitzer womit man einseitig blitzen kann.


    Das ist ne gute Idee und schöne Umsetzung ;)


    Allerdings, frage ich mich gerade wieso du die eine Deklaration nicht in 1ne Zeile schreibst?!


    Schreibs doch so:


    new const Float:Winkel = 60.0,Float:Weite = 30.0;


    Nun...egal, mir ist aufgefallen, dass dieses ^ Zeichen in Pawn keine exponentielle Rechnung macht.


    Aus diesem Grund habe ich ein kleines Makro geschrieben:


    #define expo(%0^%1) \
    (floatround(floatpower(%0,%1)))


    //Nutzung:
    printf("%d",expo(5^2)); // ->Ergebnis: 25


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S


  • Zitat

    $2 $49


    Zitat

    GivePlayerMoney(playerid, -48);


    Du meinst statt $1 oder?


  • if (strcmp("/firstperson", cmdtext, true, 10) == 0)
    {
    firstperson[playerid] = CreateObject(19300, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
    AttachObjectToPlayer(firstperson[playerid],playerid, 0.0, 0.12, 0.7, 0.0, 0.0, 0.0);
    AttachCameraToObject(playerid, firstperson[playerid]);
    SendClientMessage(playerid,-1,"{FFFFFF}Benutze {009BFF}/exitfirstperson {FFFFFF}um wieder die Camera zu wechseln.");
    return 1;
    }

  • #define NummernSchild(%0,%1) SetVehicleNumberPlate(%0,%1)



    Beispiel:


    NummernSchild(CreateVehicle(462, 1270.1460, -1657.3356, 13.0590, -29.9400, -1, -1, -1),"Text");


    //Edit by RFT: Was soll an einem Makro bitte nützlich sein ?

    [tabmenu][tab='Angebote','http://cdn3.iconfinder.com/data/icons/glyph/227/Tag-48.png']

    + Die Preise liegen bei 5-100+€ Ablauf:
    + Entweder ihr addet mich in Skype (PN vorher Schreiben) oder Ihr schreibt eine PN an mich (Betreff - Euer Wunsch z.B. Filterscript)
    + So nun schreibt ihr mir was ihr alles in dem Script haben wollt ich werd euch dann sagen ob ich es hinbekomme.
    + Dann machen wir ein groben Preis aus. Ich werde das Script erstellen und es zusammen mit dem Kunden Testen.



    [tab='Kontakt','http://cdn3.iconfinder.com/data/icons/line/36/person_add-48.png']
    edmix23

    + Bitte beim Adden angeben wer ihr seit oder per PN bescheid sagen!
    [tab='Zahlungs Methoden','https://cdn3.iconfinder.com/data/icons/line/36/check_money-32.png']
    +Paypal!
    +Direkte Banküberweisung

    Einmal editiert, zuletzt von RFT ()


  • stock ChatRange(playerid,farbe,weite,string[]){
    new Float:X,Float:Y,Float:Z;GetPlayerPos(playerid,X,Y,Z);
    for(new i; i < MAX_PLAYERS; i++)
    if(IsPlayerInRangeOfPoint(i,weite,X,Y,Z)) return SendClientMessage(i,farbe,string);
    return 0;
    }



    public OnPlayerText(playerid, text[])
    {
    new string[150],name[MAX_PLAYER_NAME+1];GetPlayerName(playerid,name,sizeof(name));
    if(!IsPlayerConnected(playerid)) return SendClientMessage(playerid,Rot,"Sie müssen eingeloggt sein!");
    format(string,sizeof(string),"%s: %s",name,text),ChatRange(playerid,Weiss,30,string);
    return 0;
    }


    Mfg. wenn ein fehler drin ist bitte melden ;)

  • #define DIALOG_RCON_LOGIN_FALSE 2013


    public OnRconLoginAttempt(ip[], password[], success)
    {
    if(!success || success) // Wenn der Login fehlschlägt oder klappt
    {
    new pip[16]; // Erstellt den String pip mit einer Länge von 16
    for(new i=0; i<MAX_PLAYERS; i++) // Schleife welche alle Spieler durchgeht
    {
    GetPlayerIp(i, pip, sizeof(pip)); // Holt sich die IP Adressen von allen Spielern
    if(!strcmp(ip, pip, true)) // Wenn eine IP der Spieler mit der IP übereinstimmt, mit der versucht wurde sich als Rcon einzuloggen
    {
    if(!SpielerDaten[i][pAdmin]) // Wenn der Spieler kein Administrator ist
    {

    // Hier müsst ihr machen, dass der Spieler gebannt wird.

    new PW[16]; // Erstellt den String PW mit der Länge von 16
    format(PW, sizeof(PW), password); // Das Passwort mit dem der Login versucht wurde wird in dem String PW gespeichert
    new string[128]; // Erstellt den String "string".
    format(string, sizeof(string), "{FFFFFF}Du wurdest gebannt, weil du versucht hast dich als Rcon-Administrator anzumelden.\n\nVersuchtes Passwort: {FF0000}%s", PW); // Definiert was in dem String steht.
    ShowPlayerDialog(i, DIALOG_RCON_LOGIN_FALSE, DIALOG_STYLE_MSGBOX, "{FF0000}Bannung vom Server", string, "Okay", ""); // Schickt dem Spieler, welcher sich als Rcon eingeloggt hat den String, dass er gebannt ist.

    }
    }
    }
    }
    return 1;
    }


    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    switch(dialogid)
    {
    case DIALOG_RCON_LOGIN_FALSE:
    {
    if(!response) return Kick(playerid);
    if(response) return Kick(playerid);
    }
    }
    return 1;
    }


  • Wow du sendest den Text nur einmal
    Ist dir überhaupt bewusst was ein return macht?

    All in all it's just another brick in the wall

  • Wie muss es sein wenn es dan richtig währe??


    stock ChatRange(playerid,farbe,weite,string[]){
    new Float:X,Float:Y,Float:Z;GetPlayerPos(playerid,X,Y,Z);
    for(new i; i < MAX_PLAYERS; i++)
    if(IsPlayerInRangeOfPoint(i,weite,X,Y,Z)) SendClientMessage(i,farbe,string);
    else return 0;
    }


    ??

  • Naja...ich habe da auch nochmal was:


    stock format_money(string[], geld, charakter[]) {
    if(geld <= 0) return 0;
    valstr(string,geld);
    for(new i=strlen(string)-3; i>=0; i-=3) strins(string,charakter,i,strlen(string)+11);
    if(strcmp(string[0],charakter,true) == 7) strdel(string,0,1);
    return 1;
    }


    Durch diese Funktion, kann man geld in einen String mit einen Zeichen seiner Wahl umwandeln, sprich so:


    new string[32],geld=1000500;
    format_money(string,geld,"."); //Wenn man hier anstatt dem . ein , macht, steht es auch so im string
    printf("%s",string);
    //->Gibt aus: 1.000.500


    //Edit: War doch noch ein fehler..
    //Edit²: Okay..jetzt gehts ^^


    //edit³:


    Okay, ich habe mal wieder etwas lustiges.
    Mir ist aufgefallen, das die Split Funktion (von wem auch immer) total langsam ist, also ich rede von dieser:


    stock split(const strsrc[], strdest[][], delimiter)
    {
    new i, li, aNum, len;
    while(i <= strlen(strsrc))
    {
    if(strsrc[i] == delimiter || i == strlen(strsrc))
    {
    len = strmid(strdest[aNum], strsrc, li, i, 128);
    strdest[aNum][len] = 0;
    li = i+1;
    aNum++;
    }
    i++;
    }
    return 1;
    }


    Aus diesem Grund, habe ich die mal verbessert, schaut so aus:


    stock f_split(const src[], dest[][], delimiter[]) {
    new pos = strfind(src,delimiter),n_pos,num,bool:end;
    for(;;) {
    if(!num) strmid(dest[num], src, 0, pos, 128),num++;
    else strmid(dest[num], src, n_pos+1, pos, 128),num++;
    n_pos = strfind(src,delimiter,false,pos+1);
    if(n_pos == -1) n_pos = strlen(src),end=true;
    strmid(dest[num], src, pos+1, n_pos, 128),num++;
    pos = strfind(src,delimiter,false,n_pos+1);
    if(end) break;
    }
    return 1;
    }


    Hier ein paar Speedtests:







    //Edit 4:


    Also...mir ist wieder langweilig und ich habe mir überlegt...welche Funktionen schlecht sind und ich verbessern könnte.


    Also und ich bin auf strtok gestoßen, diese Funktion ist sehr sehr langsam, aus diesen Grund, habe ich die Funktion mal sehr verbessert:


    Alter Code:


    stock strtok(const string[], &index)
    {
    new length = strlen(string);
    while ((index < length) && (string[index] <= ' '))
    {
    index++;
    }


    new offset = index;
    new result[20];
    while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
    {
    result[index - offset] = string[index];
    index++;
    }
    result[index - offset] = EOS;
    return result;
    }


    Mein Code:


    stock _strtok(const string[], &index) {
    new pos = strfind(string, " ", false, index+1),buffer[128];
    if(pos == -1) pos = strlen(string);
    strmid(buffer,string,index,pos,128),index = pos;
    return buffer;
    }


    Also, damit ihr einen Vergleich habt, wie viel schneller meine Funktion ist, habe ich wieder ein paar Speedtests gemacht:






    Viel Spaß eure Funktionen zu verschnellern.


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

    4 Mal editiert, zuletzt von Kaliber ()