Beiträge von Jeffry

    Aufgrund von Anfrage in PM:


    Zeig uns doch mal, wie du Bplanes, Hplanes und Splanes (etc?) definiert hast.
    Und zudem zeig uns bitte, wie du MAX_FLUGHAFEN (oder sowas in der Art) definiert hast.

    Die Caption in Dialogen hat übrigens 64 Zeichen, nicht 36 -> 64 + 1 | wegen \0
    der Infotext wie die Listitems sind 2048 Zeichen "stark" nicht nur 256 ^^


    Zitat

    Die Zahlen geben die jeweilige maximale Länge an, diese kann beliebig geändert werden, falls mehr benötigt wird. Zu beachten sei hier aber, dass je größer die Arrays, desto mehr Speicher muss später reserviert werden.


    Warum in aller Welt soll ich ein Array von 2048 Zeichen reservieren, wenn ich 90% davon sparen kann, weil ich es eh nie benötigen werde? Also das macht ja mal gar keinen Sinn. Wenn es benötigt wird, kann die Array-Größe angepasst werden, aber 99.9% werden wohl nie ein Menu mit einer Textlänge von 2048 Chars haben...


    Einen fehler hast du.


    Der da wäre?


    Schön und gut, dass SA:MP den Dialog "updatet" wenn man einen anderen anzeigen lässt.
    Besser wäre es, für den Clienten, wenn man den Dialog vorher verschwinden lässt.


    Und die Begründung dazu ist? Ohne eine Begründung ist diese Aussage wertlos. Ich kann im Gegensatz dazu sagen, dass es schlecht ist den Dialog erst zu entfernen, da es dann, bei schnellen Änderungen (so wie im Video) dazu kommen kann, dass der Dialog "Blinkeffekte" zeigt, ganz einfach deshalb, weil der Dialog in der Zeitspanne entsprechend der Ping des Spielers weg ist!
    Außerdem fehlt jeglicher Beweis, dass dies für den Client "besser" sein soll. Angesichts des Ressourcenverbrauchs und der Tatsache, dass Blinkeffekte auftreten werden, wird es dafür wohl auch keinen Beweis geben, falls doch bin ich jederzeit offen diesen zu sehen.

    [jTuT] Interaktive Dialoge




    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.




    Hallo zusammen,
    dies ist mein erstes Tutorial. Es wird in diesem Tutorial erklärt, wie man Dialoge interaktiv machen kann, das heißt, dass sich listitems während ein Dialog geöffnet ist, hinzufügen und entfernen lassen.


    Kurzer Überblick

    • Was bewirkt dieses Tutorial am Ende und warum lest ihr euch das durch?
      Ganz einfach! Mit wenigen Schritten und ein paar kleinen Funktionen ist es möglich, die Dialoge im Menu-Style interaktiv zu machen. Das bedeutet, es lassen sich listitems zu einem Menu hinzufügen oder entfernen, und das während der Dialog einem oder mehrerer Spieler gezeigt wird. Es werden hier keinerlei Timer benutzt, das heißt die ganze Sache wirkt sich keineswegs negativ auf die Rechenleistung eures Servers aus.
      Schaut es euch doch einfach mal an, es wird sich lohnen.





    Wir arbeiten uns durch den Code

    • Als erstes überlegen wir uns, was wir denn überhaupt an Variablen bzw. Speichermedien brauchen um unser Vorhaben zu realisieren.


      Um später wissen zu können, welcher Spieler gerade welchen Dialog offen hat, müssen wir eine globale (g_) Variable für alle Spieler erstellen (daher das MAX_PLAYERS-Array). Um Fehler zu verhindern, setzen wir den Wert für alle Spieler gleich auf -1.

      C
      new g_PlayerDialog[MAX_PLAYERS] = {-1,...};
    • Anschließend müssen wir auch noch Variablen definieren, die wir später brauchen, um die Dialoge sauber und mit möglichst wenig Aufwand wieder anzeigen zu können. Außerdem wollen wir ja verhindern, zig mal das gleiche im Code stehen zu haben, daher machen wir es gleich mit Variablen, die wir später flexibel aufrufen können.
      Dazu benötigen wir eine Konstante MAX_OWN_DIALOGS, diese gibt an, wie viele Dialoge im gesamten Code benutzt werden. Hierbei sollte die größte Dialog-ID, die benutzt wird, beachtet werden.
      Außerdem brauchen wir noch globale Variablen für die Überschrift (Caption), den Menutext (Info) und die zwei Buttons (Button1 & Button2). Die Zahlen geben die jeweilige maximale Länge an, diese kann beliebig geändert werden, falls mehr benötigt wird. Zu beachten sei hier aber, dass je größer die Arrays, desto mehr Speicher muss später reserviert werden.

      C
      #define MAX_OWN_DIALOGS 100
      new g_dCaption[MAX_OWN_DIALOGS][36];
      new g_dInfo[MAX_OWN_DIALOGS][256];
      new g_dButton1[MAX_OWN_DIALOGS][8];
      new g_dButton2[MAX_OWN_DIALOGS][8];
    • Jetzt erstellen wir die Funktion, die uns das Menu anzeigen lässt und gleichzeitig die jeweiligen vergebenen Werte speichert.

    • Und wenn wir schon dabei sind, dann erstellen wir noch ein paar kleine aber nützliche Funktionen um später die Werte angenehm auszulesen.
      Die jeweilige Funktion gibt lediglich den definierten Wert der jeweiligen zu einem Dialog gehörenden Variable zurück.

      C
      stock GetPlayerDialog(playerid)
      {
      	return g_PlayerDialog[playerid];
      }


      C
      stock GetDialogCaption(dialogid)
      {
      	return g_dCaption[dialogid];
      }


      C
      stock GetDialogInfo(dialogid)
      {
      	return g_dInfo[dialogid];
      }


      C
      stock GetDialogButton1(dialogid)
      {
      	return g_dButton1[dialogid];
      }


      C
      stock GetDialogButton2(dialogid)
      {
      	return g_dButton2[dialogid];
      }
    • Und wenn wir schon dabei sind, dann definieren wir auch gleich noch SpielerName, einfach eine kleine Funktion die uns das Leben leichter macht.


      C
      stock SpielerName(playerid)
      {
      	new l_name[MAX_PLAYER_NAME];
      	GetPlayerName(playerid, l_name, sizeof(l_name));
      	return l_name;
      }
    • Jetzt kommen wir zu einem sehr wichtigen Teil der interaktiven Dialoge, dem Hinzufügen und dem Entfernen von Items im Menu.
      Fangen wir mit dem Hinzufügen an. Wir definieren eine Funktion AddItemToDialog in der wir die dialogid und den Text des Items mitgeben. Um Fehler zu verhindern, überprüfen wir, ob das selbe Item bereits in der Liste ist, falls ja, wird es entfernt und erneut hinzugefügt.


    • Das Selbe machen wir nun auch mit dem Entfernen von Items aus dem Dialog.


    • Jetzt haben wir die Funktion UpdateDialogForAll zwar schon zwei mal aufgerufen, wir haben sie aber noch gar nicht definiert. Das machen wir jetzt:


    • Kurze Erklärung zu dem hier:

      C
      g_dInfo[g_PlayerDialog[i]]


      Was macht das?
      Es ruft den Info-Text (g_dInfo) von der dialog-id auf (g_PlayerDialog) die der Spieler (i) geöffnet hat auf.

    • Wir benötigen jetzt noch eine kleine Funktion, die uns ein item anhand des listitems von OnDialogResponse zurückgibt:
      Dazu zählen wir einfach die Zeilenumbrüche (\n). Wurde die richtige Anzahl gefunden (=listitem), dann wird der string zerstückelt und das item zurückgegeben.
      Ich spare mir hier die Erklärungen im Code, das würde es nur unleserlich und unverständlich machen.

    • Dann kommen wir jetzt zu den Callbacks die wir bestücken. Fangen wir zuerst mit dem kürzesten an:


      C
      public OnPlayerDisconnect(playerid, reason)
      {
      	//Wenn der Spieler den Server verlässt, dann hat er/sie keinen Dialog mehr offen, also sagen wir, dass die offene dialogid -1 ist.
      	g_PlayerDialog[playerid] = -1;
      	return 1;
      }
    • Und zu guter Letzt noch ein Nutzungsbeispiel der Funktionen:


    • Abschließend dann noch das Beispiel zu OnDialogResponse:


    • Und damit wären wir auch durch. Alles ist jetzt funktionsfähig und kann beliebig erweitert werden.





    Für die Faulen unter uns

    • Natürlich habe ich für die Faulen unter uns einen fertigen FilterScript.









    Damit wäre alles gesagt. Falls noch Fragen sind, gerne hier in diesem Thread stellen. Ich hoffe dem einen oder anderen hilft dieses Tutorial. Damit es auch noch anderen hilft, hinterlasst doch einfach kurz eine Rückmeldung, damit der Thread nicht stirbt.
    Gerne freue ich mich auch, wenn Ihr den grünen Daumen drückt und damit eure Anerkennung zeigt.


    Beste Grüße,
    Jeffry 8)

    if(PlayerInfo[playerid][pSupporter] >= 1)
    {
    format(string, sizeof(string), "Supporter %s[%d]: %s", sendername, playerid, cmdtext[strlen(cmd)+1]);
    }
    else if(PlayerInfo[playerid][pAdmin] <= 5)
    {
    format(string, sizeof(string), "Administrator %s[%d]: %s", sendername, playerid, cmdtext[strlen(cmd)+1]);
    }
    else if(PlayerInfo[playerid][pAdmin] == 1338)
    {
    format(string, sizeof(string), "Lead Admin %s[%d]: %s", sendername, playerid, cmdtext[strlen(cmd)+1]);
    }
    else if(PlayerInfo[playerid][pAdmin] == 1339)
    {
    format(string, sizeof(string), "Servermanager %s[%d]: %s", sendername, playerid, cmdtext[strlen(cmd)+1]);
    }
    else if(PlayerInfo[playerid][pAdmin] == 2000)
    {
    format(string, sizeof(string), "Serverleiter %s[%d]: %s", sendername, playerid, cmdtext[strlen(cmd)+1]);
    }

    mysql_query(query);
    mysql_store_result();

    Hat das einen Grund warum das zweimal da steht? Einmal vor den "new" s und einmal danach? Mir wäre keiner bekannt.
    Mach das mal nach den "new" s weg.


    Auf jeden Fall findet er in dem ausgegebenen result keine Zeile, also der query gibt nichts zurück. Könnte daran liegen.
    Wenn es immer noch nicht tut, derzeitiger Code mit dazu posten.

    Obiger Code ausgebessert:
    stock CheckBannedUser(playerid)
    {
    new query[256];
    format(query,sizeof(query),"SELECT * FROM banns WHERE IP='%s' OR Name='%s'",SpielerIP(playerid),SpielerInfo[playerid][pName]);
    mysql_query(query);
    mysql_store_result();
    new zeit,admin[24],reason[64], time[20],string[128];
    mysql_query(query);
    mysql_store_result();
    if(mysql_num_rows())
    {
    if(mysql_retrieve_row())
    {
    mysql_fetch_field_row(reason,"Grund");
    mysql_fetch_field_row(admin,"Admin");
    mysql_fetch_field_row(time,"Zeit"); //result fand ich nirgends definiert, habe es mal "time" genannt.
    mysql_free_result();
    zeit = strval(time);
    if(zeit == -1)
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: Unbegrenz - Grund: %s - Ausführender Admin: %s.",reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    TogglePlayerControllable(playerid,0);
    Kick(playerid);
    return 1;
    }
    else
    {
    if(gettime() < zeit)
    {
    new timebanned = zeit-gettime();
    if(floatround(timebanned/86400) > 0)//tage
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: %i Tag(e) - Grund: %s - Ausführender Admin: %s.",timebanned/86400,reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    }
    else if(floatround(timebanned/3600) > 0)//stunden
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: %i Stunde(n) - Grund: %s - Ausführender Admin: %s.",timebanned/3600,reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    }
    else if(floatround(timebanned/60) > 0 || floatround(timebanned%60) > 0)//minuten,sekunde
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: %i:%02d Minuten - Grund: %s - Ausführender Admin: %s.",timebanned/60,timebanned%60,reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    }
    }
    else
    {
    format(query,sizeof(query),"DELETE FROM banns WHERE IP ='%s' OR Name = '%s'",SpielerIP(extraid),SpielerName(extraid));
    mysql_query(query);
    }
    }
    }
    return 1;
    }
    }



    LeijaT: Dem kann ich nur zustimmen, das kam zuvor etwas anders rüber. Damit wäre das geklärt, war auch keineswegs böse gemeint, falls das so rüberkam.
    Zu meiner begleitenden Art: Ich weiß, wenn jemand was lernen will und wenn jemand nur eine Antwort haben will. So fällt dann auch der meine Post aus.

    @FleX_GuN: Dann hast du die neue Version, da ist's andersrum und mit _row:
    mysql_fetch_field_row(reason,"Grund");
    mysql_fetch_field_row(admin,"Admin");
    mysql_fetch_field_row(result,"Zeit");



    das ist Schwachsinn.


    Nein, das ist meine begründete Meinung und mit ziemlicher Sicherheit auch die Meinung des Großteils hier und aller lehrenden Personen. Es macht doch keinen Sinn, jemandem, der einen Code nicht versteht, dem diesen zu geben. Da lernt er überhaupt nichts dabei. Außerdem, wenn der Code fehlerhaft ist, dann weiß er keineswegs, wie er diesen reparieren soll. Daher ist es wesentlich besser für den Lernprozess, wenn man klein anfängt.
    Man fängt ja auch nicht mit Quadratischen Funktionen in der ersten Klasse an, sondern erstmal mit Plus und Minus, Mal und Geteilt, weil diese Dinge aufeinander aufbauen. So baut auch die Code-Optimierung auf das eigentliche Programmieren auf. Das ist eine Tatsache, das ist sowohl in der Schule als auch im Betrieb so. Unter keinen Umständen würde mein Ausbilder mir einen optimierten Code hinklatschen und sagen: Mach mal. Wo ist denn da der Lernprozess? Man sollte zu aller erst den Umgang lernen, später kann man den Code dann optimieren, sofern nötig.
    Du kannst mir nicht sagen, dass du nicht klein angefangen hast. Und dazu gehört eben auch, dass ein Code nicht optimal ist. ;)


    Der Lernprozess sollte beinhalten, dass man eigenständig und autodidaktisch die unnötige Variante perfektioniert und die Produktivität des Programms steigert.


    Wie du es ja sagst, nur leider widerspricht das deinem Widerspruch meiner Meinung. Wie soll er sich selbst die optimale Lösung erarbeiten wenn er sie hingeklatscht bekommt? Nichts gegen das Geben von Code-Teilen, die sollten aber verständlich sein. Und dieser Thread unterstützt doch zu 100% meine Aussage, nämlich dass es keinen Sinn macht einen Code zu posten, den der Fragesteller nicht mal versteht, er verwendet ihn noch nicht mal.


    Wer zulässt, dass ein Anfänger mit so einem Larifarizeugs durchstartet, hat in meinen Augen bereits zugelassen, dass es unfähige Programmierer gibt. :p


    Das würde schlussfolgernd heißen, dass alle Programmierer unfähig sind.
    Jeder startet mit simplen Methoden, das ist überall so. Schule, Uni, Betrieb. Ich hab es in allen drei Formen miterlebt, ich konnte in allen drei Formen die Programmierung bereits und dachte mir auch oft, dass es wesentlich ressourcenschonender geht, ja! Aber jemand der sich noch nicht so intensiv damit auskennt, der muss erst das Grundwissen verstehen und können, bevor er tiefer in die Materie eintauchen kann. Ansonsten versteht er es nicht. Das beste Beispiel ist dieser Thread.
    Mag sein, dass es Ausnahmen gibt, die bestätigen aber die Regel und zwar, dass 99,9% hier mit einem optimierten Code viel weniger bis nichts anfangen können.


    Damit meine Meinung als "Schwachsinn" abgestempelt wird, hätte ich wenigstens ein Argument erwartet und keinen in sich widersprechenden Widerspruch ohne jegliche Begründung.

    Ach ja, da steht zwei mal else untereinander, hatte ich übersehen. :pinch:


    stock CheckBannedUser(playerid)
    {
    new query[256];
    format(query,sizeof(query),"SELECT * FROM banns WHERE IP='%s' OR Name='%s'",SpielerIP(playerid),SpielerInfo[playerid][pName]);
    mysql_query(query);
    mysql_store_result();
    new zeit,admin[24],reason[64],string[128];
    mysql_query(query);
    mysql_store_result();
    if(mysql_num_rows())
    {
    mysql_fetch_field("Grund",reason);
    mysql_fetch_field("Admin",admin);
    mysql_fetch_field("Zeit",result);
    mysql_free_result();
    zeit = strval(result);
    if(zeit == -1)
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: Unbegrenz - Grund: %s - Ausführender Admin: %s.",reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    TogglePlayerControllable(playerid,0);
    Kick(playerid);
    return 1;
    }
    else
    {
    if(gettime() < zeit)
    {
    new timebanned = zeit-gettime();
    if(floatround(timebanned/86400) > 0)//tage
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: %i Tag(e) - Grund: %s - Ausführender Admin: %s.",timebanned/86400,reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    }
    else if(floatround(timebanned/3600) > 0)//stunden
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: %i Stunde(n) - Grund: %s - Ausführender Admin: %s.",timebanned/3600,reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    }
    else if(floatround(timebanned/60) > 0 || floatround(timebanned%60) > 0)//minuten,sekunde
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: %i:%02d Minuten - Grund: %s - Ausführender Admin: %s.",timebanned/60,timebanned%60,reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    }
    }
    else
    {
    format(query,sizeof(query),"DELETE FROM banns WHERE IP ='%s' OR Name = '%s'",SpielerIP(extraid),SpielerName(extraid));
    mysql_query(query);
    }
    }
    return 1;
    }
    }


    Jetzt aber.



    (Kleine Anmerkung an LeijaT: Das ist das was ich immer wieder predige. Optimierte Codes sind zwar gut, wenn man sie aber jemandem gibt der damit nichts anfängt haben sie keinen Sinn, ein Programmierer sollte seinen Code verstehen und da gehört es zum Lernprozess, dass man erst mit weniger "schnellen" Codes arbeitet. #Erfahrung ;) [Nichtsdestotrotz ist der Code, bzw. die Idee dahinter, natürlich kaum zu übertreffen!] )

    stock CheckBannedUser(playerid)
    {
    new query[256];
    format(query,sizeof(query),"SELECT * FROM banns WHERE IP='%s' OR Name='%s'",SpielerIP(playerid),SpielerInfo[playerid][pName]);
    mysql_query(query);
    mysql_store_result();
    new zeit,admin[24],reason[64],string[128];
    mysql_query(query);
    mysql_store_result();
    if(mysql_num_rows()){
    mysql_fetch_field("Grund",reason);
    mysql_fetch_field("Admin",admin);
    mysql_fetch_field("Zeit",result);
    mysql_free_result();
    zeit = strval(result);
    if(zeit == -1)
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: Unbegrenz - Grund: %s - Ausführender Admin: %s.",reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    TogglePlayerControllable(playerid,0);
    Kick(playerid);
    return 1;
    }
    else
    {
    if(gettime() < zeit)
    {
    new timebanned = zeit-gettime();
    if(floatround(timebanned/86400) > 0)//tage
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: %i Tag(e) - Grund: %s - Ausführender Admin: %s.",timebanned/86400,reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    }
    else if(floatround(timebanned/3600) > 0)//stunden
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: %i Stunde(n) - Grund: %s - Ausführender Admin: %s.",timebanned/3600,reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    }
    else if(floatround(timebanned/60) > 0 || floatround(timebanned%60) > 0)//minuten,sekunde
    {
    format(string, sizeof(string), "Du bist vom Server gebannt! Dauer: %i:%02d Minuten - Grund: %s - Ausführender Admin: %s.",timebanned/60,timebanned%60,reason,admin);
    SendClientMessage(playerid, COLOR_BEIGE, string);
    }
    } //Fehlte
    }
    else
    {
    format(query,sizeof(query),"DELETE FROM banns WHERE IP ='%s' OR Name = '%s'",SpielerIP(extraid),SpielerName(extraid));
    mysql_query(query);
    }
    return 1;
    }

    Totenkopf[playerid] = CreatePickup(1254, 1, X, Y, Z, 0);
    Totenkopf[playerid] = SetTimerEx("TotenlopfLöschen",10000,false,"i",playerid);


    Zwei mal die gleiche Variable.
    Nenn die vom Timer "TotenkopfTimer[playerid]" oder so, dann gehts.

    stock GetNearestAirport(playerid)//hier soll der nähste Punkt herausgefunden werden.
    {
    new Float:max = 1000000.0;
    new id = -1;
    for(new i=0; i<5; i++)
    {
    new Float:dis = GetPlayerDistanceFromPoint(playerid, Splanes[i][x],Splanes[i][y],Splanes[i][z]);
    if(dis < max)
    {
    max = dis;
    id = i;
    }
    }
    return id;
    }


    Sollte selbsterklärend sein. Bei Fragen kannste gerne Fragen, dann erkläre ich es dir.

    @Hitoyoshi: Wir Programmierer sind faul, aber du hast ja einen PC, dann lass es doch den machen ;)
    Ich hab dir eine .vbs Datei angehängt (musste Sie zippen, Forum nimmt keine .vbs an), die hat folgenden Inhalt (kannste auch einfach mit einem beliebigen Editor öffnen [Rechtsklick => Bearbeiten]):

    Code
    Set fs = CreateObject("Scripting.FilesystemObject")
    Set pfad = fs.GetFolder(fs.getParentFolderName(WScript.ScriptFullName))
    Set output = fs.OpenTextFile(pfad + "\__alleIncludes.txt", 8, 1)
    For Each datei In pfad.Files
    	If(InStr(datei.name, ".inc") > 0) Then
    		output.WriteLine("#include <" + Left(datei.name, Len(datei.name)-4) + ">")
    	End If
    Next
    output.close


    (Getestet und tut)


    Die Datei (nicht den ZIP Ordner!!) fügst du in den Ordner ein, wo die Includes drinne sind. Dann einen Doppelklick auf die outputIncludes.vbs machen. Du bekommst dann nach einem kurzen Moment (wenn es 1000 Dateien sind, kann es paar Sekunden dauern) eine Datei erstellt: __alleIncludes.txt
    In der stehen dann alle Includes aufgelistet, in der Form:
    #include <beispiel>
    #include <beispiel2>
    ...


    Damit ersparst du dir die Arbeit, nur noch Copy & Paste, fertig.
    Ich hoffe das hilft dir.

    Nimm den "root" Benutzer ohne Passwort:


    #define MYSQL_HOST "127.0.0.1"
    #define MYSQL_USER "root"
    #define MYSQL_PASS ""
    #define MYSQL_DATA "DATENBANKNAME"


    Das ist in 99% aller Fälle standardmäßig so eingestellt.
    Dein user "samp" wird nicht die richtigen Berechtigungen haben, dass ist auf localhost (dein Rechner) so eingestellt, standardmäßig zumindest.
    Deshalb benutze, wie ich oben geschrieben habe, den root - User ohne Passwort, der hat ALLE Berechtigungen. Dem kannst du später auch, je nach client, ein Passwort geben.