From 82f0b54aba4844ca7d591553f995aaa009e1c66e Mon Sep 17 00:00:00 2001 From: Tofaa <82680183+Tofaa2@users.noreply.github.com> Date: Sat, 17 Feb 2024 14:24:43 +0400 Subject: [PATCH] finish spigot cloning --- .../tofaa/entitylib/event/EventListener.java | 2 +- .../event/types/UserRefreshEntityEvent.java | 36 +++++++++++++++++++ .../me/tofaa/entitylib/meta/EntityMeta.java | 14 +++----- .../me/tofaa/entitylib/meta/Metadata.java | 5 --- .../common/AbstractEntityLibAPI.java | 7 +--- .../entitylib/spigot/ExtraConversionUtil.java | 16 +++++++++ .../tofaa/entitylib/spigot/SpigotWorld.java | 27 ++++++++++++-- 7 files changed, 83 insertions(+), 24 deletions(-) create mode 100644 api/src/main/java/me/tofaa/entitylib/event/types/UserRefreshEntityEvent.java diff --git a/api/src/main/java/me/tofaa/entitylib/event/EventListener.java b/api/src/main/java/me/tofaa/entitylib/event/EventListener.java index 8cf6c01..f58dddc 100644 --- a/api/src/main/java/me/tofaa/entitylib/event/EventListener.java +++ b/api/src/main/java/me/tofaa/entitylib/event/EventListener.java @@ -10,7 +10,7 @@ public interface EventListener { void handle(@NotNull E event); - public static EventListener generateListener(Class eventClass, Consumer consumer) { + static EventListener generateListener(Class eventClass, Consumer consumer) { return new EventListener() { @Override public @NotNull Class getEventClass() { diff --git a/api/src/main/java/me/tofaa/entitylib/event/types/UserRefreshEntityEvent.java b/api/src/main/java/me/tofaa/entitylib/event/types/UserRefreshEntityEvent.java new file mode 100644 index 0000000..9276cf2 --- /dev/null +++ b/api/src/main/java/me/tofaa/entitylib/event/types/UserRefreshEntityEvent.java @@ -0,0 +1,36 @@ +package me.tofaa.entitylib.event.types; + +import com.github.retrooper.packetevents.protocol.player.User; +import me.tofaa.entitylib.event.EntityLibEvent; +import me.tofaa.entitylib.wrapper.WrapperEntity; + +public class UserRefreshEntityEvent implements EntityLibEvent { + + private final User user; + private final WrapperEntity entity; + private boolean cancelled; + + public UserRefreshEntityEvent(User user, WrapperEntity entity) { + this.user = user; + this.entity = entity; + } + + public User getUser() { + return user; + } + + + public WrapperEntity getEntity() { + return entity; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancelled) { + this.cancelled = cancelled; + } +} 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 0957521..145cc8b 100644 --- a/api/src/main/java/me/tofaa/entitylib/meta/EntityMeta.java +++ b/api/src/main/java/me/tofaa/entitylib/meta/EntityMeta.java @@ -190,12 +190,6 @@ public class EntityMeta implements EntityMetadataProvider { return metadata.createPacket(); } - protected static void isVersionOlder(ServerVersion version) { - if (!EntityLib.getApi().getPacketEvents().getServerManager().getVersion().is(VersionComparison.OLDER_THAN, version)) { - throw new InvalidVersionException("This method is only available for versions older than " + version.name() + "."); - } - } - protected static void isVersionNewer(ServerVersion version) { 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() + "."); @@ -220,19 +214,19 @@ public class EntityMeta implements EntityMetadataProvider { return (byte) (value + amount); } - protected byte getMask(byte index) { + public byte getMask(byte index) { return this.metadata.getIndex(index, (byte) 0); } - protected void setMask(byte index, byte mask) { + public void setMask(byte index, byte mask) { this.metadata.setIndex(index, EntityDataTypes.BYTE, mask); } - protected boolean getMaskBit(byte index, byte bit) { + public boolean getMaskBit(byte index, byte bit) { return (getMask(index) & bit) == bit; } - protected void setMaskBit(int index, byte bit, boolean value) { + public void setMaskBit(int index, byte bit, boolean value) { byte mask = getMask((byte)index); boolean currentValue = (mask & bit) == bit; if (currentValue == value) { diff --git a/api/src/main/java/me/tofaa/entitylib/meta/Metadata.java b/api/src/main/java/me/tofaa/entitylib/meta/Metadata.java index 971e2c8..5d27853 100644 --- a/api/src/main/java/me/tofaa/entitylib/meta/Metadata.java +++ b/api/src/main/java/me/tofaa/entitylib/meta/Metadata.java @@ -7,12 +7,7 @@ import me.tofaa.entitylib.EntityLib; import me.tofaa.entitylib.wrapper.WrapperEntity; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.VarHandle; import java.util.*; -import java.util.concurrent.ConcurrentHashMap; @SuppressWarnings("unchecked") public class Metadata { 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 0f20a0e..aca7871 100644 --- a/common/src/main/java/me/tofaa/entitylib/common/AbstractEntityLibAPI.java +++ b/common/src/main/java/me/tofaa/entitylib/common/AbstractEntityLibAPI.java @@ -1,9 +1,7 @@ package me.tofaa.entitylib.common; -import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.PacketEventsAPI; import me.tofaa.entitylib.APIConfig; -import me.tofaa.entitylib.EntityLib; import me.tofaa.entitylib.EntityLibAPI; import me.tofaa.entitylib.Platform; import me.tofaa.entitylib.tick.TickContainer; @@ -11,10 +9,7 @@ import me.tofaa.entitylib.wrapper.WrapperEntity; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.Map; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; public abstract class AbstractEntityLibAPI implements EntityLibAPI { diff --git a/platforms/spigot/src/main/java/me/tofaa/entitylib/spigot/ExtraConversionUtil.java b/platforms/spigot/src/main/java/me/tofaa/entitylib/spigot/ExtraConversionUtil.java index 75e554d..6f9eaf9 100644 --- a/platforms/spigot/src/main/java/me/tofaa/entitylib/spigot/ExtraConversionUtil.java +++ b/platforms/spigot/src/main/java/me/tofaa/entitylib/spigot/ExtraConversionUtil.java @@ -2,8 +2,17 @@ package me.tofaa.entitylib.spigot; import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose; import com.github.retrooper.packetevents.protocol.player.HumanoidArm; +import com.github.retrooper.packetevents.protocol.player.TextureProperty; +import com.github.retrooper.packetevents.protocol.player.UserProfile; +import org.bukkit.entity.Player; import org.bukkit.entity.Pose; import org.bukkit.inventory.MainHand; +import org.bukkit.profile.PlayerProfile; +import org.bukkit.profile.PlayerTextures; + +import java.util.Collections; +import java.util.List; +import java.util.UUID; public final class ExtraConversionUtil { @@ -11,6 +20,13 @@ public final class ExtraConversionUtil { } + public static UserProfile fromBukkitPlayerProfile(PlayerProfile player) { + UUID uuid = player.getUniqueId(); + String name = player.getName(); + // TODO: Textures + return new UserProfile(uuid, name, Collections.emptyList()); + } + public static EntityPose fromBukkitPose(Pose pose) { return EntityPose.values()[pose.ordinal()]; } diff --git a/platforms/spigot/src/main/java/me/tofaa/entitylib/spigot/SpigotWorld.java b/platforms/spigot/src/main/java/me/tofaa/entitylib/spigot/SpigotWorld.java index f01c7b5..2d57f89 100644 --- a/platforms/spigot/src/main/java/me/tofaa/entitylib/spigot/SpigotWorld.java +++ b/platforms/spigot/src/main/java/me/tofaa/entitylib/spigot/SpigotWorld.java @@ -1,14 +1,18 @@ package me.tofaa.entitylib.spigot; +import com.github.retrooper.packetevents.protocol.entity.type.EntityType; import com.github.retrooper.packetevents.protocol.world.Location; import com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState; import io.github.retrooper.packetevents.util.SpigotConversionUtil; +import me.tofaa.entitylib.EntityLib; import me.tofaa.entitylib.common.AbstractWorldWrapper; import me.tofaa.entitylib.meta.EntityMeta; import me.tofaa.entitylib.meta.types.LivingEntityMeta; import me.tofaa.entitylib.meta.types.PlayerMeta; import me.tofaa.entitylib.utils.Check; import me.tofaa.entitylib.wrapper.WrapperEntity; +import me.tofaa.entitylib.wrapper.WrapperLivingEntity; +import me.tofaa.entitylib.wrapper.WrapperPlayer; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.World; @@ -17,6 +21,8 @@ import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import java.util.UUID; + public class SpigotWorld extends AbstractWorldWrapper { @@ -29,7 +35,8 @@ public class SpigotWorld extends AbstractWorldWrapper { public @NotNull T cloneEntity(@NotNull Object platformEntity, @NotNull Location location) { Check.stateCondition(!(platformEntity instanceof Entity), "Entity must be a Bukkit entity"); Entity e = (Entity) platformEntity; - EntityMeta meta = EntityMeta.createMeta(e.getEntityId(), SpigotConversionUtil.fromBukkitEntityType(e.getType())); + EntityType type = SpigotConversionUtil.fromBukkitEntityType(e.getType()); + EntityMeta meta = EntityMeta.createMeta(e.getEntityId(), type); meta.setHasNoGravity(!e.hasGravity()); meta.setCustomNameVisible(e.isCustomNameVisible()); meta.setCustomName(LegacyComponentSerializer.legacyAmpersand().deserialize(e.getCustomName())); @@ -51,7 +58,23 @@ public class SpigotWorld extends AbstractWorldWrapper { pm.setSwimming(p.isSwimming()); pm.setActiveHand(ExtraConversionUtil.fromBukkitHand(p.getMainHand())); } - return null; // TODO; + WrapperEntity entity; + int id = EntityLib.getPlatform().getEntityIdProvider().provide(e.getUniqueId(), type); + UUID uuid = e.getUniqueId(); + if (meta instanceof PlayerMeta) { + Player p = (Player) e; + entity = new WrapperPlayer(ExtraConversionUtil.fromBukkitPlayerProfile(p.getPlayerProfile()), id); + } + else if (meta instanceof LivingEntityMeta) { + entity = new WrapperLivingEntity(id, uuid, type, meta); + } + else { + entity = new WrapperEntity(id, uuid, type, meta); + } + if (entity == null) { + throw new IllegalArgumentException("Could not clone entity"); + } + return (T) this.spawnEntity(entity, location); } @Override