Added pose property

This commit is contained in:
D3v1s0m 2023-06-23 01:16:58 +05:30
parent 079006d9cb
commit b7df0e3a33
No known key found for this signature in database
GPG Key ID: 3B6EC35367B8D82E
10 changed files with 80 additions and 0 deletions

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

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

@ -1,5 +1,6 @@
package lol.pyr.znpcsplus.entity; package lol.pyr.znpcsplus.entity;
import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose;
import com.github.retrooper.packetevents.protocol.item.ItemStack; import com.github.retrooper.packetevents.protocol.item.ItemStack;
import lol.pyr.znpcsplus.api.entity.EntityProperty; import lol.pyr.znpcsplus.api.entity.EntityProperty;
import lol.pyr.znpcsplus.api.entity.EntityPropertyRegistry; import lol.pyr.znpcsplus.api.entity.EntityPropertyRegistry;
@ -26,6 +27,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
registerSerializer(new NamedTextColorPropertySerializer()); registerSerializer(new NamedTextColorPropertySerializer());
registerSerializer(new SkinDescriptorSerializer(skinCache)); registerSerializer(new SkinDescriptorSerializer(skinCache));
registerSerializer(new ItemStackPropertySerializer()); registerSerializer(new ItemStackPropertySerializer());
registerSerializer(new EntityPosePropertySerializer());
registerType("glow", NamedTextColor.class); registerType("glow", NamedTextColor.class);
registerType("fire", false); registerType("fire", false);
@ -48,6 +50,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
registerType("potion_ambient", false); // TODO registerType("potion_ambient", false); // TODO
registerType("shaking", false); registerType("shaking", false);
registerType("baby", false); // TODO registerType("baby", false); // TODO
registerType("pose", EntityPose.STANDING, EntityPose.class); // TODO
// Player // Player
registerType("skin_cape", true); registerType("skin_cape", true);

@ -0,0 +1,21 @@
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;
}
}

@ -1,6 +1,7 @@
package lol.pyr.znpcsplus.metadata; package lol.pyr.znpcsplus.metadata;
import com.github.retrooper.packetevents.protocol.entity.data.EntityData; import com.github.retrooper.packetevents.protocol.entity.data.EntityData;
import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import java.util.Collection; import java.util.Collection;
@ -24,4 +25,5 @@ public interface MetadataFactory {
EntityData silent(boolean enabled); EntityData silent(boolean enabled);
Collection<EntityData> name(Component name); Collection<EntityData> name(Component name);
EntityData noGravity(); EntityData noGravity();
EntityData pose(EntityPose pose);
} }

@ -1,10 +1,17 @@
package lol.pyr.znpcsplus.metadata; package lol.pyr.znpcsplus.metadata;
import com.github.retrooper.packetevents.protocol.entity.data.EntityData; import com.github.retrooper.packetevents.protocol.entity.data.EntityData;
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose;
public class V1_14MetadataFactory extends V1_13MetadataFactory { public class V1_14MetadataFactory extends V1_13MetadataFactory {
@Override @Override
public EntityData skinLayers(boolean cape, boolean jacket, boolean leftSleeve, boolean rightSleeve, boolean leftLeg, boolean rightLeg, boolean hat) { public EntityData skinLayers(boolean cape, boolean jacket, boolean leftSleeve, boolean rightSleeve, boolean leftLeg, boolean rightLeg, boolean hat) {
return createSkinLayers(15, cape, jacket, leftSleeve, rightSleeve, leftLeg, rightLeg, hat); return createSkinLayers(15, cape, jacket, leftSleeve, rightSleeve, leftLeg, rightLeg, hat);
} }
@Override
public EntityData pose(EntityPose pose) {
return newEntityData(6, EntityDataTypes.ENTITY_POSE, pose);
}
} }

@ -3,6 +3,7 @@ package lol.pyr.znpcsplus.metadata;
import com.github.retrooper.packetevents.protocol.entity.data.EntityData; import com.github.retrooper.packetevents.protocol.entity.data.EntityData;
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataType; import com.github.retrooper.packetevents.protocol.entity.data.EntityDataType;
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose;
import com.github.retrooper.packetevents.util.adventure.AdventureSerializer; import com.github.retrooper.packetevents.util.adventure.AdventureSerializer;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
@ -34,6 +35,11 @@ public class V1_8MetadataFactory implements MetadataFactory {
throw new UnsupportedOperationException("The gravity entity data isn't supported on this version"); throw new UnsupportedOperationException("The gravity entity data isn't supported on this version");
} }
@Override
public EntityData pose(EntityPose pose) {
throw new UnsupportedOperationException("The pose entity data isn't supported on this version");
}
@Override @Override
public EntityData silent(boolean enabled) { public EntityData silent(boolean enabled) {
return newEntityData(4, EntityDataTypes.BYTE, (byte) (enabled ? 1 : 0)); return newEntityData(4, EntityDataTypes.BYTE, (byte) (enabled ? 1 : 0));

@ -80,6 +80,8 @@ public class NpcTypeImpl implements NpcType {
allowedProperties.add(propertyRegistry.getByName("skin_cape")); allowedProperties.add(propertyRegistry.getByName("skin_cape"));
if (PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_9)) if (PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_9))
allowedProperties.add(propertyRegistry.getByName("glow")); allowedProperties.add(propertyRegistry.getByName("glow"));
if (PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_14))
allowedProperties.add(propertyRegistry.getByName("pose"));
if (PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_17)) if (PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_17))
allowedProperties.add(propertyRegistry.getByName("shaking")); allowedProperties.add(propertyRegistry.getByName("shaking"));
return new NpcTypeImpl(name, type, hologramOffset, new HashSet<>(allowedProperties)); return new NpcTypeImpl(name, type, hologramOffset, new HashSet<>(allowedProperties));

@ -1,6 +1,8 @@
package lol.pyr.znpcsplus.packets; package lol.pyr.znpcsplus.packets;
import com.github.retrooper.packetevents.PacketEventsAPI; import com.github.retrooper.packetevents.PacketEventsAPI;
import com.github.retrooper.packetevents.protocol.entity.data.EntityData;
import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose;
import com.github.retrooper.packetevents.util.Vector3d; import com.github.retrooper.packetevents.util.Vector3d;
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSpawnEntity; import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSpawnEntity;
import lol.pyr.znpcsplus.api.entity.PropertyHolder; import lol.pyr.znpcsplus.api.entity.PropertyHolder;
@ -12,6 +14,7 @@ import lol.pyr.znpcsplus.util.NpcLocation;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
public class V1_14PacketFactory extends V1_10PacketFactory { public class V1_14PacketFactory extends V1_10PacketFactory {
@ -27,4 +30,11 @@ public class V1_14PacketFactory extends V1_10PacketFactory {
sendAllMetadata(player, entity, properties); sendAllMetadata(player, entity, properties);
createTeam(player, entity, properties); createTeam(player, entity, properties);
} }
@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))));
return data;
}
} }

@ -0,0 +1,25 @@
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 java.util.Deque;
public class EntityPoseParser extends ParserType<EntityPose> {
public EntityPoseParser(Message<CommandContext> message) {
super(message);
}
@Override
public EntityPose parse(Deque<String> deque) throws CommandExecutionException {
try {
return EntityPose.valueOf(deque.pop().toUpperCase());
} catch (IllegalArgumentException e) {
throw new CommandExecutionException();
}
}
}