Beiträge von Jeffry

    Debugge es mal:
    stock GetVehicleFreeSeat(vehicleid)
    {
    printf("vehicleid: %d", vehicleid);
    new platz[5];
    for(new i=0;i<MAX_PLAYERS;i++)
    {
    if(!IsPlayerConnected(i) || !IsPlayerInVehicle(i,vehicleid))continue;
    platz[GetPlayerVehicleSeat(i)] = 1;
    printf("platz: %d ist belegt (von ID: %d) | max: %d", GetPlayerVehicleSeat(i), i, GetVehicleMaxSeats(vehicleid));
    }
    if(!platz[0] && 0 <= GetVehicleMaxSeats(vehicleid))print("return 0"), return 0;
    else if(!platz[1] && 1 <= GetVehicleMaxSeats(vehicleid))print("return 1"), return 1;
    else if(!platz[2] && 2 <= GetVehicleMaxSeats(vehicleid))print("return 2"), return 2;
    else if(!platz[3] && 3 <= GetVehicleMaxSeats(vehicleid))print("return 3"), return 3;
    else if(!platz[4] && 4 <= GetVehicleMaxSeats(vehicleid))print("return 4"), return 4;
    return -1;
    }


    Was steht dann im Log?

    Ahh, du hast auch noch 5-er Werte ( :thumbup: dass du gleich alles gepostet hast!!) . Dann mogeln wir doch ein bisschen:
    case 10:


    zu:
    case 10,11:


    Dann solltest du keine Probleme mehr haben.



    Liegt einfach daran, dass 45 / 10 = 4 ist (INT-Werte). Und 45 / 4 = 11.

    Da hilft leider nur debuggen. Wir müssen erst mal herausfinden, ob er den Switch überhaupt erreicht.
    Füge vor dem Switch und nach dem else (also dazwischen) das ein:
    printf("case: %d", Tank[veh]/(MaxTank[(modelid)-400]/10));


    Was wird als case geprintet?


    Falls gar nichts kommt, füge bitte zwischen die Zeilen deines Timers immer wieder prints um so zu verfolgen, wohin der Code geht, dann findest du vielleicht schon selbst heraus, warum string leer ist.
    Ansonsten poste den Code und das geloggte Ergebnis.

    Mit dem switch ist mir auch bewusst geworden, nachdem ich alle Zeilen fertig gescriptet hab ^^


    Haha! Du bist gut. :D
    Ist relativ egal, das nimmt sich in der Performance kaum was, aber irgendwann kannst es ja mal umschreiben zu case's, wenn dir langweilig ist.


    stock GetVehicleFreeSeat(vehicleid)
    {
    new platz[5];
    for(new i=0;i<MAX_PLAYERS;i++)
    {
    if(!IsPlayerConnected(i) || !IsPlayerInVehicle(i,vehicleid))continue;
    platz[GetPlayerVehicleSeat(i)] = 1;
    }
    if(!platz[0] && 0 <= GetVehicleMaxSeats(vehicleid))return 0;
    else if(!platz[1] && 1 <= GetVehicleMaxSeats(vehicleid))return 1;
    else if(!platz[2] && 2 <= GetVehicleMaxSeats(vehicleid))return 2;
    else if(!platz[3] && 3 <= GetVehicleMaxSeats(vehicleid))return 3;
    else if(!platz[4] && 4 <= GetVehicleMaxSeats(vehicleid))return 4;
    return -1;
    }


    Versuche es mal so.

    Nimm den "root" Benutzer ohne Passwort. Localhost solltest du nehmen, wenn die Datenbank auf dem gleichen Server liegt:


    #define SQL_HOST "127.0.0.1"
    #define SQL_USER "root"
    #define SQL_PASS ""
    #define SQL_DATA "DATENBANKNAME"


    Das ist in 99% aller Fälle standardmäßig so eingestellt.
    Dein user "samp" wird nicht die richtigen Berechtigungen haben, das ist auf localhost (dein Rechner) so eingestellt, standardmäßig zumindest.
    Deshalb benutze, wie ich oben geschrieben habe, den root - User ohne Passwort, der hat ALLE Berechtigungen. Dem kannst du später auch, je nach Client, ein Passwort geben.

    Nö, wenn du es nur einmal verwendest nicht unbedingt.
    Oft ruft man aber solche Queries mehrmals auf, von daher bietet es sich an. Muss man natürlich nicht machen, wenn du es nur einmal nutzt ist es relativ egal.


    Wie es dir lieber ist. Hauptsache ist ja immer, dass du es verstehst und dann es funktioniert. Es bringt nichts, wenn du einen Code hast den du nicht verstehst, und noch weniger bringt es was wenn du einen Code hast der nicht tut. Naja, und wenn beides zusammen kommt, dann wirds lustig.


    Lange Rede kurzer Sinn: Hier ist es egal.

    ocmd:setzen(playerid,params[])
    {
    new Name[MAX_PLAYER_NAME],query[256];
    GetPlayerName(playerid,Name,sizeof(Name));
    format(query,sizeof(query),"SELECT * FROM spieler WHERE Username = '%s'", Name);
    mysql_tquery(Datenbank, query, "OnPlayer_setzen", "d", playerid);
    return 1;
    }


    forward OnPlayer_setzen(playerid);
    public OnPlayer_setzen(playerid)
    {
    if(!cache_num_rows()) return SendClientMessage(playerid,-1,"Fehler");
    new Float:X,Float:Y,Float:Z,Float:R,Skin;
    X = cache_get_field_content_float(0,"PosX");
    Y = cache_get_field_content_float(0,"PosY");
    Z = cache_get_field_content_float(0,"PosZ");
    R = cache_get_field_content_float(0,"PosR");
    Skin = cache_get_field_content_int(0,"Skin");
    SetPlayerPos(playerid,X,Y,Z);
    SetPlayerFacingAngle(playerid,R);
    SetPlayerSkin(playerid,Skin);
    SetPlayerInterior(playerid,0);
    TogglePlayerClock(playerid,0);
    new str[126];
    format(str,sizeof(str),"%f %f %f",X,Y,Z);
    SendClientMessage(playerid,-1,str);
    return 1;
    }


    Dürfte so klappen.

    forward Speedometer();
    public Speedometer()
    {
    for(new i;i<MAX_PLAYERS;i++) {
    if(!IsPlayerNPC(i)) {
    if(IsPlayerConnected(i)) {
    if(IsPlayerInAnyVehicle(i) && GetPlayerVehicleSeat(i) == 0) {
    new Float:CarHealth,chealth,string[512],string1[128],kmh,modelid,veh;
    veh=GetPlayerVehicleID(i);
    modelid=GetVehicleModel(veh);
    GetVehicleHealth(veh,CarHealth);
    CarHealth = CarHealth - 250;
    CarHealth = CarHealth /10;
    CarHealth = CarHealth /75;
    CarHealth = CarHealth *100;
    chealth=floatround(CarHealth,floatround_floor);

    GetVehiclePos(veh,pNewKM[0][i],pNewKM[1][i],pNewKM[2][i]);
    printf("%f | %f | %f | %f | %f | %f |",pNewKM[0][i],pNewKM[1][i],pNewKM[2][i],pOldKM[0][i],pOldKM[1][i],pOldKM[2][i]);
    new Distance=floatround(floatsqroot( ((pNewKM[0][i]-pOldKM[0][i])*(pNewKM[0][i]-pOldKM[0][i])) +((pNewKM[1][i]-pOldKM[1][i])*(pNewKM[1][i]-pOldKM[1][i])) + ((pNewKM[2][i]-pOldKM[2][i])*(pNewKM[2][i]-pOldKM[2][i])) ));
    printf("distance = %d", Distance);
    KM[veh] += Distance;
    printf("KM[veh] = %d", KM[veh]);
    pOldKM[0][i] = pNewKM[0][i];
    pOldKM[1][i] = pNewKM[1][i];
    pOldKM[2][i] = pNewKM[2][i];
    format(string,sizeof string,"%d KM",KM[veh]);


    } else {

    }
    }
    }
    }
    return 1;
    }

    Spoiler anzeigen

    Ich bin bei einem Gesamt von über 2000 weil ich das bei OnPlayerStateChange nicht benutzt habe, deshalb hat er den ersten am Anfang (nicht dabei im Log) von 0 gerechnet.



    So habe ich es laufen gelassen, funktioniert einwandfrei. Ich habe nur die Textdraws und so entfernt, weil ich die ja nicht habe.
    Füge das bei dir so ein, und prüfe dann die prints.
    Wenn es klappt, füge Schritt für Schritt die anderen Dinge wieder ein.

    Das geht ganz einfach, man behilft sich eines Tricks, nämlich dem, dass \n nur einen Character darstellt.
    In deiner Datenbank sieht das ganze so aus:

    Zitat

    Dieser Zeilenumbruch~wird nun beachtet.


    Code:
    for(new i=0; i<strlen(string); i++) if(string[i] == '~') string[i] = '\n';
    ShowPlayerDialog(playerid,DIALOG_INFO,DIALOG_STYLE_MSGBOX,"Info",string,"Schließen","");


    string = der Wert aus der Datenbankspalte in der der Text steht.