- Баллы
- 66
- Имя в Minecraft
- r1ghty
Я хочу сделать такой плагин, чтобы при становлении в определённую точку игрока лечило. Настройка точки делается командой. Как реализовать эту точку?
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
При написании команды добавляешь координаты, откуда она была прописана (а лучше Location) в List.
В ивенте движения игрока берёшь его Location и перебераешь по List'y. Если совпадение, то лечишь.
Можно поподробнееНужно использовать не равенство точки, математически это почти невозможно, а некий эпсилон.
if(location.distance(точка) < epsilon) ...
ОкЧто по подробнее? Гугл всё скажет, если правильно на него "надавить"
Что-то типа такогоЧто по подробнее? Гугл всё скажет, если правильно на него "надавить"
Кто-то не знает языка.((Location) sender)
Код не мойКто-то не знает языка.
Ну это только подтверждает мои слова.Код не мой
Преобразование sender'а в Location - это что-то новенькоеОк
Что-то типа такого
- loc = new HashMap<String, Location>();
- loc.put(sender.getName(), ((Location) sender));

Не знаешь что делать, жми по подсказкам IDEПреобразование sender'а в Location - это что-то новенькое![]()

Реал код не мой, лазил по баккиту и у америкосов брал.Не знаешь что делать, жми по подсказкам IDE![]()
Это код индусов.Реал код не мой, лазил по баккиту и у америкосов брал.
Индусы этот код бы на 10 строк растянули.Это код индусов.

Лишь бы до гаммы разговор не зашел. Гамма - вещь опасная.Ну так это только aplha версия![]()
Можно сделать лист с локейшинами, как писали выше, загружая его при загрузке плагина из конфига, ну а при завершении сохранять лист, если вы добавили новые точки =)Лишь бы до гаммы разговор не зашел. Гамма - вещь опасная.
Вот, попробовал написать, как вариант. Уверен, можно сделать лучше, но лучше я не умею.
@EventHandler
public void onPlayerMove(PlayerMoveEvent e){
Player p = e.getPlayer();
Location loc = p.getLocation();
String w1 = loc.getWorld().getName().toString();
int x1 = loc.getBlockX(), y1 = loc.getBlockY(), z1 = loc.getBlockZ();
Set<String> points = config.getConfigurationSection("Points").getKeys(false);
for(String point : points){
String w2 = config.getString("Points." + point + ".world");
int x2 = config.getInt("Points." + point + ".x");
int y2 = config.getInt("Points." + point + ".y");
int z2 = config.getInt("Points." + point + ".z");
int radius = config.getInt("Radius");
if(w1.equalsIgnoreCase(w2) && Math.abs(x1-x2) <= radius && Math.abs(y1-y2) <= radius && Math.abs(y1-y2) <= radius ) {
p.setHealth(10);
return;
}
}
}
Можно еще сделать у каждой точки свой радиус. Тогда будет так:
int radius = config.getInt("Points." + point + ".radius");
Ну у меня суть та же, только реализацию я усложнил - мне так удобнее. В любом случае, в работе эти два варианта будут работать одинаково.Можно сделать лист с локейшинами, как писали выше, загружая его при загрузке плагина из конфига, ну а при завершении сохранять лист, если вы добавили новые точки =)
лучше создай из координат точки и названия мира "точечный" Location, и используйif(w1.equalsIgnoreCase(w2) && Math.abs(x1-x2) <= radius && Math.abs(y1-y2) <= radius && Math.abs(y1-y2) <= radius )
(не помню как точно называется метод у локейшена, возвращающий квадрат расстояния между ними, а свой радиус ты можешь возвести в квадрат заблаговременно).loc.distanceSq(locPoint) <= radiusSq
Так код более короткий, читабельный, и радиус у тебя сферический, а не кубический.