在玩家上存储自定义游戏状态数据

问题描述 投票:0回答:1

大家好,我有一个数组,其中存储了所有活着的玩家。我想检查它们是否都有特定的元数据。比如:

Player dead = event.getEntity().getPlayer();
PLAYING.remove(dead);
SPECTATORS.add(dead);
if (all PLAYING.hasMetaData("murder"){
    Bukkit.broadcastMessage("Murders have won the game!");
}

顺便说一下事件是 PlayerDeathEvent

java minecraft spigot
1个回答
0
投票

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)
        ...
}

这种方法可以避免使用多个列表来表示玩家是否正在比赛、正在观看比赛以及他们以何种身份进行比赛(以及构成其状态的其他任何内容)。

© www.soinside.com 2019 - 2024. All rights reserved.