2014-11-13 6 views
-1

Мне было интересно, возможно ли в плагине Bukkit создать систему RayCast, с которой я мог бы использовать вектор Vector, создать луч, который я мог бы, например, вызвать частицы каждый раз много блоков вдоль него. У меня нет большого опыта в математике; Я всего лишь в восьмом классе геометрии и еще не получил триггера. Я не хотел использовать player.getTargetBlock() и player.getLineOfSight(), потому что они устарели, а getLineOfSight() дает мне список блоков, и я искал что-то, что я мог бы получить Список местоположений или что-то еще например, и иметь возможность изменять интервал между каждым местоположением в списке.Алгоритм RayCast в Bukkit

Спасибо. Надеюсь, я смогу найти решение для этого. Я знаю, что люди делали это раньше, но когда я ищу алгоритмы RayCast, это в основном дает мне способы написать игровой движок, похожий на Doom.

+0

Эй, я помню, когда я работал над Буккитом, пока Моджан не рухнул! Если я правильно вас понимаю, вы хотите найти путь, который игрок берет, и сделать перед ним векторный путь с частицами частиц ...? –

ответ

0

Похоже, я нашел решение, здесь, если вы хотите знать. Это тестовый плагин, поэтому для тестирования я добавил команду/vec для проверки вашего вектора, а команда/shoot стреляет в частицу. Арцы/стреляют [длина луча] [пространство между частицами в блоках]. Длина не может быть десятичной (возможно, с некоторыми изменениями кода), но пространство между частицами может. Чтобы остановить частицу в сплошном блоке, я бы просто сломал цикл, когда lastParticle.getBlock(). GetType(). IsSolid() является ложным.

http://pastebin.com/CvE5vG8U

P.S. Для этого я использовал библиотеку ParticleEffect от darkbladee12, я мог бы просто использовать класс Effect, но у этого есть только несколько эффектов.

0

Для перебора метал блоки, вы можете использовать BlockIterator:

LivingEntity from;//set this to the living entity (or player) that you would like to send the particles from 
int distance;//set this to the distance, in blocks, that you would like the particles to go 

BlockIterator blocksToAdd = new BlockIterator(from.getEyeLocation(), 1, distance); 
while(blocksToAdd.hasNext()){ 
    Location loc = blocksToAdd.next().getLocation(); 
    if(!loc.getBlock().getType().isSolid()){ 
    //stop playing particles if the next block is not solid 
    break; 
    } 
    else{ 
    //play the particle here using the location loc 
    } 
} 
Смежные вопросы