Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите Выполнение кода при смене биома

Тема в разделе "Разработка плагинов для новичков", создана пользователем Dexel, 30 июн 2017.

  1. Автор темы
    Dexel

    Dexel Активный участник Пользователь

    Баллы:
    76
    Skype:
    the_osirius
    Предложите, пожалуйста, вариант выполнения определённого кода, когда игрок переходит в новый биом?
     
  2. Хостинг MineCraft
    <
  3. xDark

    xDark Активный участник Пользователь

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    Писал от руки, возможны ошибки, надеюсь принцип понял
    Код:
    package me.xDark.hybridanticheat.listener;
    
    import java.util.HashMap;
    import java.util.map.Entry;
    
    import org.bukkit.Location;
    import org.bukkit.Bukkit;
    import org.bukkit.World;
    import org.bukkit.block.Biome;
    import org.bukkit.entity.Player;
    import org.bukkit.event.Event;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.HandlerList;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerJoinEvent;
    import org.bukkit.event.player.PlayerQuitEvent;
    
    public class BiomeListener implements Listener {
    
        private static final HashMap<Player, BiomeData> data = new HashMap<>();
    
        @EventHandler
        public void onJoin(PlayerJoinEvent e) {
            initPlayer(e.getPlayer());
        }
    
        @EventHandler
        public void onQuit(PlayerQuitEvent e) {
            data.remove(e.getPlayer());
        }
    
        @EventHandler
        public void onChange(BiomeChangeEvent e) {
            // TODO
        }
    
        private static void initPlayer(Player p) {
            World world = p.getWorld();
            Location loc = p.getLocation();
            Biome biome = world.getBiome(loc.getBlockX(), loc.getBlockZ());
            data.put(e.getPlayer(), new BiomeData(biome, biome));
        }
    
        // scheduleSyncRepeatingTask, не проверял, может и async работать будет
        public static void init() {
            Bukkit.getOnlinePlayers().forEach(p -> {
                initPlayer(p);
            });
            // TODO: registerEvents
            Bukkit.getScheduler().scheduleAsyncRepeatingTask(YourPlugin.instance(), () -> {
                if (data.isEmpty())
                    return;
                for (Entry<Player, BiomeData> entry : data.entrySet()) {
                    Player p = entry.getKey();
                    BiomeData data = entry.getValue();
                    Location loc = p.getLocation();
                    Biome biome = world.getBiome(loc.getBlockX(), loc.getBlockZ());
                    data.update(biome);
                    if (data.getPrevious() != data.getNow())
                        Bukkit.getPluginManager().callEvent(new BiomeChangeEvent(p, data.getPrevius(), data.getNow()));
                }
            }, 1L, 20 * 5L);
        }
    
        public static void clear() {
            data.clear();
        }
    
    
        private static class BiomeData {
            private Biome previus, now;
        
            public BiomeData(Biome previous, Biome now) {
                this.previus = previous;
                this.now = now;
            }
        
            public Biome getPrevious() {
                return previus;
            }
        
            public Biome getNow() {
                return now;
            }
        
            public void update(Biome biome) {
                previous = now;
                now = biome;
            }
        }
    
        public static class BiomeChangeEvent extends Event {
    
            private static final HandlerList handlerList = new HandlerList();
    
            private final Biome from, to;
    
            private final Player player;
    
            public BiomeChangeEvent(Player player, Biome from, Biome to) {
                this.player = player;
                this.from = from;
                this.to = to;
            }
    
            public Player getPlayer() {
                return player;
            }
    
            public Biome getFrom() {
                return from;
            }
    
            public Biome getTo() {
                return to;
            }
    
            @Override
            public HandlerList getHandlers() {
                return handlerList;
            }
    
            public static HandlerList getHandlerList() {
                return handlerList;
            }
    
        }
    
    }
    
     
    Последнее редактирование: 30 июн 2017
  4. Автор темы
    Dexel

    Dexel Активный участник Пользователь

    Баллы:
    76
    Skype:
    the_osirius
    Хм, проверю...
     
  5. ShieldComa

    ShieldComa Ньюби Пользователь

    Баллы:
    1
    Имя в Minecraft:
    ShieldComa
    С
    Спасибо искал надеюсь робит)
     

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