Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Bukkit/Spigot-当玩家陷入真空时,PvP奖励玩家_Java_Bukkit - Fatal编程技术网

Java Bukkit/Spigot-当玩家陷入真空时,PvP奖励玩家

Java Bukkit/Spigot-当玩家陷入真空时,PvP奖励玩家,java,bukkit,Java,Bukkit,我想建立一个奖励系统,奖励你杀死一个玩家。 我已经完成了基本的检查,但我想检测受害者是否在受到攻击或被弓箭射中后掉入真空,问题是,我找不到解决办法 代码: @EventHandler 公共void onEntityDamageByEntityEvent(EntityDamageByEntityEvent事件){ if(!(event.getDamager()instanceof Player)| |!(event.getEntity()instanceof Player))返回; 字符串dama

我想建立一个奖励系统,奖励你杀死一个玩家。 我已经完成了基本的检查,但我想检测受害者是否在受到攻击或被弓箭射中后掉入真空,问题是,我找不到解决办法

代码:

@EventHandler
公共void onEntityDamageByEntityEvent(EntityDamageByEntityEvent事件){
if(!(event.getDamager()instanceof Player)| |!(event.getEntity()instanceof Player))返回;
字符串damagerName=event.getDamager().getName();
字符串victimName=event.getEntity().getName();
损坏检查。输入(受害者姓名、损坏者姓名);
Bukkit.broadcastMessage(ChatColor.GRAY+“”+ChatColor.STRIKETHROUGH+“”------------[X]-----------”;
Bukkit.broadcastMessage(ChatColor.DARK_AQUA+damagerName+ChatColor.GRAY+“是damager”);
Bukkit.broadcastMessage(ChatColor.DARK_AQUA+victimName+ChatColor.GRAY+“是受害者”);
Bukkit.broadcastMessage(ChatColor.GRAY+“”+ChatColor.STRIKETHROUGH+“”------------[X]-----------”;
Bukkit.getLogger().info(damageCheck.toString());
}
@事件处理程序
公共void onEntityDeathEvent(EntityDeathEvent事件){
damageCheck.remove(event.getEntity().getName());
删除(event.getEntity().getKiller().getName());
event.getEntity().getKiller().sendMessage(“你就是杀手,并获得奖励!”);
event.getEntity().sendMessage(“你死了,太可怕了…”);
Bukkit.broadcastMessage(ChatColor.GRAY+“”+ChatColor.STRIKETHROUGH+“”------------[X]-----------”;
Bukkit.broadcastMessage(ChatColor.DARK_AQUA+event.getEntity().getKiller().getName()+ChatColor.GRAY+“是损坏者”);
Bukkit.broadcastMessage(ChatColor.DARK_AQUA+event.getEntity().getName()+ChatColor.GRAY+“是受害者”);
Bukkit.broadcastMessage(ChatColor.GRAY+“”+ChatColor.STRIKETHROUGH+“”------------[X]-----------”;
}
@事件处理程序
PlayerMovement(PlayerMoveEvent事件)上的公共无效{
Player=(Player)event.getPlayer();
//检查玩家是否有问题
if(event.getTo().getY()<25.0){
//在这里做事
}
}

您应该用
try&catch
块包围您的
实体数据事件
代码,以避免一些错误

playermovevent
上,将
event.getPlayer()
强制转换为
Player
是多余的,因为您已经指定了变量。而且Y应该小于10,相信我,这样更好

好的,现在你首先需要检查hashmap是否包含那个玩家(他正在虚空中死去),然后从hashmap中获取杀手(damager)的名字,然后你可以向那个杀手发送消息,最后杀死那个在虚空中的玩家

代码: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 sparket)| |!(event.getEntity()instanceof Player))返回这样它就可以检测到是否有箭头击中了受害者

现在您需要检测shooter/damager名称,这可以通过
if
语句轻松完成

代码:


您还可以删除
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;
            }
        }
    }
}
私有枚举原因{
袭击
箭
}
私有HashMap lastDamage=新HashMap();
private HashMap lastDamageCause=新HashMap();
@事件处理程序
公共无效损害(实体损害由实体事件e){
如果(!(例如,玩家的getEntity()实例)){
回来
}
玩家损坏=(玩家)e.getEntity();
if(如getDamager()实例of Arrow){
箭头a=(箭头)e.getDamager();
if(播放器的a.getShooter()实例){
Player damager=(Player)a.getShooter();
lastDamage.put(damaged.getUniqueId(),damager.getUniqueId());
lastDamageCause.put(损坏的.getUniqueId(),原因.ARROW);
}
}else if(例如,播放器的getDamager()实例){
Player damager=(Player)e.getDamager();
lastDamage.put(damaged.getUniqueId(),damager.getUniqueId());
lastDamageCause.put(损坏的.getUniqueId(),原因.ATTACK);
}
}
@事件处理程序
PlayerDeath上的公共无效(PlayerDeath事件e){
玩家p=e.getEntity();
if(e.getDeathMessage().contains(“从世界上跌落”)){
if(lastdaimage.containsKey(p.getUniqueId()){
Player killer=Bukkit.getPlayer(lastDamage.get(p.getUniqueId());
原因=lastDamageCause.get(p.getUniqueId());
切换(原因){
个案攻击:
//你想干什么就干什么
打破
大小写箭头:
//你想干什么就干什么
打破
违约:
打破
}
}
}
}
如果您只想检查Y高度,请使用
PlayerMoveEvent


在玩家断开与服务器的连接后,不要忘记删除散列图中的值,以避免内存泄漏。

提示:跟踪过去的损坏以及发生的时间,相对于无效损坏。你介意分享一些代码吗?是的,我添加了代码
Player shooterName = event.getDamager() instanceof Projectile ? (Player) ((Projectile) event.getDamager()).getShooter() : null;

String damagerName = event.getDamager() instanceof Player ? event.getDamager().getName() : shooterName.getName();
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;
            }
        }
    }
}