support for FancyNpcs conversion
This commit is contained in:
		
							parent
							
								
									a56459b69e
								
							
						
					
					
						commit
						cb96dd90cd
					
				
					 2 changed files with 186 additions and 0 deletions
				
			
		| 
						 | 
					@ -2,6 +2,7 @@ package lol.pyr.znpcsplus.conversion;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import lol.pyr.znpcsplus.config.ConfigManager;
 | 
					import lol.pyr.znpcsplus.config.ConfigManager;
 | 
				
			||||||
import lol.pyr.znpcsplus.conversion.citizens.CitizensImporter;
 | 
					import lol.pyr.znpcsplus.conversion.citizens.CitizensImporter;
 | 
				
			||||||
 | 
					import lol.pyr.znpcsplus.conversion.fancynpcs.FancyNpcsImporter;
 | 
				
			||||||
import lol.pyr.znpcsplus.conversion.znpcs.ZNpcImporter;
 | 
					import lol.pyr.znpcsplus.conversion.znpcs.ZNpcImporter;
 | 
				
			||||||
import lol.pyr.znpcsplus.entity.EntityPropertyRegistryImpl;
 | 
					import lol.pyr.znpcsplus.entity.EntityPropertyRegistryImpl;
 | 
				
			||||||
import lol.pyr.znpcsplus.npc.NpcRegistryImpl;
 | 
					import lol.pyr.znpcsplus.npc.NpcRegistryImpl;
 | 
				
			||||||
| 
						 | 
					@ -34,6 +35,8 @@ public class DataImporterRegistry {
 | 
				
			||||||
                packetFactory, textSerializer, typeRegistry, propertyRegistry, skinCache, new File(pluginsFolder, "ZNPCsPlusLegacy/data.json"), bungeeConnector)));
 | 
					                packetFactory, textSerializer, typeRegistry, propertyRegistry, skinCache, new File(pluginsFolder, "ZNPCsPlusLegacy/data.json"), bungeeConnector)));
 | 
				
			||||||
        register("citizens", LazyLoader.of(() -> new CitizensImporter(configManager, adventure, taskScheduler,
 | 
					        register("citizens", LazyLoader.of(() -> new CitizensImporter(configManager, adventure, taskScheduler,
 | 
				
			||||||
                packetFactory, textSerializer, typeRegistry, propertyRegistry, skinCache, new File(pluginsFolder, "Citizens/saves.yml"), npcRegistry)));
 | 
					                packetFactory, textSerializer, typeRegistry, propertyRegistry, skinCache, new File(pluginsFolder, "Citizens/saves.yml"), npcRegistry)));
 | 
				
			||||||
 | 
					        register("fancynpcs", LazyLoader.of(() -> new FancyNpcsImporter(configManager, adventure, taskScheduler,
 | 
				
			||||||
 | 
					                packetFactory, textSerializer, typeRegistry, propertyRegistry, skinCache, new File(pluginsFolder, "FancyNpcs/npcs.yml"), npcRegistry)));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private void register(String id, LazyLoader<DataImporter> loader) {
 | 
					    private void register(String id, LazyLoader<DataImporter> loader) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,183 @@
 | 
				
			||||||
 | 
					package lol.pyr.znpcsplus.conversion.fancynpcs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import io.github.retrooper.packetevents.util.SpigotConversionUtil;
 | 
				
			||||||
 | 
					import lol.pyr.znpcsplus.api.interaction.InteractionType;
 | 
				
			||||||
 | 
					import lol.pyr.znpcsplus.api.skin.SkinDescriptor;
 | 
				
			||||||
 | 
					import lol.pyr.znpcsplus.config.ConfigManager;
 | 
				
			||||||
 | 
					import lol.pyr.znpcsplus.conversion.DataImporter;
 | 
				
			||||||
 | 
					import lol.pyr.znpcsplus.entity.EntityPropertyImpl;
 | 
				
			||||||
 | 
					import lol.pyr.znpcsplus.entity.EntityPropertyRegistryImpl;
 | 
				
			||||||
 | 
					import lol.pyr.znpcsplus.interaction.consolecommand.ConsoleCommandAction;
 | 
				
			||||||
 | 
					import lol.pyr.znpcsplus.interaction.message.MessageAction;
 | 
				
			||||||
 | 
					import lol.pyr.znpcsplus.interaction.playercommand.PlayerCommandAction;
 | 
				
			||||||
 | 
					import lol.pyr.znpcsplus.npc.*;
 | 
				
			||||||
 | 
					import lol.pyr.znpcsplus.packets.PacketFactory;
 | 
				
			||||||
 | 
					import lol.pyr.znpcsplus.scheduling.TaskScheduler;
 | 
				
			||||||
 | 
					import lol.pyr.znpcsplus.skin.SkinImpl;
 | 
				
			||||||
 | 
					import lol.pyr.znpcsplus.skin.cache.MojangSkinCache;
 | 
				
			||||||
 | 
					import lol.pyr.znpcsplus.skin.descriptor.MirrorDescriptor;
 | 
				
			||||||
 | 
					import lol.pyr.znpcsplus.skin.descriptor.PrefetchedDescriptor;
 | 
				
			||||||
 | 
					import lol.pyr.znpcsplus.util.LookType;
 | 
				
			||||||
 | 
					import lol.pyr.znpcsplus.util.NamedColor;
 | 
				
			||||||
 | 
					import lol.pyr.znpcsplus.util.NpcLocation;
 | 
				
			||||||
 | 
					import net.kyori.adventure.platform.bukkit.BukkitAudiences;
 | 
				
			||||||
 | 
					import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
 | 
				
			||||||
 | 
					import org.bukkit.Bukkit;
 | 
				
			||||||
 | 
					import org.bukkit.configuration.ConfigurationSection;
 | 
				
			||||||
 | 
					import org.bukkit.configuration.file.YamlConfiguration;
 | 
				
			||||||
 | 
					import org.bukkit.inventory.ItemStack;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.File;
 | 
				
			||||||
 | 
					import java.util.*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class FancyNpcsImporter implements DataImporter {
 | 
				
			||||||
 | 
					    private final ConfigManager configManager;
 | 
				
			||||||
 | 
					    private final BukkitAudiences adventure;
 | 
				
			||||||
 | 
					    private final TaskScheduler scheduler;
 | 
				
			||||||
 | 
					    private final PacketFactory packetFactory;
 | 
				
			||||||
 | 
					    private final LegacyComponentSerializer textSerializer;
 | 
				
			||||||
 | 
					    private final NpcTypeRegistryImpl typeRegistry;
 | 
				
			||||||
 | 
					    private final EntityPropertyRegistryImpl propertyRegistry;
 | 
				
			||||||
 | 
					    private final MojangSkinCache skinCache;
 | 
				
			||||||
 | 
					    private final File dataFile;
 | 
				
			||||||
 | 
					    private final NpcRegistryImpl npcRegistry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public FancyNpcsImporter(ConfigManager configManager, BukkitAudiences adventure,
 | 
				
			||||||
 | 
					                            TaskScheduler taskScheduler, PacketFactory packetFactory, LegacyComponentSerializer textSerializer,
 | 
				
			||||||
 | 
					                            NpcTypeRegistryImpl typeRegistry, EntityPropertyRegistryImpl propertyRegistry, MojangSkinCache skinCache,
 | 
				
			||||||
 | 
					                            File dataFile, NpcRegistryImpl npcRegistry) {
 | 
				
			||||||
 | 
					        this.configManager = configManager;
 | 
				
			||||||
 | 
					        this.adventure = adventure;
 | 
				
			||||||
 | 
					        this.scheduler = taskScheduler;
 | 
				
			||||||
 | 
					        this.packetFactory = packetFactory;
 | 
				
			||||||
 | 
					        this.textSerializer = textSerializer;
 | 
				
			||||||
 | 
					        this.typeRegistry = typeRegistry;
 | 
				
			||||||
 | 
					        this.propertyRegistry = propertyRegistry;
 | 
				
			||||||
 | 
					        this.skinCache = skinCache;
 | 
				
			||||||
 | 
					        this.dataFile = dataFile;
 | 
				
			||||||
 | 
					        this.npcRegistry = npcRegistry;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public Collection<NpcEntryImpl> importData() {
 | 
				
			||||||
 | 
					        YamlConfiguration config = YamlConfiguration.loadConfiguration(dataFile);
 | 
				
			||||||
 | 
					        ConfigurationSection npcsSection = config.getConfigurationSection("npcs");
 | 
				
			||||||
 | 
					        if (npcsSection == null) {
 | 
				
			||||||
 | 
					            return Collections.emptyList();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        ArrayList<NpcEntryImpl> entries = new ArrayList<>();
 | 
				
			||||||
 | 
					        npcsSection.getKeys(false).forEach(key -> {
 | 
				
			||||||
 | 
					            ConfigurationSection npcSection = npcsSection.getConfigurationSection(key);
 | 
				
			||||||
 | 
					            if (npcSection == null) {
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            String name = npcSection.getString("name", "FancyNPC");
 | 
				
			||||||
 | 
					            UUID uuid = UUID.fromString(key);
 | 
				
			||||||
 | 
					            String world = npcSection.getString("location.world");
 | 
				
			||||||
 | 
					            if (world == null) {
 | 
				
			||||||
 | 
					                world = Bukkit.getWorlds().get(0).getName();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            NpcLocation location = new NpcLocation(
 | 
				
			||||||
 | 
					                    npcSection.getDouble("location.x"),
 | 
				
			||||||
 | 
					                    npcSection.getDouble("location.y"),
 | 
				
			||||||
 | 
					                    npcSection.getDouble("location.z"),
 | 
				
			||||||
 | 
					                    (float) npcSection.getDouble("location.yaw"),
 | 
				
			||||||
 | 
					                    (float) npcSection.getDouble("location.pitch")
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            String typeString = npcSection.getString("type");
 | 
				
			||||||
 | 
					            NpcTypeImpl type = typeRegistry.getByName(typeString);
 | 
				
			||||||
 | 
					            if (type == null) {
 | 
				
			||||||
 | 
					                type = typeRegistry.getByName("player");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            NpcImpl npc = new NpcImpl(uuid, propertyRegistry, configManager, packetFactory, textSerializer, world, type, location);
 | 
				
			||||||
 | 
					            npc.getType().applyDefaultProperties(npc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            npc.getHologram().addTextLineComponent(textSerializer.deserialize(name));
 | 
				
			||||||
 | 
					            boolean glowing = npcSection.getBoolean("glowing", false);
 | 
				
			||||||
 | 
					            if (glowing) {
 | 
				
			||||||
 | 
					                NamedColor color;
 | 
				
			||||||
 | 
					                try {
 | 
				
			||||||
 | 
					                    color = NamedColor.valueOf(npcSection.getString("glowingColor", "white"));
 | 
				
			||||||
 | 
					                } catch (IllegalArgumentException ignored) {
 | 
				
			||||||
 | 
					                    color = NamedColor.WHITE;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                EntityPropertyImpl<NamedColor> property = propertyRegistry.getByName("glow", NamedColor.class);
 | 
				
			||||||
 | 
					                npc.setProperty(property, color);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (npcSection.getBoolean("turnToPlayer", false)) {
 | 
				
			||||||
 | 
					                EntityPropertyImpl<LookType> property = propertyRegistry.getByName("look", LookType.class);
 | 
				
			||||||
 | 
					                npc.setProperty(property, LookType.CLOSEST_PLAYER);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (npcSection.isConfigurationSection("skin")) {
 | 
				
			||||||
 | 
					                ConfigurationSection skinSection = npcSection.getConfigurationSection("skin");
 | 
				
			||||||
 | 
					                String texture = skinSection.getString("value");
 | 
				
			||||||
 | 
					                String signature = skinSection.getString("signature");
 | 
				
			||||||
 | 
					                npc.setProperty(propertyRegistry.getByName("skin", SkinDescriptor.class), new PrefetchedDescriptor(new SkinImpl(texture, signature)));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (npcSection.isConfigurationSection("equipment")) {
 | 
				
			||||||
 | 
					                ConfigurationSection equipmentSection = npcSection.getConfigurationSection("equipment");
 | 
				
			||||||
 | 
					                for (String slot : equipmentSection.getKeys(false)) {
 | 
				
			||||||
 | 
					                    ItemStack item = equipmentSection.getItemStack(slot);
 | 
				
			||||||
 | 
					                    if (item != null) {
 | 
				
			||||||
 | 
					                        npc.setProperty(propertyRegistry.getByName(getEquipmentPropertyName(slot),
 | 
				
			||||||
 | 
					                                com.github.retrooper.packetevents.protocol.item.ItemStack.class), SpigotConversionUtil.fromBukkitItemStack(item));
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (npcSection.getBoolean("mirrorSkin")) {
 | 
				
			||||||
 | 
					                npc.setProperty(propertyRegistry.getByName("skin", SkinDescriptor.class), new MirrorDescriptor(skinCache));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            List<String> playerCommands = npcSection.getStringList("playerCommands");
 | 
				
			||||||
 | 
					            if (!playerCommands.isEmpty()) {
 | 
				
			||||||
 | 
					                long cooldown = npcSection.getLong("interactionCooldown", 0);
 | 
				
			||||||
 | 
					                for (String command : playerCommands) {
 | 
				
			||||||
 | 
					                    npc.addAction(new PlayerCommandAction(scheduler, command, InteractionType.ANY_CLICK, cooldown, 0));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            String serverCommand = npcSection.getString("serverCommand");
 | 
				
			||||||
 | 
					            if (serverCommand != null) {
 | 
				
			||||||
 | 
					                long cooldown = npcSection.getLong("interactionCooldown", 0);
 | 
				
			||||||
 | 
					                npc.addAction(new ConsoleCommandAction(scheduler, serverCommand, InteractionType.ANY_CLICK, cooldown, 0));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            List<String> messages = npcSection.getStringList("messages");
 | 
				
			||||||
 | 
					            if (!messages.isEmpty()) {
 | 
				
			||||||
 | 
					                long cooldown = npcSection.getLong("interactionCooldown", 0);
 | 
				
			||||||
 | 
					                for (String message : messages) {
 | 
				
			||||||
 | 
					                    npc.addAction(new MessageAction(adventure, message, InteractionType.ANY_CLICK, textSerializer, cooldown, 0));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            String id = npcSection.getString("name");
 | 
				
			||||||
 | 
					            while (npcRegistry.getById(id) != null) {
 | 
				
			||||||
 | 
					                id += "_";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            NpcEntryImpl entry = new NpcEntryImpl(id, npc);
 | 
				
			||||||
 | 
					            entry.enableEverything();
 | 
				
			||||||
 | 
					            entries.add(entry);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        return entries;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private String getEquipmentPropertyName(String slot) {
 | 
				
			||||||
 | 
					        switch (slot) {
 | 
				
			||||||
 | 
					            case "MAINHAND":
 | 
				
			||||||
 | 
					                return "hand";
 | 
				
			||||||
 | 
					            case "OFFHAND":
 | 
				
			||||||
 | 
					                return "offhand";
 | 
				
			||||||
 | 
					            case "FEET":
 | 
				
			||||||
 | 
					                return "boots";
 | 
				
			||||||
 | 
					            case "LEGS":
 | 
				
			||||||
 | 
					                return "leggings";
 | 
				
			||||||
 | 
					            case "CHEST":
 | 
				
			||||||
 | 
					                return "chestplate";
 | 
				
			||||||
 | 
					            case "HEAD":
 | 
				
			||||||
 | 
					                return "helmet";
 | 
				
			||||||
 | 
					            default:
 | 
				
			||||||
 | 
					                return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public boolean isValid() {
 | 
				
			||||||
 | 
					        return dataFile.isFile();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in a new issue