Testen ob um einen Spieler min. 3X3 Bereich keine festen Blöcke sind

  • Abend zusammen,

    da ich grade an einen RTP Plugin sitze und es so gut wie fertig ist und mir beim Testen aufgefallen ist das ich ab und zu im Boden teleportiert werde.

    Leider weiß ich nicht wie ich testen kann ob über den Spieler Luft ist am besten in einen 3X3 bereich.

    Code :


    Ich bedanke mich jetzt schon mal für die Hilfe und die echt nette Community

  • Du bist mit isLockSafe doch eigentlich schon auf einem guten Weg. Ich vermute aber, du hast einfach das Ergebnis falsch rum, das was da aktuell steht ist:
    - "below" ist nicht in den "bad_blocks" ODER

    - "below" ist fest ODER

    - "above" ist fest


    Das scheint mir semantisch gesehen nicht so richtig sinn zu ergeben, bist du sicher, dass auch "above" fest sein soll?


    Mit freundlichen Grüßen,

    Rincewind

  • Freddy_HD also zum Thema das du gelegentlich in den Boden teleportiert wirst, kommt mir in den Kopf das du beim teleportieren den Spieler leicht über dem Block setzen solltest. Also auf der y Achse so 0.1 oder 0.2 addieren solltest. Das könnte schon helfen, da kommazahlen in der technischen Welt nicht ganz so genau sind und auch Vergleiche mit ihnen. Und dann eventuell wenn du den Spieler direkt auf die Koordinaten den Blocks teleportierst der Test ob der Spieler auf dem Block steht genau wegen der Ungenauigkeit fehlschlägt und man in den Block rutscht.


    Zum Thema mit dem Check. Der ist soweit richtig, auch wenn ich mich frage warum du das Ergebnis von isLocSafe negierst um es im while loop nochmal zu negieren ^^ da könntest du einfach beides mal das ! Weglassen und hast das gleiche Ergebnis, nur müsste die Methode dann isLocBad oder so heißen.


    Den 3x3 Bereich über dem Spieler auf Luft zu testen ist relativ einfach. Du nimmst die Location. Ziehst auf x und z 1 ab und machst dann mehrere for schleifen ineinander um die 3x3 durchzugehen.


    Code
    locX = locX - 1;
    locZ = locZ - 1;
    for(x = 0; x < 3; x++){
    for(z = 0; z < 3; z++) {
    testBlock = getBlock(locX + x, y, locZ + z);
    // testen ob Block sicher und reagieren
    }
    }

    Natürlich kann man die schleifen auch von -1 bis 1 laufen lassen und das -1 auf x und z am Anfang weglassen, allerdings ist das dann halt ein wenig unverständlicher auf den ersten Blick aber auch eigentlich besser.


    Wenn du jetzt 3x3x3 testen willst, also den kompletten Raum über dem Spieler, einfach noch eine for Schleife innen rein für die y werden und mit dem gleichen Vorgehen.