- Баллы
- 76
Предисловие:
Хз понадобится или нет, но факт остаётся фактом, VehicleBlockCollisionEvent не работает для лодок.
Поэтому мне пришлось пилить свой говнокод, чтобы это заработало, сразу говорю, я не знаю как пользоваться Collision боксами, поэтому сделал, как умею, выкладываю потому что хочется поделиться. Эта тема пригодится новичкам, которым прям позарез нужен VehiclBlockCollisionEvent для лодок. Если ты прям оч крутой программист и работаешь в Google, вместо обсираний можешь подсказать как сделать код лучше.
Начало работы:
для работы сеего чуда понадобится ProtocolLib
Хз понадобится или нет, но факт остаётся фактом, VehicleBlockCollisionEvent не работает для лодок.
Поэтому мне пришлось пилить свой говнокод, чтобы это заработало, сразу говорю, я не знаю как пользоваться Collision боксами, поэтому сделал, как умею, выкладываю потому что хочется поделиться. Эта тема пригодится новичкам, которым прям позарез нужен VehiclBlockCollisionEvent для лодок. Если ты прям оч крутой программист и работаешь в Google, вместо обсираний можешь подсказать как сделать код лучше.
Начало работы:
для работы сеего чуда понадобится ProtocolLib
Код:
@Override
public void onPacketReceiving(PacketEvent event) {
if(event.getPacketType()!=PacketType.Play.Client.BOAT_MOVE) return;
Bukkit.getScheduler().runTask(this.plugin,()->{ //Запускаем поиск лодок в радиусе 1x1x1 в основном потоке
ArrayList<Boat> boats = event.getPlayer().getNearbyEntities(1,1,1).stream().filter(entity -> entity instanceof Boat).map(entity -> (Boat)entity).filter(boat -> boat.getPassengers().contains(event.getPlayer())).collect(Collectors.toCollection(ArrayList::new));
if(boats.size()==1){
Boat boat = boats.get(0); //Получаем найденую лодку
Block loc = boat.getLocation().getBlock();
Block block = checkCollision(loc,boat.getLocation(),boat); //Проверка на столкновение
if(block == null) return;
VehicleBlockCollisionEvent event = new VehicleBlockCollisionEvent(boat,block);
Bukkit.getPluginManager().callEvent(event);
}
Код:
private Block checkCollision(Location bloc, Boat boat){
System.out.println(bloc.getYaw());
Block b = VectorUtils.getDirBlock(bloc);
if(b == null) return null;
if(!b.getType().isSolid(b.getType())) return null;
if(isPlayerOnHalf(boat)){
if(bloc.getBlockY()==NumberConversions.ceil(bloc.getY())) return b;
return null;
}
return b;
}
}
Код:
private static List<Material> halfBlockTypes = Arrays.stream(Material.values()).filter(m->m.name().endsWith("_SLAB")||m.name().endsWith("_STAIRS")).collect(Collectors.toCollection(ArrayList::new));
public boolean isPlayerOnHalf(Player player) {
return (!player.isFlying() && (player.getLocation().getY() + "").endsWith(".5")) || halfBlockTypes.contains(player.getLocation().getBlock().getType());
}
Последнее редактирование: