kann man die Distanz zu einem Object abfragen?

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
  • Hallo,


    Ungefähr so sieht das ganze bisher aus:



    enum zollinfo
    {
    zModelID,
    zText[32],
    zPreis,
    Float:zToPosX,
    Float:zToPosY,
    Float:zToPosZ,
    Float:zPosX,
    Float:zPosY,
    Float:zPosZ,
    Float:zPosRotX,
    Float:zPosRotY,
    Float:zPosRotZ,

    }





    new ZollAmt[][zollinfo] =
    {


    {978, "Gute Fahrt!",500, 52.0, -1539.19921875, 0.0, 52.0, -1539.19921875, 5.0533084869385, 0.0, 0.0, 79.991455078125},
    {978, "Gute Fahrt!",500, 54.19921875, -1524.5, 0.0, 54.19921875, -1524.5, 4.9744849205017, 0.0, 0.0, 261.98547363281}
    }



    Die Abfrage lautet bisher so:



    if(strcmp(strget(cmdtext,0),"/zoll", true) ==0)
    {



    for(new zoll = 0; zoll < sizeof(ZollAmt); zoll++)
    {
    if(!IsPlayerInRangeOfPoint(playerid, 15, ZollAmt[zoll][zPosX], ZollAmt[zoll][zPosY], ZollAmt[zoll][zPosZ])) continue;
    if(GetPlayerMoney(playerid) < ZollAmt[zoll][zPreis]) return SendClientMessage(playerid, 0xFFFFFF00, "Zu wenig Geld mit dir dabei!");
    GivePlayerMoney(playerid, -ZollAmt[zoll][zPreis]);
    GameTextForPlayer(playerid, ZollAmt[zoll][zText], 2500, 3);
    MoveObject(ZollObject[zoll], ZollAmt[zoll][zToPosX], ZollAmt[zoll][zToPosY], ZollAmt[zoll][zToPosZ], 3.5);
    SetTimerEx("SetZollBack", 3500, 0, "d", zoll);
    return 1;
    }

    return SendClientMessage(playerid, 0xFFFFFF00, "Nicht in der Nähe eines Zollamtes!");




    }


    Das funktioniert alles super, aber wenn man zu nah an einer der beiden Zollschranken ist, dann wird die andere Zollschranke angesprochen.
    Jetzt hab ich mir gedacht, man könnte irgendwie die tatsächliche Distanz zwischen Spieler und dem Object abfragen ( nicht nur InRangeOfPoint ) und dann diese mit dem zweiten Wert vergleichen. Je nachdem, wo man näher dran ist, solte die Zollschranke "angesprochen" werden.



    Kennt einer eine Lösung für mein Problem?
    Ich hab zwar schon gegoogelt, aber ich bin bisher auf nichts hilfreiches gestoßen.


    Mfg Joooo

    Einmal editiert, zuletzt von joooo ()

  • benutze doch einfach isplayerinrangeofobject schreib es um das er den wert der distance ausgibt

  • ok. da werd ich morgen damit rumbasteln.
    ( des hab ich gefunden )
    stock IsPlayerInRangeOfObject(playerid, object, Float:distance) //by Templer
    {
    new Float:X, Float:Y, Float:Z;
    if(!IsValidObject(object)) return false;
    GetObjectPos(object, X, Y, Z);
    if(IsPlayerInRangeOfPoint(playerid, distance, X, Y, Z)) return object;
    return false;
    }


    des ging dann....

    new ausgabetext[5};
    format (ausgabetext, sizeof(ausgabetext), "Die Distanz beträgt "%f", distance);
    SendClientMessage(playerid, farbehalt, ausgabetext);
    return distance;


    ok, ich probiers lieber morgen aus, anstatt meine versuche hier reinzuschreien...


    DANKE :thumbup: :thumbup:

    Einmal editiert, zuletzt von joooo ()

  • new ausgabetext[5};
    format (ausgabetext, sizeof(ausgabetext), "Die Distanz beträgt "%f", distance);
    SendClientMessage(payerid, farbehalt, ausgabetext);
    return distance;

    das kann nicht funktionieren ;)


    du hast ein " vor %f das %f muss noch in die "" mit rein ;) also muss es so aussehen:
    new ausgabetext[5};
    format (ausgabetext, sizeof(ausgabetext), "Die Distanz beträgt %f", distance);
    SendClientMessage(payerid, farbehalt, ausgabetext);
    return distance;

  • ausm Kopf geschrieben, sollte aber Funktionieren wenn ich keinen Denkfehler hatte:
    stock GetDistanceToObject(playerid, object) //by [DT]Sniper
    {
    new Float:oX, Float:oY, Float:oZ, Float:pX, Float:pY, Float:pZ, Float:Zwischenspeicher;
    if(!IsValidObject(object)) return false;
    GetObjectPos(object, oX, oY, oZ);
    GetPlayerPos(playerid, pX, pY, pZ);
    if(oX > pX){Zwischenspeicher = oX; oX=pX; pX = Zwischenspeicher;}
    if(oY > pY){Zwischenspeicher = oY; oY=pY; pZ = Zwischenspeicher;}
    if(oZ > pZ){Zwischenspeicher = oZ; oZ=pY; pZ = Zwischenspeicher;}
    pX = pX - oX;
    pY = pY - oY;
    pZ = pZ - oZ;
    Zwischenspeicher = pX+Py+Pz;
    return Zwischenspeicher;
    }