diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/packets/PacketInterface.java b/common/src/main/java/me/lojosho/hibiscuscommons/packets/PacketInterface.java index 9326299..7fd0b1b 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/packets/PacketInterface.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/packets/PacketInterface.java @@ -37,6 +37,11 @@ public interface PacketInterface { // Override } + default PacketAction readPlayerScale(@NotNull Player player, @NotNull PlayerScaleWrapper wrapper) { + return PacketAction.NOTHING; + // Override + } + default PacketAction readEntityHandle(@NotNull Player player, @NotNull PlayerInteractWrapper wrapper) { return PacketAction.NOTHING; // Override diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/PlayerScaleWrapper.java b/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/PlayerScaleWrapper.java new file mode 100644 index 0000000..de19514 --- /dev/null +++ b/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/PlayerScaleWrapper.java @@ -0,0 +1,13 @@ +package me.lojosho.hibiscuscommons.packets.wrapper; + +import lombok.Getter; + +public class PlayerScaleWrapper { + + @Getter + private final double scale; + + public PlayerScaleWrapper(double scale) { + this.scale = scale; + } +} diff --git a/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPacketChannel.java b/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPacketChannel.java index a675980..26ef5ab 100644 --- a/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPacketChannel.java +++ b/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPacketChannel.java @@ -12,6 +12,7 @@ import me.lojosho.hibiscuscommons.plugins.SubPlugins; import me.lojosho.hibiscuscommons.util.MessagesUtil; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.*; +import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.inventory.ClickType; import net.minecraft.world.item.ItemStack; import org.bukkit.craftbukkit.CraftEquipmentSlot; @@ -45,6 +46,7 @@ public class NMSPacketChannel extends ChannelDuplexHandler { case ClientboundContainerSetSlotPacket setSlotPacket -> msg = handleSlotChange(setSlotPacket); case ClientboundSetEquipmentPacket equipmentPacket -> msg = handlePlayerEquipment(equipmentPacket); case ClientboundSetPassengersPacket passengerPacket -> msg = handlePassengerSet(passengerPacket); + case ClientboundUpdateAttributesPacket attributesPacket -> msg = handleScaleChange(attributesPacket); default -> {} } @@ -168,6 +170,30 @@ public class NMSPacketChannel extends ChannelDuplexHandler { return (Packet) NMSHandlers.getHandler().getPacketHandler().createMountPacket(ownerId, passengers.stream().mapToInt(Integer::intValue).toArray()); } + private Packet handleScaleChange(@NotNull ClientboundUpdateAttributesPacket packet) { + final List nmsAttributes = packet.getValues(); + final ClientboundUpdateAttributesPacket.AttributeSnapshot nmsScaleAttribute = nmsAttributes.stream() + .filter(attribute -> attribute.attribute().equals(Attributes.SCALE)) + .findFirst() + .orElse(null); + + if (nmsScaleAttribute == null) { + return packet; + } + + AtomicReference action = new AtomicReference<>(PacketAction.NOTHING); + PlayerScaleWrapper wrapper = new PlayerScaleWrapper(nmsScaleAttribute.base()); + + SubPlugins.getSubPlugins().forEach(plugin -> { + PacketAction pluginAction = plugin.getPacketInterface().readPlayerScale(player, wrapper); + if (pluginAction != PacketAction.NOTHING) action.set(pluginAction); + }); + + if (action.get() == PacketAction.CANCELLED) return null; + if (action.get() == PacketAction.NOTHING) return packet; + return packet; + } + @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { if (!(msg instanceof Packet packet)) {