Java 如何使用Bukkit中的事件代码声明射弹并取消其造成的伤害

Java 如何使用Bukkit中的事件代码声明射弹并取消其造成的伤害,java,minecraft,bukkit,projectile,eventhandler,Java,Minecraft,Bukkit,Projectile,Eventhandler,我需要知道如何使用getCause条件在if语句中声明投射 然后,我需要知道,如果玩家在同一个帮派中,如何抵消抛射造成的伤害 请给我一个关于如何做的解释与一些示例代码请 这是我的活动 @EventHandler public void onEntityDamage(EntityDamageByEntityEvent event){ if(event.getEntity() instanceof Player){ Player damaged = (Player) even

我需要知道如何使用getCause条件在if语句中声明投射

然后,我需要知道,如果玩家在同一个帮派中,如何抵消抛射造成的伤害

请给我一个关于如何做的解释与一些示例代码请

这是我的活动

@EventHandler
public void onEntityDamage(EntityDamageByEntityEvent event){
    if(event.getEntity() instanceof Player){
        Player damaged = (Player) event.getEntity();
        String DUUID = damaged.getUniqueId().toString().toLowerCase();

        if(event.getCause() == DamageCause.PROJECTILE){

            //I NEED THE CODE TO PUT IN HERE

        }

        if(event.getDamager() instanceof Player){
            Player damager = (Player) event.getDamager();
            String DRUUID = damager.getUniqueId().toString().toLowerCase();

            if(MinecraftGTA.config.getString(DRUUID + ".Gang").equalsIgnoreCase(MinecraftGTA.config.getString(DUUID + ".Gang"))){
                event.setCancelled(true);
            }
        }
    }
}
有一个方法,有一个,我可以想象,当原因是DamageCause.sparket时调用getDamager将是投射实体


至于取消它,我不确定,但有一些方法听起来很有希望,或event.setcanceledtrue;正如您稍后在代码中使用的一样。

当您发射射弹时,应该将其UUID保存在HashMap中。 例如,我们将使用雪球作为投射物:

public Map<String, String> projectileUUID = new HashMap<String, String>

public void launch(Player p){//call this to launch the projectile
  String uuid = p.launchProjectile(Snowball.class).getUniqueId().toString(); //launch a snowball & get the UUID

  projectileUUID.put(uuid, p.getName());//put the UUID of the projectile in the map
}

你可以把雪球换成箭头之类的东西。。。只需确保将所有与滚雪球相关的代码更改为您正在使用的投射物。

不确定更改了多少,但是如果您想要玩家,您应该能够从实体对象获取它

即。

@EventHandler
public void entityDamage(EntityDamageByEntityEvent e){
  if(e.getDamager() instanceof SnowBall && e.getEntity() instanceof Player){//make sure the damager is a snowball & the damaged entity is a Player
    String uuid = ((SnowBall) e.getDamager()).getUniqueId().toString(); //get the UUID of the snowball
    if(projectileUUID.contains(uuid)){//check if our HashMap contains the UUID
      String damaged = ((Player) e.getEntity()).getName(); //get the damaged player's name
      String shooter = projectileUUID.get(uuid); //get the shooter's name
      if(getGang(shooter).equals(getGang(damaged)){//check if the two player's gangs are the same here
        e.setCancelled(true); //cancel the event
      }
    }
  }
}
@EventHandler
public void entityDamage(EntityDamageByEntityEvent e){
  if(e.getDamager() instanceof Projectile && e.getEntity() instanceof Player){
    //make sure the damager is a snowball & the damaged entity is a Player
    ProjectileSource shooter = ((Projectile) event.getDamager()).getShooter();
    if (!(shooter instanceof Player)) {
      return;
    }
    // compare shooter and entity here...
    if (isSameGang((Player) shooter, (Player) e.getEntity()) {
      e.setCancelled(true); // cancel damage
    }
  }
}