Beiträge von Goldkiller

    Die Nutzung der Funktionen, die das MySQL Plugin bietet fällt unter die Kategorie wie die Nutzung von DINI usw.
    Die Erstellung des Querys ( SQL Kommando ) ,welches an der MySQL Datenbank ausgeführt wird, ist etwas Anderes.

    SQL
    SELECT `EnterX`,`EnterY`,`EnterZ`,`ID`,`SpielerID` FROM `haus`
    SELECT `Name` FROM `accounts` WHERE `ID` = '%d'


    Diese Beiden SQL Kommandos zu kombinieren hat nichts mit PAWN / SA:MP zu tun,auch wenn du es hier nutzen kannst. Denn SQL ist eine eigenen Sprache.
    Ein einfaches Beispiel wäre hier zu finden.
    Mit einem WHERE ist es ein leichstes die Beiden zu verknüpfen.

    Mit einem besser gewähltem SQL Kommando.
    Da du in jedem ( Ausnahme wahrscheinlich GetPlayerMySQLName ) Befehl aus der Tabelle "haus" ließt,kannst du einfach einen Query nutzen und dort alle Daten auslesen.
    Da wir aber a) kein SQL - Hilfeforum sind und b) ich dir nicht die Lösung vorschreibe, überleg mal ein wenig selber ;).
    Was auch immer GetPlayerMySQLName, dass kann man sicherlich auch direkt mit dem Query verknüpfen über WHERE.
    Kannst ja einfach mal die Funktion GetPlayerMySQLName posten, Tatbestand b bleibt aber erhalten.

    Ließ dir lieber noch mal die Benutzung von mysql_fetch_row_format an.
    Die relevanten Daten stehen in der Variable str ( bei deinem Beispiel ). Sonst könntest du auch gleich mysql_retrieve_row nutzen.


    Das Problem ist recht simpel bzw nicht ganz so leicht zu finden.


    Du benutzt in der while-Schleife mysql_Get*,dort liegt auch das Problem . Diese Funktionen nutzen auch mysql_store_result und überschreiben quasi dein Query,welches die Schleife einleitet ( SELECT `EnterX`,`EnterY`,`EnterZ`,`ID`,`SpielerID` FROM `haus` ) . Denn es gibt immer nur 1 result,dass aktuell im Speicher liegt und verarbeitet wird. Da du aber innerhalb der Schleife immer neu aus der Datenbank ausließt,gehen die Daten verloren und nach dem ersten Schleifendurchgang ist Schluss.
    Warum immer nach einem ? Nun ja,du ließt ja auch immer genau einen konkreten Datensatz aus der Datenbank mit mysql_Get* und löschst diesen danach auch wieder intern durch mysql_Get* , weshalb mysql_fetch_row_format/) an einem leeren "result" durchgeführt wird und korrekterweise auch 0 zurück gibt. Denn es gibt ja keine weiteren Zeilen.


    new str[512],dest[5][64],query[128];
    format(query,128,"SELECT `EnterX`,`EnterY`,`EnterZ`,`ID`,`SpielerID` FROM `haus`");
    mysql_query(query);
    mysql_store_result(); // Dein Start-Query
    while(mysql_fetch_row_format(str))
    {


    if(strval(dest[4]) == 0)
    {
    format(string,256,"HausID: %s\nDieses Haus ist zu verkaufen!\nPreis: %d\n/enter um es zu besichtigen!\n/hauskaufen um das Haus zu kaufen\n/mieten zum einmieten\nMietpreis/PayDay: %d",dest[3],mysql_GetInt("haus","Preis","ID",dest[3]),mysql_GetInt("haus","Mietpreis","ID",dest[3])); // <------------- HIER WIRD DEIN START-QUERY ÜBERSCHRIEBEN


    }
    else
    {
    format(string,256,"HausID: %s\nDieses Haus gehört: %s\n/mieten um dort zu wohnen!\nMietpreis/PayDay: %d",dest[3],GetPlayerMySQLName(strval(dest[4])),mysql_GetInt("haus","Mietpreis","ID",dest[3])); // <------------- HIER WIRD DEIN START-QUERY ÜBERSCHRIEBEN


    }


    }
    Ich habe dir mal etwas markiert. Du musst dir da etwas Anderes überlegen.

    Du belegst zu viel Speicher ( Variablen ).
    Ließ dir mal den Beitrag von mir durch.
    Weiss auch nicht was du da jetzt nicht verstanden hast bzw per PM wissen wolltest. Du kannst es durch
    #pragma dynamic <zahl>
    aushebeln. Ist zwar keine super Lösung,funktioniert aber größtenteils.

    Toll. Hättest aber ruhig mehr Quellcode zeigen können.
    Probier es mal mit Debuggen.
    Was wird dir hier ausgegeben:
    new str[512],dest[5][64],query[128];
    format(query,128,"SELECT `EnterX`,`EnterY`,`EnterZ`,`ID`,`SpielerID` FROM `haus`");
    mysql_query(query);
    mysql_store_result();
    printf("mysql_num_rows() = %d", mysql_num_rows() ); // <--
    while(mysql_fetch_row_format(str))
    {
    // Was kommt hier noch an Code ? Hier könnte es nämlich auch Fehler geben.
    Ich hoffe auch einach mal,dass du mehr als einen Eintrag angelegt hast.

    Kannste ignorieren. Das sind blos ein paar angaben zu deinem Code ;]


    Gruss: Sonic


    Totaler Quatsch.Sollte er besser nicht ignorieren. Der Stack / Heap reicht vermutlich nicht aus für die Variablen die er anlegt.
    http://wiki.sa-mp.com/wiki/Keywords:Directives#Information
    Die Meldung kann man verhindern,indem man den Stack / Heap vergrößert. Das du trotzdem weiterhin ungewöhnlich viel Speicher belegst, bleibt bestehen.

    Zitat

    dynamic - value (generally a power of 2) - Sets the size of memory (in cells) assigned to the stack and heap. Required if you get the excess memory usage warning after compilation (a wierd table after the compiler copyright line)

    Hab doch gepostet wie es funktioniert.Ließ den Post nochmal von mir der hier drunter teilweise zitiert wird.

    Gate::Gate() - Initialisierung. ( LoadGates , Parameter für die Tore sind: Model,X[0],Y[0],Z[0],RotX,RotY,RotZ,X[1],Y[1],Z[1],Speed,Size )


    LoadGates( dateipfad[] )
    Dort befinden sich die zu erstellenden Tore. Pro Zeile natürlich 1 Tor. Eine Zeile die mit ; beginnt,wird ignoriert. Der Dateipfad ist völlig egal. Du kannst es natürlich auch direkt in den scriptfiles ablegen als "tor.txt". Ich hab nur das Script bei mir in alle Einzelteile zerlegt,deswegen ist der Pfad so lang bzw gewählt.


    Aufgebaut sind die Tore wie folgt:
    if(sscanf(tmp,"p<,>ifffffffffF(2.0)F(22.0)",Model,X[0],Y[0],Z[0],RotX,RotY,RotZ,X[1],Y[1],Z[1],Speed,Size)) {
    printf("Fehler beim laden von Gate %d",c);
    }

    ModelID,GeschlossenX,GeschlossenY,GeschlossenZ,RotationX,RotationY,RotationZ,GeöffnetX,GeöffnetY,GeöffnetZ,GeschwindigkeitBeimÖffnen*,Zonengröße**
    * Wird bei MoveObject gebraucht ( Standardmäßig 2.0 )
    ** Die Zone die um das Tor erstellt wird. Je Größer die Zone,desto eher öffnet sich das Tor. Die Zone bleibt aber statisch immer am Ort,wo das Tor erstellt wird. Sie bewegt sich NICHT mit dem Object.Ist auch nicht wirklich notwendig,wenn das Tor keine 100LE verschoben wird. ( Standardmäßig 20.0 )


    Zitat

    und woran erkennt er dan das auf und zu gehen ? hö :D lol ich versteh nur Bahnhof
    fragt er dann in mein script weiter ab oder wie :S


    Das erkennt er durch die Funktionen die ich im Beitrag zuvor genannt hatte. Du musst sie nur richtig einfügen.


    //Edit:
    So mal als Beispiel wie du es richtig mit dem Plugin verknüpfst:
    public OnDynamicObjectMoved(objectid) {
    if(Lost_OnDynamicObjectMoved(objectid)) return 1; // Für dich irrelevant
    if(Gate_OnDynamicObjectMoved(objectid)) return 1; // <----
    return 1;
    }
    Du musst die Gate_* nur unter die Callbacks des Plugins legen. Zu welchen sie gehören findest du im Post vorher von mir.

    Ich weiss nicht so recht,deine Wortwahl passt irgendwie teilweise nicht.

    Zitat

    SetTimer("TimerTest", 1000*60, true); // Setzt einen Timer namens TimerTest jede Minute, und dieser wiederholt sich immer (true)


    Setzt das tatsächlich einen Timer mit dem Namen TimerTest ? Eigentlich nicht.Es erstellt einen Timer,der die Funktion TimerTest jede Minute aufruft. Ich kann die Funktion auch irgendwo Anders aufrufen OHNE das es mit dem Timer in irgendeiner Verbindung steht. Du hast es mehrfach so beschrieben.


    Zitat

    KillTimer wird verwendet, um Timer zu löschen bevor sie ausgelöst werden.


    Was ist wenn ich einen Timer habe,der sich Wiederholt ? Darf ich den dann nur löschen,bevor er zum 1x die Funktion aufgerufen hat ? Eventuell nicht ganz so gut ausgedrückt von dir.

    Ich hab dir mal den Quellcode dazu hochgeladen.
    Es funktioniert mit dem Streamer Plugin. Für jedes Tor wird eine Area / Zone angelegt. Sobald diese Zone betreten bzw verlassen wird,wird der nächste Zustand für das dazugehörige Tor herausgefunden. Es gibt 4 Zustände
    enum ( <<= 1 ) {
    e_Gate_Closed = 1,
    e_Gate_Opening,
    e_Gate_Open,
    e_Gate_Closing
    } auf die reagiert wird bzw werden muss.


    Falls du es nutzen möchtest,


    Gate::Gate() - Initialisierung. ( LoadGates , Parameter für die Tore sind: Model,X[0],Y[0],Z[0],RotX,RotY,RotZ,X[1],Y[1],Z[1],Speed,Size )
    Gate::GateClose() - Schließen, in dem Fall aber unwichtig da nichts passiert.
    Gate_OnPlayerEnterDynamicArea - Bei OnPlayerEnterDynamicArea aufrufen ( Geliefert durch Plugin )
    Gate_OnPlayerLeaveDynamicArea - Bei OnPlayerLeaveDynamicArea aufrufen ( Geliefert durch Plugin )
    Gate_OnDynamicObjectMoved- Bei OnDynamicObjectMoved aufrufen ( Geliefert durch Plugin )
    e_Flag_Gate ist irgendeine Zahl.


    http://goldkiller.bplaced.net/filemanager/gate.inc

    Hast du keine Lust dir selber Fehler einzugestehen? Wenn die Reihenfolge richtig wäre,dann würde auch alles korrekt verarbeitet werden. Das versteht sich eigentlich von selbst.
    Die Reihenfolge ist totaler Quatsch bei dir. Wieso du es selber nicht erkennstwillst,keine Ahnung.Du hast sogar ein Beispiel woran du es ganz einfach selber überprüfen könntest. Denn so habe ich es in diesem Fall auch gemacht.


    Zitat

    (`id` int(11) AUTO_INCREMENT, `Name` varchar(255), `Passwort` varchar(255), `BDate` varchar(255), `Mail` varchar(255), `RegisterIP` varchar(255), `Geschlecht` int(11), `Baned` int(11), `Banreason` varchar(255), `Banner` varchar(255),`Skin` int(11), `Geld` int(11), `Adminlevel` int(11), `Code` int(11), `Timeban` int(11), `Level` int(11), `Warn` int(11), `AFKMessage` varchar(255), `Timeout` int(11), `LastX` float(15), `LastY` float(15), `LastZ` float(15), `LastA` float(15), `Car` int(11), `Member` int(11), `Leader` int(11)


    Das ist die Reihenfolge der Werte bei mysql_fetch_row.
    id,Name,Passwort,BDate, Mail usw usf.
    Die Ausgabe passt bildet jetzt diese Reihenfolge ab.

    Zitat

    2|RedJoker|143941100993057C04DA7B14CF3D5FD7|||127.0.0.1|0|0|||181|10000|5|0|0|0|0||0|0|0|0|0


    Schaut man sich die Komplette SSCANF Zeile bei dir an passt da absolut nichts zusammen.

    Zitat

    p<|>{i}{i}{i}s[50]s[50]{i}dds[50]s[50]ddddddds[50]dffffddd


    Die ersten 3 Parameter ( Integer ) ignorierst du komplett.Das funktioniert definitiv nicht.
    2 = Ok {i}
    RedJoker = Kein Integer,Fehler {i}
    143941100993057C04DA7B14CF3D5FD7 = Kein Integer,Fehler {i}
    <LEER> = theoretisch Ok ( PI[playerid][pBDay] ) s[50]
    <LEER> = theoretisch Ok ( PI[playerid][pMail] ) s[50]
    127.0.0.1 = Kein Integer,Fehler {i}
    ...


    Das da noch mehr nicht passt,sollte klar sein.

    Wer SSCANF nicht anwenden kann um es an einen String anzupassen,ist selber schuld. Hast du überhaupt verstanden in welcher Reihenfolge die Werte durch mysql_fetch_row zusammengeführt werden ?


    sscanf(Data, "p<|>{i}{i}{i}s[50]s[50]{i}dds[50]s[50]ddddddds[50]dffffddd",...)
    Passt absolut nicht mit dem Zusammen:

    Zitat

    2|RedJoker|143941100993057C04DA7B14CF3D5FD7|||127.0.0.1|0|0|||181|10000|5|0|0|0|0||0|0|0|0|0

    Wäre möglich. Für die erste Verbindung wird der Wert 1 verwendet und dieser ist auch bei allen Funktionen als default angegeben. Es würde also reichen,wenn du nur für die 2. Verbindung immer die Verbindung ( Connection handle ) angibst. Würde der Übersicht halber trotzdem überall die richtige Verbindung angeben.

    Du kannst eine Verbindung zu mehr als nur einer Datenbank aufbauen.
    Da du das Plugin von BlueG verwendest:
    mysql_connect

    Zitat


    Returns Connection handle.


    Du nimmst dir einfach den Rückgabewert der beiden Verbindungen ( Connection handle ) und arbeitest damit. Dieser Wert stellt die Verbindung zu der einen oder der Anderen Datenbank dar.
    new mysql = mysql_connect("127.0.0.1","root","mydatabase","mypass"); // Kopiert aus dem Wiki.
    new mysql_bla = mysql_connect("128.0.0.1","root","database","");
    So gut wie alle Funktionen bieten auch einen Parameter für die MySQL Verbindung an.
    Zum Beispiel mysql_query:

    Zitat

    (query[], resultid, extraid, connectionHandle)


    //Edit:
    Kannst natürlich auch das Andere Plugin verwenden wie RG schreibt. Da du aber anscheinend schon das von BlueG verwendest,würde ich auch dabei bleiben.

    Oh man,so viele falsche Antworten ... :|
    TextDrawSetString( (Text:text, string[] )


    amount ist bei dir kein String/Array. Du müsstest einen String erstellen der amount als Zahlenwert darstellt und den dann benutzen bei TextDrawSetString.
    Tipp: format()

    Man sollte schon lesen können,wenn man scripten möchte.

    Zitat

    C:\Users\Hami\Desktop\Selfmade Script\Happy Deathmatch\gamemodes\HappyDeathmatch.pwn(135) : error 017: undefined symbol "eingelogt"


    135 ist die Zeile,in der der Fehler aufgetreten ist. Möchtest du nicht markieren,welche Zeile es bei deinem Codeschnipsel ist ?
    Die Fehlerbeschreibung in ganz einfachem Englisch.


    Mal dran gedacht,Variablen zu deklarieren bevor du sie benutzt ?

    Von Debuggen schon mal etwas gehört ?
    Probier es mal aus:
    Klick


    Lass dir am Besten mal newcar , PlayerCar[CarOwner][Dtc_PlayerKey[CarOwner]][CarId] und Dtc_PlayerKey[CarOwner] ausgeben.


    Eigentlich ist der Spieler in keinem Fahrzeug,wenn der Rückgabewert von GetPlayerVehicleID 0 ist.