extract entity pose into an api class so people dont have to add packetevents to their dependencies

This commit is contained in:
Pyrbu 2023-06-22 23:27:10 +02:00
parent 2c708e2754
commit 8093e709dd
8 changed files with 63 additions and 35 deletions

@ -0,0 +1,24 @@
package lol.pyr.znpcsplus.util;
// TODO: Seperate this out into multiple classes and multiple properties depending on the npc type
// TODO: For example USING_TONGUE is only for the frog type but its usable everywhere
// TODO #2: Add some backwards compatibility to some of these, like for example CROUCHING can be done
// TODO #2: on older versions using the general Entity number 0 bitmask
public enum NpcPose {
STANDING,
FALL_FLYING,
SLEEPING,
SWIMMING,
SPIN_ATTACK,
CROUCHING,
LONG_JUMPING,
DYING,
CROAKING,
USING_TONGUE,
SITTING,
ROARING,
SNIFFING,
EMERGING,
DIGGING
}

@ -4,7 +4,6 @@ import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.PacketEventsAPI;
import com.github.retrooper.packetevents.event.PacketListenerPriority;
import com.github.retrooper.packetevents.manager.server.ServerVersion;
import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose;
import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder;
import lol.pyr.director.adventure.command.CommandContext;
import lol.pyr.director.adventure.command.CommandManager;
@ -233,7 +232,7 @@ public class ZNpcsPlus extends JavaPlugin {
manager.registerParser(Boolean.class, new BooleanParser(incorrectUsageMessage));
manager.registerParser(NamedTextColor.class, new NamedTextColorParser(incorrectUsageMessage));
manager.registerParser(InteractionType.class, new InteractionTypeParser(incorrectUsageMessage));
manager.registerParser(EntityPose.class, new EntityPoseParser(incorrectUsageMessage));
manager.registerParser(NpcPose.class, new NpcPoseParser(incorrectUsageMessage));
manager.registerCommand("npc", new MultiCommand(loadHelpMessage("root"))
.addSubcommand("create", new CreateCommand(npcRegistry, typeRegistry))

@ -1,6 +1,5 @@
package lol.pyr.znpcsplus.commands;
import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose;
import com.github.retrooper.packetevents.protocol.item.ItemStack;
import io.github.retrooper.packetevents.util.SpigotConversionUtil;
import lol.pyr.director.adventure.command.CommandContext;
@ -11,6 +10,7 @@ import lol.pyr.znpcsplus.entity.EntityPropertyImpl;
import lol.pyr.znpcsplus.npc.NpcEntryImpl;
import lol.pyr.znpcsplus.npc.NpcImpl;
import lol.pyr.znpcsplus.npc.NpcRegistryImpl;
import lol.pyr.znpcsplus.util.NpcPose;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
@ -68,7 +68,7 @@ public class PropertyCommand implements CommandHandler {
Class<?> type = property.getType();
if (type == Boolean.class) return context.suggestLiteral("true", "false");
if (type == NamedTextColor.class) return context.suggestCollection(NamedTextColor.NAMES.keys());
if (type == EntityPose.class) return context.suggestEnum(EntityPose.values());
if (type == NpcPose.class) return context.suggestEnum(NpcPose.values());
}
return Collections.emptyList();
}

@ -1,12 +1,12 @@
package lol.pyr.znpcsplus.entity;
import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose;
import com.github.retrooper.packetevents.protocol.item.ItemStack;
import lol.pyr.znpcsplus.api.entity.EntityProperty;
import lol.pyr.znpcsplus.api.entity.EntityPropertyRegistry;
import lol.pyr.znpcsplus.api.skin.SkinDescriptor;
import lol.pyr.znpcsplus.entity.serializers.*;
import lol.pyr.znpcsplus.skin.cache.SkinCache;
import lol.pyr.znpcsplus.util.NpcPose;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
@ -27,7 +27,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
registerSerializer(new NamedTextColorPropertySerializer());
registerSerializer(new SkinDescriptorSerializer(skinCache));
registerSerializer(new ItemStackPropertySerializer());
registerSerializer(new EntityPosePropertySerializer());
registerSerializer(new NpcPosePropertySerializer());
registerType("glow", NamedTextColor.class);
registerType("fire", false);
@ -37,6 +37,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
registerType("name", Component.class);
registerType("look", false);
// TODO: make all of these bukkit itemstack classes so api users wont have to add packetevents as a dependency
registerType("helmet", ItemStack.class);
registerType("chestplate", ItemStack.class);
registerType("leggings", ItemStack.class);
@ -49,7 +50,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
registerType("potion_ambient", false); // TODO
registerType("shaking", false);
registerType("baby", false); // TODO
registerType("pose", EntityPose.STANDING, EntityPose.class); // TODO
registerType("pose", NpcPose.STANDING);
// Player
registerType("skin_cape", true);

@ -1,21 +0,0 @@
package lol.pyr.znpcsplus.entity.serializers;
import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose;
import lol.pyr.znpcsplus.entity.PropertySerializer;
public class EntityPosePropertySerializer implements PropertySerializer<EntityPose> {
@Override
public String serialize(EntityPose property) {
return property.name();
}
@Override
public EntityPose deserialize(String property) {
return EntityPose.valueOf(property.toUpperCase());
}
@Override
public Class<EntityPose> getTypeClass() {
return EntityPose.class;
}
}

@ -0,0 +1,21 @@
package lol.pyr.znpcsplus.entity.serializers;
import lol.pyr.znpcsplus.entity.PropertySerializer;
import lol.pyr.znpcsplus.util.NpcPose;
public class NpcPosePropertySerializer implements PropertySerializer<NpcPose> {
@Override
public String serialize(NpcPose property) {
return property.name();
}
@Override
public NpcPose deserialize(String property) {
return NpcPose.valueOf(property.toUpperCase());
}
@Override
public Class<NpcPose> getTypeClass() {
return NpcPose.class;
}
}

@ -11,6 +11,7 @@ import lol.pyr.znpcsplus.entity.PacketEntity;
import lol.pyr.znpcsplus.metadata.MetadataFactory;
import lol.pyr.znpcsplus.scheduling.TaskScheduler;
import lol.pyr.znpcsplus.util.NpcLocation;
import lol.pyr.znpcsplus.util.NpcPose;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
@ -34,7 +35,11 @@ public class V1_14PacketFactory extends V1_10PacketFactory {
@Override
public Map<Integer, EntityData> generateMetadata(Player player, PacketEntity entity, PropertyHolder properties) {
Map<Integer, EntityData> data = super.generateMetadata(player, entity, properties);
add(data, metadataFactory.pose(properties.getProperty(propertyRegistry.getByName("pose", EntityPose.class))));
add(data, metadataFactory.pose(adaptNpcPose(properties.getProperty(propertyRegistry.getByName("pose", NpcPose.class)))));
return data;
}
protected EntityPose adaptNpcPose(NpcPose pose) {
return EntityPose.valueOf(pose.name());
}
}

@ -1,23 +1,22 @@
package lol.pyr.znpcsplus.parsers;
import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose;
import lol.pyr.director.adventure.command.CommandContext;
import lol.pyr.director.adventure.parse.ParserType;
import lol.pyr.director.common.command.CommandExecutionException;
import lol.pyr.director.common.message.Message;
import lol.pyr.znpcsplus.util.NpcPose;
import java.util.Deque;
public class EntityPoseParser extends ParserType<EntityPose> {
public EntityPoseParser(Message<CommandContext> message) {
public class NpcPoseParser extends ParserType<NpcPose> {
public NpcPoseParser(Message<CommandContext> message) {
super(message);
}
@Override
public EntityPose parse(Deque<String> deque) throws CommandExecutionException {
public NpcPose parse(Deque<String> deque) throws CommandExecutionException {
try {
return EntityPose.valueOf(deque.pop().toUpperCase());
return NpcPose.valueOf(deque.pop().toUpperCase());
} catch (IllegalArgumentException e) {
throw new CommandExecutionException();
}