java - 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!
解决方案
您发布的代码没有显示它,但看起来您是在玩家加入而不是插件启动时注册监听器。
推荐阅读
- android - 通过热点传输文件
- java - 与 Payara 4 一起使用的 log4j 2 不会创建日志
- symfony - API 平台响应上的聚合值
- eclipse - Eclipse自动完成替换函数名
- wordpress - 将自定义字段数据放在标题部分
- node.js - 在上一个作业完成之前不要处理下一个作业(BullJS/Redis)?
- node.js - 使用 npm install 时权限被拒绝
- mysql - 如何在mysql中跟踪分数增益
- gitolite - gitolite FATAL:R 任何 gitolite-admin git 被 fallthru 拒绝
- javascript - 遍历对象数组,删除重复项,取出一个并将布尔值分配给原始对象