Vehicle Model berechnen

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Guten Abend Breadfish-Community,


    ich habe eine kleine Frage und zwar möchte ich von Fahrzeugen die Motorhaube berechnen.
    Es soll die Distanz von der Motorhaube und Spieler berechnet werden, das ganze soll als Befehl später aufgerufen werden.


    Das Callback des Fahrzeugberechnen lautet:

    Code
    GetVehicleModelInfo(/* Vehicle Model */, VEHICLE_MODEL_INFO_SIZE, X, Y, Z);


    Mein Problem ist es nur, dass bei diesem Callback der Spieler im Auto sitzen muss.
    Geht das auch anders, sprich das der Spieler nicht im Auto sitzen muss um die Motorhaubendistanz zu berechnen?


    Ich hoffe ich habe es nicht kompliziert erklärt, ich möchte wiegesagt das die Distanz berechnet wird und geprüft wird ob der Spieler vor der Motorhaube steht...


    Könnt ihr mir helfen?
    Bedanke mich im Vorraus :)

  • Mit dieser Funktion kannst du das nächste Fahrzeug zum Spieler herausfinden:
    stock GetClosestVehicleID(playerid, Float:dist = 10000.0) //©Jeffry
    {
    new Float:tmp, Float:x, Float:y, Float:z, id = INVALID_VEHICLE_ID;
    for(new i = 0; i < MAX_VEHICLES; i++)
    {
    if(GetVehiclePos(i, x, y, z))
    {
    tmp = GetPlayerDistanceFromPoint(playerid, x, y, z);
    if(tmp <= dist)
    {
    dist = tmp;
    id = i;
    }
    }
    }
    return id;
    }


    Die ID kannst du dann nehmen, und die Größe des Fahrzeugs mit GetVehicleModelInfo berechnen.
    Die Größe nimmst du dann geteilt durch 2 als dist in dieser Funktion:
    stock GetPosVorVeh(vehicleid, Float:dist, &Float:x, &Float:y, &Float:z) //©Jeffry
    {
    new Float:a;
    GetVehicleZAngle(vehicleid, a);
    GetVehiclePos(vehicleid, x, y, z);
    x += (dist * floatsin(-a, degrees));
    y += (dist * floatcos(-a, degrees));
    return true;
    }


    Dann kannst du mit dem Rückgabewert von x, y, z ein IsPlayerInRangeOfPoint machen, mit dem Range 1 oder 2, je nach dem wie viel Abstand du erlauben willst.

  • @Jeffry:
    aaah kk gut diese Stock's habe ich gesucht :D


    Meinst du nun so den Aufbau?

  • Dort wo du bei GetPosVorVeh 50 stehen hast muss Y/2 rein.
    Beachte aber, dass der Wert von Y den GetVehicleModelInfo zurück gibt von GetPosVorVeh überschrieben wird.
    Das GetPosVorVeh muss übrigens nicht in einem if-Statement stehen, das gibt immer true zurück.



    Ändere aber:
    if(GetClosestVehicleID(playerid, 500))
    zu:
    new id = GetClosestVehicleID(playerid, 500);
    if(id != INVALID_VEHICLE_ID)



    Sprich:
    if(strcmp(cmd, "/test", true) == 0)
    {
    new id = GetClosestVehicleID(playerid, 500);
    if(id != INVALID_VEHICLE_ID)
    {
    new Float:X, Float:Y, Float:Z;
    GetVehicleModelInfo(GetVehicleModel(id), VEHICLE_MODEL_INFO_SIZE, X, Y, Z);
    GetPosVorVeh(id, Y/2, X, Y, Z);
    if(IsPlayerInRangeOfPoint(playerid, 3.0, X, Y, Z))
    {
    SendClientMessage(playerid, COLOR_WHITE, "Motorhaube");
    return 1;
    }
    }
    SendClientMessage(playerid, COLOR_WHITE, "Du bist nicht in der Nähe eines Fahrzeuges.");
    return 1;
    }

    3HZXdYd.png

    3 Mal editiert, zuletzt von Jeffry () aus folgendem Grund: X/2 -> Y/2

  • gut jetzt funktionierts aber fast :D


    Wenn ich an der Seite des Fahrzeugs bin wird "Motorhaube" ausgeschrieben.
    Ich finde gerade nicht die Fahrzeug Offsets, aber es ist nicht das X was man teilen muss.
    Glaube Y bin mir aber nicht sicher da ich die Offsets nicht weiß...


    Weißt du ob das gehen würde?

  • Stimmt, die Länge ist Y.
    GetPosVorVeh(id, X/2, X, Y, Z);
    zu:
    GetPosVorVeh(id, Y/2, X, Y, Z);


    Dann dürfte es klappen.



    EDIT:
    Mir ist noch etwas aufgefallen, bei der Funktion:
    Dort muss die Model ID rein, nicht die Vehicle ID, also damit den Befehl so:
    if(strcmp(cmd, "/test", true) == 0)
    {
    new id = GetClosestVehicleID(playerid, 500);
    if(id != INVALID_VEHICLE_ID)
    {
    new Float:X, Float:Y, Float:Z;
    GetVehicleModelInfo(GetVehicleModel(id), VEHICLE_MODEL_INFO_SIZE, X, Y, Z); //Model ID hier
    GetPosVorVeh(id, Y/2, X, Y, Z);
    if(IsPlayerInRangeOfPoint(playerid, 3.0, X, Y, Z))
    {
    SendClientMessage(playerid, COLOR_WHITE, "Motorhaube");
    return 1;
    }
    }
    SendClientMessage(playerid, COLOR_WHITE, "Du bist nicht in der Nähe eines Fahrzeuges.");
    return 1;
    }

  • Super! :)

    Eine letzte Frage hätte ich noch und zwar das geteilt durch gilt nur für vorne wenn ich z.B. den Kofferraum berechnen will muss ich mal nehmen?

    Nein, dafür musst du -(Y/2) nehmen, da es auch die Hälfte der Fahrzeuglänge ist, nur eben nach hinten.


    Oder alternativ:
    stock GetPosHinterVeh(vehicleid, Float:dist, &Float:x, &Float:y, &Float:z) //©Jeffry
    {
    new Float:a;
    GetVehicleZAngle(vehicleid, a);
    GetVehiclePos(vehicleid, x, y, z);
    x += (-dist * floatsin(-a, degrees));
    y += (-dist * floatcos(-a, degrees));
    return true;
    }


    Dann mit Y/2 als dist.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen