大家好,我有一个数组,其中存储了所有活着的玩家。我想检查它们是否都有特定的元数据。比如:
Player dead = event.getEntity().getPlayer();
PLAYING.remove(dead);
SPECTATORS.add(dead);
if (all PLAYING.hasMetaData("murder"){
Bukkit.broadcastMessage("Murders have won the game!");}
顺便说一下事件是 PlayerDeathEvent
Player
扩展了 Metadatable
,所以你可以这样做:
PlayerType playerType = PlayerType.MURDERER;
player.setMetadata("PLAYER_TYPE_KEY", new FixedMetadataValue(yourPluginInstance, playerType));
然后检查并获取它:
if(player.hasMetadata("PLAYER_TYPE_KEY")) {
PlayerType playerType = (PlayerType) player.getMetadata("PLAYER_TYPE_KEY").get(0).value();
if(playerType == PlayerType.MURDERER)
...
}
我已经编写了“PlayerType”枚举,但是您可以存储您想要的任何值。您必须添加额外的检查以确保索引零存在且不为空。
但是,您可能希望考虑创建一个数据对象来表示玩家的状态,因为您已经将它们存储在列表中。例如,你可以有这样的东西:
public void PlayerGameState() {
private final PlayerType playerType;
private boolean isDead;
private boolean isSpectating;
// ... more state data
public PlayerGameState() {
this.playerType = PlayerType.PLAYER;
}
public PlayerGameState(PlayerType playerType) {
this.playerType = playerType;
}
// ... getters & setters
public void setIsDead(boolean isDead) {
this.isDead = isDead;
}
}
然后你可以将他们的状态存储在地图中:
private Map<UUID, PlayerGameState> playerStateMap = new HashMap<>();
...
//Example methods (minimal & no data integrity checks)
public void addPlayerToGame(Player player) {
playerStateMap.put(player.getUniqueId(), PlayerGameState::new);
}
@EventHandler
public void onDeath(PlayerDeathEvent event) {
PlayerGameState state = PlayerGameState.get(event.getPlayer().getUniqueId());
if(state.getPlayerType() == PlayerType.MURDERER)
...
}
这种方法可以避免使用多个列表来表示玩家是否正在比赛、正在观看比赛以及他们以何种身份进行比赛(以及构成其状态的其他任何内容)。