pvp off players get immunity to directly caused explosions

This commit is contained in:
YouHaveTrouble
2020-08-20 15:41:50 +02:00
parent 638b40c083
commit b98c0bc66c
2 changed files with 55 additions and 16 deletions
@@ -17,6 +17,9 @@ public class LavaDumpAndIgniteListener implements Listener {
private ConfigCache config = TogglePvP.getPlugin().getConfigCache(); private ConfigCache config = TogglePvP.getPlugin().getConfigCache();
/**
* Prevents dumping lava and pufferfish bucket near players with pvp off
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onLavaDump(org.bukkit.event.player.PlayerBucketEmptyEvent event) { public void onLavaDump(org.bukkit.event.player.PlayerBucketEmptyEvent event) {
@@ -48,9 +51,11 @@ public class LavaDumpAndIgniteListener implements Listener {
} }
} }
} }
} }
/**
* Prevents setting blocks on fire near players with pvp off
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onIgnite(org.bukkit.event.block.BlockIgniteEvent event) { public void onIgnite(org.bukkit.event.block.BlockIgniteEvent event) {
@@ -82,11 +87,5 @@ public class LavaDumpAndIgniteListener implements Listener {
} }
} }
} }
} }
} }
@@ -6,9 +6,12 @@ import eu.endermite.togglepvp.util.PluginMessages;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.EnderCrystal; import org.bukkit.entity.EnderCrystal;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.FixedMetadataValue;
import java.util.UUID; import java.util.UUID;
@@ -16,17 +19,18 @@ import java.util.UUID;
public class PlayerHitByExplosionListener implements Listener { public class PlayerHitByExplosionListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerHitEnderCrystal(org.bukkit.event.entity.EntityDamageByEntityEvent event) {
if (event.getEntity() instanceof EnderCrystal && event.getDamager() instanceof Player) {
EnderCrystal enderCrystal = (EnderCrystal) event.getEntity();
enderCrystal.setMetadata("PLAYEREXPLODED", new FixedMetadataValue(TogglePvP.getPlugin(), event.getDamager().getUniqueId().toString()));
}
}
/**
* Cancels explosion damage for players with pvp off that is caused by players
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerHitByExplosion(org.bukkit.event.entity.EntityDamageByEntityEvent event) { public void onPlayerHitByExplosion(org.bukkit.event.entity.EntityDamageByEntityEvent event) {
if (event.getEntity() instanceof Player) { if (event.getEntity() instanceof Player) {
if (!event.getCause().equals(EntityDamageEvent.DamageCause.ENTITY_EXPLOSION)) {
return;
}
Player victim = (Player) event.getEntity(); Player victim = (Player) event.getEntity();
try { try {
UUID playeruuid = UUID.fromString(event.getDamager().getMetadata("PLAYEREXPLODED").get(0).asString()); UUID playeruuid = UUID.fromString(event.getDamager().getMetadata("PLAYEREXPLODED").get(0).asString());
@@ -46,7 +50,43 @@ public class PlayerHitByExplosionListener implements Listener {
return; return;
} }
} }
} catch (NullPointerException ignored) {} } catch (NullPointerException | IndexOutOfBoundsException ignored) {}
} }
} }
/**
* Tags ender crystal with exploder uuid
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerHitEnderCrystal(org.bukkit.event.entity.EntityDamageByEntityEvent event) {
if (event.getEntity() instanceof EnderCrystal) {
EnderCrystal enderCrystal = (EnderCrystal) event.getEntity();
if (event.getDamager() instanceof Player) {
enderCrystal.setMetadata("PLAYEREXPLODED", new FixedMetadataValue(TogglePvP.getPlugin(), event.getDamager().getUniqueId().toString()));
} else if (event.getDamager() instanceof Projectile) {
Projectile projectile = (Projectile) event.getDamager();
if (projectile.getShooter() instanceof Player) {
Player damager = (Player) projectile.getShooter();
enderCrystal.setMetadata("PLAYEREXPLODED", new FixedMetadataValue(TogglePvP.getPlugin(), damager.getUniqueId().toString()));
}
}
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerPrimedTnt(org.bukkit.event.entity.ExplosionPrimeEvent event) {
if (event.getEntity() instanceof TNTPrimed) {
TNTPrimed tntPrimed = (TNTPrimed) event.getEntity();
if (tntPrimed.getSource() instanceof Player) {
Player damager = (Player) tntPrimed.getSource();
tntPrimed.setMetadata("PLAYEREXPLODED",new FixedMetadataValue( TogglePvP.getPlugin(), damager.getUniqueId().toString()));
} else if (tntPrimed.getSource() instanceof TNTPrimed) {
try {
TNTPrimed sourceTnt = (TNTPrimed) tntPrimed.getSource();
String damagerUuid = sourceTnt.getMetadata("PLAYEREXPLODED").get(0).asString();
tntPrimed.setMetadata("PLAYEREXPLODED", new FixedMetadataValue( TogglePvP.getPlugin(), damagerUuid));
}catch (NullPointerException ignored) {}
}
}
}
} }