Major: Tracker system removal

This commit is contained in:
= 2024-11-14 01:01:37 +02:00
parent d710683c9e
commit 1c1c6a479e
15 changed files with 31 additions and 315 deletions

View file

@ -10,9 +10,7 @@ public final class APIConfig {
private boolean checkForUpdates = false;
private boolean tickTickables = false;
private boolean platformLogger = false;
private boolean defaultCommands = false;
private boolean platformTracking = false;
private boolean bstats = false;
private boolean bstats = true;
public APIConfig(PacketEventsAPI<?> packetEvents) {
this.packetEvents = packetEvents;
@ -23,13 +21,13 @@ public final class APIConfig {
return this;
}
public @NotNull APIConfig usePlatformLogger() {
this.platformLogger = true;
public @NotNull APIConfig disableBStats() {
this.bstats = false;
return this;
}
public @NotNull APIConfig trackPlatformEntities() {
this.platformTracking = true;
public @NotNull APIConfig usePlatformLogger() {
this.platformLogger = true;
return this;
}
@ -48,15 +46,6 @@ public final class APIConfig {
return this;
}
public @NotNull APIConfig registerDefaultCommands() {
this.defaultCommands = true;
return this;
}
public boolean shouldRegisterDefaultCommands() {
return defaultCommands;
}
public boolean isDebugMode() {
return debugMode;
}
@ -77,10 +66,6 @@ public final class APIConfig {
return platformLogger;
}
public boolean shouldTrackPlatformEntities() {
return platformTracking;
}
public boolean shouldUseBstats() {
return bstats;
}

View file

@ -14,21 +14,6 @@ import java.util.stream.Stream;
public interface Platform<P> {
/**
* Queries a stream of platform specific entities if the platform supports
* @throws UnsupportedOperationException if the platform does not support querying entities.
* @return a stream of platform specific entities. The stream is not guaranteed to be synchronized.
*/
@NotNull Stream<TrackedEntity> queryPlatformEntities();
/**
* Finds a platform specific entity by its entityId.
* @param entityId the entityId of the entity.
* @return a future that completes with the entity if found, or null if not found.
* @throws UnsupportedOperationException if the platform does not support querying entities.
*/
@Nullable TrackedEntity findPlatformEntity(int entityId);
/**
* Gets the entityId integer provider. This can be provided by a platform if needed.
* @return the entityId integer provider.

View file

@ -1,13 +0,0 @@
package me.tofaa.entitylib;
import org.jetbrains.annotations.NotNull;
import java.util.UUID;
public interface TrackedEntity {
int getEntityId();
@NotNull UUID getUuid();
}

View file

@ -1,26 +0,0 @@
package me.tofaa.entitylib.event.types;
import com.github.retrooper.packetevents.protocol.player.User;
import me.tofaa.entitylib.TrackedEntity;
import me.tofaa.entitylib.event.EntityLibEvent;
import org.jetbrains.annotations.NotNull;
public class GeneralTrackingEvent implements EntityLibEvent {
private final User user;
private final TrackedEntity entity;
public GeneralTrackingEvent(@NotNull User user, @NotNull TrackedEntity entity) {
this.user = user;
this.entity = entity;
}
public User getUser() {
return user;
}
public TrackedEntity getEntity() {
return entity;
}
}

View file

@ -1,17 +0,0 @@
package me.tofaa.entitylib.event.types;
import com.github.retrooper.packetevents.protocol.player.User;
import me.tofaa.entitylib.TrackedEntity;
import me.tofaa.entitylib.event.EntityLibEvent;
import org.jetbrains.annotations.NotNull;
public class UserStopTrackingEntityEvent extends GeneralTrackingEvent implements EntityLibEvent {
public UserStopTrackingEntityEvent(@NotNull User user, @NotNull TrackedEntity entity) {
super(user, entity);
}
}

View file

@ -1,14 +0,0 @@
package me.tofaa.entitylib.event.types;
import com.github.retrooper.packetevents.protocol.player.User;
import me.tofaa.entitylib.TrackedEntity;
import me.tofaa.entitylib.event.EntityLibEvent;
import org.jetbrains.annotations.NotNull;
public final class UserTrackingEntityEvent extends GeneralTrackingEvent implements EntityLibEvent {
public UserTrackingEntityEvent(@NotNull User user, @NotNull TrackedEntity entity) {
super(user, entity);
}
}

View file

@ -4,6 +4,7 @@ package me.tofaa.entitylib.ve;
import com.github.retrooper.packetevents.protocol.player.User;
import me.tofaa.entitylib.EntityLib;
import me.tofaa.entitylib.wrapper.WrapperEntity;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.UnmodifiableView;
@ -13,6 +14,11 @@ import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
/**
* A basic viewer manipulation engine.
* Allows for a set of rules to be applied as to show and hide an entity from viewers.
*/
@ApiStatus.Experimental
public class ViewerEngine {
private final List<ViewerRule> globalRules;
@ -34,6 +40,16 @@ public class ViewerEngine {
EntityLib.getApi().getPacketEvents().getEventManager().unregisterListener(listener);
}
public void refresh() {
getTracked0().forEach(entity -> {
for (UUID viewer : entity.getViewers()) {
if (!canSpawnFor(viewer, entity)) {
entity.removeViewer(viewer);
}
}
});
}
public Executor getExecutor() {
return executor;
}
@ -55,6 +71,14 @@ public class ViewerEngine {
return globalRules.stream().anyMatch(rule -> rule.shouldSee(user));
}
public boolean canSpawnFor(UUID userId, WrapperEntity entity) {
User user = EntityLib.getApi().getPacketEvents().getProtocolManager().getUser(
EntityLib.getApi().getPacketEvents().getProtocolManager().getChannel(userId)
);
if (user == null) return false;
return canSpawnFor(user, entity);
}
public @UnmodifiableView Collection<WrapperEntity> getTracked() {
return Collections.unmodifiableCollection(tracked);
}

View file

@ -7,7 +7,6 @@ import com.github.retrooper.packetevents.util.Vector3d;
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
import com.github.retrooper.packetevents.wrapper.play.server.*;
import me.tofaa.entitylib.EntityLib;
import me.tofaa.entitylib.TrackedEntity;
import me.tofaa.entitylib.container.EntityContainer;
import me.tofaa.entitylib.meta.EntityMeta;
import me.tofaa.entitylib.meta.types.ObjectData;
@ -23,7 +22,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Consumer;
public class WrapperEntity implements Tickable, TrackedEntity {
public class WrapperEntity implements Tickable {
private final UUID uuid;
private final int entityId;

View file

@ -23,16 +23,6 @@ public abstract class AbstractPlatform<P> implements Platform<P> {
this.entityUuidProvider = new EntityUuidProvider.DefaultEntityUuidProvider();
}
@Override
public @NotNull Stream<TrackedEntity> queryPlatformEntities() {
throw new UnsupportedOperationException("Platform does not support querying entities.");
}
@Override
public @Nullable TrackedEntity findPlatformEntity(int entityId) {
throw new UnsupportedOperationException("Platform does not support querying entities.");
}
@Override
public void setupApi(@NotNull APIConfig settings) {
this.eventHandler = EventHandler.create();

View file

@ -1,19 +0,0 @@
package me.tofaa.entitylib.common;
import me.tofaa.entitylib.TrackedEntity;
import org.jetbrains.annotations.NotNull;
public abstract class AbstractTrackedEntity<E> implements TrackedEntity {
private final E platformEntity;
protected AbstractTrackedEntity(@NotNull E platformEntity) {
this.platformEntity = platformEntity;
}
@NotNull
public E getPlatformEntity() {
return platformEntity;
}
}

View file

@ -1,106 +0,0 @@
package me.tofaa.entitylib.spigot;
import com.github.retrooper.packetevents.event.PacketListenerAbstract;
import com.github.retrooper.packetevents.event.PacketSendEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.packettype.PacketTypeCommon;
import com.github.retrooper.packetevents.protocol.player.User;
import com.github.retrooper.packetevents.wrapper.play.server.*;
import me.tofaa.entitylib.TrackedEntity;
import me.tofaa.entitylib.event.types.UserStopTrackingEntityEvent;
import me.tofaa.entitylib.event.types.UserTrackingEntityEvent;
import org.bukkit.Bukkit;
import org.bukkit.entity.Entity;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntitySpawnEvent;
final class InternalRegistryListener extends PacketListenerAbstract implements Listener {
private SpigotEntityLibPlatform platform;
InternalRegistryListener(SpigotEntityLibPlatform platform) {
this.platform = platform;
}
@Override
public void onPacketSend(PacketSendEvent event) {
final User user = event.getUser();
final PacketTypeCommon type = event.getPacketType();
if (type == PacketType.Play.Server.DESTROY_ENTITIES) {
WrapperPlayServerDestroyEntities packet = new WrapperPlayServerDestroyEntities(event);
int[] ids = packet.getEntityIds();
Bukkit.getScheduler().runTaskLater(platform.getHandle(), () -> {
for (int id : ids) {
TrackedEntity tracked = findTracker(id);
if (tracked == null) {
continue;
}
platform.getEventHandler().callEvent(UserStopTrackingEntityEvent.class, new UserStopTrackingEntityEvent(user, tracked));
}
}, 2L);
}
else if (type == PacketType.Play.Server.SPAWN_ENTITY) {
WrapperPlayServerSpawnEntity packet = new WrapperPlayServerSpawnEntity(event);
int id = packet.getEntityId();
trackEntity(user, id);
}
else if (type == PacketType.Play.Server.SPAWN_EXPERIENCE_ORB) {
WrapperPlayServerSpawnExperienceOrb packet = new WrapperPlayServerSpawnExperienceOrb(event);
int id = packet.getEntityId();
trackEntity(user, id);
}
else if (type == PacketType.Play.Server.SPAWN_LIVING_ENTITY) {
WrapperPlayServerSpawnLivingEntity packet = new WrapperPlayServerSpawnLivingEntity(event);
int id = packet.getEntityId();
trackEntity(user, id);
}
else if (type == PacketType.Play.Server.SPAWN_PLAYER) {
WrapperPlayServerSpawnPlayer packet = new WrapperPlayServerSpawnPlayer(event);
int id = packet.getEntityId();
trackEntity(user, id);
}
else if (type == PacketType.Play.Server.SPAWN_WEATHER_ENTITY) {
WrapperPlayServerSpawnWeatherEntity packet = new WrapperPlayServerSpawnWeatherEntity(event);
int id = packet.getEntityId();
trackEntity(user, id);
}
else if (type == PacketType.Play.Server.SPAWN_PAINTING) {
WrapperPlayServerSpawnPainting packet = new WrapperPlayServerSpawnPainting(event);
int id = packet.getEntityId();
trackEntity(user, id);
}
}
private void trackEntity(User user, int id) {
Bukkit.getScheduler().runTaskLater(platform.getHandle(), () -> {
TrackedEntity entity = findTracker(id);
if (entity == null) {
return;
}
platform.getEventHandler().callEvent(UserTrackingEntityEvent.class, new UserTrackingEntityEvent(user, entity));
}, 2L);
}
private TrackedEntity findTracker(int id) {
TrackedEntity entity = platform.findPlatformEntity(id);
if (entity == null) {
entity = platform.getAPI().getEntity(id);
}
if (entity == null) {
if (platform.getAPI().getSettings().isDebugMode()) {
platform.getLogger().warning("Failed to find entity with id " + id);
}
}
return entity;
}
@EventHandler
public void onEntitySpawn(EntitySpawnEvent event) {
Entity e = event.getEntity();
platform.getPlatformEntities().put(e.getEntityId(), e);
}
}

View file

@ -1,24 +0,0 @@
package me.tofaa.entitylib.spigot;
import me.tofaa.entitylib.common.AbstractTrackedEntity;
import org.bukkit.entity.Entity;
import org.jetbrains.annotations.NotNull;
import java.util.UUID;
public class SpigotEntity extends AbstractTrackedEntity<Entity> {
public SpigotEntity(@NotNull Entity platformEntity) {
super(platformEntity);
}
@Override
public int getEntityId() {
return getPlatformEntity().getEntityId();
}
@Override
public @NotNull UUID getUuid() {
return getPlatformEntity().getUniqueId();
}
}

View file

@ -5,7 +5,6 @@ import io.github.retrooper.packetevents.bstats.bukkit.Metrics;
import io.github.retrooper.packetevents.bstats.charts.SimplePie;
import me.tofaa.entitylib.APIConfig;
import me.tofaa.entitylib.EntityLib;
import me.tofaa.entitylib.TrackedEntity;
import me.tofaa.entitylib.common.AbstractPlatform;
import me.tofaa.entitylib.utils.ConcurrentWeakIdentityHashMap;
import org.bukkit.Bukkit;
@ -23,7 +22,6 @@ import java.util.stream.Stream;
public class SpigotEntityLibPlatform extends AbstractPlatform<JavaPlugin> {
private SpigotEntityLibAPI api;
private final Map<Integer, Entity> platformEntities = new ConcurrentWeakIdentityHashMap<>();
public SpigotEntityLibPlatform(@NotNull JavaPlugin plugin) {
super(plugin);
@ -36,12 +34,6 @@ public class SpigotEntityLibPlatform extends AbstractPlatform<JavaPlugin> {
this.api = new SpigotEntityLibAPI(this, settings);
this.api.onLoad();
this.api.onEnable();
if (settings.shouldTrackPlatformEntities()) {
InternalRegistryListener listener = new InternalRegistryListener(this);
handle.getServer().getPluginManager().registerEvents(listener, handle);
api.getPacketEvents().getEventManager().registerListener(listener);
}
if (settings.shouldUseBstats()) {
PacketEventsAPI<Plugin> pe = (PacketEventsAPI<Plugin>)api.getPacketEvents();
Metrics metrics = new Metrics(pe.getPlugin(), 21916);
@ -50,33 +42,6 @@ public class SpigotEntityLibPlatform extends AbstractPlatform<JavaPlugin> {
}
Map<Integer, Entity> getPlatformEntities() {
return platformEntities;
}
@Override
public @NotNull Stream<TrackedEntity> queryPlatformEntities() {
if (!api.getSettings().shouldTrackPlatformEntities()) return Stream.of();
return platformEntities.values().stream().map(SpigotEntity::new);
}
@Override
public @Nullable TrackedEntity findPlatformEntity(final int entityId) {
if (!api.getSettings().shouldTrackPlatformEntities()) return null;
for (World world : Bukkit.getWorlds()) {
Entity e = world.getEntities().stream().filter(entity -> entity.getEntityId() == entityId).findFirst().orElse(null);
if (e != null) {
return new SpigotEntity(e);
}
}
return null;
// Entity e = platformEntities.get(entityId);
// if (e == null) return null;
// return new SpigotEntity(e);
}
@Override
public SpigotEntityLibAPI getAPI() {
return api;

View file

@ -29,7 +29,7 @@ tasks {
)
val sharedBukkitPlugins = runPaper.downloadPluginsSpec {
modrinth("packetevents", "MfD5eOYA")
modrinth("packetevents", "3Jr8ovul")
}
runServer {

View file

@ -1,26 +1,14 @@
package me.tofaa.testentitylib;
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes;
import com.github.retrooper.packetevents.protocol.player.UserProfile;
import io.github.retrooper.packetevents.util.SpigotConversionUtil;
import me.tofaa.entitylib.APIConfig;
import me.tofaa.entitylib.EntityLib;
import me.tofaa.entitylib.event.types.UserTrackingEntityEvent;
import me.tofaa.entitylib.spigot.SpigotEntityLibAPI;
import me.tofaa.entitylib.spigot.SpigotEntityLibPlatform;
import me.tofaa.entitylib.wrapper.WrapperPlayer;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandMap;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import java.lang.reflect.InvocationTargetException;
import java.util.UUID;
public class TestEntityLibPlugin extends JavaPlugin {
@ -32,7 +20,6 @@ public class TestEntityLibPlugin extends JavaPlugin {
.debugMode()
.checkForUpdates()
.tickTickables()
.trackPlatformEntities()
.useBstats()
.usePlatformLogger();