Du musst:
for(new i=0; i<5; i++)
jeweils an die Größe des Arrays (3,4,8) anpassen, also bei SPlanes muss die 5 eine 8 sein, usw.
Du musst:
for(new i=0; i<5; i++)
jeweils an die Größe des Arrays (3,4,8) anpassen, also bei SPlanes muss die 5 eine 8 sein, usw.
Nicht?
Poste dann bitte noch die GetNearestAirport Funktion.
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
ZitatDie 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
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
Wir arbeiten uns durch den Code
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.
stock ShowPlayerDialog_Ex(playerid, dialogid, style, caption[], info[], button1[], button2[])
{
//Wir speichern in der Spielervariable, dass der Spieler (playerid) den jeweiligen Dialog (dialogid) geöffnet hat.
g_PlayerDialog[playerid] = dialogid;
//Der Dialog wird angezeigt. Bis auf das _Ex am Ende ändert sich an der Funktion gar nichts.
ShowPlayerDialog(playerid, dialogid, style, caption, info, button1, button2);
//Wurde ein existierender Dialog geöffnet, dann werden die Daten für die Anzeige gespeichert.
if(dialogid > -1 && dialogid < MAX_OWN_DIALOGS)
{
format(g_dCaption[dialogid], sizeof(g_dCaption[]), caption);
format(g_dInfo[dialogid], sizeof(g_dInfo[]), info);
format(g_dButton1[dialogid], sizeof(g_dButton1[]), button1);
format(g_dButton2[dialogid], sizeof(g_dButton2[]), button2);
}
//Nach erfolgreicher Ausführung der Funktion geben wir 1 zurück.
return 1;
}
Alles anzeigen
stock AddItemToDialog(dialogid, item[])
{
//Wir suchen das item.
new l_pos = strfind(g_dInfo[dialogid], item);
//Wurde das item gefunden, dann wird es entfernt.
if(l_pos != -1) strdel(g_dInfo[dialogid], l_pos, l_pos+strlen(item)+1);
//Anschließend wird das item in die Liste eingetragen.
format(g_dInfo[dialogid], sizeof(g_dInfo[]), "%s%s\n", g_dInfo[dialogid], item);
//Wir beenden die Funktion mit der Anweisung, den Dialog für alle Spieler zu aktualisieren.
return UpdateDialogForAll(dialogid);
}
Alles anzeigen
stock RemoveItemFromDialog(dialogid, item[])
{
//Wir suchen das item.
new l_pos = strfind(g_dInfo[dialogid], item);
//Wurde das item nicht gefunden, dann wird auch nichts gemacht.
if(l_pos == -1) return 0;
//Ansonsten wird es entfernt.
strdel(g_dInfo[dialogid], l_pos, l_pos+strlen(item)+1);
//Wir beenden die Funktion mit der Anweisung, den Dialog für alle Spieler zu aktualisieren.
return UpdateDialogForAll(dialogid);
}
Alles anzeigen
stock UpdateDialogForAll(dialogid)
{
//Wir machen einen Durchlauf durch alle Spieler-IDs (i)
for(new i=0; i<MAX_PLAYERS; i++)
{
//Wenn der Spieler den veränderten Dialog offen hat...
if(g_PlayerDialog[i] == dialogid)
{
//...dann wird er ihm/ihr erneut gezeigt.
ShowPlayerDialog(i, g_PlayerDialog[i], DIALOG_STYLE_LIST, g_dCaption[g_PlayerDialog[i]], g_dInfo[g_PlayerDialog[i]], g_dButton1[g_PlayerDialog[i]], g_dButton2[g_PlayerDialog[i]]);
}
}
return 1;
}
Alles anzeigen
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.
stock GetItemFromDialog(dialogid, listitem)
{
new l_str[64], c_count, l_lastpos = -1, tmp[sizeof(g_dInfo[])];
for(new i=0; i<strlen(g_dInfo[dialogid]); i++)
{
if(g_dInfo[dialogid][i] == '\n')
{
if(c_count == listitem)
{
tmp = g_dInfo[dialogid];
strdel(tmp, i, strlen(g_dInfo[dialogid]));
strdel(tmp, 0, l_lastpos+1);
break;
}
c_count++;
l_lastpos = i;
}
}
format(l_str, sizeof(l_str), tmp);
return l_str;
}
Alles anzeigen
public OnPlayerCommandText(playerid, cmdtext[])
{
//Wir erstellen den command
if(!strcmp("/ListeZeigen", cmdtext, true))
{
//Wenn die Länge des Info-Textes 0 (!) ist, dann ist niemand in der Liste (nichts eingetragen)
if(!strlen(GetDialogInfo(0))) return SendClientMessage(playerid, 0xFF0000FF, "Es ist niemand in der Liste.");
//Ansonsten wird dem Spieler die Liste angezeigt.
ShowPlayerDialog_Ex(playerid, 0, DIALOG_STYLE_LIST, "Beispiel", GetDialogInfo(0), "Ausw.", "Cancel");
return 1;
}
if(!strcmp("/InListeEintragen", cmdtext, true))
{
//Wir tragen uns in die Liste mit der ID 0 ein.
AddItemToDialog(0, SpielerName(playerid));
return 1;
}
if(!strcmp("/AusListeAustragen", cmdtext, true))
{
//Und wir tragen uns wieder aus der Liste mit der ID 0 aus.
RemoveItemFromDialog(0, SpielerName(playerid));
return 1;
}
return 0;
}
Alles anzeigen
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
//Wählt der SPieler etwas aus, dann wir der Dialog immer geschlossen, das ist Standard in SA-MP, daher hat er/sie keinen Dialog mehr offen, also -1.
g_PlayerDialog[playerid] = -1;
//Hier fragen wir nun ab, ob der dialog die ID 0 hat, und ob die Antwort (response) auch wahr ist (also nicht Cancel).
if(dialogid == 0 && response == 1)
{
//Wenn ja, führen wir den gewünschten Code aus. Hier einfach ein Beispiel wie man es machen kann.
//Wir suchen aus der Liste einfach die Spieler-ID anhand des Namens, der ja in der Liste eingetragen worden war.
new item[64], l_found_id = -1;
//GetItemFromDialog gibt uns den Name anhand des listitems zurück.
item = GetItemFromDialog(dialogid, listitem);
//Wurde ein falsches listitem übergeben (sollte hier nicht vorkommen, aber bei anderen Dingen vielleicht), dann wird ein Fehler ausgegeben.
if(!strlen(item)) return SendClientMessage(playerid, 0xFF0000FF, "Fehler: Item nicht gefunden");
//Anschließend suchen wir den Name des Spielers.
for(new i=0; i<MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i) && !strcmp(SpielerName(i), item))
{
//Wurde der Name gefunden, wird seine/ihre ID gespeichert und die Schleife beendet (break).
l_found_id = i;
break;
}
}
//Schlussendlich geben wir einfach eine Nachricht aus. Man könnte hier alles mögliche machen, z.B. zu l_found_id teleportieren, eine Nachricht an ihn/sie Schicken, etc.
new l_str[144];
format(l_str, sizeof(l_str), "Info: Ich habe Spieler %s mit der ID %d angeklickt.", SpielerName(l_found_id), l_found_id);
return SendClientMessage(playerid, -1, l_str);
}
return 0;
}
Alles anzeigen
Für die Faulen unter uns
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 ![]()
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]);
}
Dann schalte mal den Debug Modus des MySQL Plugins ein, und dann poste was im server_log.txt steht, nachdem die Überprüfung auf Ban oder nicht stattgefunden hat. Das Query scheint irgendwas falsches bzw. gar nichts zurückzugeben.
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.
Dann solltest du den Code gründlich debuggen. Füge immer wieder print's ein, und lasse dir die Werte ausgeben, dann kannst du sie auf Richtigkeit überprüfen und ggf. den Fehler ausbessern.
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. ![]()
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.
if(GetVehicleModel(GetPlayerVehicleID(playerid)) == MODEL_ID || GetVehicleModel(GetPlayerVehicleID(playerid)) == ANDERES_MODEL)
@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]):
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.
Hey, kann man ein Pickup erstellen, der so aussieht wie ein infernus ?
Nein.
Code + Log posten, so wie es im Moment ist.
Außerdem einen Screenshot von deiner Datenbank.