TNT no longer hurts other players with PvP disabled.

This commit is contained in:
Andreas Troelsen 2013-06-06 09:38:24 +02:00
parent 1c45d45e91
commit 0be1a7e4c9

View File

@ -67,6 +67,9 @@ import org.bukkit.material.Attachable;
import org.bukkit.material.Bed; import org.bukkit.material.Bed;
import org.bukkit.material.Door; import org.bukkit.material.Door;
import org.bukkit.material.Redstone; import org.bukkit.material.Redstone;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.metadata.MetadataValue;
import org.bukkit.metadata.Metadatable;
import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType; import org.bukkit.potion.PotionEffectType;
@ -235,12 +238,16 @@ public class ArenaListener
return; return;
} }
// If the block is TNT, replace with a TNTPrimed // If the block is TNT, set its planter
if (autoIgniteTNT && b.getType() == Material.TNT) { if (b.getType() == Material.TNT) {
event.setCancelled(true); if (autoIgniteTNT) {
event.getPlayer().getInventory().removeItem(new ItemStack(Material.TNT, 1)); event.setCancelled(true);
b.getWorld().spawn(b.getRelative(BlockFace.UP).getLocation(), TNTPrimed.class); event.getPlayer().getInventory().removeItem(new ItemStack(Material.TNT, 1));
return; TNTPrimed tnt = b.getWorld().spawn(b.getRelative(BlockFace.UP).getLocation(), TNTPrimed.class);
setPlanter(tnt, event.getPlayer());
return;
}
setPlanter(b, event.getPlayer());
} }
// Otherwise, block was placed during a session. // Otherwise, block was placed during a session.
@ -252,6 +259,20 @@ public class ArenaListener
} }
} }
private void setPlanter(Metadatable tnt, Player planter) {
tnt.setMetadata("mobarena-planter", new FixedMetadataValue(plugin, planter));
}
private Player getPlanter(Metadatable tnt) {
List<MetadataValue> values = tnt.getMetadata("mobarena-planter");
for (MetadataValue value : values) {
if (value.getOwningPlugin().equals(plugin)) {
return (Player) value.value();
}
}
return null;
}
public void onBlockForm(BlockFormEvent event) { public void onBlockForm(BlockFormEvent event) {
if (!arena.getRegion().contains(event.getBlock().getLocation())) if (!arena.getRegion().contains(event.getBlock().getLocation()))
return; return;
@ -262,20 +283,29 @@ public class ArenaListener
} }
public void onBlockIgnite(BlockIgniteEvent event) { public void onBlockIgnite(BlockIgniteEvent event) {
if (!arena.getRegion().contains(event.getBlock().getLocation())) Block b = event.getBlock();
if (!arena.getRegion().contains(b.getLocation()))
return; return;
switch (event.getCause()){ switch (event.getCause()) {
case FLINT_AND_STEEL:
if (arena.isRunning()) {
if (b.getType() == Material.TNT) {
Player planter = getPlanter(b);
if (planter != null) {
b.setTypeId(0);
TNTPrimed tnt = b.getWorld().spawn(b.getLocation(), TNTPrimed.class);
setPlanter(tnt, planter);
}
} else {
arena.addBlock(event.getBlock().getRelative(BlockFace.UP));
}
break;
}
case LIGHTNING: case LIGHTNING:
case SPREAD: case SPREAD:
event.setCancelled(true); event.setCancelled(true);
break; break;
case FLINT_AND_STEEL:
if (arena.isRunning())
arena.addBlock(event.getBlock().getRelative(BlockFace.UP));
else
event.setCancelled(true);
break;
default: default:
break; break;
} }
@ -484,6 +514,8 @@ public class ArenaListener
if (damager instanceof Projectile) { if (damager instanceof Projectile) {
damager = ((Projectile) damager).getShooter(); damager = ((Projectile) damager).getShooter();
} else if (damager instanceof TNTPrimed) {
damager = getPlanter(damager);
} }
} }
@ -517,7 +549,7 @@ public class ArenaListener
} }
// If PvP is disabled and damager is a player, cancel damage // If PvP is disabled and damager is a player, cancel damage
else if (arena.inArena(player)) { else if (arena.inArena(player)) {
if (!pvpEnabled && (damager instanceof Player || damager instanceof Wolf)) { if (!pvpEnabled && ((damager instanceof Player && !damager.equals(player)) || damager instanceof Wolf)) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }