mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-17 16:37:43 +01:00
Add PreExplodeEvents
This commit is contained in:
@@ -1,140 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: SageSphinx63920 <sage@sagesphinx63920.dev>
|
|
||||||
Date: Mon, 26 Dec 2022 23:40:13 +0100
|
|
||||||
Subject: [PATCH] Add PreExplodeEvents
|
|
||||||
|
|
||||||
|
|
||||||
diff --git a/src/main/java/org/purpurmc/purpur/event/PreBlockExplodeEvent.java b/src/main/java/org/purpurmc/purpur/event/PreBlockExplodeEvent.java
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000000000000000000000000000000000..4b4d32c58224e1208f14024ca214078a37550bb5
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/src/main/java/org/purpurmc/purpur/event/PreBlockExplodeEvent.java
|
|
||||||
@@ -0,0 +1,56 @@
|
|
||||||
+package org.purpurmc.purpur.event;
|
|
||||||
+
|
|
||||||
+import org.bukkit.ExplosionResult;
|
|
||||||
+import org.bukkit.block.Block;
|
|
||||||
+import org.bukkit.block.BlockState;
|
|
||||||
+import org.bukkit.event.Cancellable;
|
|
||||||
+import org.bukkit.event.HandlerList;
|
|
||||||
+import org.bukkit.event.block.BlockExplodeEvent;
|
|
||||||
+import org.jetbrains.annotations.ApiStatus;
|
|
||||||
+import java.util.Collections;
|
|
||||||
+import org.jspecify.annotations.NullMarked;
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
+ * Called before a block's explosion is processed
|
|
||||||
+ */
|
|
||||||
+@NullMarked
|
|
||||||
+public class PreBlockExplodeEvent extends BlockExplodeEvent implements Cancellable {
|
|
||||||
+ private static final HandlerList handlers = new HandlerList();
|
|
||||||
+ private boolean cancelled;
|
|
||||||
+ private final float yield;
|
|
||||||
+
|
|
||||||
+ @ApiStatus.Internal
|
|
||||||
+ public PreBlockExplodeEvent(final Block what, final float yield, BlockState explodedBlockState, ExplosionResult result) {
|
|
||||||
+ super(what, explodedBlockState, Collections.emptyList(), yield, result);
|
|
||||||
+ this.yield = yield;
|
|
||||||
+ this.cancelled = false;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /**
|
|
||||||
+ * Returns the percentage of blocks to drop from this explosion
|
|
||||||
+ *
|
|
||||||
+ * @return The yield.
|
|
||||||
+ */
|
|
||||||
+ public float getYield() {
|
|
||||||
+ return yield;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ @Override
|
|
||||||
+ public boolean isCancelled() {
|
|
||||||
+ return this.cancelled;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ @Override
|
|
||||||
+ public void setCancelled(boolean cancel) {
|
|
||||||
+ this.cancelled = cancel;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ @Override
|
|
||||||
+ public HandlerList getHandlers() {
|
|
||||||
+ return handlers;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ public static HandlerList getHandlerList() {
|
|
||||||
+ return handlers;
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
diff --git a/src/main/java/org/purpurmc/purpur/event/entity/PreEntityExplodeEvent.java b/src/main/java/org/purpurmc/purpur/event/entity/PreEntityExplodeEvent.java
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000000000000000000000000000000000..d56fb066455007cc710f7ba34ba722af6e89bc1d
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/src/main/java/org/purpurmc/purpur/event/entity/PreEntityExplodeEvent.java
|
|
||||||
@@ -0,0 +1,66 @@
|
|
||||||
+package org.purpurmc.purpur.event.entity;
|
|
||||||
+
|
|
||||||
+import org.bukkit.ExplosionResult;
|
|
||||||
+import org.bukkit.Location;
|
|
||||||
+import org.bukkit.event.Cancellable;
|
|
||||||
+import org.bukkit.event.HandlerList;
|
|
||||||
+import org.bukkit.event.entity.EntityExplodeEvent;
|
|
||||||
+import org.jetbrains.annotations.ApiStatus;
|
|
||||||
+import java.util.Collections;
|
|
||||||
+import org.jspecify.annotations.NullMarked;
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
+ * Called before an entity's explosion is processed
|
|
||||||
+ */
|
|
||||||
+@NullMarked
|
|
||||||
+public class PreEntityExplodeEvent extends EntityExplodeEvent implements Cancellable {
|
|
||||||
+ private static final HandlerList handlers = new HandlerList();
|
|
||||||
+ private boolean cancelled;
|
|
||||||
+ private final float yield;
|
|
||||||
+ private final Location location;
|
|
||||||
+
|
|
||||||
+ @ApiStatus.Internal
|
|
||||||
+ public PreEntityExplodeEvent(org.bukkit.entity.Entity what, final Location location, final float yield, ExplosionResult result) {
|
|
||||||
+ super(what, location, Collections.emptyList(), yield, result);
|
|
||||||
+ this.cancelled = false;
|
|
||||||
+ this.yield = yield;
|
|
||||||
+ this.location = location;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /**
|
|
||||||
+ * Returns the percentage of blocks to drop from this explosion
|
|
||||||
+ *
|
|
||||||
+ * @return The yield.
|
|
||||||
+ */
|
|
||||||
+ public float getYield() {
|
|
||||||
+ return yield;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /**
|
|
||||||
+ * Returns the location where the explosion happened.
|
|
||||||
+ *
|
|
||||||
+ * @return The location of the explosion
|
|
||||||
+ */
|
|
||||||
+ public Location getLocation() {
|
|
||||||
+ return location;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ @Override
|
|
||||||
+ public boolean isCancelled() {
|
|
||||||
+ return this.cancelled;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ @Override
|
|
||||||
+ public void setCancelled(boolean cancel) {
|
|
||||||
+ this.cancelled = cancel;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ @Override
|
|
||||||
+ public HandlerList getHandlers() {
|
|
||||||
+ return handlers;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ public static HandlerList getHandlerList() {
|
|
||||||
+ return handlers;
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: SageSphinx63920 <sage@sagesphinx63920.dev>
|
|
||||||
Date: Mon, 26 Dec 2022 23:42:37 +0100
|
|
||||||
Subject: [PATCH] Add PreExplodeEvents
|
|
||||||
|
|
||||||
|
|
||||||
diff --git a/net/minecraft/world/level/ServerExplosion.java b/net/minecraft/world/level/ServerExplosion.java
|
|
||||||
index 05fdb02b6f73c24f6985755effecf92c0b365cf0..4c7e4683c53afb0800b7f17c5964ba8ff31848d1 100644
|
|
||||||
--- a/net/minecraft/world/level/ServerExplosion.java
|
|
||||||
+++ b/net/minecraft/world/level/ServerExplosion.java
|
|
||||||
@@ -670,6 +670,23 @@ public class ServerExplosion implements Explosion {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// CraftBukkit end
|
|
||||||
+ // Purpur start - add PreExplodeEvents
|
|
||||||
+ if (this.source != null) {
|
|
||||||
+ Location location = new Location(this.level.getWorld(), this.center.x, this.center.y, this.center.z);
|
|
||||||
+ if(!new org.purpurmc.purpur.event.entity.PreEntityExplodeEvent(this.source.getBukkitEntity(), location, this.blockInteraction == Explosion.BlockInteraction.DESTROY_WITH_DECAY ? 1.0F / this.radius : 1.0F, org.bukkit.craftbukkit.CraftExplosionResult.toBukkit(getBlockInteraction())).callEvent()) {
|
|
||||||
+ this.wasCanceled = true;
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+ } else {
|
|
||||||
+ Location location = new Location(this.level.getWorld(), this.center.x, this.center.y, this.center.z);
|
|
||||||
+ org.bukkit.block.Block block = location.getBlock();
|
|
||||||
+ org.bukkit.block.BlockState blockState = (this.damageSource.getDirectBlockState() != null) ? this.damageSource.getDirectBlockState() : block.getState();
|
|
||||||
+ if(!new org.purpurmc.purpur.event.PreBlockExplodeEvent(location.getBlock(), this.blockInteraction == Explosion.BlockInteraction.DESTROY_WITH_DECAY ? 1.0F / this.radius : 1.0F, blockState, org.bukkit.craftbukkit.CraftExplosionResult.toBukkit(getBlockInteraction())).callEvent()) {
|
|
||||||
+ this.wasCanceled = true;
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ // Purpur end
|
|
||||||
// Paper start - collision optimisations
|
|
||||||
this.blockCache = new it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap<>();
|
|
||||||
this.chunkPosCache = new long[CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH];
|
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
package org.purpurmc.purpur.event;
|
||||||
|
|
||||||
|
import org.bukkit.ExplosionResult;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.BlockState;
|
||||||
|
import org.bukkit.event.Cancellable;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
import org.bukkit.event.block.BlockExplodeEvent;
|
||||||
|
import org.jetbrains.annotations.ApiStatus;
|
||||||
|
import java.util.Collections;
|
||||||
|
import org.jspecify.annotations.NullMarked;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called before a block's explosion is processed
|
||||||
|
*/
|
||||||
|
@NullMarked
|
||||||
|
public class PreBlockExplodeEvent extends BlockExplodeEvent implements Cancellable {
|
||||||
|
private static final HandlerList handlers = new HandlerList();
|
||||||
|
private boolean cancelled;
|
||||||
|
private final float yield;
|
||||||
|
|
||||||
|
@ApiStatus.Internal
|
||||||
|
public PreBlockExplodeEvent(final Block what, final float yield, BlockState explodedBlockState, ExplosionResult result) {
|
||||||
|
super(what, explodedBlockState, Collections.emptyList(), yield, result);
|
||||||
|
this.yield = yield;
|
||||||
|
this.cancelled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the percentage of blocks to drop from this explosion
|
||||||
|
*
|
||||||
|
* @return The yield.
|
||||||
|
*/
|
||||||
|
public float getYield() {
|
||||||
|
return yield;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCancelled() {
|
||||||
|
return this.cancelled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setCancelled(boolean cancel) {
|
||||||
|
this.cancelled = cancel;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HandlerList getHandlers() {
|
||||||
|
return handlers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HandlerList getHandlerList() {
|
||||||
|
return handlers;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
package org.purpurmc.purpur.event.entity;
|
||||||
|
|
||||||
|
import org.bukkit.ExplosionResult;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.event.Cancellable;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||||
|
import org.jetbrains.annotations.ApiStatus;
|
||||||
|
import java.util.Collections;
|
||||||
|
import org.jspecify.annotations.NullMarked;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called before an entity's explosion is processed
|
||||||
|
*/
|
||||||
|
@NullMarked
|
||||||
|
public class PreEntityExplodeEvent extends EntityExplodeEvent implements Cancellable {
|
||||||
|
private static final HandlerList handlers = new HandlerList();
|
||||||
|
private boolean cancelled;
|
||||||
|
private final float yield;
|
||||||
|
private final Location location;
|
||||||
|
|
||||||
|
@ApiStatus.Internal
|
||||||
|
public PreEntityExplodeEvent(org.bukkit.entity.Entity what, final Location location, final float yield, ExplosionResult result) {
|
||||||
|
super(what, location, Collections.emptyList(), yield, result);
|
||||||
|
this.cancelled = false;
|
||||||
|
this.yield = yield;
|
||||||
|
this.location = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the percentage of blocks to drop from this explosion
|
||||||
|
*
|
||||||
|
* @return The yield.
|
||||||
|
*/
|
||||||
|
public float getYield() {
|
||||||
|
return yield;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the location where the explosion happened.
|
||||||
|
*
|
||||||
|
* @return The location of the explosion
|
||||||
|
*/
|
||||||
|
public Location getLocation() {
|
||||||
|
return location;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCancelled() {
|
||||||
|
return this.cancelled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setCancelled(boolean cancel) {
|
||||||
|
this.cancelled = cancel;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HandlerList getHandlers() {
|
||||||
|
return handlers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HandlerList getHandlerList() {
|
||||||
|
return handlers;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
this.center = center;
|
this.center = center;
|
||||||
this.fire = fire;
|
this.fire = fire;
|
||||||
this.blockInteraction = blockInteraction;
|
this.blockInteraction = blockInteraction;
|
||||||
@@ -649,7 +_,7 @@
|
@@ -649,10 +_,27 @@
|
||||||
|
|
||||||
public void explode() {
|
public void explode() {
|
||||||
// CraftBukkit start
|
// CraftBukkit start
|
||||||
@@ -18,3 +18,23 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// CraftBukkit end
|
// CraftBukkit end
|
||||||
|
+ // Purpur start - add PreExplodeEvents
|
||||||
|
+ if (this.source != null) {
|
||||||
|
+ Location location = new Location(this.level.getWorld(), this.center.x, this.center.y, this.center.z);
|
||||||
|
+ if(!new org.purpurmc.purpur.event.entity.PreEntityExplodeEvent(this.source.getBukkitEntity(), location, this.blockInteraction == Explosion.BlockInteraction.DESTROY_WITH_DECAY ? 1.0F / this.radius : 1.0F, org.bukkit.craftbukkit.CraftExplosionResult.toBukkit(getBlockInteraction())).callEvent()) {
|
||||||
|
+ this.wasCanceled = true;
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ Location location = new Location(this.level.getWorld(), this.center.x, this.center.y, this.center.z);
|
||||||
|
+ org.bukkit.block.Block block = location.getBlock();
|
||||||
|
+ org.bukkit.block.BlockState blockState = (this.damageSource.getDirectBlockState() != null) ? this.damageSource.getDirectBlockState() : block.getState();
|
||||||
|
+ if(!new org.purpurmc.purpur.event.PreBlockExplodeEvent(location.getBlock(), this.blockInteraction == Explosion.BlockInteraction.DESTROY_WITH_DECAY ? 1.0F / this.radius : 1.0F, blockState, org.bukkit.craftbukkit.CraftExplosionResult.toBukkit(getBlockInteraction())).callEvent()) {
|
||||||
|
+ this.wasCanceled = true;
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ // Purpur end - Add PreExplodeEvents
|
||||||
|
// Paper start - collision optimisations
|
||||||
|
this.blockCache = new it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap<>();
|
||||||
|
this.chunkPosCache = new long[CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH];
|
||||||
|
|||||||
Reference in New Issue
Block a user