From d7eda34611c2854aaac7863caac48b302c06437b Mon Sep 17 00:00:00 2001 From: Felipe Paschoal Bergamo <64669985+felipepasc@users.noreply.github.com> Date: Thu, 3 Apr 2025 00:02:49 -0300 Subject: [PATCH] feat: enhance EntityLib with packet dispatcher and server version check --- .../java/me/tofaa/entitylib/APIConfig.java | 9 +++++ .../java/me/tofaa/entitylib/EntityLibAPI.java | 8 +++-- .../me/tofaa/entitylib/meta/EntityMeta.java | 36 ++++++++++--------- .../entitylib/wrapper/WrapperEntity.java | 13 ++----- .../common/AbstractEntityLibAPI.java | 34 ++++++++++++++---- 5 files changed, 63 insertions(+), 37 deletions(-) diff --git a/api/src/main/java/me/tofaa/entitylib/APIConfig.java b/api/src/main/java/me/tofaa/entitylib/APIConfig.java index 3cba7e7..5f59c05 100644 --- a/api/src/main/java/me/tofaa/entitylib/APIConfig.java +++ b/api/src/main/java/me/tofaa/entitylib/APIConfig.java @@ -13,6 +13,7 @@ public final class APIConfig { private boolean platformLogger = false; private boolean bstats = true; private boolean forceBundle = false; + private boolean ignoreServerVersionVerify = false; public APIConfig(PacketEventsAPI packetEvents) { this.packetEvents = packetEvents; @@ -53,6 +54,11 @@ public final class APIConfig { return this; } + public @NotNull APIConfig ignoreServerVersionVerify() { + this.ignoreServerVersionVerify = true; + return this; + } + public boolean isDebugMode() { return debugMode; } @@ -83,4 +89,7 @@ public final class APIConfig { && EntityLib.getOptionalApi().get().getPacketEvents().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_19_4); } + public boolean shouldIgnoreServerVersionVerify() { + return ignoreServerVersionVerify; + } } diff --git a/api/src/main/java/me/tofaa/entitylib/EntityLibAPI.java b/api/src/main/java/me/tofaa/entitylib/EntityLibAPI.java index 663c368..4c3c66e 100644 --- a/api/src/main/java/me/tofaa/entitylib/EntityLibAPI.java +++ b/api/src/main/java/me/tofaa/entitylib/EntityLibAPI.java @@ -4,6 +4,7 @@ import com.github.retrooper.packetevents.PacketEventsAPI; import com.github.retrooper.packetevents.protocol.entity.type.EntityType; import com.github.retrooper.packetevents.protocol.player.UserProfile; import com.github.retrooper.packetevents.protocol.world.Location; +import com.github.retrooper.packetevents.wrapper.PacketWrapper; import me.tofaa.entitylib.container.EntityContainer; import me.tofaa.entitylib.tick.TickContainer; import me.tofaa.entitylib.wrapper.WrapperEntity; @@ -14,6 +15,8 @@ import org.jetbrains.annotations.Nullable; import java.util.Collection; import java.util.UUID; +import java.util.function.BiConsumer; +import java.util.function.Consumer; /** * Represents the API for EntityLib. @@ -55,7 +58,8 @@ public interface EntityLibAPI { */ void addTickContainer(@NotNull TickContainer tickContainer); - @NotNull - EntityContainer getDefaultContainer(); + @NotNull BiConsumer> getPacketDispatcher(); + + @NotNull EntityContainer getDefaultContainer(); } diff --git a/api/src/main/java/me/tofaa/entitylib/meta/EntityMeta.java b/api/src/main/java/me/tofaa/entitylib/meta/EntityMeta.java index ba03d99..d6907af 100644 --- a/api/src/main/java/me/tofaa/entitylib/meta/EntityMeta.java +++ b/api/src/main/java/me/tofaa/entitylib/meta/EntityMeta.java @@ -140,60 +140,60 @@ public class EntityMeta implements EntityMetadataProvider { } public short getAirTicks() { - return this.metadata.getIndex((byte)1, (short) 300); + return this.metadata.getIndex((byte) 1, (short) 300); } public void setAirTicks(short value) { - this.metadata.setIndex((byte)1, EntityDataTypes.SHORT, value); + this.metadata.setIndex((byte) 1, EntityDataTypes.SHORT, value); } public Component getCustomName() { - Optional component = this.metadata.getIndex((byte)2, Optional.empty()); + Optional component = this.metadata.getIndex((byte) 2, Optional.empty()); return component.orElse(null); } public void setCustomName(Component value) { - this.metadata.setIndex((byte)2, EntityDataTypes.OPTIONAL_ADV_COMPONENT, Optional.ofNullable(value)); + this.metadata.setIndex((byte) 2, EntityDataTypes.OPTIONAL_ADV_COMPONENT, Optional.ofNullable(value)); } public boolean isCustomNameVisible() { - return this.metadata.getIndex((byte)3, false); + return this.metadata.getIndex((byte) 3, false); } public void setCustomNameVisible(boolean value) { - this.metadata.setIndex((byte)3, EntityDataTypes.BOOLEAN, value); + this.metadata.setIndex((byte) 3, EntityDataTypes.BOOLEAN, value); } public boolean isSilent() { - return this.metadata.getIndex((byte)4, false); + return this.metadata.getIndex((byte) 4, false); } public void setSilent(boolean value) { - this.metadata.setIndex((byte)4, EntityDataTypes.BOOLEAN, value); + this.metadata.setIndex((byte) 4, EntityDataTypes.BOOLEAN, value); } public boolean hasNoGravity() { - return this.metadata.getIndex((byte)5, true); + return this.metadata.getIndex((byte) 5, true); } public void setHasNoGravity(boolean value) { - this.metadata.setIndex((byte)5, EntityDataTypes.BOOLEAN, value); + this.metadata.setIndex((byte) 5, EntityDataTypes.BOOLEAN, value); } public EntityPose getPose() { - return this.metadata.getIndex((byte)6, EntityPose.STANDING); + return this.metadata.getIndex((byte) 6, EntityPose.STANDING); } public void setPose(EntityPose value) { - this.metadata.setIndex((byte)6, EntityDataTypes.ENTITY_POSE, value); + this.metadata.setIndex((byte) 6, EntityDataTypes.ENTITY_POSE, value); } public int getTicksFrozenInPowderedSnow() { - return this.metadata.getIndex((byte)7, 0); + return this.metadata.getIndex((byte) 7, 0); } public void setTicksFrozenInPowderedSnow(int value) { - this.metadata.setIndex((byte)7, EntityDataTypes.INT, value); + this.metadata.setIndex((byte) 7, EntityDataTypes.INT, value); } public WrapperPlayServerEntityMetadata createPacket() { @@ -201,6 +201,7 @@ public class EntityMeta implements EntityMetadataProvider { } protected static void isVersionNewer(ServerVersion version) { + if (EntityLib.getApi().getSettings().shouldIgnoreServerVersionVerify()) return; if (EntityLib.getOptionalApi().isPresent()) { if (!EntityLib.getApi().getPacketEvents().getServerManager().getVersion().is(VersionComparison.NEWER_THAN, version)) { throw new InvalidVersionException("This method is only available for versions newer than " + version.name() + "."); @@ -228,7 +229,8 @@ public class EntityMeta implements EntityMetadataProvider { /** * Annoying java 8 not letting me do OFFSET + amount in the method call so this is a workaround - * @param value the value to offset + * + * @param value the value to offset * @param amount the amount to offset by * @return the offset value */ @@ -257,7 +259,7 @@ public class EntityMeta implements EntityMetadataProvider { } public void setMaskBit(int index, byte bit, boolean value) { - byte mask = getMask((byte)index); + byte mask = getMask((byte) index); boolean currentValue = (mask & bit) == bit; if (currentValue == value) { return; @@ -267,7 +269,7 @@ public class EntityMeta implements EntityMetadataProvider { } else { mask &= (byte) ~bit; } - setMask((byte)index, mask); + setMask((byte) index, mask); } @Override diff --git a/api/src/main/java/me/tofaa/entitylib/wrapper/WrapperEntity.java b/api/src/main/java/me/tofaa/entitylib/wrapper/WrapperEntity.java index eb65d0c..4206a79 100644 --- a/api/src/main/java/me/tofaa/entitylib/wrapper/WrapperEntity.java +++ b/api/src/main/java/me/tofaa/entitylib/wrapper/WrapperEntity.java @@ -509,18 +509,9 @@ public class WrapperEntity implements Tickable { } private static void sendPacket(UUID user, PacketWrapper wrapper) { - if (wrapper == null) return; - - Object channel = EntityLib.getApi().getPacketEvents().getProtocolManager().getChannel(user); - if (channel == null) { - if (EntityLib.getApi().getSettings().isDebugMode()) { - EntityLib.getPlatform().getLogger().warning("Failed to send packet to " + user + " because the channel was null. They may be disconnected/not online."); - } - - return; + if (wrapper != null) { + EntityLib.getApi().getPacketDispatcher().accept(user, wrapper); } - - EntityLib.getApi().getPacketEvents().getProtocolManager().sendPacket(channel, wrapper); } public boolean hasNoGravity() { diff --git a/common/src/main/java/me/tofaa/entitylib/common/AbstractEntityLibAPI.java b/common/src/main/java/me/tofaa/entitylib/common/AbstractEntityLibAPI.java index 5bb4f54..ba98c95 100644 --- a/common/src/main/java/me/tofaa/entitylib/common/AbstractEntityLibAPI.java +++ b/common/src/main/java/me/tofaa/entitylib/common/AbstractEntityLibAPI.java @@ -1,7 +1,9 @@ package me.tofaa.entitylib.common; import com.github.retrooper.packetevents.PacketEventsAPI; +import com.github.retrooper.packetevents.wrapper.PacketWrapper; import me.tofaa.entitylib.APIConfig; +import me.tofaa.entitylib.EntityLib; import me.tofaa.entitylib.EntityLibAPI; import me.tofaa.entitylib.Platform; import me.tofaa.entitylib.container.EntityContainer; @@ -10,22 +12,38 @@ import me.tofaa.entitylib.wrapper.WrapperEntity; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.UUID; +import java.util.function.BiConsumer; public abstract class AbstractEntityLibAPI implements EntityLibAPI { - protected final Platform

platform; protected final PacketEventsAPI packetEvents; protected final APIConfig settings; protected final Collection> tickContainers; protected final EntityContainer defaultEntityContainer = EntityContainer.basic(); + protected final BiConsumer> packetDispatcher; protected AbstractEntityLibAPI(Platform

platform, APIConfig settings) { this.platform = platform; this.packetEvents = settings.getPacketEvents(); this.settings = settings; this.tickContainers = settings.shouldTickTickables() ? new HashSet<>() : Collections.emptyList(); + this.packetDispatcher = (user, wrapper) -> { + Object channel = EntityLib.getApi().getPacketEvents().getProtocolManager().getChannel(user); + if (channel == null) { + if (EntityLib.getApi().getSettings().isDebugMode()) { + EntityLib.getPlatform().getLogger().warning("Failed to send packet to " + user + " because the channel was null. They may be disconnected/not online."); + } + + return; + } + + EntityLib.getApi().getPacketEvents().getProtocolManager().sendPacket(channel, wrapper); + }; } @Override @@ -36,7 +54,6 @@ public abstract class AbstractEntityLibAPI implements EntityLibAPI { @Override public @Nullable WrapperEntity getEntity(@NotNull UUID uuid) { return defaultEntityContainer.getEntity(uuid); - } @Override @@ -49,9 +66,8 @@ public abstract class AbstractEntityLibAPI implements EntityLibAPI { return defaultEntityContainer; } - @NotNull @Override - public APIConfig getSettings() { + public @NotNull APIConfig getSettings() { return settings; } @@ -60,9 +76,13 @@ public abstract class AbstractEntityLibAPI implements EntityLibAPI { return packetEvents; } - @NotNull @Override - public Collection> getTickContainers() { + public @NotNull BiConsumer> getPacketDispatcher() { + return packetDispatcher; + } + + @Override + public @NotNull Collection> getTickContainers() { return tickContainers; } }