Создание частиц генератора мобов вокруг лошади-скелета в Букките

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

package survivalcraft.FireHorse;
import java.util.logging.Logger;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.command.CommandSender;
import org.bukkit.command.Command;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Horse.Variant;
import org.bukkit.entity.Player;
import org.bukkit.entity.Horse;
import org.bukkit.Effect;

public class Main extends JavaPlugin{
    public static Main plugin;
    public final Logger logger = Logger.getLogger("Minecraft");

    @Override
    public void onDisable(){
        PluginDescriptionFile pdf = this.getDescription();
        this.logger.info(pdf.getName() + " version " + pdf.getVersion() + " has been disabled! Neigh! ;D");
    }

    @Override
    public void onEnable(){
        PluginDescriptionFile pdf = this.getDescription();
        this.logger.info(pdf.getName() + " version " + pdf.getVersion() + " has been enabled!");
    }

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){
        Player player = (Player) sender;
        if(commandLabel.equalsIgnoreCase("firehorse") || commandLabel.equalsIgnoreCase("fh")){
            Horse horse = (Horse) player.getWorld().spawnEntity(player.getLocation(), EntityType.HORSE);
            horse.setBreed(true);
            horse.setAdult();
            horse.setVariant(Variant.SKELETON_HORSE);
            horse.setCustomName(player.getDisplayName() + "'s Fire Horse");
            horse.getWorld().playEffect(horse.getLocation(), Effect.MOBSPAWNER_FLAMES, 0);
        }
        return false;
    }   
}

person CODER6769    schedule 02.08.2014    source источник


Ответы (2)


Попробуйте использовать программирование планировщика. Вы можете создать повторяющуюся задачу, которая порождает частицы каждые пару тиков:

getServer().getScheduler().runTaskTimer(this, new Runnable() {
    public void run() {
        horse.getWorld().playEffect(horse.getLocation(), Effect.MOBSPAWNER_FLAMES, 0);
    }
}, 0L, 10L);

Просто замените текущую строку playEffect на нее и сделайте horse окончательной.

person chaseoes    schedule 02.08.2014

Если вы хотите создать цикл, вам следует использовать встроенный в Bukkit SchedulerAPI — объяснено здесь.

Вот пример использования вашего кода:

Создайте новый класс под названием HorseTimer (или как хотите). Заставьте его реализовать класс Runnable.

public class HorseTimer implements Runnable {
    @Override
    public void run() {

    }
}

Затем добавьте конструктор, чтобы класс знал, вокруг какой сущности создавать частицы.

public class HorseTimer implements Runnable {
    private Horse horse;

    public HorseTimer(Horse horse) { 
        this.horse = horse; 
    }

    @Override
    public void run() {

    }
}

Теперь вы можете создавать частицы вокруг лошади (как если бы вы делали это только один раз).

public class HorseTimer implements Runnable {
    private Horse horse;

    public HorseTimer(Horse horse) { 
        this.horse = horse; 
    }

    @Override
    public void run() {
        // Do stuff with the horse, will be in the loop.
    }
}

Наконец, нам нужно запустить цикл в классе Main. Поместите этот код в конец инструкции if в методе onCommand(...),

Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new HorseTimer(horse), 0l, <DELAY BETWEEN REPEATS IN TICKS HERE>l);
person Momo    schedule 02.08.2014
comment
Спасибо, вы меня очень выручили! - person CODER6769; 03.08.2014
comment
Я думаю, стоит указать на возможность утечек памяти из-за хранения сущности Лошади. - person hintss; 05.09.2014