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
  • Betritt den Server


    public OnPlayerConnect(playerid)
    {
    new pName[MAX_PLAYER_NAME];
    new string[48];
    GetPlayerName(playerid, pName, sizeof(pName));
    format(string, sizeof(string), "%s hat den Server Betreten.", pName);
    SendClientMessageToAll(0xAAAAAAAA, string);
    return 1;
    }


    Verlässt den Server
    public OnPlayerDisconnect(playerid, reason)
    {
    new pName[MAX_PLAYER_NAME];
    new string[56];
    GetPlayerName(playerid, pName, sizeof(pName));


    switch(reason)
    {
    case 0: format(string, sizeof(string), "%s hat den Server verlassen. (Error)", pName);
    case 1: format(string, sizeof(string), "%s hat den Server verlassen.", pName);
    case 2: format(string, sizeof(string), "%s hat den Server verlassen. (Kick/ban)", pName);
    }


    SendClientMessageToAll(0xAAAAAAAA, string);
    return 1;


    }

  • Einfaches Levelsystem


    enum Levelvoraussetzung (*= 3.3333)
    {
    Float: Levelmin = 2,
    Float: Levelmittel,
    Float: Levelhigh
    }


    new Levelsystem[MAX_PLAYERS],
    var[4 char]; //gepackter string nur zum zurückgeben


    Levelsystem() {
    new
    playerid;
    for(playerid = 0; playerid < sizeof(MAX_PLAYERS); playerid++) {
    if (Levelsystem[playerid] => floatround(Levelmin, floatround_ceil)) return var = "Noob";
    else if (Levelsystem[playerid] => floatround(Levelmittel, floatround_ceil)) return var = "Guter Spieler";
    else if (Levelsystem[playerid] => floatround(Levelhigh, floatround_ceil)) return var = "Profi";
    else { Levelsystem[playerid]++; goto Levelsystem(); }
    }

    [align=center]
    Mta Script Editor - Work in Progress

  • Da wird Pawno leider streiken da sich ein Variablenname und ein Funktionsname gleichen. ;P

  • Wooops nicht gesehen :P


    _Levelsystem() {
    new
    playerid;
    for(playerid = 0; playerid < sizeof(MAX_PLAYERS); playerid++) {
    if (Levelsystem[playerid] => floatround(Levelmin, floatround_ceil)) return var = "Noob";
    else if (Levelsystem[playerid] => floatround(Levelmittel, floatround_ceil)) return var = "Guter Spieler";
    else if (Levelsystem[playerid] => floatround(Levelhigh, floatround_ceil)) return var = "Profi";
    else { Levelsystem[playerid]++; goto _Levelsystem(); }
    }

    [align=center]
    Mta Script Editor - Work in Progress

    Einmal editiert, zuletzt von Jason_Gregory ()

  • Das wird nie funktionieren, weil du 4 * 8 bit dir reservierst. (var mit 4 char größe)
    Da bekommt man garnicht so lange Strings rein. ;)
    Außerdem, wieso rundest du die Level in der enum o_X
    Dann kannst du auch gleich die Werte auch gleich gerade laßen.


    Im gesamten: Sinnlos.


    Und dann auchnoch goto Levelsystem(); wird ja immer lustiger. :>

  • enum Levelvoraussetzung (*= 3.3333)
    {
    Float: Levelmin = 2,
    Float: Levelmittel,
    Float: Levelhigh
    }


    new Levelsystem[MAX_PLAYERS],
    var[16];


    _Levelsystem() {
    new
    playerid;
    Noobreturn:
    for(playerid = 0; playerid < sizeof(MAX_PLAYERS); playerid++) {
    if (Levelsystem[playerid] => floatround(Levelmin, floatround_round)) return var = "Noob";
    else if (Levelsystem[playerid] => floatround(Levelmittel, floatround_round)) return var = "Guter Spieler";
    else if (Levelsystem[playerid] => floatround(Levelhigh,floatround_round)) return var = "Profi";
    else { Levelsystem[playerid]++; return var = "noob"; //oder du wiederholst die Function mit goto _Levelsystem; }
    //Alternativ else { goto Noobreturn; }
    }


    Die Werte kannste natürlich auch ungerundet lassen, mir persönlich aber lieber weil viele danach direkt das Level mitausgeben
    und keiner fängt was mit 4.3922 an...
    Hier damits verständlicher rüberkommt.


    Zitat

    Ausgabe:
    ...
    6.6666
    9.9999
    ...

    [align=center]
    Mta Script Editor - Work in Progress

    Einmal editiert, zuletzt von Jason_Gregory ()

  • OnPlayerConnect


    new string[100], name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    format(string,sizeof(string),"%s hat den Server betreten. [Joining]",name);


    OnPlayerDisconnect


    new string[100], name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));


    switch(reason)
    {
    case 0: format(string, sizeof(string), "%s hat den Server verlassen. [Timeout]", name);
    case 1: format(string, sizeof(string), "%s hat den Server verlassen. [Leaving].", name);
    case 2: format(string, sizeof(string), "%s hat den Server verlassen. [Kick/Ban]", name);
    }


    SendClientMessageToAll(grau,string);


    @dir da war ich zu langsam

  • Kleines OnPlayerConnect Script :D


    public OnPlayerConnect(playerid)
    {
    new Name[MAX_PLAYER_NAME+2], message[256];
    GetPlayerName(playerid, Name, sizeof(Name));
    format(message, sizeof(message), "%s hat den Server Betreten.", Name);
    GameTextForAll(message,2500,4);
    SendClientMessageToAll(0xFFFFF,message);
    return 1;
    }

    Einmal editiert, zuletzt von ]PRT[The_Gamer ()

  • Habs bisher selber nicht getestet sondern einfach so geschrieben wie es aussehen könnte , werds mal selber testen & verbessern
    Jetzt fällt mir das mit Floath auch erst auf :>


    Hab jetzt die letzte Seite nicht gesehen, vllt. wurde es schon verbessert, aber dein Script da macht momentan eigentlich:
    health
    health = 80
    dann setzt du PlayerHealth auf 81
    und fragst dann ob
    health(80) != health+1(81) ist, das ist natürlich nie so :D


    Ersetz einfach in der Abfrage health+1 mit health2 oderso und frag nach dem Health + 1 nochmal ab. :)

  • Genau das meine ich ^^


    Ontopic:
    Automatischer Server Restart zu einer bestimmten Uhrzeit:
    #define RESTART_HOUR 4
    #define RESTART_MINS 30


    public OnGameModeInit()
    {
    SetTimer("CheckForRestart",60000,1);
    return 1;
    }


    forward CheckForRestart();
    public CheckForRestart()
    {
    new thour, tmin, tsec;
    gettime(thour,tmin,tsec);
    if(thour == RESTART_HOUR && tmin == RESTART_MINS)
    {
    print(" Automatic Server Restart ");
    SendRconCommand("gmx");
    }
    return 1;
    }


    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!


  • #define ForEachPlayer(%0) for(new index_%0=0, %0=ConnectedPlayerList[0]; index_%0<ConnectedPlayers; index_%0++, %0=ConnectedPlayerList[index_%0])


    new ConnectedPlayers;
    new ConnectedPlayerList[MAX_PLAYERS+1];//Bug bei Loop verhindern, wenn voller Server.


    stock AddPlayer(playerid)//Unter OnPlayerConnect: AddPlayer(playerid); hinmachen
    {
    if(ConnectedPlayers>=MAX_PLAYERS)
    return 0;

    ConnectedPlayerList[ConnectedPlayers++]=playerid;
    return 1;
    }


    stock RemovePlayer(playerid)//Unter OnPlayerDisconnect RemovePlayer(playerid); hinmachen
    {
    for(new i=0;i<ConnectedPlayers;i++)
    {
    if(ConnectedPlayerList[i]==playerid)
    {
    ConnectedPlayers--;
    ConnectedPlayerList[i]=ConnectedPlayerList[ConnectedPlayers];
    return 1;
    }
    }
    return 0;
    }


    Wer Y_Less' foreach Funktion kennt, der weiss um was es dabei geht. Diese Funktion bewirkt dasselbe. Jedoch ist sie nur auf die Spieler bezogen.
    ForEachPlayer ist eine Schleife, die ihr anstelle von for(new i=0;i<MAX_PLAYERS;i++) benutzen könnt. Ihr müsst dann in dieser neuen ForEachPlayer-Schleife kein IsPlayerConnected mehr benutzen.


    Beispiel:
    Alt:

    for(new i=0;i<MAX_PLAYERS;i++)
    {
    if(IsPlayerConnected(i))
    {
    GivePlayerMoney(i,3000);
    SendClientMessage(i,0xFF0000FF,"Zahltag: $3000");
    }
    }


    Neu:

    ForEachPlayer(i)
    {
    GivePlayerMoney(i,3000);
    SendClientMessage(i,0xFF0000FF,"Zahltag: $3000");
    }


    Da diese Schleife nur durch alle Connecteten Spieler loopt, ist sie viel schneller als die andere.

  • stock SecondsToMinutes(from, &dest)
    {
    dest = 0;
    while(from >= 60)
    {
    dest += 1;
    from -= 60;
    }
    return 1;
    }


    stock MinutesToSeconds(from, &dest)
    {
    dest = 0;
    while(from >= 1)
    {
    dest += 60;
    from -= 1;
    }
    return 1;
    }


    Damit kann man Minuten in Sekunde umwandeln und auch andersrum. Kann hilfreich sein.

  • stock SecondsToMinutes(sec)return sec/60;
    stock MinutesToSeconds(min)return min*60;

  • Aus Langeweile entstanden


    StrCmp(const str0[],const str1[],maxln = 0)
    {
    new jcount;
    maxln = (!maxln) ? (strlen(str1)) : (maxln);
    while(str0[jcount]==str1[jcount] && str0[jcount])jcount++;
    return (jcount==maxln) ? (1) : (0);
    }

    • Vergleicht 2 Texte miteinander


    StrCpy(str0[],const str1[])
    {
    new jpos;
    str0[0] = '\0';
    while(str0[jpos])
    {
    str1[jpos] = str0[jpos];
    jpos++;
    }
    }

    • Kopiert den Text


    Spiegeln(str0[],const str1[])
    {
    new jpos = strlen(str1),nn;
    while(jpos>0)
    {
    str0[nn] = str1[jpos];
    jpos--;
    nn++;
    }
    }

    • Gibt den Text gespiegelt wieder


    StrLen(const str[])
    {
    new ppos;
    while(str[ppos])ppos++;
    return ppos;
    }

    • Gibt die Länge eines Textes wieder

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • ungetestet, abfrage, ob einer einen bestimmten namen hat.
    stock hasPlayerName(playerid,name[])
    {
    new xname[MAX_PLAYER_NAME];
    GetPlayerName(playerid,xname);
    return ((!strcmp(name,xname))?(true):(false));
    }
    benutzung
    if(hasPlayerName(playerid,"Opa"))SendClientMessage(playerid,farbe,"Hallo Opa xD");

  • #define Message(%1,%2,%3,%4) new cmd_string[256]; format(cmd_string, sizeof(cmd_string), %3, %4); SendClientMessage(%1, %2, cmd_string)


    Damit kann man eine Nachricht, formatiert an einen Spieler mit selbstdefinierter Farbe senden.
    Message(playerid, 0xFFFFFFFF, "%d | %d sind %f", 3, 4, 0.75);


    Ich habe es getestet und es geht, mehrere Parameter zu machen.