Beiträge von Blowfish


    HostName: German Chill Roleplay

    Address: 5.35.243.41:7777

    Control Panel: http://www.chillrp.de/

    TS3 IP: chillrp.de





    Jobs



    Trucker

    Der Beruf Trucker ist in
    mehrere Level aufgeteilt und natürlich völlig legal. Die Transportfahrzeuge
    müssen von den Truckern gekauft werden und sind vom Joblevel abhängig. Sie
    reichen von klapprigen Pick-Ups in Level 1 bis hin zum Leviathan oder Raindance
    Transporthubschrauber in Level 6. Es gibt viele verschiedene Strecken und
    Fahrzeuge pro Level, somit ist der Job abwechslungsreich und das Einkommen
    fleißabhängig.


    Waffendealer

    Als Waffendealer müsst
    ihr euch hocharbeiten, indem ihr Waffen an andere Spieler oder Ammunation’s
    verkauft. Auch dieser Job ist in mehrere Level unterteilt, in denen ihr
    verschiedene Waffen herstellen und verkaufen könnt. Um Waffen bauen zu können
    benötigt man die jeweiligen Bauanleitungen, welche ihr im Schwarzmarkt findet.
    Die für die Waffen und Munition benötigten Rohstoffe sind Holz, Stahl,
    Kunststoff und Schießpulver.

    Aber Achtung: an die offiziellen „Ammunation“ Waffenläden
    können nur legale Waffen zu Geld gemacht werden.


    Drogendealer

    Die Drogendealer-Szene
    ist besonders für die Spieler von Bedeutung, die Konflikte mit anderen Fraktionen
    oder der Polizei haben. Ein Gramm Drogen bringt
    dem konsumierenden Spieler einen Bonus von zwei HP.

    Natürlich ist der Besitz, sowie das Konsumieren von Drogen illegal.

    Die Drogendealer haben die Aufgabe Drogenpakete abzuholen, diese verarbeiten zu lassen und die
    fertigen Drogen dann möglichst gewinnbringend an die Spieler zu verkaufen, der
    Verdienst ist also vom Verhandlungsgeschick des Dealers abhängig.


    Holzfäller

    Als Holzfäller ist es das
    Ziel in der Nähe von Blueberry in einem kleinen Wald am Holzfällerlager Bäume
    zu fällen. Dafür erhält man eine
    Kettensäge, mit der man so lang an einem Baum sägen muss, bis dieser

    keine Health-Points mehr hat und somit gefällt ist.
    Je nachdem wie groß der Baum ist, hat der Baum verschieden viele
    Health-Points und bringt dem Spieler unterschiedlich viel Geld.


    Bauer

    Als Bauer besteht eure
    Aufgabe darin, die Felder der Blueberry Farm im Norden von Los Santos zu
    ernten. Hierfür stehen euch Mähdrescher zur Verfügung. Dieser Job ist ein guter
    Einsteigerberuf, da keine speziellen Kenntnisse, Führerscheine oder sonstige
    Erfahrungen benötigt sind.


    Minenarbeiter

    Die Minenarbeiter müssen
    in der Mine von Las Venturas Eisenerz abbauen, indem sie mit einem Dumper eine
    Strecke abfahren. Dieser Job ist ebenfalls gut für Anfänger geeignet, setzt
    jedoch einen LKW-Führerschein voraus.


    Fischer


    Die Fischerboote liegen
    im Hafen von LS und können von jedem Fischer benutzt werden. Vorausgesetzt der Spieler
    besitzt einen Bootsführerschein.


    Mechaniker


    Mechanikern steht eine
    Flotte von Utility Vans zur Verfügung. Sie können andere Fahrzeuge reparieren,
    auftanken und tunen. Zum Tunen der Fahrzeuge kann ein übersichtliches Menü
    benutzt werden. Spieler können mit einem einfachen Befehl einen Mechaniker anfordern,
    falls ihr Tank leer ist oder ihr Fahrzeug zu stark beschädigt ist.


    Bestatter


    Gangwars sind eine recht
    blutige Angelegenheit und am Ende bleibt nur ein Berg Leichen zurück. Doch
    damit ist nun Schluss, denn die Bestatter haben den Auftrag die Leichen
    einzusammeln und zum Friedhof zu bringen, damit man ihnen die letzte Ehre
    erweisen kann.




    Freizeitangebote
    Der Autoscooterplatz
    befindet sich in Las Venturas und ist über das /navi zu finden. Es können bis
    zu 16 Spieler an einem Event teilnehmen.

    Jeder Spieler muss eine
    Startgebühr von 1000$ zahlen und der Gewinner erhält den Gesamtbetrag aller
    Startgebühren.


    Kartbahn

    Die Kartbahn wurde auf
    Basis einer realen Kartbahn erstellt. Sie befindet sich ebenfalls in Las
    Venturas und ist über das /navi zu finden.

    Fraktionen





    Staatsfraktionen


    Los Santos Police Department


    Das Los Santos Police
    Department sorgt in San Andreas für Recht und Ordnung. Die Polizisten können
    Wanteds an kriminelle Spieler vergeben und diese anschließend ins Gefängnis
    bringen. Außerdem können die Beamten Verkehrsrowdies mit Führerscheinpunkten
    bestrafen. Die Führerscheinpunkte können zu einem Entzug der Fahrerlaubnis
    führen


    Ordnungsamt


    Die Angestellten des
    Ordnungsamtes sorgen im Straßenverkehr für das richtige Verhalten der Spieler.
    Sie können ebenfalls, wie die Polizisten Führerscheinpunkte verteilen.
    Desweiteren sind Sie in der Lage falsch parkende Fahrzeuge abzuschleppen und
    Blitzer aufzustellen.






    Mafias


    La Cosa Nostra


    Die La Cosa Nostra ist
    wohl eine der bekanntesten Mafias der Welt. Sie haben gewaltige Reichtümer und
    scheuen sich nicht diese zur Schau zu stellen. Doch sind sie nicht nur reich,
    sondern auch kampferprobt. Sollte sich jemand gegen die La Cosa Nostra
    aussprechen, so wird nicht lang gefackelt und derjenige oder einer seiner
    Freunde entführt und nur für Lösegeld wieder freigelassen.


    Yakuza


    Stolz und Ehre! Das sind wohl
    die Schlagwörter die die Yakuza ausmachen. Sie haben wohl den größten Einfluss
    in San Andreas. Feinde werden oftmals entführt und festgehalten, bis für ihn
    gezahlt wurde. Sollte niemand für ihn zahlen endet eine Entführung bei der
    Yakuza meist tödlich!

    Man drückt dem Häftling
    ein Katana in die Hand und ruft den Mafia eigenen Katana-Champion in die Arena,
    in der nun auf Leben und Tod gekämpft wird.


    Tambowskaja


    Die schlagkräftigste
    Mafia in San Andreas. In der rechten Hand die AK und in der linken eine Flasche
    Vodka. Nüchtern zu kämpfen ist für die Tambowskaja eine Schande, aber Vorsicht,
    denn trinken ohne Trinkspruch ist Trinksucht. Was sie an Besitz und Macht nicht
    haben, machen sie durch ihre kämpferische Überlegenheit wieder wett.






    Gangs


    Varrios Los Aztecas


    Die Aztecas sind die
    Chiller unter den Gangs. Sie halten oft Low Rider Treffen ab. Doch man sollte
    sie nicht als Faulenzer abstempeln. Nach außen mögen sie zwar etwas träge
    erscheinen, doch spielt sich im Hintergrund viel mehr ab.

    Ihre Pläne sind groß,
    zuerst der Hafen von Los Santos, dann der Rest und wenn man währenddessen noch
    seinen Rivalen, der Grove Street, ein Bein stellen kann, so hat sich der
    Aufwand auf jedenfall gelohnt.


    Bandidos

    Die Straße ist ihre
    Heimat! Wenn das Rudel wildgewordener Biker auftaucht, verbarrikadieren sich
    die Einwohner in ihren Häusern und kommen erst wieder heraus wenn das Beben des
    Asphalts nicht mehr zu spüren und das heulen der Motoren nicht mehr zu hören
    ist. Sie machen sich nicht viel aus Geld, sondern leben für ihre Freiheit auf
    der Straße.


    Caligula


    Die Caligula kontrolliert
    die meisten Casinos in San Andreas und sie erhalten dadurch nicht wenige
    Einnahmen. Leute die wie harmlose Casino Mitarbeiter aussehen, entpuppen sich
    als wahre Kampfmaschinen, wenn es heißt für den Ehre der Caligula zu kämpfen.
    Sie sind der Wolf im Schafspelz und man sollte sie nicht unterschätzen.


    Grove Street


    Eine verschworene
    Gemeinschaft. Sie haben sich als Ziel gesetzt den Einfluss der ausländischen
    Mafias in Los Santos zu begrenzen und ihre Macht weiter auszubauen. Sie sind
    wie Brüder und so kämpfen sie auch. Für jeden Gefallenen ihrer Brüder muss der
    Gegner doppelt oder dreifach büßen!








    Events


    Das Chillrp-Team
    veranstaltet regelmäßig abwechslungsreiche Events bei denen jeder die Chance
    hat sich gegen die anderen Spieler zu behaupten und die fetten Preisgelder zu
    kassieren.




    Gang-War System


    Auf unserem Server
    kämpfen die Fraktionen verbittert um die Kontrolle in Los Santos und dem
    Umland. Eine Fraktion kann das Gebiet einer anderen Fraktion angreifen und es
    ihr somit streitig machen. Daraufhin kämpfen diese beiden Fraktionen 24 Stunden
    um dieses Gebiet. Für jede Minute die ein Mitglied einer Fraktion in dem Gebiet
    verbringt erhält die Fraktion, die er repräsentiert 1 Punkt. Für jeden Feind
    den ein Member tötet erhält die Fraktion 10 Punkte, für jeden weiteren Kill
    erhält man 5 Extra Punkte, sprich 1 Kill entpsricht 10 Punkten, 2 Kills
    entprechen 25 Punkte. Diesen "Kill Multiplikator“ verliert der Spieler
    wenn er im Gebiet getötet wird oder sich ausloggt! Der Gangwar endet wenn eine
    Fraktion 1000 Punkte erzielt hat oder die 24 Stunden abgelaufen sind, nach den
    24 Stunden gewinnt die Fraktion mit den meisten Punkten.

    Ein Gebiet indem der Kampf geendet hat kann erst wieder
    nach 24 Stunden angegrifen werden. Dadurch
    wird verhindert das sich 2 Fraktionen ständig um ein Gebiet streiten.

    Momentan sind die Gebietenur ein Zeichen für Macht und Prestige einer Fraktion,
    sie sollen aber in nicht alzu ferner Zukunft täglich Geld für die Fraktion generieren.


    TÜV

    Der TÜV ist dazu da um
    die Verkehrstauglichkeit von Fahrzeugen zu bestimmen. Falls ein Ölwechsel zum
    Beispiel zu lang aufgeschoben wird, so kann das Fahrzeug nichtmehr die vollen
    HP erreichen. Je mehr Teile defekt sind, desto geringer sind die maximalen HP
    des Fahrzeugs.

    Die Fahrzeuge müssen in
    Folge dessen im TÜV-Zentrum in Las Venturas die defekten Teile ersetzen um
    dadurch die Fahrtauglichkeit wieder herzustellen.


    Achievement System

    Das Achievement System
    besteht aus Erfolgen, die immer vom Spielerlevel abhängig sind. So bekommt man
    in jedem Level neue Erfolge, die freigeschaltet werden könnnen. Durch die
    Freischaltung dieser Erfolge erhält man Credits.

    Credits sind eine Art
    zweite Währung, mit der man sich spezielle Gegenstände kaufen kann. Einerseits
    gibt es Spielereien wie RC Fahrzeuge und Helikopter, andererseits gibt es auch
    sinnvolle Gegenstände, wie Begnadigungen, mit denen man sofort aus dem
    Gefängnis freikommt.


    Anti AFK System

    Um zu verhindern, dass die Spieler nur auf dem Server herumstehen um ihre
    Spielzeit zu erhöhen haben wir ein einzigartiges Anti AFK System eingeführt.
    Wenn man länger als 5 Minuten inaktiv ist erscheint ein äußerst simples, aber
    effektives Captcha mit Spielkarten (siehe Screenshot). Wenn man darauf nicht
    reagiert, beziehungsweise die Falsche Spielkarte anklickt wird man vom Server
    gekickt.
    Um dies zu verhindern kann man mit /afk in den AFK Modus gehen. Dadurch wird
    man nicht mehr gekickt, bekommt jedoch auch keine Spielzeit dazu. Ausserdem ist
    man im AFK Modus Sicher vor Angriffen aller Art.


    Suche nach
    Fraktionsleadern


    Wir suchen noch nach
    Fraktionsleadern, diese sollten möglichst aktiv sein und auch schon eine
    gewisse Zeit auf unserem Server verbracht haben, damit sie ihren
    Fraktionsmitgliedern mit Rat zur Seite stehen können.


    Wer sind wir?

    Unser Team besteht
    derzeitig aus 9 Leuten. Wir teilen uns die Arbeit und man findet immer einen Supporter
    online der einem mit Rat und Tat zur Seite steht.



    HostName: German Chill Roleplay

    Address: 5.35.243.41:7777
    Control Panel: http://www.chillrp.de/

    TS3 IP: chillrp.de

    Woher hast du denn überhaupt diese Funktionen? Im standard release sind die soweit ich weiß nicht vorhanden.


    edit: Kommando zurück! :) Die müssen neu sein, kannte ich noch gar nicht...


    char *RowData = NULL;
    Result->GetRowData(params[1], params[2], &RowData);
    if(RowData == NULL || sscanf(RowData, "%d", &ReturnVal) != 1) {
    CLog::Get()->LogFunction(LOG_ERROR, false, "cache_get_row_int", "invalid data type");
    ReturnVal = 0;
    }



    Um genau zu sein kommen die Fehler von diesem Code :)
    Es wird wohl daran liegen, dass du irgendwo cache_get_row_int ausführst obwohl für die angegebene Zeile / Spalte gar kein Ergebnis existiert.

    In deinem OnPlayerVehicleLoad Callback überprüfst du Beispielsweise nicht ob die Abfrage wirklich ein Ergebnis hat.

    Dies zu überprüfen ist sehr simpel. Füge einfach nach cache_get_row folgendes ein:


    if(rows == 0)

    return 0;

    Wunderbar :)




    if(mysql_DoubleRowExist(playerid, "db_vehicles", "pName", "vNumber", escapedName, fIDStr))
    {

    }


    Diese if-Abfrage brauchst du nicht. In der UPDATE Abfrage hast du ein WHERE Statement:
    WHERE `pName` = '%s' AND `vNumber` = '%i'


    Wenn deine Datenbank keine Zeile finden kann, die die Bedingung nach dem WHERE erfüllt dann passiert nichts. Da kannst du dich da ganz auf deinen MySQL Server verlassen und dein Code wird dadurch sogar kürzer.

    Du kannst aus Callbacks nichts an den Code, in dem du die Abfrage gestartet hast zurückgeben.


    Das ganze funktioniert ähnlich wie mit Dialogen, nur kommen die Antworten hier meist etwas schneller :)
    Du erstellst an einer Stelle im Code einen Dialog und an einer anderen Stelle im Code (OnDialogResponse) kommt dann das Resultat zurück.


    Mit Dialogen kannst du ja auch nicht so eine Funktion erstellen:


    stock IsPlayerCool(playerid) {
    return ShowPlayerDialog(playerid, 123412, DIALOG_STYLE_MSGBOX, "", "Bist du cool?", "Ja", "Nein");
    }


    Das funktioniert prinzipiell nicht, weil Funktion IsPlayerCool in dem Moment beendet wird in dem der Dialog an den Spieler geschickt wird. Die Antwort kommt dann in OnDialogResponse zurück.
    Ganz genau so ist es auch mit dem MySQL Plugin. An einer Stelle im Code startest du die Abfrage und an einer anderen, im erstellten Callback, kommt dann die Antwort wenn die Abfrage beendet ist.
    Da muss man zu Anfang ein wenig umdenken.

    Das musst du ja nicht :)


    Du willst eine Zeile in der Tabelle Updaten, die folgende Bedingungen erfüllt:
    WHERE `pName` = '%s' AND `vNumber` = '%i'
    Wenn es keine Zeile in der Tabelle gibt, die diese Bedingung erfüllt dann wird auch nichts geupdated. Die Überprüfung ist daher nicht nötig, das macht die Datenbank schon von ganz alleine.




    edit Ob du in den Callbacks etwas per return zurückgibst oder nicht ist egal. Es wird ignoriert.

    Der Grund warum ich sage, dass das nicht funktionieren kann ist der gleiche wie bei deinem mysql_GetPlayerPasswort vorhin. Das Callback ist vollkommen unabhängig von der Funktion, in der du es erzeugst. Wenn das Callback ausgeführt wird ist die Funktion, in der die Abfrage gestartet wurde schon lange beendet. Das ist gerade das gute am neuen System. Es wird nichts mehr blockiert. Der Gamemode kann problemlos weiterlaufen während die Abfrage läuft.

    if(mysql_DoubleRowExist(playerid, "db_vehicles", "pName", "vNumber", escapedName, fIDStr))



    Das sollte schonmal nicht mehr funktionieren schätze ich.


    Ausserdem ist da bei deinem
    mysql_function_query(MySQLHandle, query, false, "OnGetReturn", "", "");
    etwas faul. Nach "OnGetReturn" lässt du den String leer, in dem du sagst welche Parameter übergeben werden sollen, übergibst dann aber noch einen leeren String. Lass den Letzten Parameter einfach mal weg.

    Und noch ein kleiner Tipp zu mysql_function_query. Wenn du bei deiner Query keine Daten erwartest kannst du das Callback auch einfach weglassen, sprich den String dafür einfach leer lassen. Dann wird auch kein Callback ausgeführt.
    Die Zeile würde also wie folgt lauten:

    mysql_function_query(MySQLHandle, query, false, "", "");


    Das Callback OnGetReturn kannst du dann entfernen.

    Hier die Signatur von cache_get_row.


    cache_get_row( row, idx, dest[] [, connectionHandle = 1] )


    Der fünfte Parameter in Zeile 12 und 15 gehört dort nicht hin.
    Das Connection Handle ist bei cache_get_row übrigends auch optional. Das musst du dort nicht überall hinschreiben wenn du sowieso nur eine Datenbankverbindung hast.

    Vielleicht ist es diese Zeile:


    mysql_real_escape_string(PlayerName(playerid), PlayerName(playerid), 1, 18);


    Änder das mal in:

    new escapedName[MAX_PLAYER_NAME];
    mysql_real_escape_string(PlayerName(playerid), escapedName);


    Und nicht vergessen dann auch in der Abfrage escapedName statt PlayerName(playerid) zu nutzen :)

    Da bist du auf einen der Nachteile des Modells gestoßen. Wie du weißt wird die Abfrage in einem separaten Thread ausgeführt um den Gamemode nicht zu blockieren. Das Callback wird erst aufgerufen wenn die Abfrage beendet ist. Der Funktionsaufruf von mysql_GetPlayerPassword ist zu diesem Zeitpunkt jedoch bereits beendet.


    Du hast also keine Möglichkeit einfach per return im Callback den Wert an mysql_GetPlayerPasswort zu übergeben.
    Sprich du musst das Passwort bereits zu einem frühreren Zeitpunkt in einer Variable gespeichert haben, damit du eine derartige Funktion umsetzen kannst.
    Die andere Möglichkeit ist, dass du die nötige Überprüfung im Callback ausführst.
    Ich würde hier ersteres bevorzugen, da du ja sowieso die Userdaten aus der Datenbank ausliest.
    Das Plugin zwingt dich gewissermassen unnötige Abfragen zu vermeiden.

    Hallo nochmal :)


    Zu der Zeile Hier:


    mysql_real_escape_string(PlayerName(playerid), PlayerName(playerid));

    Das funktioniert so leider nicht. Den escapten Namen musst du anschliessend in einem neuen String speichern.
    Also beispielsweise:


    new escapedName[MAX_PLAYER_NAME];
    mysql_real_escape_string(PlayerName(playerid), escapedName);




    Die Überprüfung des Passworts kannst du auch gleich im Callback machen. Die Abfrage lautet ja:


    `pName` = '%s' AND `Password` = '%s'


    Sie liefert also nur ein Ergebnis wenn ein Benutzer unter dem Namen gefunden wurde und auch das richtige Passwort angegeben wurde.
    Im Callback kannst du daher sehr einfach überprüfen ob der Login erfolgreich ist:

    new rows, fields;
    cache_get_data(rows, fields);
    if(rows == 0) {
    // Falsches Passwort
    return 0;
    } else {
    // Passwort korrekt, lade Daten
    }


    Auch die Zeile mit dem Geld kannst du anpassen:
    SetPlayerEuro(playerid, mysql_GetInt("db_accounts", "Money", "pName", PlayerName(playerid)));

    Hier hast du bereits das Geld aus der Datenbank geholt, also kannst du doch einfach folgendes schreiben:
    SetPlayerEuro(playerid, pInfo[playerid][Money]);


    Sieht aber schon ganz gut aus was du da machst ;)

    Erstmal fällt mir auf, dass du in der Abfrage gar kein WHERE verwendest und so einfach alle Benutzer aus der Datenbank lädst. Das ist nicht sehr effizient ;) Versuchs mal mit dem Ansatz:



    new escapedName[MAX_PLAYER_NAME * 2];
    new name[MAX_PLAYER_NAME];
    new query[512];


    GetPlayerName(playerid, name, sizeof(name));


    // Verhindert mögliche SQL Injections. Beim Spielernamen zwar unwahrscheinlich, aber man weiß ja nie
    mysql_real_escape_string(name, escapedName);


    format(query, sizeof(query), "SELECT ... FROM ... WHERE `name` = '%s'", escapedName);


    mysql_function_query( // .......


    So bekommst du nur den Benutzer aus der Datenbank, der auch den entsprechenden Namen hat. Du kannst dies natürlich auch gleich mit einer Passwortabfrage verknüpfen:


    ... WHERE `name` = '%s' AND `password` = '%s'


    Bei Daten, die in Form von Strings so an die Datenbank übergeben werden solltest du jedoch immer darauf achten, dass du sie mit mysql_real_escape_string(source[], destination[]) escapest. Dadurch werden SQL Injections verhindert. Es wäre ja schade wenn das Passwort eines Users plötzlich lautet:


    '; DROP TABLE `db_bank` --

    Nun zu deiner eigentlichen Frage:
    Bei mysql_function_query läuft das ganz genau so wie bei SetTimerEx. Du gibst erst in einem String an was für Parameter übergeben werden sollen, bei dir eine Zahl und ein String, also:


    "is"

    Und darauf hin folgen dann die weiteren Parameter, also:



    mysql_function_query(MySQLHandle, query, true, "OnPlayerLoad", "is", playerid, key);

    Das beste Tutorial was ich dazu kenne ist immer noch das hier:http://forum.sa-mp.com/showthread.php?t=337810


    edit: Ob du wirklich umsteigen möchtest bleibt dir überlassen. Wie gesagt: Auf den ersten Blick scheint es sehr kompliziert zu sein, aber man gewöhnt sich daran.


    Aus deinem Code ist nicht genau ersichtlich wie deine Tabellenstruktur ist, aber ich gehe mal davon aus, dass die id aus einer anderen Tabelle kommt
    als db_bank.


    Soweit ich mich erinnere kann man mit dem Plugin nur eine Abfrage zugleich durchführen, da stets der gleiche Zwischenspeicher genutzt wird für mysql_store_result() und mysql_free result(). Es ist also nicht möglich verschachtelte Abfragen wie in deinem Code zu machen, mir fallen für das Problem zwei Lösungsansätze ein.



    Der erste Weg ist nicht sehr elegant und führt immer noch dazu, dass du viele Abfragen machst. Du speicherst einfach in der Schleife alle IDs in ein Array und machst nach mysql_free_result() eine weitere Schleife, die über das Array geht.
    Diesen Weg kann ich jedoch nicht empfehlen.


    Der zweite Weg sind Joins. Durch Joins kannst du kurz gesagt Daten aus mehreren Tabellen in einer Abfrage verknüpfen. Dies macht deine Abfragen zwar etwas komplexer, aber macht deinen Code anschliessend deutlich einfacher.
    Hier ein Tutorial dazu: http://wiki.selfhtml.org/wiki/…_SQL/Einfuehrung_in_Joins
    Ich weiß nicht woher die ID kommt, aber ich nehme einfach mal an sie kommt aus deiner Spielertabelle:


    SELECT a.`id`, b.`type`, b.`number`, b.`nickname`
    FROM `db_users` a, `db_bank` b
    WHERE a.`id` = b.`id`

    Weiterhin kannst du durch dieses Konzept auch gleich den Spielernamen aus der db_bank Tabelle entfernen, da du ihn ja direkt aus der db_users Tabelle holen kannst.



    SELECT a.`id`, b.`type`, b.`number`, a.`nickname`
    FROM `db_users` a, `db_bank` b
    WHERE a.`id` = b.`id`


    Dadurch hast du weniger redundanzen in deiner Datenbank und letztendlich eine einfachere Tabellenstruktur.


    edit: Wenn deine Queries zu lang werden kannst du sie einfach mit strcat zusammenfügen:


    new teilstring[128];
    new string[512];


    format(teilstring, sizeof(teilstring) , ".......", ....);
    strcat(string, teilstring, sizeof(string));


    format(teilstring, sizeof(teilstring) , ".......", ....);
    strcat(string, teilstring, sizeof(string));


    Und so weiter... strcat hängt einfach teilstring an string an.