Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите В разработке плагина

Fresh624

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

@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");
 
Последнее редактирование:
Лишь бы до гаммы разговор не зашел. Гамма - вещь опасная.
Вот, попробовал написать, как вариант. Уверен, можно сделать лучше, но лучше я не умею.

@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");
Можно сделать лист с локейшинами, как писали выше, загружая его при загрузке плагина из конфига, ну а при завершении сохранять лист, если вы добавили новые точки =)
 
Можно сделать лист с локейшинами, как писали выше, загружая его при загрузке плагина из конфига, ну а при завершении сохранять лист, если вы добавили новые точки =)
Ну у меня суть та же, только реализацию я усложнил - мне так удобнее. В любом случае, в работе эти два варианта будут работать одинаково.
 
Вместо такой проверки
if(w1.equalsIgnoreCase(w2) && Math.abs(x1-x2) <= radius && Math.abs(y1-y2) <= radius && Math.abs(y1-y2) <= radius )
лучше создай из координат точки и названия мира "точечный" Location, и используй
loc.distanceSq(locPoint) <= radiusSq
(не помню как точно называется метод у локейшена, возвращающий квадрат расстояния между ними, а свой радиус ты можешь возвести в квадрат заблаговременно).
Так код более короткий, читабельный, и радиус у тебя сферический, а не кубический.

И да, используй тег [ CODE=Java] ... [ /CODE].
 
Так код более короткий, читабельный, и радиус у тебя сферический, а не кубический.

Я написал, как знал. Ты знаешь лучший вариант - исправь мой (или напиши новый) и приведи сюда полный результат. По себе сужу - проще взять готовую рабочую процедуру или даже написать с нуля собственную, чем ковыряться-исправлять в чужих.
 

Поделиться этой страницей

Назад
Верх