所以我正在試驗哈希圖/集,但我無法讓我的事件類識別我的哈希集的內容。切換命令有效(識別并發回玩家是否在集合中的正確結果)但是,當我投擲棒時的事件總是回傳代碼的 else 部分(總是宣告為 false)而不是使用來自用于檢查玩家是否在那里的集合。(代碼將在下面)
是的,我的事件和命令都已注冊
我試過的
改變 player.add(p.getUniqueId()); 到 player.add(p.getName()); 反之亦然 多個 if 陳述句對哈希集的創建/檢查方式進行隨機小的更改
代碼:
切換命令*
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.HashSet;
import java.util.UUID;
public class HashCommand implements CommandExecutor {
HashSet<UUID> players = new HashSet<UUID>();
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if(!(sender instanceof Player)) {
sender.sendMessage("Players Only");
}else{
Player p = (Player) sender;
boolean check = players.contains(p.getUniqueId());
if(!check){
players.add(p.getUniqueId());
p.sendMessage("Toggled On");
}else{
players.remove(p.getUniqueId());
p.sendMessage("Toggled Off");
}
}
return false;
}
}
事件命令
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerFishEvent;
public class Event implements Listener {
public HashCommand hashCommand = new HashCommand();
@EventHandler
public void onCast(PlayerFishEvent e){
Player p = e.getPlayer();
if (hashCommand.players.contains(p.getUniqueId())) {
p.sendMessage("Fish");
}else{
p.sendMessage("You do not have it enabled!");
}
}
}
uj5u.com熱心網友回復:
在您的情況下,您不能使用面向物件的方式。每次觸發命令時,Spigot 都會為您的HashCommand類創建一個新實體。Spigot 不使用您在事件偵聽器中創建的實體:public HashCommand hashCommand = new HashCommand();. 擁有多個實體意味著您擁有多個集合,每個集合都有自己的內容。因此,您從事件訪問的集合與從命令訪問的集合不同。事件的集合總是空的。
解決方案:將集合設為靜態。每個實體的靜態內容都是“相同的”。
public static Set<UUID> players = new HashSet<UUID>();
在 Event 類中,您可以通過類名訪問它,如下所示:
HashCommand.players.contains(...)
不需要名為 的實體hashCommand。
請注意,您可能想要添加玩家斷開連接事件以從您的集合中移除不在線的玩家。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/498089.html
