#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 досье?