finish spigot cloning

This commit is contained in:
Tofaa 2024-02-17 14:24:43 +04:00
parent 2eaaca878e
commit 82f0b54aba
7 changed files with 83 additions and 24 deletions

View file

@ -10,7 +10,7 @@ public interface EventListener<E extends EntityLibEvent> {
void handle(@NotNull E event); void handle(@NotNull E event);
public static <T extends EntityLibEvent> EventListener<T> generateListener(Class<T> eventClass, Consumer<T> consumer) { static <T extends EntityLibEvent> EventListener<T> generateListener(Class<T> eventClass, Consumer<T> consumer) {
return new EventListener<T>() { return new EventListener<T>() {
@Override @Override
public @NotNull Class<T> getEventClass() { public @NotNull Class<T> getEventClass() {

View file

@ -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;
}
}

View file

@ -190,12 +190,6 @@ public class EntityMeta implements EntityMetadataProvider {
return metadata.createPacket(); 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) { protected static void isVersionNewer(ServerVersion version) {
if (!EntityLib.getApi().getPacketEvents().getServerManager().getVersion().is(VersionComparison.NEWER_THAN, 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() + "."); 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); return (byte) (value + amount);
} }
protected byte getMask(byte index) { public byte getMask(byte index) {
return this.metadata.getIndex(index, (byte) 0); 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); 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; 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); byte mask = getMask((byte)index);
boolean currentValue = (mask & bit) == bit; boolean currentValue = (mask & bit) == bit;
if (currentValue == value) { if (currentValue == value) {

View file

@ -7,12 +7,7 @@ import me.tofaa.entitylib.EntityLib;
import me.tofaa.entitylib.wrapper.WrapperEntity; import me.tofaa.entitylib.wrapper.WrapperEntity;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; 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.*;
import java.util.concurrent.ConcurrentHashMap;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public class Metadata { public class Metadata {

View file

@ -1,9 +1,7 @@
package me.tofaa.entitylib.common; package me.tofaa.entitylib.common;
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.PacketEventsAPI; import com.github.retrooper.packetevents.PacketEventsAPI;
import me.tofaa.entitylib.APIConfig; import me.tofaa.entitylib.APIConfig;
import me.tofaa.entitylib.EntityLib;
import me.tofaa.entitylib.EntityLibAPI; import me.tofaa.entitylib.EntityLibAPI;
import me.tofaa.entitylib.Platform; import me.tofaa.entitylib.Platform;
import me.tofaa.entitylib.tick.TickContainer; 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.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.Collection; import java.util.*;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
public abstract class AbstractEntityLibAPI<P, W, T> implements EntityLibAPI<W, T> { public abstract class AbstractEntityLibAPI<P, W, T> implements EntityLibAPI<W, T> {

View file

@ -2,8 +2,17 @@ package me.tofaa.entitylib.spigot;
import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose; import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose;
import com.github.retrooper.packetevents.protocol.player.HumanoidArm; 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.entity.Pose;
import org.bukkit.inventory.MainHand; 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 { 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) { public static EntityPose fromBukkitPose(Pose pose) {
return EntityPose.values()[pose.ordinal()]; return EntityPose.values()[pose.ordinal()];
} }

View file

@ -1,14 +1,18 @@
package me.tofaa.entitylib.spigot; 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.Location;
import com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState; import com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState;
import io.github.retrooper.packetevents.util.SpigotConversionUtil; import io.github.retrooper.packetevents.util.SpigotConversionUtil;
import me.tofaa.entitylib.EntityLib;
import me.tofaa.entitylib.common.AbstractWorldWrapper; import me.tofaa.entitylib.common.AbstractWorldWrapper;
import me.tofaa.entitylib.meta.EntityMeta; import me.tofaa.entitylib.meta.EntityMeta;
import me.tofaa.entitylib.meta.types.LivingEntityMeta; import me.tofaa.entitylib.meta.types.LivingEntityMeta;
import me.tofaa.entitylib.meta.types.PlayerMeta; import me.tofaa.entitylib.meta.types.PlayerMeta;
import me.tofaa.entitylib.utils.Check; import me.tofaa.entitylib.utils.Check;
import me.tofaa.entitylib.wrapper.WrapperEntity; 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.Component;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import org.bukkit.World; import org.bukkit.World;
@ -17,6 +21,8 @@ import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.UUID;
public class SpigotWorld extends AbstractWorldWrapper<World> { public class SpigotWorld extends AbstractWorldWrapper<World> {
@ -29,7 +35,8 @@ public class SpigotWorld extends AbstractWorldWrapper<World> {
public <T extends WrapperEntity> @NotNull T cloneEntity(@NotNull Object platformEntity, @NotNull Location location) { public <T extends WrapperEntity> @NotNull T cloneEntity(@NotNull Object platformEntity, @NotNull Location location) {
Check.stateCondition(!(platformEntity instanceof Entity), "Entity must be a Bukkit entity"); Check.stateCondition(!(platformEntity instanceof Entity), "Entity must be a Bukkit entity");
Entity e = (Entity) platformEntity; 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.setHasNoGravity(!e.hasGravity());
meta.setCustomNameVisible(e.isCustomNameVisible()); meta.setCustomNameVisible(e.isCustomNameVisible());
meta.setCustomName(LegacyComponentSerializer.legacyAmpersand().deserialize(e.getCustomName())); meta.setCustomName(LegacyComponentSerializer.legacyAmpersand().deserialize(e.getCustomName()));
@ -51,7 +58,23 @@ public class SpigotWorld extends AbstractWorldWrapper<World> {
pm.setSwimming(p.isSwimming()); pm.setSwimming(p.isSwimming());
pm.setActiveHand(ExtraConversionUtil.fromBukkitHand(p.getMainHand())); 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 @Override