Beiträge von Chris.

    Ich kann das mal versuchen, doch bis vor kurzem ging alles wunderbar..
    //Edit: sorry.. was genau meinst du? Ich lerne nämlich mit diesem Script Pawno ein bisschen besser kennen zu lernen.. :/


    Ein MySQL-Backup-File hat nichts mit Pawno zu tun. Entweder setze in der .sql-Datei via "use" (http://dev.mysql.com/doc/refman/5.1/de/use.html) die Datenbank oder lade die Datei an richtiger Stelle hoch, nähmlich nachdem du die Datenbank ausgewählt hast. Entweder per "use" in der Konsole oder per Klick in phpMyAdmin.

    Ich habe deine Verbesserungen befolgt und den Befehl teilweise verbessert.


    Der Befehl wie ich ihn oben habe funktioniert aber trotzdem nicht um ihn ingame zu testen, was habe ich falsch gemacht?


    Keiner ne Idee? :S


    Deinen aktuellen Quellcode können wir nicht erraten. :rolleyes:

    Er muss nur Abfragen ob das Objekt die ID 0 hat um leere zeilen eines Arrays raus zu filtern da die Objekte mit der Ordnungszahl 1 anfangen, dies ist genauso wie bei dem Fahrzeugen.


    Das stimmt. Wäre eine Alternative zum Iterator im Falle, dass die Checkpoints geladen werden. Dann würde ich jedoch nicht "continue" beim Erreichen eines leeren Array-Indexes verwenden, sondern break, um die komplette Schleife abzubrechen. Es sei denn, es können während Runtime Lücken im Array entstehen.

    Alles klar, danke dir!
    /edit: Kann man auch das R39-2 Plugin mit diesem Tutorial verwenden oder muss man dafür unbedingt das R5 Plugin haben?


    Gehe nicht nach dem, was in einem Tutorial verwendet wird, sondern nach dem, was am besten ist. R5 ist outdated. Also verwende es auch nicht. Verwende die neuste Version, schließlich gibt es eine neuste Version mit Grund. Tutorials zu BlueGs Plugin gibt es genug, da musst du lediglich etwas googlen.


    [BlaZZeR]BirD: Was möchtest du damit bezwecken?


    if(!strlen(inputtext) < 6)

    Dann macht jedoch dein jetziger Quellcode keinen Sinn, denn du setzt den Checkpoint innerhalb der for-Schleife.



    // ...


    #define MAX_SWEEPING_DISTANCE (500.0)


    new Float:pos[3],
    Float:distance[2]
    index = -1;


    GetVehiclePos(GetPlayerVehicleID(playerid), pos[0], pos[1], pos[2]);
    for(new i = 0; i < sizeof(sweeperCheckpoints); i++) {
    distance[0] = getDistanceBetweenCoordinates(pos[0], pos[1], pos[2], sweeperCheckpoints[i][pos][0], sweeperCheckpoints[i][pos][1], sweeperCheckpoints[i][pos][2]);
    if((index == -1 && distance[0] <= MAX_SWEEPING_DISTANCE) || (index != -1 && distance[0] < distance[1])) {
    distance[1] = distance[0];
    index = i;
    }
    }


    if(index != -1) {
    SetPlayerCheckpoint(playerid, sweeperCheckpoints[i][pos][0], sweeperCheckpoints[i][pos][1], sweeperCheckpoints[i][pos][2], 4.5); // Yay!
    } else {
    SendClientMessage(playerid, -1, "Thank you for sweeping, however, there is no further task for you in this area!");
    }


    // ...


    Float:getDistanceBetweenCoordinates(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2) {
    return floatsqroot(floatpower(floatabs(floatsub(x2,x1)), 2) + floatpower(floatabs(floatsub(y2,y1)), 2) + floatpower(floatabs(floatsub(z2,z1)), 2));
    }


    P.S.: Ungetestet! + Verwende eher die Größe des Arrays in der for-Schleife, wenn die Checkpoints im Quellcode definiert sind. Falls sie geladen werden, verwende einen Iterator (foreach!).

    Überdenke deinen Quellcode:

    • Verwende GetVehicleDistanceFromPoint() einmalig und speichere das Ergebnis vor der if-Abfrage in einer Variable. So verhinderst du, dass du das Ganze doppelt berechnest. Das ist doch Unsinn!
    • So wie es mir scheint, setzt du einfach immer den selben Checkpoint. Du ermittelst keinen random Checkpoint, sondern nimmst einfach den ersten im Array, der in der Nähe ist. Daher ist auch die "Object" und "Abstand" Variable für die Tonne und unnötig.


    Ich will machen, dass wenn man online irgendeinen Befehl und ne Zahl oder ein Wort (z.B. /random 2) dann soll geschaut werden in welcher Datei bei den Accounts die Zahl oder das Wort am öffterstens vorkommt. Dann soll der bei dem es am öfftersten vorkommt geld bekommen und bei dem dem es am zweit öfftersten vorkommt soll ein bisschen weniger geld bekommen dann das mit dem dritt öfftersten auch usw..
    Verstehst du es nun?


    Dann solltest du mit den von mir genannten Fread() und strfind() wunderbar zurecht kommen. Das Ganze ist aber total unperformant und keineswegs zu empfehlen. Steige lieber auf ein ordentliches DBMS um und sende einen organisierten Query ab, um dein Ziel zu erreichen.

    Da mir dein Vorhaben nicht ganz schlüssig ist, da es sehr schlecht beschrieben ist, kann ich nur auf Fread() und strfind() verweisen. Mit Fread() kannst du die Dateien Zeile für Zeile auslesen und mit strfind() die Zweien herausfiltern. Wenn die Zweien an einem ganz bestimmten Ort in den Dateien sich befinden, dann solltest du Plugins/Includes herbeiziehen, welche .ini-Dateien handhaben. Falls die Dateien nicht im "scriptfiles" Ordner liegen, dann musst du die Dateien zuvor mit dem von Mr.Reese genannten Plugin öffnen und auslesen.


    Achtung: Mit vielen Dateien kann dies sehr unperformant sein (Lag könnte eine der Folgen sein). Aus diesen Gründen verwendet man Datenbanken.

    • Warum schaust du nach, ob ein Spieler mit dem Server verbunden ist, wenn er einen Befehl ausführt. Ohne verbunden zu sein, kann man auch keinen Befehl ausführen.
    • Erstelle deine Variablen, wenn du sie brauchst. Du brauchst die Variable "string" nur innerhalb des if-Statements, daher erstelle die Variable auch dort. Du verschwendest Ressourcen.
    • Zu deinem eigentlichen Problem: Womöglich liegt es, wie Kaliber bereits erleuterte, an der Deklaration des "LastDriver"-Arrays.

    Beginne erneut, das ist kompletter Murks:

    • Du benötigst PlayerTextDraws, nicht einfache TextDraws. Grund: Es können mehrere Benutzer gleichzeitig den Befehl verwenden und somit mehrere Benutzer gleichzeitig den selben Textdraw mit unterschiedlichem Content sehen.
    • Erstelle die PlayerTextDraws einmalig unter OnPlayerConnect() und verwende nur PlayerTextDrawSetString(), PlayerTextDrawHide() und PlayerTextDrawShow() in deinem Befehl und Timer.
    • Verwende nicht "return SendClientMessage() && SendClientMessage()". Das ist kein guter Stil! Verwende einfach geschweifte Klammern und rufe die Funktion normal 2x auf!
    • Verwende elseif! Deine if-Statements überschneiden sich (bei =) und werden immer beide überprüft. Verwende elseif, um zu verhindern, dass die zweite auch überprüft wird, wenn die erste bereits zutrifft.
    • Zerstöre deinen PlayerTextDraw nicht mehr, sondern blende ihn lediglich aus. Sonst musst du ihn immer wieder erstellen. Das ist eine unnötige Verschwendung von Ressourcen.
    • Überprüfe die logische Abfolge deines Quellcodes! Du deklarierst die Variable "tdstring", erstellst dann den Textdraw und erst dann setzt du die Variable. Das macht keinen Sinn!

    Warum speichert ihr nicht einfach beim Verbindungsaufbau (OnPlayerConnect()) einmalig die Daten der Benutzer? Dazu dann noch foreach verwenden, um unnötiges Aufrufen von IsPlayerConnected() zu verhindern. Ist doch viel effizienter:



    #include <a_samp>
    #include <YSI\y_iterate> // foreach


    enum playerDataEnumerator {
    username[MAX_PLAYER_NAME]
    }


    new playerData[MAX_PLAYERS][playerDataEnumerator],
    Iterator:playerIterator<MAX_PLAYERS>;


    public OnPlayerConnect(playerid) {
    Iter_Add(playerIterator, playerid);
    GetPlayerName(playerid, playerData[playerid][username], MAX_PLAYER_NAME);
    return 1;
    }


    public OnPlayerDisconnect(playerid, reason) {
    Iter_Remove(playerIterator, playerid);
    resetPlayerDataIndex(playerid);
    return 1;
    }


    isPlayerNameConnected(name[]) {
    foreach(new i : playerIterator) {
    if(strcmp(playerData[i][username], name, false) == 0) {
    return 1;
    }
    }


    return 0;
    }


    resetPlayerDataIndex(index) {
    for(new i = 0; i < sizeof(playerData[]); i++) {
    playerData[index][playerDataEnumerator:i] = 0;
    }
    }


    P.S.: Ungetestet.

    Vielen dank für deine Hilfe.
    Leider klappt dies auch nicht mit dein Code.


    Er bleibt bereits bei der ersten If abfrage hängen.

    PHP
    if(($json = @file_get_contents("http://api.ets2mp.com/servers/")) !== FALSE) {


    Dann solltest du wohl das error_reporting einschalten, Errors anzeigen lassen und die Unterdrückung der Fehler aufheben (@-Zeichen vor file_get_contents() entfernen), um zu debuggen:


    PHP
    error_reporting(E_ALL);
    ini_set('display_errors', 1);


    Warum sollte man hier einen JOIN anwenden? Das macht keinen Sinn.


    SQL
    SELECT date FROM tabelle2 WHERE tabelle1.id = tabelle2.id


    Auch das macht keinen Sinn, denn hier werden alle Logins von allen Usern gesucht und nicht der letzte Login eines Users.


    du kannst auch in der 1. Tabelle u_id noch einfügen, das alles mit der UserID handlen


    Ich nehme Stark an, dass "u_id' bereits als Foreign Key die ID der User repräsentiert.


    Meine Lösung:


    Wichtig ist, dass die Tabellen zunächst korrekt aufgesetzt sind. Foreign Keys sind ausschlaggebend und ein "id"-Feld bei der Login-Tabelle halte ich für überflüssig. Daher folgendes Setup:



    Nun können wir wie folgt den letzten Login einer bestimmten UserID (hier: 1) abrufen:


    SQL
    SELECT `l`.`date`
    FROM `logins` AS `l`, `users` AS `u`
    WHERE `u`.`id` = `l`.`user_id`
    AND `u`.`id` = 1
    ORDER BY `l`.`date` DESC
    LIMIT 1;
    • Eine Klasse würde ich nur verwenden, wenn diese auch Sinn macht.
    • Eine API ist dies schonmal garnicht.
    • Der font-Tag ist deprecated. Verwende stattdessen CSS. Da auch inline-CSS aus der Mode ist, habe ich ein span-Tag mit einem class-Attribut versehen.
    • <br> zu verwenden, bevor man irgendetwas ausgibt, empfinde ich für sinnlos. Wenn du die Ausgabe nach unten rücken möchtest, dann verwende CSSs margin.
    • Tipp: Entscheide dich für entweder Single-Quotes oder Double-Quotes in PHP und setze diese Anwendung gewiss um, sonst bekommst du irgendwann Probleme mit Kontextwechseln.
    • Behandle Fehler in deinem Quellcode sinnvoll. Einfach Fehler zu unterdrücken und ihnen weiter kein Gehör zu schenken, das ist nicht zielführend.


    Wie ich das Vorhaben umgesetzt hätte:



    CSS
    .online {
    	color: green;
    }
    
    
    .offline {
    	color: red;
    }