Erfolgssystem (über MySQL)

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
  • Hallo und willkommen zu meinem neuen Scriptingtutorial.
    Heute wollen wir uns sowohl mit Erfolgen beschäftigen, als aber auch ein wenig mit Datenbanken.


    Was erstellen wir?
    Wir erstellen ein "dynamisches" Erfolgssystem, welches wir beliebig per Datenbankzugriff ändern können und im Script Erfolge durch lediglich eine Zeile vergeben.
    Dies hat vielleicht nicht immer einen wirklich praktischen Sinn, kann dafür aber sowohl den Anreiz der Spieler erhöhen, als auch für Spannung sorgen wenn die Erfolge bekannt sind.


    Erste Überlegungen...
    Der Einfachheit halber nutze ich für die grafische Darstellung den TextDraw Editor von Zamaroth. Alternativ könnt ihr aber gerne auch den Editor von iPLEOMAX verwenden, welcher meiner Meinung nach ein bisschen ausgereifter ist (nicht zuletzt wegen der neueren Version).
    Welchen Editor ihr letztendlich verwendet, ist natürlich egal. Ihr könnt gerne auch per Hand eure Textdraws schreiben. Hierbei geht es lediglich um den Komfort.


    Als nächstes müssen wir uns überlegen welche Datenspeicherungsart wir verwenden. Dabei habe ich mich für MySQL entschieden. Es gibt vielleicht auch einfachere Speicherungsmöglichkeiten
    für solch ein "kleineres" Projekt, allerdings ist dieses meiner Meinung nach am einfachsten zu bedienen. Zur Nutzung davon verwenden wir das MySQL-Plugin von Strickenkid. Solltet ihr ein anderes
    verwenden, passt euren Code bitte dementsprechend an.


    Die letzte Frage wäre dann wo wir das Script erstellen. Sicherlich wäre es möglich, dieses als Filterscript oder Include zu schreiben, doch für unsere Ansprüche (und der Einfachheit für Neulinge halber)
    werden wir es einfach in unseren Gamemode integrieren.


    Erstellen des Textdraws
    Wie erwähnt, nutze ich den Editor von Zamaroth. Deshalb könnte es Ungleichheiten zwischen diesem Code und eurem geben, wenn ihr einen anderen Editor verwendet.
    Meine Idee war für die folgenden Dinge Textdraws zu erstellen:


    • Schwarze Hintergrundbox
    • Überschrift
    • Erfolgsbeschreibung
    • Belohnung
    • "Icon" (sofern mit Texturen gearbeitet wird)


    Nach einigen Minuten Arbeit kam ich auf folgendes, meiner Meinung nach ansehnliches, Ergebnis:

    Ich habe hier zwei weitere Textdraws angebracht. Einmal den Text oben links, welcher zur Verdeutlichung des errungenen Erfolges sein soll, sowie das kleine Icon oben rechts, welches nicht wirklich einen praktischen Nutzen hat, aber wie ich finde gut aussieht.
    Nachdem ihr mit eurem Ergebnis zufrieden seid, könnt ihr es exportieren (ich habe die klassische Exportmethode verwendet). Ebenfalls müsst ihr (bei Zamaroht's leider manuell) alle TextDraws zu PlayerTextDraws umwandeln. Schaut dabei ggf. in die Wiki um die genauen Funktionsbezeichnungen und Parameter zu sehen.


    Mein Textdraw hat diesen Code:

    Textdraw Code
    new PlayerText:Box[MAX_PLAYERS];
    new PlayerText:MiniIcon[MAX_PLAYERS];
    new PlayerText:Titel[MAX_PLAYERS];
    new PlayerText:MiniInfo[MAX_PLAYERS];
    new PlayerText:Info[MAX_PLAYERS];
    new PlayerText:Belohnung[MAX_PLAYERS];
    new PlayerText:Icon[MAX_PLAYERS];

    Textdraw Code
    Box[playerid] = CreatePlayerTextDraw(playerid, 400.000000, 283.000000, "~n~");
    MiniIcon[playerid] = CreatePlayerTextDraw(playerid, 387.000000, 274.000000, "LD_CHAT:badchat");
    MiniInfo[playerid] = CreatePlayerTextDraw(playerid, 242.000000, 264.000000, "Erfolg errungen:");
    Titel[playerid] = CreatePlayerTextDraw(playerid, 320.000000, 273.000000, "Erfolgstitel");
    Info[playerid] = CreatePlayerTextDraw(playerid, 390.000000, 292.000000, "Erhalte deinen ersten Erfolg~n~und sei froh!");
    Belohnung[playerid] = CreatePlayerTextDraw(playerid, 243.000000, 320.000000, "~g~+ $500 ~w~...~g~ +10 Punkte");
    Icon[playerid] = CreatePlayerTextDraw(playerid, 245.000000, 279.000000, "ld_grav:bee1");

    Textdraw Code
    PlayerTextDrawBackgroundColor(playerid, Box[playerid], 255);
    PlayerTextDrawFont(playerid, Box[playerid], 1);
    PlayerTextDrawLetterSize(playerid, Box[playerid], 0.569998, 5.399999);
    PlayerTextDrawColor(playerid, Box[playerid], -1);
    PlayerTextDrawSetOutline(playerid, Box[playerid], 0);
    PlayerTextDrawSetProportional(playerid, Box[playerid], 1);
    PlayerTextDrawSetShadow(playerid, Box[playerid], 1);
    PlayerTextDrawUseBox(playerid, Box[playerid], 1);
    PlayerTextDrawBoxColor(playerid, Box[playerid], 150);
    PlayerTextDrawTextSize(playerid, Box[playerid], 240.000000, 0.000000);

    Textdraw Code
    PlayerTextDrawBackgroundColor(playerid, MiniIcon[playerid], 255);
    PlayerTextDrawFont(playerid, MiniIcon[playerid], 4);
    PlayerTextDrawLetterSize(playerid, MiniIcon[playerid], 0.500000, 1.000000);
    PlayerTextDrawColor(playerid, MiniIcon[playerid], -1);
    PlayerTextDrawSetOutline(playerid, MiniIcon[playerid], 0);
    PlayerTextDrawSetProportional(playerid, MiniIcon[playerid], 1);
    PlayerTextDrawSetShadow(playerid, MiniIcon[playerid], 1);
    PlayerTextDrawUseBox(playerid, MiniIcon[playerid], 1);
    PlayerTextDrawBoxColor(playerid, MiniIcon[playerid], 255);

    Textdraw Code
    PlayerTextDrawTextSize(playerid, MiniIcon[playerid], 20.000000, 20.000000);

    Textdraw Code
    PlayerTextDrawAlignment(playerid, Titel[playerid], 2);
    PlayerTextDrawBackgroundColor(playerid, Titel[playerid], 255);
    PlayerTextDrawFont(playerid, Titel[playerid], 0);
    PlayerTextDrawLetterSize(playerid, Titel[playerid], 0.519999, 1.700000);
    PlayerTextDrawColor(playerid, Titel[playerid], -1);
    PlayerTextDrawSetOutline(playerid, Titel[playerid], 1);
    PlayerTextDrawSetProportional(playerid, Titel[playerid], 1);

    Textdraw Code
    PlayerTextDrawBackgroundColor(playerid, MiniInfo[playerid], 255);
    PlayerTextDrawFont(playerid, MiniInfo[playerid], 2);
    PlayerTextDrawLetterSize(playerid, MiniInfo[playerid], 0.209999, 1.000000);
    PlayerTextDrawColor(playerid, MiniInfo[playerid], -65281);
    PlayerTextDrawSetOutline(playerid, MiniInfo[playerid], 1);
    PlayerTextDrawSetProportional(playerid, MiniInfo[playerid], 1);

    Textdraw Code
    PlayerTextDrawAlignment(playerid, Info[playerid], 3);
    PlayerTextDrawBackgroundColor(playerid, Info[playerid], 255);
    PlayerTextDrawFont(playerid, Info[playerid], 1);
    PlayerTextDrawLetterSize(playerid, Info[playerid], 0.209999, 1.299999);
    PlayerTextDrawColor(playerid, Info[playerid], -1);
    PlayerTextDrawSetOutline(playerid, Info[playerid], 0);
    PlayerTextDrawSetProportional(playerid, Info[playerid], 1);
    PlayerTextDrawSetShadow(playerid, Info[playerid], 1);

    Textdraw Code
    PlayerTextDrawBackgroundColor(playerid, Belohnung[playerid], 255);
    PlayerTextDrawFont(playerid, Belohnung[playerid], 1);
    PlayerTextDrawLetterSize(playerid, Belohnung[playerid], 0.209999, 1.299999);
    PlayerTextDrawColor(playerid, Belohnung[playerid], -1);
    PlayerTextDrawSetOutline(playerid, Belohnung[playerid], 0);
    PlayerTextDrawSetProportional(playerid, Belohnung[playerid], 1);
    PlayerTextDrawSetShadow(playerid, Belohnung[playerid], 1);

    Textdraw Code
    PlayerTextDrawBackgroundColor(playerid, Icon[playerid], 255);
    PlayerTextDrawFont(playerid, Icon[playerid], 4);
    PlayerTextDrawLetterSize(playerid, Icon[playerid], 0.500000, 1.000000);
    PlayerTextDrawColor(playerid, Icon[playerid], -1);
    PlayerTextDrawSetOutline(playerid, Icon[playerid], 0);
    PlayerTextDrawSetProportional(playerid, Icon[playerid], 1);
    PlayerTextDrawSetShadow(playerid, Icon[playerid], 1);
    PlayerTextDrawUseBox(playerid, Icon[playerid], 1);
    PlayerTextDrawBoxColor(playerid, Icon[playerid], 255);
    PlayerTextDrawTextSize(playerid, Icon[playerid], 40.000000, 40.000000);


    Coding:
    Da wir nun alle Informationen und vor allem unsere TextDraw's haben, ist unser jetziger Schritt das eigentliche Coden. Zuerst müssen wir alle PlayerText-Variablen deklarieren. Also ganz oben, außerhalb jedes Callbacks in das Script:
    new PlayerText:Box[MAX_PLAYERS];
    new PlayerText:MiniIcon[MAX_PLAYERS];
    new PlayerText:Titel[MAX_PLAYERS];
    new PlayerText:MiniInfo[MAX_PLAYERS];
    new PlayerText:Info[MAX_PLAYERS];
    new PlayerText:Belohnung[MAX_PLAYERS];
    new PlayerText:Icon[MAX_PLAYERS]; 
    Ausnahmsweise gilt hier fast ausschließlich Copy and Paste. Wir wollen ja nicht immer alles aus unserem Textdokument abschreiben.
    Auch kann es ziemlich irritierend sein, die TextDraws für jeden Spieler bereits bei OnPlayerConnect/Spawn zu initialisieren, also schreiben wir uns dafür eine neue Funktion:
    InitialisePlayerAchievements(playerid)
    {
    Box[playerid] = CreatePlayerTextDraw(playerid, 400.000000, 283.000000, "~n~");
    MiniIcon[playerid] = CreatePlayerTextDraw(playerid, 387.000000, 274.000000, "LD_CHAT:badchat");
    MiniInfo[playerid] = CreatePlayerTextDraw(playerid, 242.000000, 264.000000, "Erfolg errungen:");
    Titel[playerid] = CreatePlayerTextDraw(playerid, 320.000000, 273.000000, "");
    Info[playerid] = CreatePlayerTextDraw(playerid, 390.000000, 292.000000, "");
    Belohnung[playerid] = CreatePlayerTextDraw(playerid, 243.000000, 320.000000, "");
    Icon[playerid] = CreatePlayerTextDraw(playerid, 245.000000, 279.000000, "");


    PlayerTextDrawBackgroundColor(playerid, Box[playerid], 255);
    PlayerTextDrawFont(playerid, Box[playerid], 1);
    PlayerTextDrawLetterSize(playerid, Box[playerid], 0.569998, 5.399999);
    PlayerTextDrawColor(playerid, Box[playerid], -1);
    PlayerTextDrawSetOutline(playerid, Box[playerid], 0);
    PlayerTextDrawSetProportional(playerid, Box[playerid], 1);
    PlayerTextDrawSetShadow(playerid, Box[playerid], 1);
    PlayerTextDrawUseBox(playerid, Box[playerid], 1);
    PlayerTextDrawBoxColor(playerid, Box[playerid], 150);
    PlayerTextDrawTextSize(playerid, Box[playerid], 240.000000, 0.000000);


    PlayerTextDrawBackgroundColor(playerid, MiniIcon[playerid], 255);
    PlayerTextDrawFont(playerid, MiniIcon[playerid], 4);
    PlayerTextDrawLetterSize(playerid, MiniIcon[playerid], 0.500000, 1.000000);
    PlayerTextDrawColor(playerid, MiniIcon[playerid], -1);
    PlayerTextDrawSetOutline(playerid, MiniIcon[playerid], 0);
    PlayerTextDrawSetProportional(playerid, MiniIcon[playerid], 1);
    PlayerTextDrawSetShadow(playerid, MiniIcon[playerid], 1);
    PlayerTextDrawUseBox(playerid, MiniIcon[playerid], 1);
    PlayerTextDrawBoxColor(playerid, MiniIcon[playerid], 255);
    PlayerTextDrawTextSize(playerid, MiniIcon[playerid], 20.000000, 20.000000);


    PlayerTextDrawAlignment(playerid, Titel[playerid], 2);
    PlayerTextDrawBackgroundColor(playerid, Titel[playerid], 255);
    PlayerTextDrawFont(playerid, Titel[playerid], 0);
    PlayerTextDrawLetterSize(playerid, Titel[playerid], 0.519999, 1.700000);
    PlayerTextDrawColor(playerid, Titel[playerid], -1);
    PlayerTextDrawSetOutline(playerid, Titel[playerid], 1);
    PlayerTextDrawSetProportional(playerid, Titel[playerid], 1);


    PlayerTextDrawBackgroundColor(playerid, MiniInfo[playerid], 255);
    PlayerTextDrawFont(playerid, MiniInfo[playerid], 2);
    PlayerTextDrawLetterSize(playerid, MiniInfo[playerid], 0.209999, 1.000000);
    PlayerTextDrawColor(playerid, MiniInfo[playerid], -65281);
    PlayerTextDrawSetOutline(playerid, MiniInfo[playerid], 1);
    PlayerTextDrawSetProportional(playerid, MiniInfo[playerid], 1);


    PlayerTextDrawAlignment(playerid, Info[playerid], 3);
    PlayerTextDrawBackgroundColor(playerid, Info[playerid], 255);
    PlayerTextDrawFont(playerid, Info[playerid], 1);
    PlayerTextDrawLetterSize(playerid, Info[playerid], 0.209999, 1.299999);
    PlayerTextDrawColor(playerid, Info[playerid], -1);
    PlayerTextDrawSetOutline(playerid, Info[playerid], 0);
    PlayerTextDrawSetProportional(playerid, Info[playerid], 1);
    PlayerTextDrawSetShadow(playerid, Info[playerid], 1);


    PlayerTextDrawBackgroundColor(playerid, Belohnung[playerid], 255);
    PlayerTextDrawFont(playerid, Belohnung[playerid], 1);
    PlayerTextDrawLetterSize(playerid, Belohnung[playerid], 0.209999, 1.299999);
    PlayerTextDrawColor(playerid, Belohnung[playerid], -1);
    PlayerTextDrawSetOutline(playerid, Belohnung[playerid], 0);
    PlayerTextDrawSetProportional(playerid, Belohnung[playerid], 1);
    PlayerTextDrawSetShadow(playerid, Belohnung[playerid], 1);


    PlayerTextDrawBackgroundColor(playerid, Icon[playerid], 255);
    PlayerTextDrawFont(playerid, Icon[playerid], 4);
    PlayerTextDrawLetterSize(playerid, Icon[playerid], 0.500000, 1.000000);
    PlayerTextDrawColor(playerid, Icon[playerid], -1);
    PlayerTextDrawSetOutline(playerid, Icon[playerid], 0);
    PlayerTextDrawSetProportional(playerid, Icon[playerid], 1);
    PlayerTextDrawSetShadow(playerid, Icon[playerid], 1);
    PlayerTextDrawUseBox(playerid, Icon[playerid], 1);
    PlayerTextDrawBoxColor(playerid, Icon[playerid], 255);
    PlayerTextDrawTextSize(playerid, Icon[playerid], 40.000000, 40.000000);
    }Nun haben wir alle Initialisierungen in einer neuen Funktion, welche wir am besten an das Ende des Scripts setzen. Beachtet jedoch, dass wenn ihr eine normale Funktion verwendet (Anstatt stock/public), dass ihr dann auch keine Fehlermeldungen bekommt, wenn etwas daran falsch ist, solange ihr sie nirgends verwendet.
    Mit der Funktion, welche den Übergabeparameter playerid möchte, können wir nun vorzugsweise in OnPlayerConnect alle Erfolgstextdraws initialisieren:
    InitialisePlayerAchievements(playerid);


    Damit haben wir alle Textdraws im Script und können das vom Editor exportierte Dokument schließen. Als nächstes wollen wir uns nämlich für die MySQL-Verbindung vorbereiten. Bitte seht euch z.B. dieses MySQL-Tutorial an, damit ihr in der Lage seid eine Verbindung zu eurem Server herzustellen. Eine genaue Erklärung zu MySQL und seiner Funktionsweise in PAWN findet ihr dort, bei mir geht es nur um das Erfolgssystem, weshalb ich gar nicht zu lange auf diese Funktionen eingehen möchte.
    Für den Erfolgsaufruf benötigen wir eine Abfrage, einen Timer und ein wenig Wissen. Wir erstellen uns also eine neue Funktion:
    AwardAchievement(playerid, achievementid)
    {
    new query[64], z[24], titel[24], inhalt[64], geld, punkte, icon[64];
    format(query, sizeof(query), "SELECT * WHERE ID = %i", achievementid);
    mysql_query(query);
    mysql_store_result();
    mysql_fetch_field("titel", titel);
    mysql_fetch_field("inhalt", inhalt);
    mysql_fetch_field("icon", icon);
    mysql_fetch_field("geld", z);
    geld = strval(z);
    mysql_fetch_field("punkte", z);
    punkte = strval(z);
    mysql_free_result();

    Hieran sehen wir bereits wie unsere MySQL-Tabelle aufgebaut sein muss:
    [table='6''][*]ID[*]titel[*]inhalt[*]icon[*]geld[*]punkte[*]1[*]Erfolgstitel[*]Erhalte deinen ersten Erfolg und sei froh![*]ld_grav:bee1[*]500[*]100[/table]


    Aktuell macht unsere Funktion allerdings noch nichts, als alle Daten aus der Datenbank mit der ID = achievementid abzufragen. Verarbeitet wird aktuell noch nichts. Das wollen wir ändern. Folgendes kommt nach der MySQL-Abfrage:
    GivePlayerMoney(playerid, geld); // Addiert das Belohnungsgeld zum aktuellen Spielergeld
    SetPlayerScore(playerid, GetPlayerScore(playerid)+punkte); // Addiert die Belohnungspunkte zur aktuellen Spielerpunktzahl


    PlayerTextDrawSetString(playerid, Titel[playerid], titel); // Setzt den Titel auf den abgefragten Titel
    PlayerTextDrawSetString(playerid, Info[playerid], info); // ...
    PlayerTextDrawSetString(playerid, Icon[playerid], icon); // ...


    new belohnung[48]; // Deklariert einen neuen String, welcher uns für die Belohnung dient.
    if (geld > 0) // Gibt es eine Geldbelohnung?
    {
    format(belohnung, sizeof(belohnung), "~g~+ $%i", geld); // Wenn ja, dann formatiere sie.
    if(punkte > 0) // Gibt es auch Punkte?
    {
    new punktebelohnung[24];
    format(punktebelohnung, sizeof(punktebelohnung), " ~w~... ~g~+ %i Punkte", punkte); // Wenn ja, dann formatiere sie...
    strcat(belohnung, punktebelohnung); // ... und füge sie mit dem Geldstring zusammen.
    }
    }
    else if (punkte > 0) // Gibt es kein Geld, sondern nur Punkte:
    {
    format(belohnung, sizeof(belohnung), "~g~+ %i Punkte", punkte); // Formatiere sie
    }
    else format(belohnung, sizeof(belohnung), " "); // Gibt es garnichts: Lass es leer.
    PlayerTextDrawSetString(playerid, Belohnung[playerid], belohnung); 
    Dieser Abschnitt sieht vielleicht schon etwas komplizierter aus, doch ich hoffe, dass euch die Kommentare genug Aufschluss darüber geben, was hier vonstatten geht. Hauptsächlich kommt es dabei auf die Formatierung des Belohnungs-Textes an.


    Nun, da alle Texte ihre Richtigkeit haben, müssen wir sie darstellen:
    PlayerTextDrawShow(playerid, Box[playerid]);
    PlayerTextDrawShow(playerid, MiniIcon[playerid]);
    PlayerTextDrawShow(playerid, MiniInfo[playerid]);
    PlayerTextDrawShow(playerid, Titel[playerid]);
    PlayerTextDrawShow(playerid, Info[playerid]);
    PlayerTextDrawShow(playerid, Belohnung[playerid]);
    PlayerTextDrawShow(playerid, Icon[playerid]);
    SetTimerEx("AchievementEnd", 5000, false, "i", playerid); 
    Nun werden alle TextDraw's, die zum Erfolg gehören angezeigt und ein Timer gestartet, welcher die playerid übergibt. Die Zeit für die Anzeige der TextDraw's steht derzeit auf 5 Sekunden (5000 Millisekunden).
    Spieler in der Nähe sollen aber auch sehen, wenn jemand einen Erfolg erringt:
    new pName[MAX_PLAYER_NAME], nachricht[68], Float:pX, Float:pY, Float:pZ;
    GetPlayerName(playerid, pName, sizeof(pName));
    format(nachricht, sizeof(nachricht), "* %s hat den Erfolg \"%s\" errungen!", pName, titel);
    GetPlayerPos(playerid, pX, pY, pZ);
    for (new i = 0; i < MAX_PLAYERS; i++)
    {
    if (IsPlayerConnected(i))
    {
    if (IsPlayerInRangeOfPoint(i, 15, pX, pY, pZ) SendClientMessageToPlayer(i, COLOR_RED, nachricht);
    }
    }  
    Nun wird also erstmal der Text für die anderen Spieler definiert, woraufhin eine Schleife alle Spieler durchläuft und denjenigen in der Nähe die Nachricht schickt. Theoretisch fehlt uns jetzt nur noch eine Funktion: Das Beenden des Erfolgs. Dafür müssen wir erstmal das Callback AchievementEnd(playerid) 'forwarden'. Danach erstellen wir dieses:
    public AchievementEnd(playerid)
    {
    PlayerTextDrawHide(playerid, Box[playerid]);
    PlayerTextDrawHide(playerid, MiniIcon[playerid]);
    PlayerTextDrawHide(playerid, MiniInfo[playerid]);
    PlayerTextDrawHide(playerid, Titel[playerid]);
    PlayerTextDrawHide(playerid, Info[playerid]);
    PlayerTextDrawHide(playerid, Belohnung[playerid]);
    PlayerTextDrawHide(playerid, Icon[playerid]);
    return 1;

    Dies funktioniert theoretisch genauso wie die Anzeige der TextDraw's, bis auf die Tatsache dass sie nun wieder versteckt werden.
    Um nun Erfolge an Spieler zu vergeben müssen wir folgendes tun:
    Wir gehen an den entsprechenden Teil im Script (z.B. Registrierung) und fügen dort die Funktion ein:
    AwardAchievement(playerid, achievementid); wobei achievementid für die ID steht, welche wir in der MySQL-Tabelle eingetragen haben.


    Ein Icon muss in diesem Falle nichtmal zwangsläufig eingetragen werden. Wenn keins existiert und das Feld leer ist, wird einfach nichts angezeigt.


    Dies war der erste Teil meines Tutorials. Der zweite Teil (welcher ebenfalls hier im Thread geschrieben wird, wenn sich diesen genug Leute wünschen), wird sich mit der Speicherung der errungenen Erfolge beschäftigen.


    Gerne höre ich mir jede konstruktive Kritik an und freue mich über eure Rückmeldungen. Leider konnte ich in diesem Tutorial nicht so viel zum Code selbst erklären wie in meinen anderen Tutorials üblich, allerdings sollten die meisten Dinge hier so oder so selbsterklärend sein.


    Mit freundlichen Grüßen
    Padarom


    PS: Bitte entschuldigt die fehlende Einrückung. Seit Tagen spinnen Foren bei jedem meiner Browser so stark, dass bei jedem Klick auf Vorschau 3 Leerzeilen pro Zeile eingebaut werden. Sobald ich die rausmache, ist die Einrückung vom Code weg.
    Wenn ich diesen wieder reinmache, sind dann die 3 Leerzeilen wieder da.

    Ich bin
    .. seit etwa 2007 in der Webentwicklung tätig, seit 2013 professionell
    .. Erfahrener Entwickler in PHP, Swift, Javascript, Typescript und Ruby. Zusätzlich habe ich Erfahrung in Python, Java, C#, C++, Prolog und einigen esoterischen Programmiersprachen
    .. Luftfahrtenthusiast und Segelflieger

    8 Mal editiert, zuletzt von Padarom ()

  • Die kann man leider nicht erstellen (nur modifizieren, was dann aber auch nur lokal ist).
    Eine Liste gibt es u.A. hier. Als Icon gibst du dann beispielsweise an: LD_BEAT:upr (Für den Pfeil nach Oben rechts).
    Ich weiß leider selbst nicht so genau, ob das eine vollständige Liste ist oder nicht.

    Ich bin
    .. seit etwa 2007 in der Webentwicklung tätig, seit 2013 professionell
    .. Erfahrener Entwickler in PHP, Swift, Javascript, Typescript und Ruby. Zusätzlich habe ich Erfahrung in Python, Java, C#, C++, Prolog und einigen esoterischen Programmiersprachen
    .. Luftfahrtenthusiast und Segelflieger

  • aber eine Frage das Icon was hast du da in den Editor eingegeben, das das kam?


    Ich habe ein "Update" von MakuPL genommen. Wenn du da auf Font Type klickst, gibt es als Menüpunkt bereits "Texture".




    Und danke für die Bewertung :)

    Ich bin
    .. seit etwa 2007 in der Webentwicklung tätig, seit 2013 professionell
    .. Erfahrener Entwickler in PHP, Swift, Javascript, Typescript und Ruby. Zusätzlich habe ich Erfahrung in Python, Java, C#, C++, Prolog und einigen esoterischen Programmiersprachen
    .. Luftfahrtenthusiast und Segelflieger

  • Ich find echt Hammer,aber du hättest noch besser Erklären sollen wo die Funktionen hinsollen weil das hast du soweit ich das sehe nureinmal gesagt am anfang bei OnPlayerConnect


    Aber trotzdem geil ;)

    Bewertung: 9/10



    Mach weiter so...! ^^

    Der Fehler sitzt meistens vor dem Gerät. :thumbup:

  • Gut erklärt :) passt schon so aber was mich etwas stört das es so C+P freundlich ist wie währe es wenn du die Leute dazu nötigst das sie weniger C+P machen können und sich den Text durchlesen ?
    Und format(belohnung, sizeof(belohnung), " "); könntest du ja mit strdel(belohnung, 0, sizeof(belohnung)); ersetzen ich denke du weißt warum ^^

  • Schade... Funzt bei mir nicht so versuche schon zu fixxen will aber nicht...



    **.pwn(5999) : error 035: argument type mismatch (argument 1)
    **.pwn(6000) : error 035: argument type mismatch (argument 1)
    **.pwn(6001) : error 035: argument type mismatch (argument 1)
    **.pwn(6002) : error 035: argument type mismatch (argument 1)
    **.pwn(6004) : error 035: argument type mismatch (argument 1)


    hier die Zeilen:

    Spoiler anzeigen


    AwardAchievement(playerid, achievementid)
    {
    new query[64], z[24], titel[24], inhalt[64], geld, punkte, icon[64];
    format(query, sizeof(query), "SELECT * FROM erfolge WHERE ID = %i", achievementid);
    mysql_query(query);
    mysql_store_result();
    mysql_fetch_field("titel", titel); // 5999
    mysql_fetch_field("inhalt", inhalt); //6000
    mysql_fetch_field("icon", icon); //6001
    mysql_fetch_field("geld", z); //6002
    geld = strval(z);
    mysql_fetch_field("punkte", z); //6004
    punkte = strval(z);
    mysql_free_result();
    GivePlayerMoney(playerid, geld);
    SpielerInfo[playerid][RespektPunkte] = SpielerInfo[playerid][RespektPunkte]+punkte;

    Spoiler anzeigen
    PlayerTextDrawSetString(playerid, Titel[playerid], titel);
    PlayerTextDrawSetString(playerid, Info[playerid], inhalt);
    PlayerTextDrawSetString(playerid, Icon[playerid], icon);

    Spoiler anzeigen
    new belohnung[48];
    if (geld > 0)
    {
    format(belohnung, sizeof(belohnung), "~g~+ $%i", geld);
    if(punkte > 0)
    {
    new punktebelohnung[24];
    format(punktebelohnung, sizeof(punktebelohnung), " ~w~... ~g~+ %i Punkte", punkte);
    strcat(belohnung, punktebelohnung);
    }
    }
    else if (punkte > 0)
    {
    format(belohnung, sizeof(belohnung), "~g~+ %i Punkte", punkte);
    }
    else format(belohnung, sizeof(belohnung), " ");
    PlayerTextDrawSetString(playerid, Belohnung[playerid], belohnung);
    PlayerTextDrawShow(playerid, Box[playerid]);
    PlayerTextDrawShow(playerid, MiniIcon[playerid]);
    PlayerTextDrawShow(playerid, MiniInfo[playerid]);
    PlayerTextDrawShow(playerid, Titel[playerid]);
    PlayerTextDrawShow(playerid, Info[playerid]);
    PlayerTextDrawShow(playerid, Belohnung[playerid]);
    PlayerTextDrawShow(playerid, Icon[playerid]);
    SetTimerEx("AchievementEnd", 5000, false, "i", playerid);
    }


    // Schon erledigt...


  • native mysql_fetch_field(number,dest[],connectionHandle = 1);

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen