Frage bezüglich einer Abfrage bsp: NearObject

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
  • Beitrag von ReborN ()

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Mal ein etwas sinnvollerer Denkanstoß, der die Pumpe deines Servers nicht unnötig rennen lässt:


    Geladene Objekte mit Koordinaten und Indikator in einem Array speichern -> So schließt du schonmal alle nicht vorhandenen Objekt-IDs aus und kannst auch problemlos mit Streamern arbeiten. Der Rest von SynonymousZ ist eigentlich korrekt, while oder for-Schleife über den Array heizen und Entfernung zum Spieler mittels IsPlayerInRangeOfPoint ermitteln, fertig.


    Der Array bietet dir dann übrigens auch darüber hinaus die Möglichkeit deine Objekte dynamisch zu editieren, ohne dabei immer wieder auf ein Filesystem zurückgreifen zu müssen.


    Mein CS:GO Server: 62.75.168.39:27016


    Ich bin so hungrig, dass ich vor lauter Durst nicht weiß, was ich rauchen soll - so müde bin ich!
    Freedom is just another word for 'Nothing left to lose'

  • Ich danke euch ;)
    Funktioniert nun wie es soll.


    MfG ;)



    //Edit
    Hab mal noch eine andere Frage und zwar,
    habe ich einen Befehl mit IsPlayerInArea (bei mir umbenannt zu IsPlayerInZone), die Area wird wie folgt abgefragt:


    if(IsPlayerInZone(playerid,HausBau[hb][hbPosX],HausBau[hb][hbPosY],HausBau[hb][hbPos2X],HausBau[hb][hbPos2Y]))


    Eine for schleife geht in den Fall durch alle Gebiete, an der stelle wo der Besitzer identisch ist mit dem gespeicherten Wert wird die schleife "gestoppt" und es sollte zu der Abfrage IsPlayerInZone weiter gehen.
    Dies tut es auch.
    Lediglich habe ich nun folgendes Problem, irgendwie akzeptiert er das mit dem Area nicht.
    Die Prints sind wie folgt:
    printf("return PlayerPOS X:%f - Y:%f", pPos[0], pPos[1]);
    printf("return ZoneAreaMin X:%f - X:%f", HausBau[hb][hbPosX],HausBau[hb][hbPosY]);
    printf("return ZoneAreaMax X:%f - X:%f", HausBau[hb][hbPos2X],HausBau[hb][hbPos2Y]);


    Bei IsPlayerInZone, sollte eine 1 zurück gegeben werden, tut es jedoch nicht, sondern eine 0.
    Der Stock dazu:
    stock IsPlayerInZone(playerid,Float:MinX,Float:MinY,Float:MaxX,Float:MaxY)
    {
    new Float:Pos[3];
    GetPlayerPos(playerid,Pos[0],Pos[1],Pos[2]);
    if(Pos[0] >= MinX && Pos[0] <= MaxX && Pos[1] >= MinY && Pos[1] <= MaxY)
    {
    return true;
    }
    return false;
    }
    Der Witz hierbei ist jedoch, dass er mit genau den gleichen Koordinaten (auch gleiche Anordnung) die Funktion "GangZoneCreate" ausführt und diese wird auch erstellt.


    Meine weitere Frage nun, wo soll hier ein Fehler sein?
    Die Koordinaten sind korrekt & laut den Print stimmen diese auch mit der Abfrage im stock überein.


    MfG ;)

    Einmal editiert, zuletzt von ReborN ()

  • Möglicherweise übergibst du die Werte falsch, oder lädst sie sogar falsch.
    Printe dir das ganze mal, dann siehst du wo der Fehler liegt.


    stock IsPlayerInZone(playerid,Float:MinX,Float:MinY,Float:MaxX,Float:MaxY)
    {
        new Float:Pos[3];
        GetPlayerPos(playerid,Pos[0],Pos[1],Pos[2]);
        printf("%0.2f >= %0.2f | %0.2f <= %0.2f | %0.2f >= %0.2f | %0.2f <= %0.2f", Pos[0], MinX, Pos[0], MaxX, Pos[1], MinY, Pos[1], MaxY);
        if(Pos[0] >= MinX && Pos[0] <= MaxX && Pos[1] >= MinY && Pos[1] <= MaxY)
        {
            print("true");
            return true;
        }
        print("false");
        return false;
    }


    Falls du den Fehler nicht findest, poste bitte den print.

  • Hallo Jeffry:,
    Den gleichen Print hatte ich ja oben schon ausgeführt, leider jedoch vergessen den Print hier mit einzufügen.
    Er gibt mir bei meinen Print (was das gleiche ist wie bei dir) folgendes aus:


    Print:
    printf("return PlayerPOS X:%f - Y:%f", pPos[0], pPos[1]);
    printf("return ZoneAreaMin X:%f - X:%f", HausBau[hb][hbPosX],HausBau[hb][hbPosY]);
    printf("return ZoneAreaMax X:%f - X:%f", HausBau[hb][hbPos2X],HausBau[hb][hbPos2Y]);


    Log:

    Code
    [19:11:55] return PlayerPOS X:913.007568 - Y:-1659.893310
    [19:11:55] return ZoneAreaMin X:921.935729 - X:-1646.126220
    [19:11:55] return ZoneAreaMax X:898.636779 - X:-1668.512207
    [19:11:55] if(Pos[0] >= MinX && Pos[0] <= MaxX && Pos[1] >= MinY && Pos[1] <= MaxY)


    Der Wert von GetPlayerPos X & Y stimmt so, wie es auch in der If Abfrage im Stock abgefragt wird.
    Jedoch muss ich dazu sagen, dass wir "IsPlayerInZone" ebenfalls schon des öfteren verwendet haben, wo es auch funktioniert hatte bzw. noch immer funktioniert.
    Wieso es jetzt hierbei plötzlich nicht funktioniert ist komisch.


    ocmd:bauen(playerid)
    {
    for(new hb= 0;hb<10;hb++)
    {
    print("1");
    if(HausBau[hb][BesitzerGR] == SpielerInfo[playerid][SPName])
    {
    print("2");
    new Float:pPos[3];
    GetPlayerPos(playerid, pPos[0], pPos[1], pPos[2]);
    printf("return PlayerPOS X:%f - Y:%f", pPos[0], pPos[1]);
    printf("return ZoneAreaMin X:%f - X:%f", HausBau[hb][hbPosX],HausBau[hb][hbPosY]);
    printf("return ZoneAreaMax X:%f - X:%f", HausBau[hb][hbPos2X],HausBau[hb][hbPos2Y]);
    print("if(Pos[0] >= MinX && Pos[0] <= MaxX && Pos[1] >= MinY && Pos[1] <= MaxY)");
    if(IsPlayerInZone(playerid,HausBau[hb][hbPosX],HausBau[hb][hbPosY],HausBau[hb][hbPos2X],HausBau[hb][hbPos2Y]))
    {
    print("3");
    ShowPlayerDialog(playerid,DIALOG_HAUS_BAUEN,DIALOG_STYLE_LIST,"Objekt Verwaltung","Bau Objekte","Weiter","Abbruch");
    return true;
    }
    }
    }
    return true;
    }


    Die prints werden alle anzeigt, welche vor der Abfrage "IsPlayerInZone" sind, mehr jedoch nicht.


    MfG ;)

  • Naja, deine prints sind nicht wirklich hilfreich, die sind zum einen falsch beschriftet und zum anderen durcheinander.


    Aber wie du hier siehst:

    Zitat

    [19:11:55] return ZoneAreaMin X:921.935729 - X:-1646.126220
    [19:11:55] return ZoneAreaMax X:898.636779 - X:-1668.512207


    Der Min Wert ist größer als der Max Wert. Das ist falsch.


    Also entweder du lädst es falsch, oder du musst es bei der Abfrage umdrehen, sprich zuerst die "2"-Pos eintragen, und dann die "normale".

  • Du bist zwar schon etwas weiter in deinem System jedoch würde ich um das baugebiet eine Zone erstellt mit der Hilfe des Streamerplugins.
    http://forum.sa-mp.com/showthread.php?t=102865


    CreateDynamicRectangle(Float:minx, Float:miny, Float:maxx, Float:maxy, worldid = -1, interiorid = -1, playerid = -1);


    Du kannst bei dem Befehl bauen dem user die Möglichkeit geben Objekte anzuklicken:


    SelectObject(playerid);


    über das Callback


    OnPlayerSelectDynamicObject(playerid, objectid, modelid, Float:x, Float:y, Float:z);


    kannst du abprüfen ob dieses Objekt in der bauzone ist, die dem Spieler gehört.


    IsPointInDynamicArea(areaid, Float:x, Float:y, Float:z);