Fixes projectile damage by block bug

Fixes https://github.com/BentoBoxWorld/BentoBox/issues/1211
This commit is contained in:
tastybento 2020-02-29 10:04:59 -08:00
parent b189ebde65
commit 8393784498
2 changed files with 43 additions and 5 deletions

View File

@ -83,13 +83,11 @@ public class PVPListener extends FlagListener {
user.notify(getFlag(damager.getWorld()).getHintReference());
e.setCancelled(true);
}
} else if (damager instanceof Projectile) {
} else if (damager instanceof Projectile && ((Projectile)damager).getShooter() instanceof Player) {
// Find out who fired the arrow
Projectile p = (Projectile) damager;
Entity shooter =(Entity)p.getShooter();
if (shooter instanceof Player) {
processDamage(e, damager, (Player)shooter, hurtEntity, flag);
}
Player shooter =(Player)p.getShooter();
processDamage(e, damager, shooter, hurtEntity, flag);
} else if (damager instanceof Firework && firedFireworks.containsKey(damager)) {
Player shooter = firedFireworks.get(damager);
processDamage(e, damager, shooter, hurtEntity, flag);

View File

@ -50,6 +50,7 @@ import org.bukkit.event.entity.PotionSplashEvent;
import org.bukkit.event.player.PlayerFishEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.projectiles.BlockProjectileSource;
import org.bukkit.projectiles.ProjectileSource;
import org.bukkit.scheduler.BukkitScheduler;
import org.junit.After;
@ -591,6 +592,45 @@ public class PVPListenerTest {
}
/**
* Test method for {@link PVPListener#onEntityDamage(org.bukkit.event.entity.EntityDamageByEntityEvent)}.
*/
@Test
public void testOnEntityDamagePVPAllowedProjectileNullSource() {
Projectile p = mock(Projectile.class);
when(p.getShooter()).thenReturn(null);
when(p.getLocation()).thenReturn(loc);
// PVP is allowed
when(island.isAllowed(any())).thenReturn(true);
EntityDamageByEntityEvent e = new EntityDamageByEntityEvent(p, player2, EntityDamageEvent.DamageCause.ENTITY_ATTACK,
new EnumMap<>(ImmutableMap.of(DamageModifier.BASE, 0D)),
new EnumMap<DamageModifier, Function<? super Double, Double>>(ImmutableMap.of(DamageModifier.BASE, Functions.constant(-0.0))));
new PVPListener().onEntityDamage(e);
// PVP should be allowed
assertFalse(e.isCancelled());
verify(player, never()).sendMessage(Flags.PVP_OVERWORLD.getHintReference());
}
/**
* Test method for {@link PVPListener#onEntityDamage(org.bukkit.event.entity.EntityDamageByEntityEvent)}.
*/
@Test
public void testOnEntityDamagePVPAllowedProjectileNonEntitySource() {
Projectile p = mock(Projectile.class);
BlockProjectileSource pSource = mock(BlockProjectileSource.class);
when(p.getShooter()).thenReturn(pSource);
when(p.getLocation()).thenReturn(loc);
// PVP is allowed
when(island.isAllowed(any())).thenReturn(true);
EntityDamageByEntityEvent e = new EntityDamageByEntityEvent(p, player2, EntityDamageEvent.DamageCause.ENTITY_ATTACK,
new EnumMap<>(ImmutableMap.of(DamageModifier.BASE, 0D)),
new EnumMap<DamageModifier, Function<? super Double, Double>>(ImmutableMap.of(DamageModifier.BASE, Functions.constant(-0.0))));
new PVPListener().onEntityDamage(e);
// PVP should be allowed
assertFalse(e.isCancelled());
verify(player, never()).sendMessage(Flags.PVP_OVERWORLD.getHintReference());
}
/**
* Test method for {@link PVPListener#onFishing(org.bukkit.event.player.PlayerFishEvent)}.
*/