Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-12-26 00:00:16 +01:00
Cleanup and rework physical interaction events. Fixes BUKKIT-3686
Currently when dealing with physical interactions with pressure plates and tripwires we immediately block their activation as soon as a single entity involved has their event cancelled. We also fire events whenever an entity intersects the block a wooden button is in even if they aren't actually pressing it. To correct this we move the button interaction to the correct place and modify all three to only block the activation if every entity is blocked from using them instead of just one of them.
Dieser Commit ist enthalten in:
Ursprung
ae19f2c46f
Commit
444ced306a
src/main/java/net/minecraft/server
@ -238,15 +238,6 @@ public abstract class BlockButtonAbstract extends Block {
|
|||||||
if (!world.isStatic) {
|
if (!world.isStatic) {
|
||||||
if (this.a) {
|
if (this.a) {
|
||||||
if ((world.getData(i, j, k) & 8) == 0) {
|
if ((world.getData(i, j, k) & 8) == 0) {
|
||||||
// CraftBukkit start - Call interaction when entities (currently arrows) hit wooden buttons
|
|
||||||
EntityInteractEvent event = new EntityInteractEvent(entity.getBukkitEntity(), world.getWorld().getBlockAt(i, j, k));
|
|
||||||
world.getServer().getPluginManager().callEvent(event);
|
|
||||||
|
|
||||||
if (event.isCancelled()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// CraftBukkit end
|
|
||||||
|
|
||||||
this.n(world, i, j, k);
|
this.n(world, i, j, k);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -262,6 +253,30 @@ public abstract class BlockButtonAbstract extends Block {
|
|||||||
List list = world.a(EntityArrow.class, AxisAlignedBB.a().a((double) i + this.minX, (double) j + this.minY, (double) k + this.minZ, (double) i + this.maxX, (double) j + this.maxY, (double) k + this.maxZ));
|
List list = world.a(EntityArrow.class, AxisAlignedBB.a().a((double) i + this.minX, (double) j + this.minY, (double) k + this.minZ, (double) i + this.maxX, (double) j + this.maxY, (double) k + this.maxZ));
|
||||||
boolean flag1 = !list.isEmpty();
|
boolean flag1 = !list.isEmpty();
|
||||||
|
|
||||||
|
// CraftBukkit start - Call interact event when arrows turn on wooden buttons
|
||||||
|
if (flag != flag1 && flag1) {
|
||||||
|
org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k);
|
||||||
|
boolean allowed = false;
|
||||||
|
|
||||||
|
// If all of the events are cancelled block the button press, else allow
|
||||||
|
for (Object object : list) {
|
||||||
|
if (object != null) {
|
||||||
|
EntityInteractEvent event = new EntityInteractEvent(((Entity) object).getBukkitEntity(), block);
|
||||||
|
world.getServer().getPluginManager().callEvent(event);
|
||||||
|
|
||||||
|
if (!event.isCancelled()) {
|
||||||
|
allowed = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!allowed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// CraftBukkit end
|
||||||
|
|
||||||
if (flag1 && !flag) {
|
if (flag1 && !flag) {
|
||||||
world.setData(i, j, k, i1 | 8, 3);
|
world.setData(i, j, k, i1 | 8, 3);
|
||||||
this.d(world, i, j, k, i1);
|
this.d(world, i, j, k, i1);
|
||||||
|
@ -43,7 +43,7 @@ public class BlockPressurePlateBinary extends BlockPressurePlateAbstract {
|
|||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
Entity entity = (Entity) iterator.next();
|
Entity entity = (Entity) iterator.next();
|
||||||
|
|
||||||
// CraftBukkit start
|
// CraftBukkit start - Fire interact event when turning on a pressure plate
|
||||||
org.bukkit.World bworld = world.getWorld();
|
org.bukkit.World bworld = world.getWorld();
|
||||||
org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager();
|
org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager();
|
||||||
org.bukkit.event.Cancellable cancellable;
|
org.bukkit.event.Cancellable cancellable;
|
||||||
@ -55,8 +55,9 @@ public class BlockPressurePlateBinary extends BlockPressurePlateAbstract {
|
|||||||
manager.callEvent((EntityInteractEvent) cancellable);
|
manager.callEvent((EntityInteractEvent) cancellable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We only want to block turning the plate on if all events are cancelled
|
||||||
if (cancellable.isCancelled()) {
|
if (cancellable.isCancelled()) {
|
||||||
return 0;
|
continue;
|
||||||
}
|
}
|
||||||
// CraftBukkit end
|
// CraftBukkit end
|
||||||
|
|
||||||
|
@ -147,12 +147,14 @@ public class BlockTripwire extends Block {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// CraftBukkit start
|
// CraftBukkit start - Call interact even when triggering connected tripwire
|
||||||
|
if (flag != flag1 && flag1 && (world.getData(i, j, k) & 4) == 4) {
|
||||||
org.bukkit.World bworld = world.getWorld();
|
org.bukkit.World bworld = world.getWorld();
|
||||||
org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager();
|
org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager();
|
||||||
|
org.bukkit.block.Block block = bworld.getBlockAt(i, j, k);
|
||||||
|
boolean allowed = false;
|
||||||
|
|
||||||
if (flag != flag1) {
|
// If all of the events are cancelled block the tripwire trigger, else allow
|
||||||
if (flag1) {
|
|
||||||
for (Object object : list) {
|
for (Object object : list) {
|
||||||
if (object != null) {
|
if (object != null) {
|
||||||
org.bukkit.event.Cancellable cancellable;
|
org.bukkit.event.Cancellable cancellable;
|
||||||
@ -160,19 +162,23 @@ public class BlockTripwire extends Block {
|
|||||||
if (object instanceof EntityHuman) {
|
if (object instanceof EntityHuman) {
|
||||||
cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) object, org.bukkit.event.block.Action.PHYSICAL, i, j, k, -1, null);
|
cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) object, org.bukkit.event.block.Action.PHYSICAL, i, j, k, -1, null);
|
||||||
} else if (object instanceof Entity) {
|
} else if (object instanceof Entity) {
|
||||||
cancellable = new EntityInteractEvent(((Entity) object).getBukkitEntity(), bworld.getBlockAt(i, j, k));
|
cancellable = new EntityInteractEvent(((Entity) object).getBukkitEntity(), block);
|
||||||
manager.callEvent((EntityInteractEvent) cancellable);
|
manager.callEvent((EntityInteractEvent) cancellable);
|
||||||
} else {
|
} else {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cancellable.isCancelled()) {
|
if (!cancellable.isCancelled()) {
|
||||||
|
allowed = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!allowed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// CraftBukkit end
|
// CraftBukkit end
|
||||||
|
|
||||||
if (flag1 && !flag) {
|
if (flag1 && !flag) {
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren