Каждый раз, когда игрок покидает мой сервер minecraft, события запускаются дважды. Почему это происходит?

#java #plugins #minecraft #bukkit

Вопрос:

Каждый раз, когда игрок покидает мой сервер minecraft, события запускаются дважды. То же самое происходит во всех моих плагинах, поэтому я считаю, что это что-то в моем коде. Вот все мои занятия:

Основной Класс:

 package me.lucas.lobby;

import java.util.HashMap;
import java.util.UUID;

import org.bukkit.ChatColor;
import org.bukkit.plugin.java.JavaPlugin;

import me.lucas.lobby.listeners.OnJoin;
import me.lucas.lobby.listeners.OnLeave;
import me.lucas.lobby.listeners.OnDropItem;
import me.lucas.lobby.listeners.PlacePainting;
import me.lucas.lobby.commands.SlashSpawn;
import me.lucas.lobby.commands.ToggleInv;
import me.lucas.lobby.listeners.OnInteract;
import me.lucas.lobby.listeners.OnInvClick;

public class Main extends JavaPlugin{
public HashMap<UUID, String> toggleInv = new HashMap<UUID, String>();

    @Override
    public void onEnable() {
        System.out.println(ChatColor.GREEN   "Main Lobby Enabled");
        //listeners
        new OnJoin(this);
        new OnInteract(this);
        new OnLeave(this);
        new OnInvClick(this); //partially for development uses
        new PlacePainting(this);
        new OnDropItem(this);
        
        //commands
        new ToggleInv(this); //just for development uses
        new SlashSpawn(this);
    }
    @Override
    public void onDisable() {
        
    }
    
}
 

Один из моих классов событий (в данном случае PlayerInteractEvent):

 package me.lucas.lobby.listeners;

import java.util.HashMap;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.Inventory;

import me.lucas.lobby.Main;

public class OnInteract implements Listener{

    @SuppressWarnings("unused")
    private Main plugin;
    public OnInteract(Main plugin) {
    this.plugin = plugin;
    Bukkit.getPluginManager().registerEvents(this, plugin);
    }
    
    //parkour
public HashMap<String, String> TreeParkour = new HashMap<String, String>();

    private Inventory inv;
    private Inventory inv2;

         
         @EventHandler(priority=EventPriority.HIGH)
         public void onPlayerInteract(PlayerInteractEvent e) {
             e.getPlayer().sendMessage(e.getAction().toString());
         }
     

         
    private void createCompassInventory(Player p) {
        inv = Bukkit.createInventory(null, 54, ChatColor.DARK_GRAY   "Game Menu");      
        
    }
    
    private void createPaintingInventory(Player p) {
        inv2 = Bukkit.createInventory(null, 54, ChatColor.DARK_GRAY   "Profile");
            
    }
    
    private Inventory getCompassInventory() {
        return inv;
    }
    
    private Inventory getPaintingInventory() {
        return inv2;
    }
        
}
 

Мой совместный урок

 package me.lucas.lobby.listeners;

import java.util.ArrayList;

import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

import me.lucas.lobby.Main;
import net.md_5.bungee.api.ChatColor;

public class OnJoin implements Listener{    
    @SuppressWarnings("unused")
    private Main plugin;
    public OnJoin(Main plugin) {
    this.plugin = plugin;
    Bukkit.getPluginManager().registerEvents(this, plugin);
    }   

    @EventHandler
    private void joinEvent(PlayerJoinEvent event) {
        //normal stuff
        Player p = event.getPlayer();
        Inventory inv = p.getInventory();
        Location hub = new Location(p.getWorld(), -1460.5, 6, -406.5);
        
        //clear inventory
        inv.clear();
        //add items for player
        MainInventory(p, inv);
        
        p.sendMessage(ChatColor.BOLD   ""   ChatColor.AQUA   "To move items in your inventory use /toggleinventory "   ChatColor.GRAY   "(This is a testing feature)");
        p.teleport(hub);
        
        if(p.isOp()) {p.teleport(hub); return;}     
        p.setGameMode(GameMode.ADVENTURE);      
        
        //send message (development uses)
        
    }
    
