java - 如何添加一个1射击婴儿小怪的结界?
问题描述
我尝试过很多事件,例如 onAttack、EntityDeathEvent、EntityDamageByEntityEvent。这些似乎都不起作用。这可能是因为我写错了代码,这就是我想要的。我添加了一个命令,它会给你一把钻石剑,上面附有我试图添加的附魔,这将用于已经应用的 1 次射击婴儿小怪。代码:
@EventHandler
public void onAttack(EntityDamageByEntityEvent event) {
Player player = (Player) event.getDamager();
Ageable ageableEntity = (Ageable) event.getEntity();
if (event.getEntity() instanceof Ageable) {
if (ageableEntity.isAdult() == false) {
if(player.getInventory().getItemInMainHand().containsEnchantment(OrphanEnchants.ORPHAN_OBLITERATOR)) {
ageableEntity.setLastDamage(1000);
ageableEntity.setHealth(0);
}
}
}
}
告诉我,如果我;曾经事件错误,应该选择另一个事件或注册的结界错误。(我知道我没有给出注册的代码)
解决方案
您的代码看起来很可靠,乍一看,我看不出它可能有什么问题(除非您只是没有注册该事件)。虽然有瑕疵。您可能应该在强制转换之前检查它是否event.getDamager()
是一个实例。Player
我还建议使用ageableEntity.damage(damage, player)
这样游戏来处理它,就好像玩家真的杀死了它一样,它不会突然死亡。
我使用了您自己的代码并对其进行了一些更改,并添加了注释来解释所有内容的用途。假设您的代码确实不起作用,这只是另一种选择。
@EventHandler
public void onAttack(EntityDamageByEntityEvent event) {
// check if damager is a Player and the entity is Ageable
// otherwise there's no point of continuing
if(event.getDamager() instanceof Player && event.getEntity() instanceof Ageable) {
Player player = (Player) event.getDamager();
Ageable ageableEntity = (Ageable) event.getEntity();
// check if they're not an adult and the item has the enchantment required
// otherwise there's no point of continuing
if (!ageableEntity.isAdult() && player.getInventory().getItemInMainHand().containsEnchantment(OrphanEnchants.ORPHAN_OBLITERATOR)) {
// cancel the event to handle it yourself
event.setCancelled(true);
// remove all potion effects to prevent absorbtion/regeneration/resistance
// or other potions from keeping the entity alive
ageableEntity.getActivePotionEffects().stream().map(PotionEffect::getType).forEach(ageableEntity::removePotionEffect);
// set their health very low, but not zero, because then the
// player doesn't get credit for killing it
ageableEntity.setHealth(0.5D);
// make the player damage the entity, set damage to MAX_VALUE
// so the entity MUST die
ageableEntity.damage(Double.MAX_VALUE, player);
}
}
}
推荐阅读
- python - 在磁盘上写一个python运行进程
- unix - 我想在 unix cron 上安排一份工作,工作日上午 9 点到下午 5 点,周末 24 小时。你能帮我解决这个问题吗
- java - 不要为添加到列表视图中的新项目设置标签
- python - 产生数字排列
- javascript - Html/CSS/Javascript: Popup onclick not working for second div
- java - 缓冲阅读器/文件阅读器 .readLine() 到 .split() 读取但没有显示到控制台
- c++ - 仅在堆中创建 C++ 对象
- ruby-on-rails - 如何在控制器中渲染视图并分配给变量(Rails)
- django - 如何为本地托管的应用程序设置外部访问?(苹果电脑)
- docker - Docker EE 2.0 - 支持的操作系统