finish spigot cloning
This commit is contained in:
parent
2eaaca878e
commit
82f0b54aba
7 changed files with 83 additions and 24 deletions
|
@ -10,7 +10,7 @@ public interface EventListener<E extends EntityLibEvent> {
|
|||
|
||||
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>() {
|
||||
@Override
|
||||
public @NotNull Class<T> getEventClass() {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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) {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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<P, W, T> implements EntityLibAPI<W, T> {
|
||||
|
|
|
@ -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()];
|
||||
}
|
||||
|
|
|
@ -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<World> {
|
||||
|
||||
|
||||
|
@ -29,7 +35,8 @@ public class SpigotWorld extends AbstractWorldWrapper<World> {
|
|||
public <T extends WrapperEntity> @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<World> {
|
|||
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
|
||||
|
|
Loading…
Reference in a new issue