    private void MainInventory(Player p, Inventory inv) {
        //define the item
        ItemStack compass = new ItemStack(Material.COMPASS);
        ItemMeta compass_meta = compass.getItemMeta();  
        ArrayList<String> compass_lore = new ArrayList<>();
        
        
        //the item information amp; design
        compass_meta.setDisplayName(ChatColor.GREEN   "Game Menu "   ChatColor.GRAY   "(Right Click)");
        compass_lore.add(ChatColor.GRAY   "Right-click to open the Game Menu!");

        //apply the changes amp; add it to the inventory
        compass_meta.setLore(compass_lore);
        compass.setItemMeta(compass_meta);

        ////////////////////////////////////////////////////////////////////////
        
        ItemStack painting = new ItemStack(Material.PAINTING);
        ItemMeta painting_meta = painting.getItemMeta();    
        ArrayList<String> painting_lore = new ArrayList<>();
        
        
        painting_meta.setDisplayName(ChatColor.GREEN   "Profile "   ChatColor.GRAY   "(Right Click)");
        painting_lore.add(ChatColor.GRAY   "Right-click to view Achievements,");
        painting_lore.add(ChatColor.GRAY   "browse Quests, and more!");

        painting_meta.setLore(painting_lore);
        painting.setItemMeta(painting_meta);
        
        ////////////////////////////////////////////////////////////////////////
        
        ItemStack cookie = new ItemStack(Material.COOKIE);
        ItemMeta cookie_meta = cookie.getItemMeta();
        ArrayList<String> cookie_lore = new ArrayList<>();
        
        cookie_meta.setDisplayName(ChatColor.GREEN   "Collectibles "   ChatColor.GRAY   "(Right Click)");
        cookie_lore.add(ChatColor.GRAY   "Achievements, Particle Effects, and more!");

        cookie_meta.setLore(cookie_lore);
        cookie.setItemMeta(cookie_meta);
        
        /////////////////////////////////////////////////////////////////////////
        
        ItemStack book = new ItemStack(Material.BOOK);
        ItemMeta book_meta1 = book.getItemMeta();
        ArrayList<String> book_lore = new ArrayList<>();
        
        book_meta1.setDisplayName(ChatColor.GREEN   "Lobby Selector "   ChatColor.GRAY   "(Right Click)");
        book_lore.add(ChatColor.GRAY   "Right-click to switch between lobbies!");

        book_meta1.setLore(book_lore);
        book.setItemMeta(book_meta1);
                
        
        inv.setItem(0, compass);        
        inv.setItem(3, painting);
        inv.setItem(5, cookie);
        inv.setItem(8, book);
        
        } //level 1 incomplete
    
}
 

Когда я впервые подключаюсь к серверу и нажимаю левой кнопкой мыши air (запускает вышеуказанный класс):

ЛЕВЫЙ КЛИК ПО ВОЗДУХУ

После того, как я уйду и присоединюсь снова:

ЛЕВЫЙ КЛИК ПО ВОЗДУХУ ЛЕВЫЙ КЛИК ПО ВОЗДУХУ

И снова:

LEFT_CLICK_AIR LEFT_CLICK_AIR LEFT_CLICK_AIR

Имейте в виду, что количество запусков события увеличивается каждый раз, когда ЛЮБОЙ игрок на сервере покидает и присоединяется, независимо от того, запускает он событие или нет. Это очень странная ошибка, и я надеюсь, что кто-нибудь сможет помочь. Спасибо!

Комментарии:

1. Проверьте все места, в которые вы вызываете Bukkit.getPluginManager().registerEvents(,) , и посмотрите, повторяете ли вы это. Кроме того, похоже, что вы должны выйти в эфир, чтобы получить сообщение, а не просто присоединиться к серверу.

Ответ №1:

Код, который вы опубликовали, не показывает этого, но похоже, что вы регистрируете прослушивателя всякий раз, когда игрок присоединяется, а не когда запускается плагин.

Комментарии:

1. Есть ли что-нибудь еще, что вам нужно увидеть, чтобы подтвердить это и, возможно, найти решение?

2. @LucasFassman new OnJoin(this); Это, вероятно, то, к чему присоединяются игроки. Покажи мне OnJoin.java досье?