diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/lightningFireControl/LightningFireControl.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/lightningFireControl/LightningFireControl.java new file mode 100644 index 0000000..6210c0c --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/lightningFireControl/LightningFireControl.java @@ -0,0 +1,19 @@ +package eu.mhsl.craftattack.spawn.appliances.tooling.lightningFireControl; + +import eu.mhsl.craftattack.spawn.appliance.Appliance; +import org.bukkit.block.Block; +import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class LightningFireControl extends Appliance { + Set frozenFireBlocks = new HashSet<>(); + + @Override + protected @NotNull List listeners() { + return List.of(new LightningFireListener()); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/lightningFireControl/LightningFireListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/lightningFireControl/LightningFireListener.java new file mode 100644 index 0000000..dfaa1fa --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/lightningFireControl/LightningFireListener.java @@ -0,0 +1,62 @@ +package eu.mhsl.craftattack.spawn.appliances.tooling.lightningFireControl; + +import eu.mhsl.craftattack.spawn.Main; +import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.event.EventHandler; +import org.bukkit.event.block.BlockBurnEvent; +import org.bukkit.event.block.BlockIgniteEvent; +import org.bukkit.event.block.BlockSpreadEvent; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.Random; + +class LightningFireListener extends ApplianceListener { + private final Random rnd = new Random(); + + @EventHandler + public void onBlockIgnite(BlockIgniteEvent event) { + if(!event.getCause().equals(BlockIgniteEvent.IgniteCause.LIGHTNING)) return; + Block block = event.getBlock(); + + this.getAppliance().frozenFireBlocks.add(block); + + new BukkitRunnable() { + @Override + public void run() { + Runnable cancel = () -> { + LightningFireListener.this.getAppliance().frozenFireBlocks.remove(block); + this.cancel(); + }; + + if (block.getType() != Material.FIRE) { + cancel.run(); + return; + } + + if (LightningFireListener.this.rnd.nextInt(100) < 30) { + block.setType(Material.AIR); + cancel.run(); + } + } + }.runTaskTimer(Main.instance(), 20L, 20L); + } + + @EventHandler + public void onFireSpread(BlockSpreadEvent event) { + Block source = event.getSource(); + if(!source.getType().equals(Material.FIRE)) return; + if(source.equals(event.getBlock())) return; + if(!this.getAppliance().frozenFireBlocks.contains(source)) return; + + event.setCancelled(true); + } + + @EventHandler + public void onBlockBurned(BlockBurnEvent event) { + if(!this.getAppliance().frozenFireBlocks.contains(event.getIgnitingBlock())) return; + + event.setCancelled(true); + } +}