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
  • nützliches für anfänger:
    UsePlayerPedAnims(); für die geh-art, damit man nicht wie ein clown rum läuft.
    SetGameModeText("Hier der Mode Name"); für den Mode Name.


    Automatisches Heilen:


    ganz oben über #if defined FILTERSCRIPT
    forward heilen();
    dann:


    public OnGameModeInit()
    {
    SetTimer("heilen",500,1); //500 = 0,5 sekunden glaube ich
    return 1;
    }


    ganz unten im script:
    public heilen()
    {
    for (new i = 0; i < MAX_PLAYERS; i++)
    {
    SetPlayerHealth(i, 100.0);
    //Lieber ohne SendClientMessage, weil dann die ganze Zeit ein Text kommt.
    }
    return 1;
    }

    Gruß Nate

    Einmal editiert, zuletzt von Nate ()

  • blöde frage aber wenn ich den z.b befehl hier hab:
    if (strcmp("/blabla", cmdtext, true, 10) == 0)
    {
    if(IsPlayerConnected(i))
    {
    Sendblablabla(bla, bla, "bla");

    return 1;
    }
    wofür brauch ich dann die abfrage ob der spieler connected ist?
    ich versteh das ja beim kick command aber bei commands die nur für einen selbst eine wirkung haben ist doch egal ob man if(IsPlayerConnected(i)) reintut oder?

  • Ja, da ist das total unnötig.
    Kannste mit gutem gewissen rausmachen ;).


    Nur bei Befehlen mit parametern solltest du´s halt drinne lassen.
    Zum Beispiel /ban [pID]



    Nur bei einer for Schleife macht er das sonst 200 obwohl vielleicht nur 5 online sind.
    Also bei schleifen auch drin lassen ;).

    ...

  • Es ist besonders wichtig bei nem Timer wo ALLE angesprochen sind, bei Parametern und bei so nem zeugs eben mit allen leuten weil das ressourcen schonend is(oder wie mans schreibt)

  • /* Player Loop by Y_Less, bisschen verändert von mir */
    #define foreach(%1,%2) \
    new %1; \
    for(; %1 < %2; %1++) if(IsPlayerConnected(%1))


    /* Non-Player Loop (vllt auch von Y_Less, weiß es nicht), bisschen von mir verändert */
    #define foreachEx(%1,%2) \
    new %1; \
    for(; %1 < %2; %1++)


    /* IsPlayerName Funktion */


    stock IsPlayerName(playerid, const name[])
    {
    new tmpname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, tmpname, sizeof(tmpname));
    if(!strcmp(tmpname, name, false)) return true;
    return false;
    }


    /* PrintChar Funktion */


    stock printChar(c)
    {
    return printf("%c", c);
    }


    /* PlayerVar Funktion */


    #define playerVar(%1) \
    new %1[MAX_PLAYERS]


    Anwendung printChar:
    public OnGameModeInit()
    {
    printChar(64);
    return 1;
    }


    Output: "@".


    Beschreibung: Gibt ASCII Zeichencodes in der Konsole aus.


    Anwendung playerVar:
    playerVar(Kills);


    Beschreibung: Neuer Array mit Name "Kills" wird erstellt. Array Größe = MAX_PLAYERS.

    Einmal editiert, zuletzt von [NSG]Bright ()

  • Zwar nichts besonderes aber erspart das Umgerechne in Millisekunden:



    Angabe in Minuten:


    forward SetTimerMin(funcname[], interval, reapeating);


    public SetTimerMin(funcname[], interval, repeating)
    {
    SetTimer(funcname, interval*60000, reapeating);
    return 1;
    }


    Angabe in Sekunden:


    forward SetTimerSek(funcname[], interval, reapeating);


    public SetTimerSek(funcname[], interval, repeating)
    {
    SetTimer(funcname, interval*1000, reapeating);
    return 1;
    }

  • Mal wieder was kleines.


    Beschreibung:
    Durch diese Funktion kann man ganz bequem ein Tag (Kürzel) vor/hinter den Namen setzen und natürlich bei Bedarf auch wieder entfernen lassen.


    Benützung:
    Zuerst einfach alles was in dem unten stehenden Pawn Code steht in das Script kopieren, am besten ist es wenn alles nach ganz ganz unten kommt, an das Ende des Scripts.


    Danach kann man die Funktion "AddTag(playerid, tag[], place = 0);" benützen.
    Beispiel an einem Command:
    if(!strcmp(cmdtext,"/afk")) {
    AddTag(playerid, "]AFK[", 0);
    return 1;
    }


    Dieser Command würde das Tag "]AFK[" an das Ende des Namens setzen. Wenn man das Tag vorne will ändert man die 0 einfach in eine 1.



    new
    oldname[MAX_PLAYERS][MAX_PLAYER_NAME];


    stock AddTag(playerid, const tag[], place = 0) {
    new name[MAX_PLAYER_NAME], some, str[32];
    GetPlayerName(playerid, name, sizeof(name));
    strmid(oldname[playerid], name, 0, MAX_PLAYER_NAME, MAX_PLAYER_NAME);
    some = (place == 0) ? (format(str, sizeof(str), "%s%s", name, tag)) : (format(str, sizeof(str), "%s%s", tag, name));
    printf("Tag: %s Tagmode: %d", tag, place);
    SetPlayerName(playerid, str);
    return 1;
    }


    stock RemoveTag(playerid) {
    SetPlayerName(playerid, oldname[playerid]);
    return 1;
    }


    Und nochmal was kleines:


    Funktion die die ID des Users über den Namen herausfindet. Wenn ihr wollt könnt ihr auch zwischen Großbuchstaben und Kleinbuchstaben unterscheiden lassen.
    stock GetPlayerIDByName(playername[], bool:capitalletters) {
    new g = GetMaxPlayers(), j, j_playername[MAX_PLAYER_NAME], player;
    for(; j < g; j++) {
    if(GetPlayerName(j, j_playername, sizeof(j_playername))) {
    if(!strcmp(j_playername, playername, capitalletters)) {
    player = j;
    break;
    }
    }
    }
    return player;
    }


    Anwendungsbeispiel:
    if(!strcmp(cmdtext,"/idbyname"))
    {
    printf("%d", GetPlayerIDByName("Br1ght]NSG", true));
    return 1;
    }

    Einmal editiert, zuletzt von [NSG]Bright ()

  • Etwas kleines:
    Dis-Connect Icons im Death Menü:
    //public OnPlayerConnect(playerid)
    {
    SendDeathMessage(playerid, INVALID_PLAYER_ID, 200);
    return 1;
    }
    //public OnPlayerDisconnect(playerid)
    {
    SendDeathMessage(INVALID_PLAYER_ID, playerid, 201);
    return 1;
    }

    Mehr dazu:
    1
    2

    Gruß Nate

  • Einmal Meine Lösung
    stock TagDerWoche()
    {
    new tag,monat,jahr;
    getdate(jahr,monat,tag);
    if (monat < 3)
    {
    monat += 12;
    jahr--;
    }
    return ((13*monat+3)/5 + tag + jahr + jahr/4 - jahr/100 + jahr/400) % 7;
    }
    stock GetTag()
    {
    new Ergebniss[25];
    switch(TagDerWoche())
    {
    case 0:
    {
    Ergebniss = "Montag";
    }
    case 1:
    {
    Ergebniss = "Dienstag";
    }
    case 2:
    {
    Ergebniss = "Mittwoch";
    }
    case 3:
    {
    Ergebniss = "Donnerstag";
    }
    case 4:
    {
    Ergebniss = "Freitag";
    }
    default:
    {
    Ergebniss = "Fehler";
    }
    }
    return Ergebniss;
    }



    Diese Lösung ist von KeksOfDeath
    stock Wochentag(t,m,j) {//Tag, Monat, Jahr eingeben
    new wt=((j-2009)*365)+t, x;
    for(new i=2008; i<=j; i+=4) {
    if(i>=2012) {
    wt++; }
    if(i==j) { x++; }
    else { x+=2; }}
    switch(m) {
    case 2: { wt+=31; }
    case 3: { wt+=61-x; }
    case 4: { wt+=92-x; }
    case 5: { wt+=122-x; }
    case 6: { wt+=153-x; }
    case 7: { wt+=183-x; }
    case 8: { wt+=214-x; }
    case 9: { wt+=244-x; }
    case 10: { wt+=275-x; }
    case 11: { wt+=305-x; }
    case 12: { wt+=336-x; }
    }
    new s[20];
    while(wt>7) { wt-=7; }
    wt--;
    switch(wt) {
    case 0: s="Donnerstag";
    case 1: s="Freitag";
    case 2: s="Samstag";
    case 3: s="Sonntag";
    case 4: s="Montag";
    case 5: s="Dienstag";
    case 6: s="Mittwoch";
    }
    return s;
    }



    Diese Lösung ist von DMA (De Äm A :> )
    WochenTag(ParamJahr) //
    {
    new MyTag = ((floatround(ParamJahr * 365.25) - 620628) % 7 - 1), MyResult[12];
    switch(MyTag)
    {
    case 0: MyResult = "Sonntag";
    case 1: MyResult = "Montag";
    case 2: MyResult = "Dienstag";
    case 3: MyResult = "Mittwoch";
    case 4: MyResult = "Donnerstag";
    case 5: MyResult = "Freitag";
    case 6: MyResult = "Samstag";
    default: MyResult = "Error";
    }
    return MyResult;
    }


    Gefragt hatte 8D. nach den möglichkeiten, so und nun sucht euch eine möglichkeit aus.


    Wie gesagt:


    Credits der Codes sind:


    DMA
    KeksOfDeath
    ..und ich ^^


    Ich hoffe die macher der anderen 2 Codes haben nix dagegen das dies hier verewigt wird :>

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • Alternative zu for-Schleifen bzw. foreach:
    /* Zu den anderen defines bzw. unter "#include a_samp" */
    #define whileloop(%1,%2,%3) \
    new %1 = %2-1; \
    while(%1++ < %3)


    Syntax:
    whileloop(varname, size at start, size at end)
    Erstellt eine Variable mit der angegebenen Startgröße und startet dann einen while-Loop der den nachfolgenden Code ausführt bis die angegebene Endgröße erreicht ist.


    Anwendungsbeispiel:
    if(!strcmp(cmdtext,"/msg"))
    {
    whileloop(players,MAX_PLAYERS) {
    SendClientMessage(players, 0xFF00AAFF, "Bla, Message");
    }
    return 1;
    }



    Dazu noch eine kleine Funktion um zu checken ob ein String leer ist.
    /* Zu den anderen defines bzw. unter "#include a_samp" */
    #define strEmpty(%1) !%1[0] || %1[0] == '\0'


    Syntax:strEmpty(string[]);
    Überprüft ob ein String leer ist.


    Anwendungsbeispiel:
    if(!strcmp(cmdtext,"/say"))
    {
    if(strEmpty(cmdtext[4])) return print("Fail");
    SendClientMessageToAll(0xFF0000FF, cmdtext[4]);
    return 1;
    }

  • Stimmt, aber für die Faulen ist es ganz nützlich.
    // Ginge es nur um den Nutzen einer Funktion kann man die meisten Releases und Code Schnippsel hier vergessen.


    -- Gott braucht das Forum lange zum Antwort-Header laden -.-


  • so, schon sehr alt aber: was fügt es genau hinzu? n teleport zb. zu nem menu?

  • Na das wäre bei einem Command nützlich, den Spieler mit wenig Code zu teleportieren. Du kannst neben X,Y und Z auch die Drehung(A), das Interior, die VirtualWorld und den Preis bestimmen. Eine neuere Version der Funktion ist is meiner M-Inc , wo man auch bestimmen kann, ob das Auto mitkommen soll.


    Ich scripte NICHT mehr, ich möchte mit NIEMANDEM einen Server aufmachen habe auch NICHTS mehr mit LoH zu tun, also lasst es mit den PNs!

  • dann ist aber der name "ADD" falsch O.o was hat das mit adden zu tun? xD

  • afk mit grund


    new Float: pX, Float: pY, Float: pZ;
    if(!strcmp(strget(cmdtext,0),"/afk"))
    {
    if(!strlen(strget(cmdtext,1)))
    {
    SendClientMessage(playerid,COLOR_YELLOW,"Benutze: /afk [Grund] "); return 1;
    }
    new grund[128];
    grund = strget(cmdtext,1);
    new pName[MAX_PLAYER_NAME];
    new string[48];
    GetPlayerName(playerid, pName, sizeof(pName));
    format(string, sizeof(string), "%s ist abwesend. Grund: %s", pName,grund);
    SendClientMessageToAll(0xFF7E00FF, string);
    SendClientMessage(playerid, 0xFF6347AA, "(¯`·._.·[ABWESEND]·._.·´¯)");
    SendClientMessage(playerid, 0xAFAFAFAA, "Benutze /back um zurückzukehren.");
    TogglePlayerControllable(playerid,0);
    SetPlayerPos(playerid,20000,20000,1000);
    GetPlayerPos(playerid,pX,pY,pZ);
    return 1;
    }


    if(!strcmp(strget(cmdtext,0),"/back"))
    {
    new pName[MAX_PLAYER_NAME];
    new string[48];
    GetPlayerName(playerid, pName, sizeof(pName));
    format(string, sizeof(string), "%s ist wieder da.", pName);
    SendClientMessageToAll(COLOR_NEWS, string);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, "(¯`·._.·[ANWESEND]·._.·´¯)");
    SendClientMessage(playerid, COLOR_GREY, "Willkommen zurück!");
    TogglePlayerControllable(playerid,1);
    SetPlayerPos(playerid, pX,pY,pZ);
    return 1;
    }