|
9 | 9 | protected BlockPos pos; |
10 | 10 |
|
11 | 11 | protected BlockAttachedEntity(final EntityType<? extends BlockAttachedEntity> type, final Level level) { |
12 | | -@@ -42,11 +_,27 @@ |
| 12 | +@@ -42,11 +_,32 @@ |
13 | 13 | public void tick() { |
14 | 14 | if (this.level() instanceof ServerLevel level) { |
15 | 15 | this.checkBelowWorld(); |
|
20 | 20 | if (!this.isRemoved() && !this.survives()) { |
21 | 21 | - this.discard(); |
22 | 22 | + // CraftBukkit start - fire break events |
23 | | -+ final org.bukkit.event.hanging.HangingBreakEvent.RemoveCause cause; |
24 | | -+ if (!this.level().getBlockState(this.blockPosition()).isAir()) { |
25 | | -+ // TODO: This feels insufficient to catch 100% of suffocation cases |
26 | | -+ cause = org.bukkit.event.hanging.HangingBreakEvent.RemoveCause.OBSTRUCTION; |
| 23 | ++ boolean cancelled; |
| 24 | ++ final io.papermc.paper.event.entity.EntityBreakEvent.RemoveCause cause; |
| 25 | ++ if (!this.level().getBlockState(this.blockPosition()).isSuffocating(this.level(), this.blockPosition())) { |
| 26 | ++ cause = io.papermc.paper.event.entity.EntityBreakEvent.RemoveCause.OBSTRUCTION; |
27 | 27 | + } else { |
28 | | -+ cause = org.bukkit.event.hanging.HangingBreakEvent.RemoveCause.PHYSICS; |
| 28 | ++ cause = io.papermc.paper.event.entity.EntityBreakEvent.RemoveCause.PHYSICS; |
29 | 29 | + } |
30 | 30 | + |
31 | | -+ org.bukkit.event.hanging.HangingBreakEvent event = new org.bukkit.event.hanging.HangingBreakEvent((org.bukkit.entity.Hanging) this.getBukkitEntity(), cause); |
32 | | -+ this.level().getCraftServer().getPluginManager().callEvent(event); |
| 31 | ++ final io.papermc.paper.event.entity.EntityBreakEvent event = new io.papermc.paper.event.entity.EntityBreakEvent(this.getBukkitEntity(), cause); |
| 32 | ++ cancelled = !event.callEvent(); |
| 33 | ++ if (this.getBukkitEntity() instanceof org.bukkit.entity.Hanging hanging) { |
| 34 | ++ final org.bukkit.event.hanging.HangingBreakEvent bukkitEvent = new org.bukkit.event.hanging.HangingBreakEvent(hanging, org.bukkit.event.hanging.HangingBreakEvent.RemoveCause.valueOf(cause.toString())); |
| 35 | ++ bukkitEvent.setCancelled(cancelled); |
| 36 | ++ cancelled = !bukkitEvent.callEvent(); |
| 37 | ++ } |
33 | 38 | + |
34 | | -+ if (this.isRemoved() || event.isCancelled()) { |
| 39 | ++ if (this.isRemoved() || cancelled) { |
35 | 40 | + return; |
36 | 41 | + } |
37 | 42 | + // CraftBukkit end |
38 | 43 | + this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DROP); // CraftBukkit - add Bukkit remove cause |
39 | 44 | this.dropItem(level, null); |
40 | 45 | } |
41 | 46 | } |
42 | | -@@ -99,6 +_,21 @@ |
| 47 | +@@ -99,6 +_,33 @@ |
43 | 48 | } |
44 | 49 |
|
45 | 50 | if (!this.isRemoved()) { |
46 | 51 | + // CraftBukkit start - fire break events |
47 | | -+ Entity damager = source.getDirectEntity(); |
48 | | -+ final org.bukkit.event.hanging.HangingBreakEvent event; |
| 52 | ++ boolean cancelled; |
| 53 | ++ final Entity damager = source.getDirectEntity(); |
| 54 | ++ final org.bukkit.damage.DamageSource craftDamageSource = new org.bukkit.craftbukkit.damage.CraftDamageSource(source); |
| 55 | ++ final io.papermc.paper.event.entity.EntityBreakEvent event; |
49 | 56 | + if (damager != null) { |
50 | | -+ event = new org.bukkit.event.hanging.HangingBreakByEntityEvent((org.bukkit.entity.Hanging) this.getBukkitEntity(), damager.getBukkitEntity(), new org.bukkit.craftbukkit.damage.CraftDamageSource(source), source.is(net.minecraft.tags.DamageTypeTags.IS_EXPLOSION) ? org.bukkit.event.hanging.HangingBreakEvent.RemoveCause.EXPLOSION : org.bukkit.event.hanging.HangingBreakEvent.RemoveCause.ENTITY); |
| 57 | ++ event = new io.papermc.paper.event.entity.EntityBreakByEntityEvent(this.getBukkitEntity(), damager.getBukkitEntity(), craftDamageSource, source.is(net.minecraft.tags.DamageTypeTags.IS_EXPLOSION) ? io.papermc.paper.event.entity.EntityBreakEvent.RemoveCause.EXPLOSION : io.papermc.paper.event.entity.EntityBreakEvent.RemoveCause.ENTITY); |
51 | 58 | + } else { |
52 | | -+ event = new org.bukkit.event.hanging.HangingBreakEvent((org.bukkit.entity.Hanging) this.getBukkitEntity(), source.is(net.minecraft.tags.DamageTypeTags.IS_EXPLOSION) ? org.bukkit.event.hanging.HangingBreakEvent.RemoveCause.EXPLOSION : org.bukkit.event.hanging.HangingBreakEvent.RemoveCause.DEFAULT); |
| 59 | ++ event = new io.papermc.paper.event.entity.EntityBreakEvent(this.getBukkitEntity(), source.is(net.minecraft.tags.DamageTypeTags.IS_EXPLOSION) ? io.papermc.paper.event.entity.EntityBreakEvent.RemoveCause.EXPLOSION : io.papermc.paper.event.entity.EntityBreakEvent.RemoveCause.DEFAULT); |
53 | 60 | + } |
| 61 | ++ cancelled = !event.callEvent(); |
54 | 62 | + |
55 | | -+ event.callEvent(); |
| 63 | ++ if (this.getBukkitEntity() instanceof org.bukkit.entity.Hanging hanging) { |
| 64 | ++ final org.bukkit.event.hanging.HangingBreakEvent bukkitEvent; |
| 65 | ++ if (damager != null) { |
| 66 | ++ bukkitEvent = new org.bukkit.event.hanging.HangingBreakByEntityEvent(hanging, damager.getBukkitEntity(), craftDamageSource, org.bukkit.event.hanging.HangingBreakEvent.RemoveCause.valueOf(event.getCause().toString())); |
| 67 | ++ } else { |
| 68 | ++ bukkitEvent = new org.bukkit.event.hanging.HangingBreakEvent(hanging, org.bukkit.event.hanging.HangingBreakEvent.RemoveCause.valueOf(event.getCause().toString())); |
| 69 | ++ } |
| 70 | ++ bukkitEvent.setCancelled(cancelled); |
| 71 | ++ cancelled = !bukkitEvent.callEvent(); |
| 72 | ++ } |
56 | 73 | + |
57 | | -+ if (this.isRemoved() || event.isCancelled()) { |
| 74 | ++ if (this.isRemoved() || cancelled) { |
58 | 75 | + return true; |
59 | 76 | + } |
60 | 77 | + // CraftBukkit end |
|
0 commit comments