【发布时间】: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