Beiträge von Jeffry

    Die Spalte username5 existiert in deiner Datenbank nicht. Entweder du hast du verschrieben, oder die Spalte vergessen hinzuzufügen.
    Falls du den Fehler nicht findest, poste bitte den Code bei dem der Fehler kommt.

    Um nochmal hier drauf zu sprechen zu kommen:

    Kennt jemand noch eine Seite wo man den Vehicle Streamer findet??


    http://forum.sa-mp.com/showthread.php?t=529389


    Jetzt gibt es ja das SetVehicleParamsEx nicht.
    Es gibt eine Möglichkeit, zumindest für manche Anwendungen, trotzdem darauf zuzugreifen. Willst du zum Beispiel nur den Motor starten, und er standardmäßig aus ist, sobald du das Fahrzeug verlässt, dann geht es indem du mit GetPlayerVehicleID und SetVehicleParamsEx direkt arbeitest. Nur gespeichert werden die Daten eben nicht, heißt wenn niemand mehr in der Nähe ist, dann sind wieder die Standard Werte drin.


    Schade, dass es bei dem Streamer Edit nicht beachtet wurde, dass auch eine neue Funktion kommen kann.
    Allerdings ist es das beste was es derzeit noch gibt.

    Das alles zwischen Print 5 und Print 6 musst du hiermit ersetzen:
    sscanf(string, "p<|>ddfffffffd", GZ[i][zid], GZ[i][owner], GZ[i][max_x], GZ[i][max_y], GZ[i][min_x], GZ[i][min_y], GZ[i][flagge_x], GZ[i][flagge_y], GZ[i][flagge_z], GZ[i][erstellt]);
    Ist zwar kürzer, aber bei weitem nicht so flexibel. Wenn dir das egal ist, kannst du auch sscanf nutzen. Mir ist es in meinem Code nicht egal.


    Du kannst es auch direkt in das enum splitten, dazu sollte aber die Reihenfolge im enum gleich sein wie in der Datenbank.
    Falls du das noch selbst machen willst hast du hier ein Tutorial, wie du das machst: [ SCRIPTING ] sscanf 2.0

    Du hast den Timer weg gemacht, warum? Ohne den Timer geht es nicht.


    Nein, nicht manuell. Beim Erstellen der Zone (INSERT Query setzt du die Spalte "erstellt" (eben die letzte in der Tabelle) auf 1.


    Oder, falls dir das egal ist, mache einfach das weg:
    if(GZ[i][erstellt] != 1)continue;



    Den Timer brauchst du aber zwingend, da sonst das Query vor der Verbindung ausgeführt wird, und das geht nicht.

    Sehr gut!


    Es geht nicht, weil beide Zonen auf erstellt = 0 sind (die 0 am Ende). Wenn du das zu 1 setzt (auch beim Erstellen), dann geht es.


    Um spätere Probleme zu verhindern:
    Da du die IDs anders hast als der Index füge das hinzu
    case 1: GZ[i][zid] = strval(tmpstring);


    Und entferne
    GZ[i][zid] = i;

    Moment mal, in dem neuen Log sieht das so aus, als dass du erst LoadGZ ausführst und erst danach die Verbindung zur Datenbank herstellst.


    Ich nehme an:
    LoadGZ im Filterscript
    Verbindung zur Datenbank herstellen: Im Gamemode


    Ist das so? Wenn ja: Die Verbindung muss VOR LoadGZ hergestellt werden. Entweder du holst das verbinden in dem Filterscript, oder du setzt einen Timer der einmalig eine Sekunde läuft, welcher dann LoadGZ aufruft (musst es halt public machen).


    Bin ich mit der Annahme richtig? Wenn ja, klappt es wenn du obiges machst?

    Lass es mal so laufen, und poste dann was im Server Log steht (mit Zeitstempel bitte).


    stock LoadGZ()
    {
    print("LoadGZ aufgerufen");
    new string[500], str[64];
    print("1");
    format(str, sizeof(str), "SELECT * FROM `gangwar`;");
    printf("str = %s", str);
    mysql_query(str);
    print("2");
    mysql_store_result();
    printf("3 -> rows: %d", mysql_num_rows());
    new i = -1, counter = 0;
    print("4");
    while(mysql_fetch_row(string))
    {
    i++;
    printf("5 -> i=%d -> string = %s", i, string);
    strins(string, "|", strlen(string));
    new oldx=0;
    new count=0;
    for(new x=0; x<strlen(string); x++)
    {
    if(string[x]=='|')
    {
    count++;
    new tmpstring[sizeof(string)]; tmpstring=string;
    strdel(tmpstring, x, strlen(tmpstring));
    strdel(tmpstring, 0, oldx+1);
    switch(count)
    {
    case 2: GZ[i][owner] = strval(tmpstring);
    case 3: GZ[i][max_x] = floatstr(tmpstring);
    case 4: GZ[i][max_y] = floatstr(tmpstring);
    case 5: GZ[i][min_x] = floatstr(tmpstring);
    case 6: GZ[i][min_y] = floatstr(tmpstring);
    case 7: GZ[i][flagge_x] = floatstr(tmpstring);
    case 8: GZ[i][flagge_y] = floatstr(tmpstring);
    case 9: GZ[i][flagge_z] = floatstr(tmpstring);
    case 10: GZ[i][erstellt] = strval(tmpstring);
    }
    oldx=x;
    }
    }
    print("6");
    GZ[i][zid] = i;
    print("7");
    if(GZ[i][erstellt] != 1)continue;
    print("8");
    format(str,64,"%d |Besitzer: '%s'",i,FrakName(GZ[i][owner]));
    print("9");
    M_CreateZone(GZ[i][min_x],GZ[i][min_y],GZ[i][max_x],GZ[i][max_y],FrakColor(GZ[i][owner]),str,FrakColor(GZ[i][owner]));
    print("10");
    GZ[i][pickup] = CreatePickup(1314,1,GZ[i][flagge_x],GZ[i][flagge_y],GZ[i][flagge_z],0);
    print("11");
    GZ[i][label] = Create3DTextLabel("Tippe '/angriff', um das Gebiet anzugreifen.\nTippe '/flagge', um die Flagge zu erobern.",Rot,GZ[i][flagge_x],GZ[i][flagge_y],GZ[i][flagge_z],20,0);
    print("12");
    counter ++;
    }
    print("13");
    mysql_free_result();
    return printf(" '%d' Gangzone(n) wurde(n) erfolgreich erstellt und geladen.",counter);
    }


    Und dann suche bitte, ob in dem MySQL Log etwas zu "gangwar" steht, dieses SELECT - Query muss ausgeführt werden.
    Deine Tabelle heißt doch noch so, oder?


    Zwecks sscanf: Ja, aber erst mal sollten wir das hier zum laufen bekommen. Solange das Query nicht ausgeführt wird, ist das andere Zeug irrelevant.

    Ok, das kann ich mit dem Log bestätigen, das was wir zuvor gemacht haben klappt. Nur das Laden klappt nicht und das ist mir wirklich ein Rätsel.
    Kannst du bitte, die Lade-Funktion (mit dem test-Print) und dein OnFilterScriptInit (so wie es jetzt ist, mit den prints) nochmals posten, beides zusammen, so wie du es jetzt gerade im Moment hast.
    Es kann doch nicht sein, dass dieses Query nicht aufgerufen wird.


    Dann debugge ich dir den Code mal durch.

    Hm, komisch.
    Klappt es so?
    Falls nicht, wie hast du "VehicleNames" definiert? Stehen da einfach alle Namen drin, wie es normal ist?


    if(newstate == PLAYER_STATE_DRIVER)
    {
    new string[256], vehicleid = GetPlayerVehicleID(playerid);
    for(new i=0; i<sizeof(AutohausVehicles); i++)
    {
    printf("i:%d autohausvid:%d vehicleid:%d", i, AutohausVehicles[i][autohausvid], vehicleid);
    if(AutohausVehicles[i][autohausvid] == vehicleid)
    {
    printf("In %d.", vehicleid);
    SetPVarInt(playerid,"BuyVehicleID",i);
    printf("PVar Set -> Model: %d", vehicleid, GetVehicleModel(vehicleid));
    format(string,sizeof(string),"Möchtest du diesen %s wirklich für %i$ kaufen?",VehicleNames[GetVehicleModel(vehicleid) - 400],AutohausVehicles[i][ahvehiclepreis]);
    print(string);
    ShowPlayerDialog(playerid,DIALOG_FAHRZEUGKAUF,DIALOG_STYLE_MSGBOX,"[1/4]:Fahrzeugkauf",string,"JA","NEIN");
    return 1;
    }
    }
    return 1;
    }


    Falls es auch nicht klappt, poste bitte den Log.

    Debugge den Code mal.


    for(new i=0; i<sizeof(AutohausVehicles); i++)
    {
    AutohausVehicles[i][autohausvid] = AddStaticVehicle(AutohausVehicles[i][modelid],AutohausVehicles[i][ahvposX],AutohausVehicles[i][ahvposY],AutohausVehicles[i][ahvposZ],AutohausVehicles[i][ahvposR],AutohausVehicles[i][ahvcolor1],AutohausVehicles[i][ahvcolor2]);
    printf("autohausvid(%d) = %d", i, AutohausVehicles[i][autohausvid]);
    }



    if(newstate == PLAYER_STATE_DRIVER)
    {
    new string[999], vehicleid = GetPlayerVehicleID(playerid);
    for(new i=0; i<sizeof(AutohausVehicles); i++)
    {
    printf("i:%d autohausvid:%d vehicleid:%d", i, AutohausVehicles[i][autohausvid], vehicleid);
    if(AutohausVehicles[i][autohausvid] != vehicleid)continue;
    printf("In %d", vehicleid);
    SetPVarInt(playerid,"BuyVehicleID",i);
    format(string,sizeof(string),"Möchtest du diesen %s wirklich für %i $ kaufen?",VehicleNames[GetVehicleModel(vehicleid) - 400],AutohausVehicles[i][ahvehiclepreis]);
    print(string);
    ShowPlayerDialog(playerid,DIALOG_FAHRZEUGKAUF,DIALOG_STYLE_MSGBOX,"[1/4]:Fahrzeugkauf",string,"JA","NEIN");
    break;
    }
    return 1;
    }


    Was wird beim Erstellen und beim Einsteigen geprintet?

    Fahrzeuglimit bei der 0.3z Version liegt noch immer bei 2000. :fun:


    Er meint die Anzahl an gestreamten Fahrzeugen. Ein Streamer sollte mit 10.000 "virtuellen" Fahrzeugen klar kommen, die natürlich nicht alle gleichzeitig sichtbar sind.
    Wenn man in der Nähe aller ist, muss der Streamer so schlau sein, und nur die nächsten Fahrzeuge anzeigen (auch beim Objekt Streamer muss das so sein!), auch wenn sie im Range liegen, das macht (bzw. hat gemacht, da der Link weg ist) der "Streamer" hier nicht, sondern er würde einfach nichts mehr machen. ;)

    Grapefruit: Sorry für das lange Warten, ich hatte in dem Dorf in dem ich den ganzen Tag war keinen bzw. kaum Empfang. Auf der Fahrt dahin war es irgendwann weg.


    Ich habe mir deinen Log angeschaut, aber dort fehlt wieder der Teil des Querys.
    Also entweder du postest nicht den ganzen Log oder du machst irgendwas gewaltig falsch.


    Mache bitte mal folgendes:
    Lösche den MySQL Log komplett. Dann starte deinen Server und schaue in den MySQL Log. Dann kopiere ALLES raus und poste es hier.

    Kann ich denn jetzt alle anderen Funktionen damit nutzen z.B. SetVehicleParamsEx etc oder klappt das nicht??


    Nein, das geht nicht.


    Das hast du nicht richtig getestet, Kaliber.
    Beispiel:


    Ich erstelle ein Auto "cheetah" => Bekommt ID 1.
    Dann laufe ich ganz weit weg => Das gestreamte Fahrzeug (entsprechend cheetah) wird gelöscht, klar. ID 1 wird wieder frei.
    Ich erstelle ein Auto "infernus" => Bekommt ebenfalls die ID 1.
    Ich fahre mit meinem infernus zum cheetah => cheetah wird eingestreamt und erhält die virtuelle ID 2 (nicht die Variable "cheetah").


    Somit kann man (selbst wenn die Funktionen existieren würden) nicht mehr auf "cheetah" zugreifen, da dieser, wenn er nahe an "infernus" kommt nicht mehr die ID 1 hat. Man würde, egal ob "cheetah" oder "infernus" immer auf den Infernus zugreifen.



    Hier fehlt noch einiges. So wie es jetzt ist, ist es nicht verwendbar.


    Die Idee dahinter ist, auf die Autos nicht mit der Vehicle-ID zuzugreifen, sondern mit dem Index von "v_Info".



    EDIT: Zwecks der Übersichtlichkeit muss ich Goldkiller: voll und ganz zustimmen.