BUKKIT - 检查玩家下的阻止

时间:2015-10-04 21:27:37

标签: java bukkit

我道歉,代码已被删除。

我认为这个问题对其他人没有帮助,因为它基本上是关于布尔值而不是检查如何获得块材料。

1 个答案:

答案 0 :(得分:2)

您可以使用内置的String数据类型,而不是使用boolean来跟踪真/假值。

您正在将Entity个变量(event.getDamager()event.getEntity())投射到Player类型,只要ClassCastException,就会产生EntityDamageByEntityEvent被称为不涉及两个玩家(怪物,箭头等)的事件。检查实体是否实际上是Player类的实例,可以使用instanceof关键字完成。

请注意,虽然for循环中的x变量从3递减到1,但是包含取消事件的代码的循环中的最后一个条件总是检查x是否等于1,所以没有当x等于2或3时,将执行if语句中的代码。

如果您只删除最后一个if语句的x == 1部分,则每次在任一玩家下方找到基岩块时,您的代码都会将该消息发送给损坏者(可能是三次)。现在你的循环设置方式(没有x == 1条件),两个玩家下面的所有六个区块都需要成为基岩以便处理损坏,因为找到的任何非基岩块都会导致取消。

我假设你只想检查每个玩家下面的三个街区中是否至少有一个是基岩(“如果在玩家下面有一个基石块1,2, 3个街区“)所以你必须以不同的方式写这个。

我们可以使用以下方法检查播放器下方的任何depth块是否由material类型组成(克隆播放器的位置非常重要,这样我们就不会修改播放器的实际位置):

public static boolean isMatBelow(Player player, Material material, int depth) {
    Location location = player.getLocation().clone(); // Cloned location
    for (int blocks = 1; blocks <= depth; blocks++) { // From 1 to depth
        location.subtract(0, 1, 0); // Move one block down
        if (location.getBlock().getType() == material) { // If this is the material -> return true (break/exit loop)
            return true;
        }
    }
    return false; // No such material was found in all blocks -> return false
}

然后我们可以使用这种方法来检查两个玩家是否在他们下方至少有一个基岩块,同时还向受害者发送一条消息:

@EventHandler
public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
    // Check whether both entities are players
    if (event.getDamager() instanceof Player && event.getEntity() instanceof Player) {
        Player damager = (Player) event.getDamager(); // Player doing the damage
        Player hurt = (Player) event.getEntity(); // Player getting hurt

        int height = 3; // The height you want to check
        Material pvpMaterial = Material.BEDROCK; // The material we are checking for

        boolean belowDamager = isMatBelow(damager, pvpMaterial, height); // Boolean whether a bedrock block is below the damager
        boolean belowHurt = isMatBelow(hurt, pvpMaterial, height); // Boolean whether a bedrock block is below the hurt player
        if (!belowDamager || !belowHurt) { // If there is NO bedrock between the damager or the hurt player
            // Create message -> if there isn't bedrock below the damager, initialize with first string, otherwise use the second string
            String message = (!belowDamager) ? "You are in a no-PVP zone." : "That player is in a no-PVP zone.";
            damager.sendMessage(message);
            event.setCancelled(true);
        }
    }
}

如果您想检查播放器下方是否所有三个块都是基岩,您可以修改isMatBelow(...)方法,只有当每个块都是指定材料时才返回true。