Beiträge von Jeffry

    Das Problem ist, dass du auf den Index von VehicleInfo mit der vehicleid drauf zu greifst, das geht aber nicht, da die vehicleid nicht der Index-ID entspricht.
    Erstelle dazu eine folgende Funktion, um aus der vehicleid den Index zu bekommen:
    stock getVehIndex(vehicleid)
    {
    for(new i = 0; i < sizeof(VehicleInfo); i++)
    {
    if(VehicleInfo[i][v_Objekt] == vehicleid)
    {
    return i;
    }
    }
    return -1;
    }


    Dann kannst du die TachoTimer Funktion so schreiben:
    forward TachoTimer();
    public TachoTimer()
    {
    for(new i=0; i < MAX_PLAYERS; i++)
    {
    new vID = GetPlayerVehicleID(i);
    if(!IsPlayerConnected(i) || PlayerInfo[i][p_LoggedIn] != true)continue;
    if(!IsPlayerInAnyVehicle(i))continue;
    new idx = getVehIndex(vID);
    if(idx == -1) continue;
    new tacho[256], Float:hp;
    GetVehicleHealth(vID, hp);
    VehicleInfo[idx][v_Kilometer] += e_GetDistance(vID);
    format(tacho, sizeof(tacho), "%s~n~Geschwindigkeit: %dkm/h~n~Kilometerstand: %d.%dkm~n~Treibstoff: %dl~n~Schaden: %0.2f", VehicleNames[GetVehicleModel(vID)-400], GetPlayerSpeed(i), VehicleInfo[idx][v_Kilometer]/1000, VehicleInfo[idx][v_Kilometer]%1000, VehicleInfo[idx][v_Tank], hp);
    PlayerTextDrawSetString(i, Tacho[i][0], tacho);
    if(VehicleEngineOn(vID))PlayerTextDrawSetString(i, Tacho[i][2], "~g~Motor");
    else PlayerTextDrawSetString(i, Tacho[i][2], "~w~Motor");
    if(VehicleLightsOn(vID))PlayerTextDrawSetString(i, Tacho[i][3], "~g~Licht");
    else PlayerTextDrawSetString(i, Tacho[i][3], "~w~Licht");
    if(VehicleDoorLocked(vID))PlayerTextDrawSetString(i, Tacho[i][4], "~g~Tueren");
    else PlayerTextDrawSetString(i, Tacho[i][4], "~w~Tueren");
    GetVehiclePos(vID, VehicleInfo[idx][v_KMX], VehicleInfo[idx][v_KMY], VehicleInfo[idx][v_KMZ]);
    }
    return 1;
    }





    Zu dem anderen Problem:
    Da musst du die e_GetDistance Funktion ebenfalls abändern. Und zwar zu:
    stock e_GetDistance(vehicleid)
    {
    new Float:x2, Float:y2, Float:z2, Float:value, idx = getVehIndex(vehicleid);
    if(idx == -1) return 0;
    GetVehiclePos(vehicleid, x2, y2, z2);
    value = floatsqroot(floatpower(floatabs(floatsub(x2, VehicleInfo[idx][v_KMX])), 2)+floatpower(floatabs(floatsub(y2, VehicleInfo[idx][v_KMY])), 2)+floatpower(floatabs(floatsub(z2, VehicleInfo[idx][v_KMZ])), 2));
    return floatround(value);
    }
    Zudem musst du dann beim Laden der Fahrzeuge den Wert von diesen Variablen
    VehicleInfo[idx][v_KMX], VehicleInfo[idx][v_KMY], VehicleInfo[idx][v_KMZ]
    auf den Wert von
    VehicleInfo[idx][v_X], VehicleInfo [idx][v_Y], VehicleInfo[idx][v_Z]
    setzen, damit nicht der Null-Punkt als Berechnungsstart genommen wird.


    Dann musst du außerdem, wenn die Distanz dazu gerechnet wurde, also in der Funktion zur Positionsberechnung, oder dort wo es der Variable hinzugefügt wird (je nach dem wie der Rest deines Systems aussieht) die Koordinaten aktualisieren, sprich:
    GetVehiclePos(vehicleid, VehicleInfo[idx][v_KMX], VehicleInfo[idx][v_KMY], VehicleInfo[idx][v_KMZ]);
    Damit diese neue Position als neuer Berechnungsstart genommen wird.

    Postpack[playerid] = SetPlayerAttachedObject(playerid,1,1271,1,0.17,0.42,0.00,0.0,448.0,1.0,0.85,0.67,0.69);
    zu:
    SetPlayerAttachedObject(playerid,1,1271,1,0.17,0.42,0.00,0.0,448.0,1.0,0.85,0.67,0.69);


    Und
    RemovePlayerAttachedObject(Postpack[playerid],1);
    zu:
    RemovePlayerAttachedObject(playerid,1);



    Dort brauchst du kein Array, da du über den Attachment-Slot (1) arbeitest.

    public insecurePasswords()
    {
    new result[130], rows = cache_get_row_count(MySQL);
    if(rows)
    {
    print("Folgende unsichere Passwörter wurden geladen:\n");
    for(new i = 0; i<rows; i++)
    {
    cache_get_field_content(i, "Password", result, MySQL);
    format(inpass[i][In_Password], 30, result);
    printf("%s", result);
    }
    }
    else print("Keine unsicheren Passwörter in der Datenbank gefunden.");
    return 1;
    }

    Ich hab leider nicht die Zeit. @Jeffry ?

    Sorry, da muss ich passen. Ich habe momentan keine Zeit - vor allem nicht um an Projekten zu arbeiten - da bei mir demnächst die Prüfungen anstehen und es ziemlich zeitaufwendig ist, sich in ein System zu denken, das man nicht selbst gemacht hat, dies dann komplett funktionsfähig und ohne Fehler umzuschreiben.


    Der Schein, dass ich viel Zeit hätte, trügt, trotz dass ich ziemlich aktiv hier bin. Meistens ist es so, dass ich zwischendrin kurz was poste, das dauert dann 5 Minuten oder so. Für stundenlange Arbeiten an Systemen habe ich aber keine Zeit mehr - deshalb haben mein Kumpel und ich ja auch im Oktober letzten Jahres nach 6 Jahren unseren Server beendet. :)

    Das liegt daran, wie die Warnung auch sagt, dass eine Funktion mit einem getaggten Result (bool) vor deren Deklaration im Code verwendet wird.
    Entweder du fügst den stock ganz oben im Gamemode ein, unter den Includes, oder in eine Include rein, oder du fügst das hier in die Zeile vor dem stock ein:
    forward bool:PlayYouTubeStream(playerid,str[]);

    Versuche es so, das sollte reichen:
    public OnPlayerText(playerid, text[])
    {
    new string[145],pname[16],string2[145];
    GetPlayerName(playerid,pname,sizeof(pname));
    format(string,sizeof(string),"%s sagt: %s",pname,text);
    format(string2,sizeof(string2),"%s sagt: (Fremdsprache)",pname);
    for(new i; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i)) continue;
    if(Spieler[i][Sprache] == Spieler[playerid][Sprache])
    {
    SendClientMessageR(i,Weiss,string,10.0);
    }
    else
    {
    SendClientMessageR(i,Weiss,string2,10.0);
    }
    }
    return 0;
    }

    Was performanter ist weiß ich nicht genau, ich würde mal schätzen die MySQL Funktionen direkt zu nutzen ist besser. Aber davon abgesehen ist es vom Coding her wesentlich übersichtlicher, wenn man die MySQL Funktionen nutzt, für mich ist das ein besserer Stil, daher würde ich dir das empfehlen, anstatt es mit sscanf zu splitten.