99import net .minecraft .util .math .BlockPos ;
1010import org .bukkit .Bukkit ;
1111import org .bukkit .block .Block ;
12+ import org .bukkit .block .BlockFace ;
1213import org .bukkit .entity .Player ;
1314import org .bukkit .event .block .Action ;
1415import org .bukkit .event .block .BlockBreakEvent ;
16+ import org .bukkit .event .block .BlockPlaceEvent ;
1517import org .bukkit .event .entity .EntityDamageByEntityEvent ;
1618import org .bukkit .event .entity .EntityDamageEvent ;
1719import org .bukkit .event .player .PlayerInteractEvent ;
2123
2224import javax .annotation .Nonnull ;
2325import javax .annotation .Nullable ;
26+ import java .util .Objects ;
2427import java .util .UUID ;
2528
2629import static com .gamerforea .eventhelper .integration .bukkit .BukkitUtils .*;
@@ -73,7 +76,7 @@ private BukkitIntegration0()
7376 @ Override
7477 public boolean cantBreak (@ Nonnull EntityPlayer player , @ Nonnull BlockPos pos )
7578 {
76- Player bukkitPlayer = getPlayer (player );
79+ Player bukkitPlayer = getPlayer (Objects . requireNonNull ( player , "player" ) );
7780 Block block = bukkitPlayer .getWorld ().getBlockAt (pos .getX (), pos .getY (), pos .getZ ());
7881 BlockBreakEvent event = new BlockBreakEvent (block , bukkitPlayer );
7982 Bukkit .getPluginManager ().callEvent (event );
@@ -83,15 +86,40 @@ public boolean cantBreak(@Nonnull EntityPlayer player, @Nonnull BlockPos pos)
8386 @ Override
8487 public boolean cantPlace (@ Nonnull EntityPlayer player , @ Nonnull BlockPos pos , @ Nonnull IBlockState blockState )
8588 {
86- // TODO Make correct implementation
87- return this .cantBreak (player , pos );
89+ Player bukkitPlayer = getPlayer (Objects .requireNonNull (player , "player" ));
90+ Block bukkitBlock = bukkitPlayer .getWorld ().getBlockAt (pos .getX (), pos .getY (), pos .getZ ());
91+ org .bukkit .inventory .ItemStack item ;
92+ EquipmentSlot equipmentSlot ;
93+
94+ if (player .getActiveHand () == EnumHand .OFF_HAND )
95+ {
96+ item = bukkitPlayer .getInventory ().getItemInOffHand ();
97+ equipmentSlot = EquipmentSlot .OFF_HAND ;
98+ }
99+ else
100+ {
101+ item = bukkitPlayer .getInventory ().getItemInMainHand ();
102+ equipmentSlot = EquipmentSlot .HAND ;
103+ }
104+
105+ net .minecraft .block .Block newBlock = Objects .requireNonNull (blockState , "blockState" ).getBlock ();
106+ FakeBlock placed = new FakeBlock (bukkitBlock , getMaterial (newBlock .getRegistryName ()), (byte ) newBlock .getMetaFromState (blockState ));
107+
108+ BlockPlaceEvent event = new BlockPlaceEvent (placed , bukkitBlock .getState (), bukkitBlock /*.getRelative(BlockFace.SELF)*/ , item , bukkitPlayer , true , equipmentSlot );
109+ Bukkit .getPluginManager ().callEvent (event );
110+ return event .isCancelled ();
88111 }
89112
90113 @ Override
91114 public boolean cantReplace (@ Nonnull EntityPlayer player , @ Nonnull BlockPos pos , @ Nonnull IBlockState blockState )
92115 {
93- // TODO Make correct implementation
94- return this .cantBreak (player , pos );
116+ // NOTE: Bukkit doesn't have a suitable event, so we use a combination of two events.
117+ if (cantBreak (player , pos ))
118+ return true ;
119+ if (cantPlace (player , pos , blockState ))
120+ return true ;
121+
122+ return false ;
95123 }
96124
97125 @ Override
0 commit comments