Skip to content

Commit 6587c42

Browse files
committed
Improved Bukkit integration
Add event for block place
1 parent c4f7764 commit 6587c42

3 files changed

Lines changed: 375 additions & 6 deletions

File tree

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
# Project
22
group=com.gamerforea
3-
version=1.12.2-2.8.1
3+
version=1.12.2-2.8.2

src/main/java/com/gamerforea/eventhelper/integration/bukkit/BukkitIntegration.java

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@
88
import net.minecraft.util.EnumHand;
99
import net.minecraft.util.math.BlockPos;
1010
import org.bukkit.Bukkit;
11+
import org.bukkit.Material;
1112
import org.bukkit.block.Block;
1213
import org.bukkit.entity.Player;
1314
import org.bukkit.event.block.Action;
1415
import org.bukkit.event.block.BlockBreakEvent;
16+
import org.bukkit.event.block.BlockPlaceEvent;
1517
import org.bukkit.event.entity.EntityDamageByEntityEvent;
1618
import org.bukkit.event.entity.EntityDamageEvent;
1719
import org.bukkit.event.player.PlayerInteractEvent;
@@ -21,6 +23,7 @@
2123

2224
import javax.annotation.Nonnull;
2325
import javax.annotation.Nullable;
26+
import java.util.Objects;
2427
import java.util.UUID;
2528

2629
import 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, Material.getMaterial(net.minecraft.block.Block.getIdFromBlock(newBlock)), (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

Comments
 (0)