Beiträge von Jeffry

    Am besten du machst es so:
    getShopOwnerID(id)
    {
    if(id < 0 || id >= sizeof(ShopInfo)) return -1;
    if(!strlen(ShopInfo[id][owner])) return INVALID_PLAYER_ID;
    new pname[MAX_PLAYER_NAME];
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i)) continue;
    GetPlayerName(playerid, pname, MAX_PLAYER_NAME);
    if(!strcmp(ShopInfo[id][owner], pname)) return i;
    }
    return INVALID_PLAYER_ID;
    }


    Und dann beim Ausrauben:
    new ownerid = getShopOwnerID(i);
    if(ownerid != INVALID_PLAYER_ID)
    {
    //ownerid = Besitzer, online
    }
    else
    {
    //Besitzer nicht online
    }


    EDIT:
    IsPlayerConnected-Abfrage noch hinzugefügt. Bitte passe deinen Code auch ein.

    Du hast die Anpassung im Code LoadPlayerCars noch nicht gemacht. Mache das, das ist unbedingt notwendig.
    Wenn wir das jetzt schon Schritt für Schritt machen, musst du auch alles machen, sonst geht es am Ende erst nicht, und keiner weiß warum.



    Zur Rotation:
    Erstelle ein neues Fahrzeug und prüfe anschließend direkt den Wert der Rotation in der Datenbank. Verlasse dann den Server und prüfe die Rotation erneut. Hat sie sich verändert?

    P_VID kann ich dann auch aus der Datenbank raus nehmen

    Ja, das kannst du jetzt machen.



    Du meinst Login oder?

    Ah, ja! Das meinte ich.


    Also, das SELECT Query passt.
    Du musst nur darauf achten, dass du dies nach dem Auslesen der db_id des Spielers ausführst, sonst steht dort ja noch kein Wert drin.


    Zum Callback:
    Das sieht auch gut aus. Füge dort aber noch folgende zwei Zeilen mit dazu ein:
    cache_get_value_name_int(i,"P_uID",PCar[playerid][i][P_uID]);
    cache_get_value_name_int(i,"dbID",PCar[playerid][i][dbID]);
    Wenn das Fahrzeug geladen wird, muss auch die Verbindung zwischen Eintrag in der Datenbank (dbID) und dem Besitzer (uID) wieder hergestellt werden.



    Teste anschließend, ob ein von dir erstelltes Fahrzeug nach dem Login korrekt geladen wird.
    Folgende Schritte:
    Erstelle ein Fahrzeug.
    Verlasse den Server.
    Starte den Server neu (wichtig, da wir das Löschen erst später machen).
    Logge dich ein.
    Prüfe ob das Fahrzeug korrekt da ist.


    Ist das Fahrzeug korrekt da?
    Wenn ja, poste bitte den Code, der beim OnPlayerDisconnect die Fahrzeuge aus dem Server entfernen (und speichern?) soll.
    Wenn nein, erkläre bitte das Problem.

    Also ist es richtig das es dbID nicht mehr da ist heißt soll ich sie löschen?

    Ja, das ist richtig. Lösche sie aber nicht aus der Datenbank, diese soll von der Tabelle automatisch vergeben werden.



    Duplicate entry '0' for key 'PRIMARY'

    Hast du die Auto-Einträge aus der Tabelle alle gelöscht?
    Wenn ja, prüfe, ob die Spalte "dbID" die Eigenschaft "AUTO_INCREMENT" hat und aktiviere diese, falls sie es nicht hat.


    Somit:
    dbID muss AUTO_INCREMENT sein.
    Alle Fahrzeuge müssen aus der Tabelle gelöscht werden.


    Anschließend kannst du obige Test-Schritte nochmal durchführen.

    Alles klar, danke.


    Dann ändere jetzt bitte folgendes am Code, der das Fahrzeug erstellt:
    PCar[playerid][d][P_uID] = cache_insert_id();
    zu:
    PCar[playerid][d][P_uID] = pInfo[playerid][db_id];
    Der Grund für diese Anpassung:
    Die P_uID ist die Datenbank-ID des Besitzers des Fahrzeugs. Darüber stellst du die Verbindung zwischen Besitzer und Fahrzeug her.
    Dies brauchst du, wenn du die Fahrzeuge aus der Datenbank laden willst. Dort musst du ja prüfen, welche Fahrzeuge für welchen Spieler geladen werden sollen.



    Ändere außerdem folgendes:
    mysql_format(db, query, sizeof(query), "INSERT INTO personalcars (P_X, P_Y, P_Z, P_R, P_C1, P_C2, P_MID, P_VID, dbID, P_uID) VALUES ('%f','%f','%f','%f','%d','%d','%d','%d','%d')",PCar[playerid][d][P_X],PCar[playerid][d][P_Y],PCar[playerid][d][P_Z],PCar[playerid][d][P_R],PCar[playerid][d][P_C1],PCar[playerid][d][P_C2],PCar[playerid][d][P_MID],PCar[playerid][d][P_VID],PCar[playerid][d][P_dbID],PCar[playerid][d][P_uID]);
    zu:
    mysql_format(db, query, sizeof(query), "INSERT INTO personalcars (P_X, P_Y, P_Z, P_R, P_C1, P_C2, P_MID, P_uID) VALUES ('%f','%f','%f','%f','%d','%d','%d','%d')",PCar[playerid][d][P_X],PCar[playerid][d][P_Y],PCar[playerid][d][P_Z],PCar[playerid][d][P_R],PCar[playerid][d][P_C1],PCar[playerid][d][P_C2],PCar[playerid][d][P_MID],PCar[playerid][d][P_uID]);
    Dort habe ich zum einen die dbID und die P_VID aus dem Query entfernt, sowie die P_VID aus den Parametern hinten, die dbID war dort nicht drin.
    Dies hat dazu geführt, dass du einen Fehler im MySQL Log erhalten haben solltest, da die Anzahl der Parameter nicht mit den erwarteten Werten übereinstimmt.
    So passt es jetzt.


    Es werden gespeichert:
    Koordinaten (X, Y, Z, R)
    Farben (C1, C2)
    Model (MID)
    Besitzer (uID)



    Nach der Anpassung dieser beiden Code-Stellen mache bitte folgendes:
    Beende den Server.
    Lösche alle Fahrzeuge aus der Datenbank, da diese zum Teil falsche Werte haben.
    Starte den Server wieder.
    Kaufe dir jetzt ein Fahrzeug.
    Prüfe anschließend, ohne weitere Aktionen im Server, ob der Eintrag in der Datenbank korrekt ist.


    Ist dieser korrekt?
    Wenn ja: Poste bitte den Code, mit dem du die Fahrzeuge aus der Datenbank beim Server-Start lädst (Query UND Callback).
    Wenn nein: Poste bitte einen Screenshot des Datenbankeintrags des neuen Fahrzeugs und erkläre, was falsch ist.



    Bitte mache nur die genannten Punkte, nichts anderes und lasse auch nichts aus. Das ist wichtig.

    Ja, das passt von der Menge.


    Poste jetzt bitte den Code, der die Spieler Statistik speichert (SpielerSpeichern oder so).


    Warum das notwendig ist? Damit ich dir die Beziehung zwischen Spieler und Fahrzeug erklären und herstellen kann.

    Gut, da das mit dem alles auf einmal posten nicht klappt (Code wieder nur brüchig da, keine Screenshots) machen wir das Step für Step jetzt.



    Poste bitte deinen Code, mit dem du ein neues Fahrzeug erstellst, und zwar den ganzen Befehl.

    Meine Frage wäre jetzt tatsächlich noch, wie es möglich wäre mehrere Ausgänge in einem Interior zu nutzen?
    Heißt wenn ich in ein 24/7 Shop gehe und rausgehen möchte, dass ich dann auch zurück an den richtigen ausgang gebracht werde

    Speichere die ID (Index i) des Shops, den du betrittst, beim Betreten in eine Spieler-Variable (PlayerInfo...).
    Beim Verlassen des Shops brauchst du nur prüfen, ob der Spieler an einem Ausgang ist. Wenn ja, setzt du ihn an die Position des Eingangs, von der ID (Index i), die du zuvor gespeichert (PlayerInfo) hast.

    Füge hier mal einen print ein:
    cInfo[i][fraktion] = PlayerInfo[playerid][pLeader];
    printf("Fraktion: %d", PlayerInfo[playerid][pLeader]);


    Was wird dir dann geprintet und siehst du die Meldung, dass es ein Fraktionsfahrzeug ist, wenn du dieses Fahrzeug abschleppst?

    Bei OnGameModeInit in die Schleife noch das aufnehmen:
    ShopInfo[i][shopid] = -1;


    Und beim Shopausgang:
    mysql_pquery(handle, query, "ShopFinished", "i", ShopInfo[MakeShop[playerid]][shopid]);
    zu:
    mysql_pquery(handle, query, "ShopFinished", "i", MakeShop[playerid]);

    Schreibe die Funktion so:
    getFreeShopID()
    {
    for(new i=0; i<sizeof(ShopInfo); i++)
    {
    if(ShopInfo[i][shopid]==-1) return i;
    }
    ABroadCast(0xFF0000FF, "Error: Maximale Anzahl an Shops erreicht.")
    return -1;
    }


    Das hatte ich ganz zu Anfangs schon angemerkt.
    Sonst klappt es nicht, da du immer nur die 0 oder 1 zurück bekommst.

    du fragst ab ob oder oder also ist da nix schwachsinn

    Nicht zwangsläufig, wenn es mit "2" zum Beispiel ein Mietfahrzeug ist, welches anders behandelt wird, dann klappt else nicht.
    else-if wäre hier angebrachter.


    Er erkennt aktuell nur Privatfahrzeuge. Was müsste ich anders machen ?

    Der Code an sich ist schon korrekt. Vermutlich weist du beim Erstellen des Fraktionsfahrzeugs nicht die 1 zu.


    Außerdem hast du hier bereits einen Thread zu diesem Thema offen, warum eröffnest du einen zweiten?
    Fahrzeug Abfrage PAWN

    Was kann ich da nochmal machen ?

    Als erste Lösung, abgesehen davon, die 6 Stunden einfach drauf zu rechnen (mit TimestampToDate), wäre zu empfehlen, die Uhrzeit der Maschine (Linux vermutlich) zu ändern. Das kannst du eventuell selbst machen, ansonsten frage bei deinem Host an, ob der dir das machen kann.


    Nur wenn das nicht möglich ist, dann würde ich die Umrechnung im Code machen.

    Dafür, dass ich jetzt erst angefangen habe, doch bestimmt nicht schlecht oder?

    Einwandfrei fürs erste Mal. So kleine Fehler wie das mit dem sizeof kommen auch später immer mal wieder vor. Das Tückische bei der Sache ist, sie sehen auf den ersten Blick richtig aus, weil man es ja oft so schreibt.
    Die Hauptsache ist aber immer, dass man daraus lernt.


    Vielen Dank

    Gerne!