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

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

Discussion in 'Разработка плагинов для новичков' started by Dexel, Jun 30, 2017.

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

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

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

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

    Trophy Points:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    Писал от руки, возможны ошибки, надеюсь принцип понял
    Code:
    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;
            }
    
        }
    
    }
    
     
    Last edited: Jun 30, 2017
  4. Автор темы
    Dexel

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

    Trophy Points:
    76
    Skype:
    the_osirius
    Хм, проверю...
     
  5. ShieldComa

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

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

Share This Page