布基特/斯皮戈特 - PvP 在玩家陷入虚空时奖励玩家

  • 本文关键字:玩家 PvP 布基特 java bukkit
  • 更新时间 :
  • 英文 :


>我正在尝试制作一个奖励系统,奖励你杀死玩家。所以我完成了基本检查,但我想检测受害者在被攻击或用弓箭射击后是否掉入虚空,问题是,我找不到解决方案。

法典:

    @EventHandler
public void onEntityDamageByEntityEvent(EntityDamageByEntityEvent event) {
    if(!(event.getDamager() instanceof Player) || !(event.getEntity() instanceof Player) ) return;
    String damagerName = event.getDamager().getName();
    String victimName = event.getEntity().getName();
    damageCheck.put(victimName, damagerName);
    Bukkit.broadcastMessage(ChatColor.GRAY + "" + ChatColor.STRIKETHROUGH + "-------------[ X ]-------------");
    Bukkit.broadcastMessage(ChatColor.DARK_AQUA + damagerName + ChatColor.GRAY + " is the damager");
    Bukkit.broadcastMessage(ChatColor.DARK_AQUA + victimName + ChatColor.GRAY + " is the victim");
    Bukkit.broadcastMessage(ChatColor.GRAY + "" + ChatColor.STRIKETHROUGH + "-------------[ X ]-------------");
    Bukkit.getLogger().info(damageCheck.toString());
}
@EventHandler
public void onEntityDeathEvent(EntityDeathEvent event){
    damageCheck.remove(event.getEntity().getName());
    damageCheck.remove(event.getEntity().getKiller().getName());
    event.getEntity().getKiller().sendMessage("You are the killer, and receives rewards!");
    event.getEntity().sendMessage("You died, thats horrible..");
    Bukkit.broadcastMessage(ChatColor.GRAY + "" + ChatColor.STRIKETHROUGH + "-------------[ X ]-------------");
    Bukkit.broadcastMessage(ChatColor.DARK_AQUA + event.getEntity().getKiller().getName() + ChatColor.GRAY + " is the damager");
    Bukkit.broadcastMessage(ChatColor.DARK_AQUA + event.getEntity().getName() + ChatColor.GRAY + " is the victim");
    Bukkit.broadcastMessage(ChatColor.GRAY + "" + ChatColor.STRIKETHROUGH + "-------------[ X ]-------------");
}
@EventHandler
public void onPlayerMovement(PlayerMoveEvent event) {
    Player player = (Player)event.getPlayer();
    // Checking if the players Y
    if(event.getTo().getY() < 25.0) {
        // do stuff here
    }
}
你应该

try & catch块包围你的EntityDeathEvent代码以避免一些错误......

PlayerMoveEvent 上,将event.getPlayer()转换为 Player 是多余的,因为您已经指定了变量。Y也应该低于10,相信我,更好。

好的,现在你首先需要检查哈希图是否包含那个玩家(谁正在虚空中死去(,然后从哈希图中获取杀手(破坏者(的名字,之后你可以向那个杀手发送一条消息,最后杀死在虚空中的玩家

代码:D

if (!damageCheck.containsKey(player.getName())) return;
        Player killer = Bukkit.getPlayer(damageCheck.get(player.getName()));
        killer.sendMessage(ChatColor.GREEN + "You've earned " + ChatColor.RED + "" + ChatColor.BOLD + "$3" + ChatColor.GREEN + " for killing " + ChatColor.DARK_AQUA + player.getName()); // sends a message to the killer
        player.setHealth(0); // kills the player

因此,我们完成了空隙部分的处理。现在你需要检测受害者是否被弓箭击中:

将您的 if 语句更改为 if (!(event.getDamager() instanceof Player || event.getDamager() instanceof Projectile) || !(event.getEntity() instanceof Player)) return;,以便它可以检测例如箭头是否击中受害者。

现在你需要检测射手/破坏者的名字,这可以通过if语句轻松完成。

法典:

Player shooterName = event.getDamager() instanceof Projectile ? (Player) ((Projectile) event.getDamager()).getShooter() : null;
String damagerName = event.getDamager() instanceof Player ? event.getDamager().getName() : shooterName.getName();

您也可以删除Bukkit.getLogger().info(damageCheck.toString());,因为它仅用于调试。

您可能应该这样做:

private enum Cause {
    ATTACK,
    ARROW,
}
private HashMap<UUID, UUID> lastDamage = new HashMap<UUID, UUID>();
private HashMap<UUID, Cause> lastDamageCause = new HashMap<UUID, Cause>();
@EventHandler
public void onDamage(EntityDamageByEntityEvent e) {
    if (!(e.getEntity() instanceof Player)) {
        return;
    }
    Player damaged = (Player) e.getEntity();
    if (e.getDamager() instanceof Arrow) {
        Arrow a = (Arrow) e.getDamager();
        if (a.getShooter() instanceof Player) {
            Player damager = (Player) a.getShooter();
            lastDamage.put(damaged.getUniqueId(), damager.getUniqueId());
            lastDamageCause.put(damaged.getUniqueId(), Cause.ARROW);
        }
    } else if (e.getDamager() instanceof Player) {
        Player damager = (Player) e.getDamager();
        lastDamage.put(damaged.getUniqueId(), damager.getUniqueId());
        lastDamageCause.put(damaged.getUniqueId(), Cause.ATTACK);
    }
}
@EventHandler
public void onPlayerDeath(PlayerDeathEvent e) {
    Player p = e.getEntity();
    if (e.getDeathMessage().contains("fell out of the world")) {
        if (lastDamage.containsKey(p.getUniqueId())) {
            Player killer = Bukkit.getPlayer(lastDamage.get(p.getUniqueId()));
            Cause cause = lastDamageCause.get(p.getUniqueId());
            switch (cause) {
            case ATTACK:
                //Do whatever you want
                break;
            case ARROW:
                //Do whatever you want
                break;
            default:
                break;
            }
        }
    }
}

如果您只想检查 Y 高度,请使用PlayerMoveEvent

不要忘记在播放器与服务器断开连接后删除哈希映射中的值,以避免内存泄漏。

最新更新