Beiträge von Jeffry

    Schaut so aus @Jeffry , aber das Problem ist immer noch vorhanden

    Versuche es so:
    public OnPlayerSpawn(playerid)
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(specID[i] == playerid)
    {
    if(!IsPlayerInAnyVehicle(playerid))
    {
    TogglePlayerSpectating(i,1);
    PlayerSpectatePlayer(i,playerid);
    SetPlayerInterior(i,GetPlayerInterior(playerid));
    SetPlayerVirtualWorld(i,GetPlayerVirtualWorld(playerid));
    }
    else
    {
    TogglePlayerSpectating(i,1);
    PlayerSpectateVehicle(i,GetPlayerVehicleID(playerid));
    SetPlayerInterior(i,GetPlayerInterior(playerid));
    SetPlayerVirtualWorld(i,GetPlayerVirtualWorld(playerid));
    }
    }
    }



    Warum kommt diese Warning-Meldung?

    Scheint so, als sei die Verbindung nicht mehr aktiv. Entferne die Zeile mal und schaue, ob der Fehler weiterhin auftritt, oder dann weg ist.

    Versuche es so:
    stock ChangeVehicle(playerid,vmodell)
    {
    new Float:pos[4],seed[3],vID = GetPlayerVehicleID(playerid),newveh, engine, lights, alarm, doors, bonnet, boot, objective, bool:pSeatid[0xF],
    seatmodel, seatcount, seatx;
    seatmodel = GetVehicleModel(vID);
    seatcount = GetVehicleSeatCount(seatmodel)+1;
    if(!seatmodel) return -1;
    if(!IsPlayerInAnyVehicle(playerid))return 1;
    GetPlayerPos(playerid,pos[0],pos[1],pos[2]);
    GetVehicleZAngle(vID,pos[3]);
    GetVehicleVelocity(vID,speed[1],speed[2],speed[3]);
    DestroyVehicle(vID);
    for(new p; p<MAX_PLAYERS; p++)
    {
    if(!IsPlayerConnected(p) || IsPlayerNPC(p)) continue;
    if(GetPlayerVehicleID(p) == vID) pSeatid[GetPlayerVehicleSeat(p)] = true,seatx++;
    if(seatx >= seatcount) return -1;
    for(new i; i<sizeof pSeatid; i++) if(!pSeatid[i]) return i;
    PutPlayerInVehicle(p,newveh,pSeatid[i]);
    return -1;
    newveh = CreateVehicle(vmodell,pos[0],pos[1],pos[2]+0.5,pos[3],1,1,-1);
    PutPlayerInVehicle(playerid,newveh,0);
    SetVehicleVelocity(newveh,speed[0],speed[1],speed[2]);
    GetVehicleParamsEx(newveh, engine, lights, alarm, doors, bonnet, boot, objective);
    SetVehicleParamsEx(newveh, 1, lights, alarm, doors, bonnet, boot, objective);
    }
    return 1;
    }



    stock ChangeVehicle(playerid,vmodell)//@Jeffry
    {
    new Float:pos[4],seed[3],vID = GetPlayerVehicleID(playerid),newveh, engine, lights, alarm, doors, bonnet, boot, objective, seat[MAX_PLAYERS] = {-1, ...};
    new seatcount = GetVehicleSeatCount(GetVehicleModel(vID));
    if(!IsPlayerInAnyVehicle(playerid))return 1;
    GetPlayerPos(playerid,pos[0],pos[1],pos[2]);
    GetVehicleZAngle(vID,pos[3]);
    GetVehicleVelocity(vID,speed[1],speed[2],speed[3]);
    DestroyVehicle(vID);
    for(new i = 0; i < MAX_PLAYERS; i++) if(GetPlayerVehicleID(i) == vID) seat[i] = GetPlayerVehicleSeat(i);
    newveh = CreateVehicle(vmodell,pos[0],pos[1],pos[2]+0.5,pos[3],1,1,-1);
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(seat[i] != -1)
    {
    if(seat[i] < seatcount) PutPlayerInVehicle(i, newveh, seat[i]);
    else SetPlayerPos(i,pos[0],pos[1],pos[2]);
    }
    }
    PutPlayerInVehicle(playerid,newveh,0);
    SetVehicleVelocity(newveh,speed[0],speed[1],speed[2]);
    GetVehicleParamsEx(newveh, engine, lights, alarm, doors, bonnet, boot, objective);
    SetVehicleParamsEx(newveh, 1, lights, alarm, doors, bonnet, boot, objective);
    return 1;
    }

    Den kannst du fast so lassen, den Code von mir fügst du vor (das vor dem Kommentar) und nach (das nach dem Kommentar) deiner CreateVehicle Zeile ein.

    Dann unter den Includes:
    new specID[MAX_PLAYERS] = {-1, ...};


    Im Befehl:
    specID[playerid] = playerID;


    Beim beenden:
    specID[playerid] = -1;


    Und bei OnPlayerSpawn:
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(specID[i] == playerid)
    {
    //Spectate für "i" neu starten, auf "playerid".
    }
    }

    Das kannst du so machen:

    new seat[MAX_PLAYERS] = {-1, ...};
    for(new i = 0; i < MAX_PLAYERS; i++) if(GetPlayerVehicleID(i) == vID) seat[i] = GetPlayerVehicleSeat(i);
    //Fahrzeug neu erstellen...
    for(new i = 0; i < MAX_PLAYERS; i++) if(seat[i] != -1) PutPlayerInVehicle(i, newveh, seat[i]);


    Beachte aber, dass das neue Fahrzeug nicht weniger Sitze haben sollte, als das vorherige (Bus -> Motorrad), wenn mehr Sitze belegt sind, als dass neue Fahrzeug hat.

    Du bist aber noch im spectate Modus, oder? Wenn ja, dann ist das ein bekannter Fehler. Ich habe den bei mir auf dem Server damals so umgangen, dass ich den spectate Modus automatisch neu gestartet habe, wenn der gestorbene Spieler wieder gespawnt ist (OnPlayerSpawn).

    Du darfst den Index (idx) auch nur im Index (das was zwischen [ ] steht) von VehicleInfo nutzen, nicht als vehicleid.
    vehicleid != Index


    GetVehicleParamsEx(idx, engine, lights, alarm, doors, bonnet, boot, objective);
    zu:
    GetVehicleParamsEx(vID, engine, lights, alarm, doors, bonnet, boot, objective);
    Gleiches beim Set... .

    Soll ich idx durch i ersetzen oder den stock benutzen den du mir erstellt hast?

    Ersetze es durch "i".



    Das hier soll ich dann durch GetVehiclePos(vID, VehicleInfo[idx][v_X], VehicleInfo [idx][v_Y], VehicleInfo[idx][v_Z]); im public TachoTimer ersetzen?
    Fehler: Sobald ich in ein Fahrzeug einsteige wird der Kilometerstand automatisch hochgezählt.

    Da bin ich mit den Variablen durcheinander gekommen.
    Nutze
    GetVehiclePos(vehicleid, VehicleInfo[idx][v_KMX], VehicleInfo[idx][v_KMY], VehicleInfo[idx][v_KMZ]);
    Diese Werte müssen aktualisiert werden.
    Mit idx, ja.




    Soll ich im Befehl den Index von vID zu idx ersetzen?

    Ja, für die Indexe ([vID]) jeweils.

    Ist "sql10" auch die richtige Datenbank, also heißt deine Datenbank so?
    Ansonsten benenne mal die Tabellen um zu "Tor" und "TimeBan" also von den Großbuchstaben her. Das MySQL Plugin hat da zum Teil (nicht immer) Probleme, ich hatte das schon mit "id" und "ID", dass es das nicht genommen hat.

    Die Tabellen "Tor" und "TimeBan" existieren in deiner Datenbank "sql10" nicht.
    Möglicherweise wurden sie nicht exportiert, oder nicht mehr importiert.

    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.