Beiträge von Jeffry

    Da sehe ich keinen Fehler, kannst du mal den ganzen Gamemode posten? Wenn du willst kannst du mir es auch per PN schicken.



    EDIT:
    In ~Zeile 20:
    new sscanf
    for(new i; i< MAX_PLAYERS; i++)


    Das muss weg.


    Stattdessen brauchst du:
    #include <sscanf2>

    Ja, das kannst du machen.
    Arbeite dazu mit einer Spielervariable, die du bei jeder Transaktion um eins erhöhst, also beispielsweise:
    SetPVarInt(playerid, "TransaktionID", GetPVarInt(playerid, "TransaktionID") + 1);


    Dann fragst du beim speichern in die Datenbank ab, ob das größer als 10 ist, falls ja machst du ein Update, ansonsten ein Insert.


    new id = GetPVarInt(playerid, "TransaktionID")-1;
    if(id >= 10)
    {
    format(query, sizeof(query), "UPDATE tabelle SET datum = '%s', empfaenger = '%s' WHERE id = '%d' and name = '%s'", datum, empf, (id%10)+1, SpielerName(playerid));
    //Das id%10 ist Modulo 10, also nur Werte zwischen 1 und 10.
    }
    else
    {
    format(query, sizeof(query), "INSERT INTO tabelle (id, datum, empfaenger, name) VALUES ('%d', '%s', '%s', '%s')", id+1, datum, empf, SpielerName(playerid));
    }


    Alternativ kannst du es auch so machen, dass du immer weiter hoch zählst und die löschst, die älter als die 10 neusten sind:
    new id = GetPVarInt(playerid, "TransaktionID");
    format(query, sizeof(query), "DELETE FROM tabelle WHERE id <= '%d' and name = '%s'", id-10, SpielerName(playerid));
    format(query, sizeof(query), "INSERT INTO tabelle (id, datum, empfaenger, name) VALUES ('%d', '%s', '%s', '%s')", id+1, datum, empf, SpielerName(playerid));

    Ist eben nicht ganz so performant, das macht hier aber keinen Unterschied.

    Schreibe es so:

    Spoiler anzeigen
    CreatePlayerCar(playerid,modelid,Float:x,Float:y,Float:z,Float:r,cl1,cl2,vsteuern)
    {
    for(new i=0; i<sizeof(cInfo); i++)
    {
    new string[128];
    new engine, lights, alarm, boonet, boot, objective;
    if(cInfo[i][id_x]!=0)continue;
    strmid(cInfo[i][besitzer],SpielerName(playerid),0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
    cInfo[i][c_x]=x;
    cInfo[i][c_y]=y;
    cInfo[i][c_z]=z;
    cInfo[i][c_r]=r;
    cInfo[i][clr1]=cl1;
    cInfo[i][clr2]=cl2;
    cInfo[i][model]=modelid;
    cInfo[i][csteuern]=vsteuern;
    cInfo[i][c_lock] = 1;
    cInfo[i][id_x]=CreateVehicle(modelid,x,y,z,r,cl1,cl2,-1);
    gas[cInfo[i][id_x]] = 100;
    SetVehicleParamsEx(cInfo[i][id_x], engine, lights, alarm, cInfo[i][c_lock], boonet, boot, objective);
    if(!strcmp(cInfo[i][besitzer], SpielerName(playerid)))
    {
    new slotID;
    for(new x = 0; x < sizeof(cInfo); x++) if(cInfo[x][id_x]!=0 && !strcmp(cInfo[x][besitzer], SpielerName(playerid))) slotID++;
    if(slotID <= MAX_VEHICLE_SLOT)
    {
    printf("Besitzer: %s | max Slots: %i",cInfo[i][besitzer], MAX_VEHICLE_SLOT);
    cInfo[i][c_slot] = slotID;
    printf("Besitzer: %s | SlotID: %i",cInfo[i][besitzer],slotID);
    }
    else if(slotID >MAX_VEHICLE_SLOT)
    {
    format(string,128,"Der Spieler %s hat seine Slots bereits verbraucht.",SpielerName(playerid));
    SCM(playerid,COLOR_GRAU,string);
    printf("Besitzer: %s | Slots: %i",cInfo[i][besitzer],slotID);
    return 1;
    }
    }
    SaveCarToDB(playerid,i);
    return 1;
    }
    return 1;
    }

    Dafür gibt es die expander. ;)


    Schreibe es so:
    if(IsPlayerInRangeOfPoint(playerid,range,2219.5276,-2228.8760,13.5469))
    {
    for(new i=0; i<sizeof(fcInfo); i++)
    {
    printf("DEBUG 1: vID: %d | i: %d | id_x: %d",vID,i,cInfo[i][id_x]);
    if(fcInfo[i][id_x] != vID) continue;
    printf("fc_id: %d",fcInfo[i][fc_id]);
    if(fcInfo[i][fc_id] !=5) continue;
    new string[128];
    format(string,128,"Produkte kaufen");
    ShowPlayerDialog(playerid,DIALOG_BUYPRODS,DIALOG_STYLE_LIST,"Produkte",string,"Wählen","Abbrechen");
    print("ENDE");
    DisablePlayerCheckpoint(playerid);
    return 1;
    }
    return SCM(playerid,COLOR_GRAU,"Fahre mit ein Fahrzeug deiner Fraktion zum Checkpoint.");;
    }

    Weil du "pickupid" in OnPlayerKeyStateChange nicht verwenden kannst.
    Wenn du abfragen willst, ob der Spieler im Pickup ist, dann musst du das mit IsPlayerInRangeOfPoint machen.


    Pascal.:
    Debugge es so:
    if(IsPlayerInRangeOfPoint(playerid,range,2219.5276,-2228.8760,13.5469))
    {
    for(new i=0; i<sizeof(fcInfo); i++)
    {
    printf("DEBUG 1: mID: %d | i: %d | id_x: %d",mID,i,cInfo[i][id_x]);
    if(fcInfo[i][id_x] != mID) continue;
    printf("fc_id: %d",fcInfo[i][fc_id]);
    if(fcInfo[i][fc_id] !=5) continue;
    new string[128];
    format(string,128,"Produkte kaufen");
    ShowPlayerDialog(playerid,DIALOG_BUYPRODS,DIALOG_STYLE_LIST,"Produkte",string,"Wählen","Abbrechen");
    print("ENDE");
    DisablePlayerCheckpoint(playerid);
    return 1;
    }
    return SCM(playerid,COLOR_GRAU,"Fahre mit ein Fahrzeug deiner Fraktion zum Checkpoint.");;
    }
    Was steht im Log?

    Durch die returns bewirkst du, dass bei der ersten nicht Übereinstimmung gleich beendet wird. Schreibe es so:
    if(IsPlayerInRangeOfPoint(playerid,range,2219.5276,-2228.8760,13.5469))
    {
    for(new i=0; i<sizeof(fcInfo); i++)
    {
    printf("DEBUG 1: Vehicle: %d | fcInfo[%i][fc_id] !=vID[%i]",vID,i,vID);
    if(fcInfo[i][id_x] !=mID) continue;
    printf("DEBUG 2: Vehicle: %d | vID[%i] != fcInfo[%i][fc_id]",vID,vID,i);
    if(fcInfo[i][fc_id] !=5) continue;
    new string[128];
    format(string,128,"Produkte kaufen");
    ShowPlayerDialog(playerid,DIALOG_BUYPRODS,DIALOG_STYLE_LIST,"Produkte",string,"Wählen","Abbrechen");
    print("ENDE");
    DisablePlayerCheckpoint(playerid);
    return 1;
    }
    return SCM(playerid,COLOR_GRAU,"Fahre mit ein Fahrzeug deiner Fraktion zum Checkpoint.");;
    }


    Übrigens, Debug Meldungen setzt man vor die Abfrage, sonst weißt du ja nicht was die Werte sind, die geprüft werden. ;)

    Und wenn du vor den Aufruf der Funktion einen Print setzt? Ansonsten poste bitte mal den Code.
    Was passiert, wenn du die Funktion im Aufruf einfach mal auskommmentierst?
    //Fight_Init();


    Vielleicht liegt es auch daran, dass du die 0.3d Version von sscanf auf einem 0.3z Server laufen lässt, aktualisiere die ggf mal.

    So wie die ini/txt/... Datei heißen soll, die hat ja einen Namen. Ich weiß ja noch wie du den vergibst, generell würde es auch einfach so gehen:
    format(Banklog, sizeof(Banklog), "/SanAndreas-Bank/BankTransferLog.txt");


    Beachte aber, dass der Ordner SanAndreas-Bank existieren muss, sollte klar sein, wenn der im Pfad steht.

    Füge das ganz unten in deinen Gamemode ein:
    forward SaveToFile(filepath[],text[]);
    public SaveToFile(filepath[],text[])
    {
    new File:wFile, string[512], year,month,day, hour,minute,second;
    getdate(year,month,day);
    gettime(hour,minute,second);
    wFile = fopen(filepath,io_append);
    format(string,sizeof(string),"[%02d.%02d.%02d %02d:%02d:%02d] %s\r\n",day,month,year,hour,minute,second,text);
    fwrite(wFile,string);
    fclose(wFile);
    return 1;
    }


    und dann dort wo du den Text speichern willst:
    format(Banklog, sizeof(Banklog), "/SanAndreas-Bank/%s.ini", dateiname);
    format(string2, sizeof(string2), "[Überweisung]: %s hat %s %d$ auf sein Konto überwiesen.", SpielerName(playerid), SpielerName(pID), strval(inputtext));
    SaveToFile(Banklog, string2);

    Dann bleibt dir leider nur noch das händische debuggen übrig, indem du am besten hier anfängst:
    Fight_Init


    Einfach zwischen jede Zeile einen print setzen, damit du anhand des Logs dann weißt, vor welcher Zeile der Code stoppt.
    Wenn du die Zeile gefunden hast, und den Fehler nicht erkennst, poste sie hier.


    Debugge es einfach so:
    //Code...
    printf("1");
    //Code
    printf("2");
    ...

    Schreibe das so:
    stock KillFrakCar(id)
    {
    DestroyVehicle(FrakCarInfo[id][f_ID]);
    FrakCarInfo[id][f_ID] = 0;
    }


    Und das:
    if(FrakCarInfo[i][f_Fraktion] == GetPVarInt(playerid,"Fraktion"))
    zu:
    if(FrakCarInfo[i][f_Fraktion] == GetPVarInt(playerid,"Fraktion") && FrakCarInfo[i][f_ID] > 0)




    EDIT:
    shoxinat0r: Gerne, kein Problem. Freut mich :)