Skip to content

Commit e37a4fa

Browse files
author
bridge
committed
fix: villager exploit
1 parent cb4120d commit e37a4fa

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

src/main/java/world/minecraftservers/plugin/ContainerExploitPrevention.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.bukkit.inventory.InventoryHolder;
3838
import org.bukkit.inventory.ItemStack;
3939
import org.bukkit.persistence.PersistentDataContainer;
40+
import org.bukkit.persistence.PersistentDataHolder;
4041
import org.bukkit.persistence.PersistentDataType;
4142
import org.bukkit.plugin.java.JavaPlugin;
4243

@@ -122,12 +123,12 @@ public void onPacketSending(PacketEvent event) {
122123
PacketContainer packet = event.getPacket();
123124
Entity entity = packet.getEntityModifier(event).read(0);
124125

125-
if (entity instanceof Vehicle vehicle) {
126-
PersistentDataContainer pdc = vehicle.getPersistentDataContainer();
126+
if (entity instanceof InventoryHolder) {
127+
PersistentDataContainer pdc = entity.getPersistentDataContainer();
127128
String serializedCustomName = pdc.get(clientSideRenderTitleKey, PersistentDataType.STRING);
128129

129130
if (serializedCustomName != null) {
130-
WrappedDataWatcher dataWatcher = WrappedDataWatcher.getEntityWatcher(vehicle).deepClone();
131+
WrappedDataWatcher dataWatcher = WrappedDataWatcher.getEntityWatcher(entity).deepClone();
131132
WrappedDataWatcher.Serializer chatSerializer = WrappedDataWatcher.Registry.getChatComponentSerializer(true);
132133
final WrappedDataWatcher.WrappedDataWatcherObject optChatFieldWatcher = new WrappedDataWatcher.WrappedDataWatcherObject(2, chatSerializer);
133134

@@ -217,21 +218,22 @@ public void onVehicleDestroy(VehicleDestroyEvent event) {
217218
}
218219
}
219220

220-
// This is mainly for donkeys
221+
// This is mainly for donkeys, villagers etc...
221222
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
222223
public void onVehicleInteract(PlayerInteractEntityEvent event) {
223-
if (event.getRightClicked() instanceof Vehicle vehicle) {
224+
Entity rightClicked = event.getRightClicked();
225+
if (rightClicked instanceof InventoryHolder) {
224226
Player player = event.getPlayer();
225227
ItemStack itemInHand = player.getInventory().getItem(event.getHand());
226228

227229
if (itemInHand.getType() == Material.NAME_TAG) {
228230
// Not happy with how this works, but seems to be the only way :( Create a PR if you have a better idea
229231
Bukkit.getScheduler().runTaskLater(this, () -> {
230-
Component customName = vehicle.customName();
232+
Component customName = rightClicked.customName();
231233

232234
if (customName != null && canUseTitle(customName)) {
233-
vehicle.customName(null);
234-
PersistentDataContainer pdc = vehicle.getPersistentDataContainer();
235+
rightClicked.customName(null);
236+
PersistentDataContainer pdc = rightClicked.getPersistentDataContainer();
235237
pdc.set(clientSideRenderTitleKey, PersistentDataType.STRING, GsonComponentSerializer.gson().serialize(customName));
236238
}
237239
}, 1L);

0 commit comments

Comments
 (0)