Işın izleme

Uyarı

These docs were written for SpongeAPI 7 and are likely out of date. If you feel like you can help update them, please submit a PR!

Genel olarak ışın izleme koordine sistem yoluyla parçacık yolunu belirlemenin bir yöntemidir. SpongeAPI’de bu, alanda gelişigüzel bir sıra yolundaki engelleri keşfetmek için the BlockRay sınıfıyla uygulanır. Yaygın kullanım sorunu bir :javadoc:`Player`ın baktığı engeli bulmak olur.

Işınımın kaynağını Location, Extent ve “Vector3d” ya da bir Entity teriminden geçirerek “BlockRay#from’’ yöntemini kullanarak belirtebilirsiniz. Yöntem, bir BlockRay.BlockRayBuilder döndürecektir.

Tüyo

Eğer Entity olacak ışının kaynağını belirtirseniz, varsayılan yönü ``Entity``nin işaret ettiği yön olacaktır.

To specify the end point, you can use the BlockRay.BlockRayBuilder#to(Vector3d) method, which will set both the direction and ending location. Alternatively, you can specify a direction using BlockRay.BlockRayBuilder#direction(Vector3d) and also a distance limit using BlockRay.BlockRayBuilder#distanceLimit(double).

Not

The default distance limit is 1000 blocks as a safeguard to prevent infinite iteration. To disable the distance limit, use a negative value with BlockRayBuilder#distanceLimit(double).

Filtreleme

Filters determine what blocks are accepted by the BlockRay. To add a filter, use the BlockRayBuilder#stopFilter or BlockRayBuilder#skipFilter method, passing in one or many Predicate<BlockRayHit<E>>s (where E extends Extent). The BlockRayBuilder#stopFilter continues the ray cast when it hits a block that passes the given filter and the BlockRayBuilder#skipFilter skips all blocks that pass the filter. These filters can be chained together to create a complex BlockRay. For convenience, BlockRay contains the following methods for common filter use cases:

  • allFilter: bütün blokları kabul eden bir filtre döndürür

  • onlyAirFilter: sadece havayı kabul eden bir filtre döndürür

  • blockTypeFilter(BlockType): sadece belirlenmiş :javadoc:`BlockType`ı kabul eden bir filtre döndürür

  • continueAfterFilter(Predicate<BlockRayHit<E>>, int): belirlenmiş sayıda engeller tarafından verilen filtrenin geçmişinde devam eden filtreye geri döner.

Tabi ki kendi Predicate<BlockRayHit<E>> filtrenizi de yazabilirsiniz.

Son olarak BlockRay oluşturmayı bitirmek için BlockRay.BlockRayBuilder#build() kullanın.Bir Player``ın baktığı ilk havasız bloğu almak için örnek bir ``BlockRayBuilder kullanımı aşağıda sağlanmıştır.

import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.util.blockray.BlockRay;
import org.spongepowered.api.world.World;

Player player;
BlockRay<World> blockRay = BlockRay.from(player)
    .skipFilter(BlockRay.onlyAirFilter()).stopFilter(BlockRay.onlyAirFilter()).build();

We can rewrite the above to use BlockRay#skipFilter(Predicate<BlockRayHit>) in addition to BlockRay#stopFilter(Predicate<BlockRayHit>). This will skip all air blocks and stop at the first non-air block it hits.

BlockRay<World> blockRay = BlockRay.from(player)
    .skipFilter(BlockRay.onlyAirFilter()).stopFilter(BlockRay.allFilter()).build();

BlockRay kullanma

BlockRay, Iterator dahil ettiğinden beri, `` BlockRay`` tarafından üretilen BlockRayHit’leri yinelemek için` hasNext` ve next gibi yöntemleri (remove değil) kullanabilirsiniz. Buna ek olarak, yineleyiciyi başlangıç konumuna sıfırlamak için BlockRay#reset() yöntemini kullanabilirsiniz. BlockRayHit aracılığıyla tekrar yapmaktansa, BlockRay#end() yöntemini kullanarak, filtrenin kabul ettiği son bloğu elde etmek için blok yolunu sonuna kadar izleyebilirsiniz(veya block limitine erişildiyse hiçbirini).

BlockRayHit kullanmak

`` BlockRayHit``, ışınla kesişen her blok hakkında bilgi içerir. Blokun yerini, ışının yönünü, ışının ve bloğun kesişim noktasının * koordinatlarını ve diğer benzer verileri içerir. Aşağıdaki kod, önceki örnekteki “BlockRay” ‘i, oynatıcı önünde ilk hava tahliye edilmemiş bloğun yerini yazdırmak için kullanmaktadır.

import org.spongepowered.api.util.blockray.BlockRayHit;
import java.util.Optional;

BlockRay<World> blockRay = ...;
Optional<BlockRayHit<World>> hitOpt = blockRay.end();
if (hitOpt.isPresent()) {
    BlockRayHit<World> hit = hitOpt.get();
    System.out.println("Found " + hit.getLocation().getBlockType() + " block at "
        + hit.getLocation() + " with intersection at " + hit.getPosition());
}