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

  • Автор темы Автор темы Dexel
  • Дата начала Дата начала

Dexel

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
SiRiuS_OSiRiuS
Предложите, пожалуйста, вариант выполнения определённого кода, когда игрок переходит в новый биом?
 
Писал от руки, возможны ошибки, надеюсь принцип понял
Java:
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;
        }

    }

}
 
Последнее редактирование:
Писал от руки, возможны ошибки, надеюсь принцип понял
Java:
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);
        })
        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.getPrevius() != 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 getPrevius() {
            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;
        }

    }

}
Хм, проверю...
 
С
Писал от руки, возможны ошибки, надеюсь принцип понял
Java:
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;
        }

    }

}
Спасибо искал надеюсь робит)
 
Назад
Верх