added lightning fire control

This commit is contained in:
Elias Müller 2025-03-15 23:37:24 +01:00
parent 49eeb646ea
commit 71d5d8303d
2 changed files with 81 additions and 0 deletions
src/main/java/eu/mhsl/craftattack/spawn/appliances/tooling/lightningFireControl

@ -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<Block> frozenFireBlocks = new HashSet<>();
@Override
protected @NotNull List<Listener> listeners() {
return List.of(new LightningFireListener());
}
}

@ -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<LightningFireControl> {
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);
}
}