Skip to content

Commit f68f93a

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

File tree

4 files changed

+398
-6
lines changed

4 files changed

+398
-6
lines changed

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
@@ -9,9 +9,11 @@
99
import net.minecraft.util.math.BlockPos;
1010
import org.bukkit.Bukkit;
1111
import org.bukkit.block.Block;
12+
import org.bukkit.block.BlockFace;
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, 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

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import net.minecraft.entity.Entity;
44
import net.minecraft.entity.player.EntityPlayer;
55
import net.minecraft.util.EnumFacing;
6+
import net.minecraft.util.ResourceLocation;
67
import org.bukkit.Bukkit;
8+
import org.bukkit.Material;
79
import org.bukkit.block.BlockFace;
810
import org.bukkit.entity.Player;
911

@@ -63,6 +65,27 @@ public static BlockFace getBlockFace(@Nonnull EnumFacing side)
6365
}
6466
}
6567

68+
/**
69+
* Returns matched Bukkit Material for {@link ResourceLocation} identifier.
70+
*/
71+
public static String getMaterialName(ResourceLocation identifier)
72+
{
73+
return Objects.requireNonNull(identifier, "identifier")
74+
.toString()
75+
.toUpperCase()
76+
.replaceAll("(:|\\s)", "_")
77+
.replaceAll("\\W", "");
78+
}
79+
80+
/**
81+
* Returns matched Bukkit Material name for {@link ResourceLocation} identifier.
82+
*/
83+
@Nullable
84+
public static Material getMaterial(ResourceLocation identifier)
85+
{
86+
return Material.getMaterial(getMaterialName(identifier));
87+
}
88+
6689
static
6790
{
6891
craftPackage = Objects.requireNonNull(Bukkit.getServer(), "CraftServer is null")

0 commit comments

Comments
 (0)