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);
|
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() {
|
||||||
|
|
|
@ -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();
|
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) {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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> {
|
||||||
|
|
|
@ -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()];
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue