首页 > 解决方案 > Every time a player leaves my minecraft server, events are run twice. Why is this happening?

问题描述

Every time a player leaves my minecraft server, events are run twice. The same thing happens in all of my plugins so I believe it is something in my code. Here are all of my classes:

Main Class:

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() {
        
    }
    
}

One of my event classes (PlayerInteractEvent in this case):

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;
    }
        
}

My OnJoin class

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 & 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 & 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
    
}

When I join the server for the first time and left click air (runs the above class):

LEFT_CLICK_AIR

After I leave and join again:

LEFT_CLICK_AIR LEFT_CLICK_AIR

And again:

LEFT_CLICK_AIR LEFT_CLICK_AIR LEFT_CLICK_AIR

Keep in mind the amount of times the event is run increases every time ANY player on the server leaves and joins, if they run the event or not. It is a very strange bug and I hope someone can help. Thanks!

标签: javapluginsminecraftbukkit

解决方案


您发布的代码没有显示它,但看起来您是在玩家加入而不是插件启动时注册监听器。


推荐阅读