Альтернатив собственно немного.
Вот к примеру,
плагин, он использует множитель для вектора velocity. Но у этого метода есть неприятные моменты:
1. Рассинхронизация с клиентом, которая приводит к тому, что могут быть дерганья и рывки. Т.е. клиент считает, что у тебя скорость одна, а с сервера тебе присылают другую.
2. Можно установка velocity легко приводит к зацикливанию: представляете вы в onPlayerMove ставите игроку скорость и всё, он не может остановиться. Тут наверное обязательно учитывать состояния игрока isSprinting() или что-то ещё.
Вопрос обсуждался
здесь. Вроде в споуте есть функции для множителя скорости. Но... тут нужен будет и клиент.
Поэтому вопрос с эффектом зелья - пока самый лучший вариант.
Кстати, я сейчас как раз добавляю спидвеи в RoadProtector и работать они будут как раз на основе эффекта зелья скорости.
Вот тестовый код, результат работы которого меня полностью устраивает - (естественно добавится зависимость от конфигурации):
Java:
@EventHandler(priority=EventPriority.NORMAL, ignoreCancelled = true)
public void onPlayerMove (PlayerMoveEvent event) {
Player p = event.getPlayer();
if (p.isSprinting()&&(p.getLocation().getBlock().getRelative(BlockFace.DOWN).getType()==Material.GRAVEL)&&
(plg.PlaceGuarded(p.getLocation().getBlock())))
p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED,20,0));
}
Т.е. смотрите, практически один в один то, что у Вас. Но я выдаю зелье на 1 секунду - а у вас какое-то огромное число (как сошёл с дороги, его действие закончилось) и проверяю находится ли игрок в состоянии бега. Т.е. ходим по дороге с обычной скоростью.
Никаких переворачиваний нет, работает отлично. Скорость... наверное можно и увеличить.