如何制作,鸡蛋不会对队友造成击退?
How to make, that eggs wouldn't deal knockback to teammates?
如何让鸡蛋不对队友造成击退?
我用这个代码的时候不会用刀剑之类的东西伤害队友,但是我不知道怎么让蛋不给队友击退。
其实我在游戏的时候给一个队友丢了个鸡蛋,在我看来好像对他造成了伤害,但是他并没有受到伤害。
@EventHandler
public void onPlayerDamage(EntityDamageByEntityEvent event) {
if(faze.equals("game")){
if (Team.getTeamType(event.getEntity()) == Team.getTeamType(event.getDamager())) {
event.setCancelled(true);
event.getEntity().setVelocity(event.getEntity().getLocation().getDirection().multiply(0));
}
}
}
如果有人能帮我解决这个问题,我将不胜感激
取消击退的旧方法是在处理损坏事件后将受损实体的速度设置为零(在所有三个方向上)一个刻度(使用计划任务),尽管我相信你现在可以简单地取消伤害事件,然后自己使用 damage(double)
方法重新应用初始事件造成的最终伤害,但这次没有任何击退。
第二种方法过去执行起来要困难得多,因为使用 event.getDamage()
重新施加伤害只会返回对实体造成的基础伤害,而没有考虑护甲等因素的伤害减免,等等,导致造成比通常预期更多的伤害。将速度设置为零的方法效果很好,除非损坏的实体已经在运动,在这种情况下速度仍会被取消,这可能会导致意外行为。
现在 EntityDamageEvent
中有一个 getFinalDamage()
方法,您可以使用它来确保仍然造成正确的伤害(虽然还没有彻底测试它是否适用于每个案例)。
这是一个示例:
@EventHandler
public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
if (event.getDamager() instanceof Egg && event.getEntity() instanceof LivingEntity) { // If damager is an egg and hurt entity is a living entity
LivingEntity hurt = (LivingEntity) event.getEntity(); // Cast living entity so we can use damage() method
event.setCancelled(true); // Cancel the event, removing any knockback/velocity changes
hurt.damage(event.getFinalDamage()); // Re-apply final/original damage
}
}
这里是重置速度的旧方法:
@EventHandler
public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
if (event.getDamager() instanceof Egg) { // If damager is an egg
final Entity hurt = event.getEntity(); // Declare entity final so that we can use it in future scheduling
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { // Schedule a delayed task to run in one tick, plugin is main class
public void run() {
hurt.setVelocity(new Vector(0, 0, 0)); // Set velocity to zero vector, cancelling all motion
}
});
}
}
如何让鸡蛋不对队友造成击退?
我用这个代码的时候不会用刀剑之类的东西伤害队友,但是我不知道怎么让蛋不给队友击退。
其实我在游戏的时候给一个队友丢了个鸡蛋,在我看来好像对他造成了伤害,但是他并没有受到伤害。
@EventHandler
public void onPlayerDamage(EntityDamageByEntityEvent event) {
if(faze.equals("game")){
if (Team.getTeamType(event.getEntity()) == Team.getTeamType(event.getDamager())) {
event.setCancelled(true);
event.getEntity().setVelocity(event.getEntity().getLocation().getDirection().multiply(0));
}
}
}
如果有人能帮我解决这个问题,我将不胜感激
取消击退的旧方法是在处理损坏事件后将受损实体的速度设置为零(在所有三个方向上)一个刻度(使用计划任务),尽管我相信你现在可以简单地取消伤害事件,然后自己使用 damage(double)
方法重新应用初始事件造成的最终伤害,但这次没有任何击退。
第二种方法过去执行起来要困难得多,因为使用 event.getDamage()
重新施加伤害只会返回对实体造成的基础伤害,而没有考虑护甲等因素的伤害减免,等等,导致造成比通常预期更多的伤害。将速度设置为零的方法效果很好,除非损坏的实体已经在运动,在这种情况下速度仍会被取消,这可能会导致意外行为。
现在 EntityDamageEvent
中有一个 getFinalDamage()
方法,您可以使用它来确保仍然造成正确的伤害(虽然还没有彻底测试它是否适用于每个案例)。
这是一个示例:
@EventHandler
public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
if (event.getDamager() instanceof Egg && event.getEntity() instanceof LivingEntity) { // If damager is an egg and hurt entity is a living entity
LivingEntity hurt = (LivingEntity) event.getEntity(); // Cast living entity so we can use damage() method
event.setCancelled(true); // Cancel the event, removing any knockback/velocity changes
hurt.damage(event.getFinalDamage()); // Re-apply final/original damage
}
}
这里是重置速度的旧方法:
@EventHandler
public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
if (event.getDamager() instanceof Egg) { // If damager is an egg
final Entity hurt = event.getEntity(); // Declare entity final so that we can use it in future scheduling
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { // Schedule a delayed task to run in one tick, plugin is main class
public void run() {
hurt.setVelocity(new Vector(0, 0, 0)); // Set velocity to zero vector, cancelling all motion
}
});
}
}