diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 2f973f9..400eb52 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,7 +5,16 @@ + + + + + + + + + diff --git a/api/src/main/java/me/tofaa/entitylib/EntityLibAPI.java b/api/src/main/java/me/tofaa/entitylib/EntityLibAPI.java index 623e82d..663c368 100644 --- a/api/src/main/java/me/tofaa/entitylib/EntityLibAPI.java +++ b/api/src/main/java/me/tofaa/entitylib/EntityLibAPI.java @@ -58,9 +58,4 @@ public interface EntityLibAPI { @NotNull EntityContainer getDefaultContainer(); - void addContainer(EntityContainer container); - - void removeContainer(EntityContainer container); - - @NotNull Collection getEntityContainers(); } diff --git a/api/src/main/java/me/tofaa/entitylib/packetconversion/CommonSpawningMethods.java b/api/src/main/java/me/tofaa/entitylib/packetconversion/CommonSpawningMethods.java new file mode 100644 index 0000000..9d299b0 --- /dev/null +++ b/api/src/main/java/me/tofaa/entitylib/packetconversion/CommonSpawningMethods.java @@ -0,0 +1,26 @@ +package me.tofaa.entitylib.packetconversion; + +import com.github.retrooper.packetevents.wrapper.PacketWrapper; +import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSpawnExperienceOrb; +import me.tofaa.entitylib.wrapper.WrapperEntity; +import me.tofaa.entitylib.wrapper.WrapperExperienceOrbEntity; + +final class CommonSpawningMethods { + + static final class ExperienceOrb implements EntitySpawningMethod { + + @Override + public PacketWrapper getSpawnPacket(WrapperEntity entity) { + short experience = entity instanceof WrapperExperienceOrbEntity ? ((WrapperExperienceOrbEntity) entity).getExperience() : 0; + return new WrapperPlayServerSpawnExperienceOrb( + entity.getEntityId(), + entity.getLocation().getX(), + entity.getLocation().getY(), + entity.getLocation().getZ(), + experience + ); + } + } + + +} diff --git a/api/src/main/java/me/tofaa/entitylib/packetconversion/EntitySpawningMethod.java b/api/src/main/java/me/tofaa/entitylib/packetconversion/EntitySpawningMethod.java new file mode 100644 index 0000000..232e03b --- /dev/null +++ b/api/src/main/java/me/tofaa/entitylib/packetconversion/EntitySpawningMethod.java @@ -0,0 +1,13 @@ +package me.tofaa.entitylib.packetconversion; + +import com.github.retrooper.packetevents.wrapper.PacketWrapper; +import me.tofaa.entitylib.wrapper.WrapperEntity; + +public interface EntitySpawningMethod { + + EntitySpawningMethod EXPERIENCE_ORB = new CommonSpawningMethods.ExperienceOrb(); + + + PacketWrapper getSpawnPacket(WrapperEntity entity); + +} diff --git a/api/src/main/java/me/tofaa/entitylib/packetconversion/EntitySpawningPacketConversion.java b/api/src/main/java/me/tofaa/entitylib/packetconversion/EntitySpawningPacketConversion.java new file mode 100644 index 0000000..96586f5 --- /dev/null +++ b/api/src/main/java/me/tofaa/entitylib/packetconversion/EntitySpawningPacketConversion.java @@ -0,0 +1,26 @@ +package me.tofaa.entitylib.packetconversion; + +import com.github.retrooper.packetevents.protocol.entity.type.EntityType; +import com.github.retrooper.packetevents.wrapper.PacketWrapper; +import me.tofaa.entitylib.wrapper.WrapperEntity; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public final class EntitySpawningPacketConversion { + + private static Map methods = new ConcurrentHashMap<>(); + + static { + + } + + public PacketWrapper getSpawnPacket(WrapperEntity entity) { + EntityType type = entity.getEntityType(); + EntitySpawningMethod method = methods.get(type); + return method.getSpawnPacket(entity); + } + + private EntitySpawningPacketConversion() {} + +} diff --git a/api/src/main/java/me/tofaa/entitylib/packetconversion/LegacySpawningMethods.java b/api/src/main/java/me/tofaa/entitylib/packetconversion/LegacySpawningMethods.java new file mode 100644 index 0000000..a2ad2b2 --- /dev/null +++ b/api/src/main/java/me/tofaa/entitylib/packetconversion/LegacySpawningMethods.java @@ -0,0 +1,59 @@ +package me.tofaa.entitylib.packetconversion; + +import com.github.retrooper.packetevents.wrapper.PacketWrapper; +import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSpawnLivingEntity; +import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSpawnPainting; +import me.tofaa.entitylib.meta.other.PaintingMeta; +import me.tofaa.entitylib.wrapper.WrapperEntity; +import me.tofaa.entitylib.wrapper.WrapperLivingEntity; + +final class LegacySpawningMethods { + + private LegacySpawningMethods() {} + + static class Generic implements EntitySpawningMethod { + @Override + public PacketWrapper getSpawnPacket(WrapperEntity entity) { + return null; + } + } + + static class LivingEntity implements EntitySpawningMethod { + + @Override + public PacketWrapper getSpawnPacket(WrapperEntity entity) { + if (!(entity instanceof WrapperLivingEntity)) { + throw new IllegalArgumentException("Entity is not an instance of WrapperLivingEntity"); + } + return new WrapperPlayServerSpawnLivingEntity( + entity.getEntityId(), + entity.getUuid(), + entity.getEntityType(), + entity.getLocation().getPosition(), + entity.getLocation().getYaw(), + entity.getLocation().getPitch(), + entity.getLocation().getPitch(), + entity.createVeloPacket().get(), + entity.getEntityMeta().entityData() + ); + } + } + + static class Painting implements EntitySpawningMethod { + + @Override + public PacketWrapper getSpawnPacket(WrapperEntity entity) { + if (entity.getEntityMeta() instanceof PaintingMeta) { + PaintingMeta paintingMeta = (PaintingMeta) entity.getEntityMeta(); + return new WrapperPlayServerSpawnPainting( + entity.getEntityId(), + entity.getUuid(), + entity.getLocation().getPosition().toVector3i(), + paintingMeta.getDirection() + ); + } + throw new IllegalArgumentException("EntityMeta is not an instance of PaintingMeta"); + } + } + +} diff --git a/api/src/main/java/me/tofaa/entitylib/packetconversion/ModernSpawningMethods.java b/api/src/main/java/me/tofaa/entitylib/packetconversion/ModernSpawningMethods.java new file mode 100644 index 0000000..a42dfa5 --- /dev/null +++ b/api/src/main/java/me/tofaa/entitylib/packetconversion/ModernSpawningMethods.java @@ -0,0 +1,35 @@ +package me.tofaa.entitylib.packetconversion; + +import com.github.retrooper.packetevents.manager.server.ServerVersion; +import com.github.retrooper.packetevents.wrapper.PacketWrapper; +import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSpawnEntity; +import me.tofaa.entitylib.meta.types.ObjectData; +import me.tofaa.entitylib.utils.VersionUtil; +import me.tofaa.entitylib.wrapper.WrapperEntity; + +import java.util.Optional; + +final class ModernSpawningMethods { + + private ModernSpawningMethods() {} + + static class Generic implements EntitySpawningMethod { + + @Override + public PacketWrapper getSpawnPacket(WrapperEntity entity) { + if (VersionUtil.isOlderThan(ServerVersion.V_1_19_3)) throw new UnsupportedOperationException("This method is not supported in this version."); + return new WrapperPlayServerSpawnEntity( + entity.getEntityId(), + Optional.of(entity.getUuid()), + entity.getEntityType(), + entity.getLocation().getPosition(), + entity.getLocation().getPitch(), + entity.getLocation().getYaw(), + entity.getLocation().getYaw(), + entity.getEntityMeta() instanceof ObjectData ? (((ObjectData) entity.getEntityMeta()).getObjectData()) : 0, + entity.createVeloPacket() + ); + } + } + +} diff --git a/api/src/main/java/me/tofaa/entitylib/utils/VersionUtil.java b/api/src/main/java/me/tofaa/entitylib/utils/VersionUtil.java new file mode 100644 index 0000000..f9eba2a --- /dev/null +++ b/api/src/main/java/me/tofaa/entitylib/utils/VersionUtil.java @@ -0,0 +1,32 @@ +package me.tofaa.entitylib.utils; + +import com.github.retrooper.packetevents.manager.server.ServerVersion; +import com.github.retrooper.packetevents.manager.server.VersionComparison; +import me.tofaa.entitylib.EntityLib; + +public final class VersionUtil { + + private VersionUtil () {} + + + public static boolean isNewerThanOrEqual(ServerVersion version) { + return EntityLib.getApi().getPacketEvents().getServerManager().getVersion().isNewerThanOrEquals(version); + } + + public static boolean isNewerThan(ServerVersion version) { + return EntityLib.getApi().getPacketEvents().getServerManager().getVersion().isNewerThan(version); + } + + public static boolean isOlderThanOrEqual(ServerVersion version) { + return EntityLib.getApi().getPacketEvents().getServerManager().getVersion().isOlderThanOrEquals(version); + } + + public static boolean isOlderThan(ServerVersion version) { + return EntityLib.getApi().getPacketEvents().getServerManager().getVersion().isOlderThan(version); + } + + public static boolean is(ServerVersion version) { + return EntityLib.getApi().getPacketEvents().getServerManager().getVersion().is(VersionComparison.EQUALS, version); + } + +} 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 02bd72f..7f56b43 100644 --- a/api/src/main/java/me/tofaa/entitylib/wrapper/WrapperEntity.java +++ b/api/src/main/java/me/tofaa/entitylib/wrapper/WrapperEntity.java @@ -96,7 +96,7 @@ public class WrapperEntity implements Tickable, TrackedEntity { return 0; } - protected Optional createVeloPacket() { + public Optional createVeloPacket() { Optional velocity; double veloX = 0, veloY = 0, veloZ = 0; if (entityMeta instanceof ObjectData) { 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 1287850..5bb4f54 100644 --- a/common/src/main/java/me/tofaa/entitylib/common/AbstractEntityLibAPI.java +++ b/common/src/main/java/me/tofaa/entitylib/common/AbstractEntityLibAPI.java @@ -1,28 +1,17 @@ package me.tofaa.entitylib.common; import com.github.retrooper.packetevents.PacketEventsAPI; -import com.github.retrooper.packetevents.protocol.entity.type.EntityType; -import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes; -import com.github.retrooper.packetevents.protocol.player.UserProfile; -import com.github.retrooper.packetevents.protocol.world.Location; 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; -import me.tofaa.entitylib.meta.EntityMeta; -import me.tofaa.entitylib.meta.projectile.ThrownExpBottleMeta; -import me.tofaa.entitylib.meta.types.LivingEntityMeta; import me.tofaa.entitylib.tick.TickContainer; import me.tofaa.entitylib.wrapper.WrapperEntity; -import me.tofaa.entitylib.wrapper.WrapperExperienceOrbEntity; -import me.tofaa.entitylib.wrapper.WrapperLivingEntity; -import me.tofaa.entitylib.wrapper.WrapperPlayer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; -import java.util.concurrent.ConcurrentHashMap; + public abstract class AbstractEntityLibAPI implements EntityLibAPI { @@ -30,11 +19,6 @@ public abstract class AbstractEntityLibAPI implements EntityLibAPI { protected final PacketEventsAPI packetEvents; protected final APIConfig settings; protected final Collection> tickContainers; - protected final Map globalEntityMap = new ConcurrentHashMap<>(); - protected final Map entitiesById = new ConcurrentHashMap<>(); - protected final Map entities = new ConcurrentHashMap<>(); - - protected final Set entityContainers = ConcurrentHashMap.newKeySet(); protected final EntityContainer defaultEntityContainer = EntityContainer.basic(); protected AbstractEntityLibAPI(Platform

platform, APIConfig settings) { @@ -46,27 +30,18 @@ public abstract class AbstractEntityLibAPI implements EntityLibAPI { @Override public @Nullable WrapperEntity getEntity(int id) { - return entitiesById.get(id); + return defaultEntityContainer.getEntity(id); } @Override public @Nullable WrapperEntity getEntity(@NotNull UUID uuid) { - return entities.get(uuid); + return defaultEntityContainer.getEntity(uuid); + } @Override public @NotNull Collection getAllEntities() { - return Collections.unmodifiableCollection(entities.values()); - } - - @Override - public void addContainer(EntityContainer container) { - entityContainers.add(container); - } - - @Override - public void removeContainer(EntityContainer container) { - entityContainers.remove(container); + return defaultEntityContainer.getEntities(); } @Override @@ -74,12 +49,6 @@ public abstract class AbstractEntityLibAPI implements EntityLibAPI { return defaultEntityContainer; } - @NotNull - @Override - public Set getEntityContainers() { - return entityContainers; - } - @NotNull @Override public APIConfig getSettings() { diff --git a/platforms/spigot/src/main/java/me/tofaa/entitylib/spigot/SpigotEntityLibAPI.java b/platforms/spigot/src/main/java/me/tofaa/entitylib/spigot/SpigotEntityLibAPI.java index a9a8122..6e86df4 100644 --- a/platforms/spigot/src/main/java/me/tofaa/entitylib/spigot/SpigotEntityLibAPI.java +++ b/platforms/spigot/src/main/java/me/tofaa/entitylib/spigot/SpigotEntityLibAPI.java @@ -1,7 +1,6 @@ package me.tofaa.entitylib.spigot; import com.github.retrooper.packetevents.protocol.entity.type.EntityType; -import com.github.retrooper.packetevents.protocol.world.Location; import io.github.retrooper.packetevents.util.SpigotConversionUtil; import me.tofaa.entitylib.APIConfig; import me.tofaa.entitylib.EntityLib; @@ -16,7 +15,6 @@ import me.tofaa.entitylib.wrapper.WrapperLivingEntity; import me.tofaa.entitylib.wrapper.WrapperPlayer; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.Bukkit; -import org.bukkit.World; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; diff --git a/platforms/spigot/src/main/java/me/tofaa/entitylib/spigot/SpigotEntityLibPlatform.java b/platforms/spigot/src/main/java/me/tofaa/entitylib/spigot/SpigotEntityLibPlatform.java index 61d2402..ffe81e5 100644 --- a/platforms/spigot/src/main/java/me/tofaa/entitylib/spigot/SpigotEntityLibPlatform.java +++ b/platforms/spigot/src/main/java/me/tofaa/entitylib/spigot/SpigotEntityLibPlatform.java @@ -23,7 +23,7 @@ import java.util.stream.Stream; public class SpigotEntityLibPlatform extends AbstractPlatform { private SpigotEntityLibAPI api; - private Map platformEntities = new ConcurrentWeakIdentityHashMap<>(); + private final Map platformEntities = new ConcurrentWeakIdentityHashMap<>(); public SpigotEntityLibPlatform(@NotNull JavaPlugin plugin) { super(plugin);