Мелкие и не очень вопросы

fromgate

Administrator
Если у Вас есть вопрос о том как и что сделать на Java, спрашивайте в этой теме.
Если Вы хотите как перевести какой-то участок кода с php на Java - приводите код, будем думать как это сделать.
 

fromgate

Administrator
Первый вопрос (копирую из ВК):
игорь
как вызвать рандом в ява?
За случайные числа отвечает класс Random. Что интересно, помимо "родного для Java" Random, одноименный есть и в самом nukkit'е

Пользоваться им надо так:
Code:
        Random random = new Random(); // Объект можно объявить один раз на весь плагин
        random.nextBoolean(); // случайное true / false
        random.nextBoundedInt(int x); // числот от 0 до x
        random.nextRange(); // случайное целое выше 0
        random.nextInt();   // случайное целое (в т.ч. и ниже нуля)
Это не все возможное варианты, но думаю вопросов не будет.
 

Doomhawk

Developer
Здравствуйте. Каким образом можно сделать задержку, ибо плагин отказывается запускаться, если в нем есть Thread.sleep?
 

fromgate

Administrator
Thread sleep - это слишком категоричный метод. Если его выполнить в основном потоке сервера, то уснёт всё, а не только нужный метод.

Поэтому варианта два (в зависимости от того, что нужно):
1. Если нужно организовать что-то вроде cooldown'а: cохраняем время (допустим текущее + xxxx) и потом проверяем наступило это время или нет. Если не наступило - то отказывать игроку в каких-то действиях. Это типичное решение для плагинов, к примеру, ставят вводят ограничение по времени на использование команды.
2. Еслин нужно выполнить код через какое-то время. В этом случае используем шедуллер. Вот пример выполнения через 10 секунд:
Code:
		getServer().getScheduler().scheduleDelayedTask(new Runnable() {
			public void run() {
				///
			}
		},20*10);
 

Doomhawk

Developer
Не понимаю, в чем проблема:
Code:
@EventHandler
public void onPlayerChatEvent(PlayerChatEvent event) {
	this.getLogger().info("test");
}
По идее, когда игрок пишет в чат любой текст, в консоли должна отобразится надпись "test". Но почему-то этого не происходит. Событие вообще не обрабатывается. В чем может быть проблема?
Заранее спасибо.
 

Doomhawk

Developer
Заметил, что вообще никакие события (event) не обрабатываются.
implements Listener есть, компилируется без ошибок. В чем еще может быть проблема? Вот plugin.yml:
Code:
#name, main, version and api are required
name: Test
main: Test.MainClass
#remember version and api is string, don't write it like this: 1.0.0, or there will be an exception
version: "1.0"
api: ["1.0.0"]
author: "Doomhawk"
load: POSTWORLD
 

Doomhawk

Developer
Интересно, что у BlockBreakEvent нет функции, возвращающей Vector3. Как тогда узнавать координаты сломаного блока?
 

fromgate

Administrator
@RayDJGo

Ну тут один вариант. Открываешь исходники. Убираюшь из библиотек BukkitAPI и подключаешь Nukkit. В отдельных случаях могут потребоваться дополинтельные библиотеки. К примеру, если плагин работает с базами данных - надо будет подключать DbLib.
И получаешь исходники с кучей ошибок, которые надо исправлять.
Когда исправишь все ошибке - есть шанс получить работающий плагин для Nukkit.
 

Varfalomey

Developer (Level 3)
Code:
	public void onDeath(PlayerDeathEvent event){
		Player p = event.getEntity();
		int cause = p.getLastDamageCause().getCause();
		if(cause instanceof EntityDamageByEntityEvent){
			
		}
	}
выдаёт ошибку, как тогда получить убийцу?
 

JustMaks19

Developer (Level 2)
Code:
	public void onDeath(PlayerDeathEvent event){
		Player p = event.getEntity();
		int cause = p.getLastDamageCause().getCause();
		if(cause instanceof EntityDamageByEntityEvent){
			
		}
	}
выдаёт ошибку, как тогда получить убийцу?
learn java please
Code:
@EventHandler
	public void onDeath(PlayerDeathEvent event){
		Entity entity = event.getEntity();
		EntityDamageEvent cause = entity.getLastDamageCause();
		if(cause instanceof EntityDamageByEntityEvent) {
			Entity damager = ((EntityDamageByEntityEvent) cause).getDamager(); 
			if(damager instanceof Player) { 
				Player killer = (Player) damager;
				
			}
		}
	}
 

Varfalomey

Developer (Level 3)
int - это число.
Смотри, что возвращает getCause() и создавай объект этого типа.
Так его IJ поставил. Он выдавал ошибку, и предложил подставить.
 

fromgate

Administrator
Так его IJ поставил. Он выдавал ошибку, и предложил подставить.
Ну он тоже может ошибаться. Когда он подставлял - может у тебя код не был до конца набран или что-то ещё.
 

Doomhawk

Developer
Возможно ли осуществить регистрацию эвентов для нескольких классов?

Code:
this.getServer().getPluginManager().registerEvents(new Auth(), this);
this.getServer().getPluginManager().registerEvents(new Chat(), this);
Класс Auth обрабатывает эвенты, а Chat - нет.
Не исключено, что проблема в самом классе Chat, но глазами пробежался - ошибок не нашел.
 

fromgate

Administrator
Можно. Можно сколько угодно классов регистрировать и даже более того, можно внутри одного класса писать несколько методов-обработчиков на одно и тоже событие.
 

Leonidius

Developer (Level 2)
2. Еслин нужно выполнить код через какое-то время. В этом случае используем шедуллер. Вот пример выполнения через 10 секунд:
Code:
		getServer().getScheduler().scheduleDelayedTask(new Runnable() {
			public void run() {
				///
			}
		},20*10);
А почему здесь задержка 10 секунд умножается на 20?
 

Leonidius

Developer (Level 2)
И ещё вопрос: если сервер выключить и включить, то запланированные задачи сохраняются или нет?
 
Top