Skip to content

Rewrite explode track #31

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 11 commits into
base: main
Choose a base branch
from
2 changes: 2 additions & 0 deletions Prism/src/main/java/network/darkhelmet/prism/Prism.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import network.darkhelmet.prism.listeners.PrismBlockEvents;
import network.darkhelmet.prism.listeners.PrismCustomEvents;
import network.darkhelmet.prism.listeners.PrismEntityEvents;
import network.darkhelmet.prism.listeners.PrismExplodeEvents;
import network.darkhelmet.prism.listeners.PrismInventoryEvents;
import network.darkhelmet.prism.listeners.PrismInventoryMoveItemEvent;
import network.darkhelmet.prism.listeners.PrismPlayerEvents;
Expand Down Expand Up @@ -527,6 +528,7 @@ private void enabled() {

// Assign event listeners
getServer().getPluginManager().registerEvents(new PrismBlockEvents(this), this);
getServer().getPluginManager().registerEvents(new PrismExplodeEvents(this), this);
getServer().getPluginManager().registerEvents(new PrismEntityEvents(this), this);
getServer().getPluginManager().registerEvents(new PrismWorldEvents(), this);
getServer().getPluginManager().registerEvents(new PrismPlayerEvents(this), this);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ public FileConfiguration getConfig() {
config.addDefault("prism.tracking.tnt-explode", true);
config.addDefault("prism.tracking.bed-explode", true);
config.addDefault("prism.tracking.respawnanchor-explode", true);
config.addDefault("prism.tracking.block-explode", true);
config.addDefault("prism.tracking.tnt-prime", true);
config.addDefault("prism.tracking.tree-grow", true);
config.addDefault("prism.tracking.vehicle-break", true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,8 @@ private void registerPrismDefaultActions() {
BlockAction.class, Il8nHelper.getRawMessage("blew-up")));
registerAction(new ActionTypeImpl("respawnanchor-explode", false, true, true,
BlockAction.class, Il8nHelper.getRawMessage("blew-up")));
registerAction(new ActionTypeImpl("block-explode", false, true, true,
BlockAction.class, Il8nHelper.getRawMessage("blew-up")));
registerAction(new ActionTypeImpl("tnt-prime", false, false, false,
UseAction.class, Il8nHelper.getRawMessage("primed")));
registerAction(new ActionTypeImpl("tree-grow", true, true, true,
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package network.darkhelmet.prism.listeners;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import network.darkhelmet.prism.Prism;
import network.darkhelmet.prism.actionlibs.ActionFactory;
import network.darkhelmet.prism.actionlibs.RecordingQueue;
Expand All @@ -16,7 +14,6 @@
import org.bukkit.block.DoubleChest;
import org.bukkit.block.Jukebox;
import org.bukkit.block.Sign;
import org.bukkit.block.data.type.Bed;
import org.bukkit.block.data.type.Chest;
import org.bukkit.block.data.type.Chest.Type;
import org.bukkit.block.sign.Side;
Expand All @@ -25,10 +22,10 @@
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockBurnEvent;
import org.bukkit.event.block.BlockDispenseEvent;
import org.bukkit.event.block.BlockExplodeEvent;
import org.bukkit.event.block.BlockFadeEvent;
import org.bukkit.event.block.BlockFormEvent;
import org.bukkit.event.block.BlockFromToEvent;
Expand All @@ -41,36 +38,26 @@
import org.bukkit.event.block.SignChangeEvent;
import org.bukkit.event.entity.EntityChangeBlockEvent;
import org.bukkit.event.player.PlayerBedEnterEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.WeakHashMap;
import java.util.concurrent.TimeUnit;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

public class PrismBlockEvents extends BaseListener {
public class PrismBlockEvents implements Listener {

private final Cache<Location, PlayerBed> bedWeakCache = CacheBuilder
.newBuilder()
.expireAfterWrite(30, TimeUnit.SECONDS)
.build();
private final Cache<Location, Player> anchorWeakCache = CacheBuilder
.newBuilder()
.expireAfterWrite(30, TimeUnit.SECONDS)
.build();
private final Prism plugin;

/**
* Constructor.
*
* @param plugin Prism.
* @param plugin Prism
*/
public PrismBlockEvents(Prism plugin) {
super(plugin);
this.plugin = plugin;

if (Prism.getInstance().getServerMajorVersion() >= 20) {
try {
Expand Down Expand Up @@ -365,63 +352,11 @@ public void onLeavesDecay(final LeavesDecayEvent event) {
}

/**
* Primarily for tracking respawn anchor explosions in the world and end,
* and bed explosions in the nether and end.
* @param event BlockExplodeEvent
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBlockExplode(BlockExplodeEvent event) {
if (event.getBlock().getBlockData() instanceof Bed) {
if (!Prism.getIgnore().event("bed-explode", event.getBlock())) {
return;
}
//while it might be nice to check that it's a bed - the block is already air
PlayerBed playerBed = bedWeakCache.getIfPresent(event.getBlock().getLocation());
if (playerBed == null) {
return;
}
String source = playerBed.player.getName();
List<Block> affected = event.blockList();
RecordingQueue.addToQueue(ActionFactory.createBlock("bed-explode", playerBed.bed, playerBed.player));
contructBlockEvent("bed-explode", source, affected);
bedWeakCache.invalidate(event.getBlock().getLocation());
} else if (event.getBlock().getType() == Material.RESPAWN_ANCHOR) {
if (!Prism.getIgnore().event("respawnanchor-explode", event.getBlock())) {
return;
}
Player player = anchorWeakCache.getIfPresent(event.getBlock().getLocation());
if (player == null) {
return;
}
String source = player.getName();
List<Block> affected = event.blockList();
RecordingQueue.addToQueue(ActionFactory.createBlock("respawnanchor-explode", event.getBlock().getState(), player));
contructBlockEvent("respawnanchor-explode", source, affected);
anchorWeakCache.invalidate(event.getBlock().getLocation());
}
}

/**
* Tracks players use respawn anchor to set spawnpoint and cache it in case of explosion.
* @param event PlayerInteractEvent
*/
@EventHandler(priority = EventPriority.MONITOR)
public void onRespawnAnchorUse(PlayerInteractEvent event) {
if (event.hasBlock() && event.getClickedBlock().getType() == Material.RESPAWN_ANCHOR) {
anchorWeakCache.put(event.getClickedBlock().getLocation(), event.getPlayer());
}
}

/**
* Tracks players entering a bed and where its not possible cache's it in case of explosion.
* Tracks players entering a bed.
* @param enterEvent PlayerBedEnterEvent
*/
@EventHandler(priority = EventPriority.MONITOR)
public void onBedEnter(PlayerBedEnterEvent enterEvent) {
if (enterEvent.getBedEnterResult() == PlayerBedEnterEvent.BedEnterResult.NOT_POSSIBLE_HERE) {
bedWeakCache.put(enterEvent.getBed().getLocation(), new PlayerBed(enterEvent.getPlayer(),
enterEvent.getBed().getState()));
}
if (!Prism.getIgnore().event("block-use", enterEvent.getBed())) {
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Creeper;
import org.bukkit.entity.EnderDragon;
import org.bukkit.entity.Enderman;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
Expand All @@ -24,11 +22,11 @@
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.entity.Wither;
import org.bukkit.entity.minecart.PoweredMinecart;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.EntityBlockFormEvent;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.EntityBreakDoorEvent;
Expand All @@ -37,7 +35,6 @@
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.entity.EntityTargetEvent;
import org.bukkit.event.entity.EntityUnleashEvent;
import org.bukkit.event.entity.PlayerLeashEntityEvent;
Expand All @@ -64,14 +61,16 @@
import java.util.Objects;
import java.util.UUID;

public class PrismEntityEvents extends BaseListener {
public class PrismEntityEvents implements Listener {

private final Prism plugin;

/**
* Constructor.
* @param plugin Plugin
* @param plugin Prism
*/
public PrismEntityEvents(Prism plugin) {
super(plugin);
this.plugin = plugin;
}

/**
Expand Down Expand Up @@ -763,80 +762,4 @@ public void onEntityBlockForm(final EntityBlockFormEvent event) {
block.getBlockData(), newState, entity));
}
}

/**
* EntityExplodeEvent.
* @param event EntityExplodeEvent
*/
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onEntityExplodeChangeBlock(final EntityExplodeEvent event) {

if (event.blockList().isEmpty()) {
return;
}
String name;
String action = "entity-explode";
if (event.getEntity() != null) {
if (event.getEntity() instanceof Creeper) {
if (!Prism.getIgnore().event("creeper-explode", event.getEntity().getWorld())) {
return;
}
action = "creeper-explode";
name = "creeper";
} else if (event.getEntity() instanceof TNTPrimed) {
if (!Prism.getIgnore().event("tnt-explode", event.getEntity().getWorld())) {
return;
}
action = "tnt-explode";
Entity source = ((TNTPrimed) event.getEntity()).getSource();
name = followTntTrail(source);
} else if (event.getEntity() instanceof EnderDragon) {
if (!Prism.getIgnore().event("dragon-eat", event.getEntity().getWorld())) {
return;
}
action = "dragon-eat";
name = "enderdragon";
} else {
if (!Prism.getIgnore().event("entity-explode", event.getLocation().getWorld())) {
return;
}
try {
name = event.getEntity().getType().name().toLowerCase().replace("_", " ");
name = name.length() > 15 ? name.substring(0, 15) : name; // I
} catch (final NullPointerException e) {
name = "unknown";
}
}
} else {
if (!Prism.getIgnore().event("entity-explode", event.getLocation().getWorld())) {
return;
}
name = "magic";
}
contructBlockEvent(action,name,event.blockList());
}

private String followTntTrail(Entity initial) {
int counter = 10000000;

while (initial != null) {
if (initial instanceof Player) {
return initial.getName();
} else if (initial instanceof TNTPrimed) {
initial = (((TNTPrimed) initial).getSource());
if (counter < 0 && initial != null) {
Location last = initial.getLocation();
plugin.getLogger().warning("TnT chain has exceeded one million, will not continue!");
plugin.getLogger().warning("Last Tnt was at " + last.getX() + ", " + last.getY() + ". "
+ last.getZ() + " in world " + last.getWorld());
return "tnt";
}
counter--;
} else {
return initial.getType().name();
}
}

return "tnt";
}
}
Loading