【问题标题】:Every time a player leaves my minecraft server, events are run twice. Why is this happening?每次玩家离开我的 Minecraft 服务器时,事件都会运行两次。为什么会这样?
【发布时间】:2021-08-08 06:12:16
【问题描述】:

每次玩家离开我的 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;
    }
        
}

我的 OnJoin 课程

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
    
}

当我第一次加入服务器并左键点击air(运行上面的类)时:

LEFT_CLICK_AIR

离开后再次加入:

LEFT_CLICK_AIR LEFT_CLICK_AIR

再说一遍:

LEFT_CLICK_AIR LEFT_CLICK_AIR LEFT_CLICK_AIR

请记住,每当服务器上的任何玩家离开和加入时,无论他们是否举办赛事,赛事举办的次数都会增加。这是一个非常奇怪的错误,我希望有人能提供帮助。谢谢!

【问题讨论】:

  • 检查你调用Bukkit.getPluginManager().registerEvents(,)的所有地方,看看你是否在重复它。此外,您似乎必须先在空中接收消息,而不是仅仅加入服务器。

标签: java plugins minecraft bukkit


【解决方案1】:

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

【讨论】:

  • 您还需要查看其他内容以确认这一点并可能找到解决方法吗?
  • @LucasFassman new OnJoin(this); 可能是玩家加入的地方。显示 OnJoin.java 文件?
猜你喜欢
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
相关资源
最近更新 更多