From 0418c25f5fc327151c3925912ddc31fa5eb19a92 Mon Sep 17 00:00:00 2001 From: Pyrbu Date: Tue, 30 May 2023 13:49:14 +0100 Subject: [PATCH] start on conversions --- .../znpcsplus/conversion/DataImporter.java | 10 ++ .../conversion/DataImporterType.java | 19 +++ .../conversion/znpcs/ZNpcsLoader.java | 130 ++++++++++++++++++ .../conversion/znpcs/model/ZNpcsAction.java | 24 ++++ .../conversion/znpcs/model/ZNpcsLocation.java | 34 +++++ .../conversion/znpcs/model/ZNpcsModel.java | 64 +++++++++ 6 files changed, 281 insertions(+) create mode 100644 plugin/src/main/java/lol/pyr/znpcsplus/conversion/DataImporter.java create mode 100644 plugin/src/main/java/lol/pyr/znpcsplus/conversion/DataImporterType.java create mode 100644 plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/ZNpcsLoader.java create mode 100644 plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/model/ZNpcsAction.java create mode 100644 plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/model/ZNpcsLocation.java create mode 100644 plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/model/ZNpcsModel.java diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/conversion/DataImporter.java b/plugin/src/main/java/lol/pyr/znpcsplus/conversion/DataImporter.java new file mode 100644 index 0000000..3f932cc --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/conversion/DataImporter.java @@ -0,0 +1,10 @@ +package lol.pyr.znpcsplus.conversion; + +import lol.pyr.znpcsplus.npc.NpcEntryImpl; + +import java.util.Collection; + +public interface DataImporter { + Collection importData(); + boolean isValid(); +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/conversion/DataImporterType.java b/plugin/src/main/java/lol/pyr/znpcsplus/conversion/DataImporterType.java new file mode 100644 index 0000000..6fb081e --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/conversion/DataImporterType.java @@ -0,0 +1,19 @@ +package lol.pyr.znpcsplus.conversion; + +import lol.pyr.znpcsplus.util.LazyLoader; + +public enum DataImporterType { + ZNPCS(() -> null), // TODO + LEGACY_ZNPCS_PLUS(() -> null), // TODO + CITIZENS(() -> null); // TODO + + private final LazyLoader importerLoader; + + DataImporterType(LazyLoader.ObjectProvider provider) { + this.importerLoader = LazyLoader.of(provider); + } + + DataImporter getImporter() { + return importerLoader.get(); + } +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/ZNpcsLoader.java b/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/ZNpcsLoader.java new file mode 100644 index 0000000..a7bbd22 --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/ZNpcsLoader.java @@ -0,0 +1,130 @@ +package lol.pyr.znpcsplus.conversion.znpcs; + +import com.google.gson.Gson; +import com.google.gson.stream.JsonReader; +import lol.pyr.znpcsplus.api.interaction.InteractionType; +import lol.pyr.znpcsplus.config.ConfigManager; +import lol.pyr.znpcsplus.conversion.DataImporter; +import lol.pyr.znpcsplus.conversion.znpcs.model.ZNpcsAction; +import lol.pyr.znpcsplus.conversion.znpcs.model.ZNpcsLocation; +import lol.pyr.znpcsplus.conversion.znpcs.model.ZNpcsModel; +import lol.pyr.znpcsplus.interaction.InteractionAction; +import lol.pyr.znpcsplus.interaction.consolecommand.ConsoleCommandAction; +import lol.pyr.znpcsplus.interaction.message.MessageAction; +import lol.pyr.znpcsplus.interaction.playerchat.PlayerChatAction; +import lol.pyr.znpcsplus.interaction.playercommand.PlayerCommandAction; +import lol.pyr.znpcsplus.interaction.switchserver.SwitchServerAction; +import lol.pyr.znpcsplus.npc.NpcEntryImpl; +import lol.pyr.znpcsplus.npc.NpcImpl; +import lol.pyr.znpcsplus.npc.NpcTypeRegistryImpl; +import lol.pyr.znpcsplus.packets.PacketFactory; +import lol.pyr.znpcsplus.scheduling.TaskScheduler; +import lol.pyr.znpcsplus.util.BungeeConnector; +import lol.pyr.znpcsplus.util.NpcLocation; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; + +public class ZNpcsLoader implements DataImporter { + private final ConfigManager configManager; + private final BukkitAudiences adventure; + private final BungeeConnector bungeeConnector; + private final TaskScheduler taskScheduler; + private final PacketFactory packetFactory; + private final LegacyComponentSerializer textSerializer; + private final NpcTypeRegistryImpl typeRegistry; + private final File folder; + private final File dataFile; + private final Gson gson; + + public ZNpcsLoader(ConfigManager configManager, BukkitAudiences adventure, BungeeConnector bungeeConnector, TaskScheduler taskScheduler, PacketFactory packetFactory, LegacyComponentSerializer textSerializer, NpcTypeRegistryImpl typeRegistry, File pluginsFolder) { + this.configManager = configManager; + this.adventure = adventure; + this.bungeeConnector = bungeeConnector; + this.taskScheduler = taskScheduler; + this.packetFactory = packetFactory; + this.textSerializer = textSerializer; + this.typeRegistry = typeRegistry; + folder = new File(pluginsFolder, "ServersNPC"); + dataFile = new File(folder, "data.json"); + gson = new Gson(); + } + + + @Override + public Collection importData() { + ZNpcsModel[] models; + try (FileReader fileReader = new FileReader(dataFile)) { + models = gson.fromJson(new JsonReader(fileReader), ZNpcsModel[].class); + } catch (IOException e) { + throw new RuntimeException(e); + } + if (models == null) return Collections.emptyList(); + ArrayList entries = new ArrayList<>(); + for (ZNpcsModel model : models) { + String type = model.getNpcType(); + if (type.equalsIgnoreCase("mushroom_cow")) type = "mooshroom"; + else if (type.equalsIgnoreCase("snowman")) type = "snow_golem"; + + + ZNpcsLocation oldLoc = model.getLocation(); + NpcLocation location = new NpcLocation(oldLoc.getX(), oldLoc.getY(), oldLoc.getZ(), oldLoc.getYaw(), oldLoc.getPitch()); + NpcImpl npc = new NpcImpl(configManager, packetFactory, textSerializer, oldLoc.getWorld(), typeRegistry.getByName(type), location); + + for (String raw : model.getHologramLines()) { + Component line = textSerializer.deserialize(raw); + npc.getHologram().addLineComponent(line); + } + + for (ZNpcsAction action : model.getClickActions()) { + InteractionType t = adaptClickType(action.getActionType()); + // TODO + } + + NpcEntryImpl entry = new NpcEntryImpl(String.valueOf(model.getId()), npc); + entry.enableEverything(); + entries.add(entry); + } + return entries; + } + + @Override + public boolean isValid() { + return folder.isDirectory() && dataFile.isFile(); + } + + private InteractionType adaptClickType(String clickType) { + switch (clickType.toLowerCase()) { + case "default": + return InteractionType.ANY_CLICK; + case "left": + return InteractionType.LEFT_CLICK; + case "right": + return InteractionType.RIGHT_CLICK; + } + throw new IllegalArgumentException("Couldn't adapt znpcs click type: " + clickType); + } + + private InteractionAction adaptAction(String type, InteractionType clickType, String parameter, int delay) { + switch (type.toLowerCase()) { + case "cmd": + return new PlayerCommandAction(taskScheduler, parameter, clickType, delay * 1000L); + case "console": + return new ConsoleCommandAction(taskScheduler, parameter, clickType, delay * 1000L); + case "chat": + return new PlayerChatAction(parameter, clickType, delay * 1000L); + case "message": + return new MessageAction(adventure, parameter, clickType, textSerializer, delay * 1000L); + case "server": + return new SwitchServerAction(bungeeConnector, parameter, clickType, delay * 1000L); + } + throw new IllegalArgumentException("Couldn't adapt znpcs click action: " + type); + } +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/model/ZNpcsAction.java b/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/model/ZNpcsAction.java new file mode 100644 index 0000000..8e2ba30 --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/model/ZNpcsAction.java @@ -0,0 +1,24 @@ +package lol.pyr.znpcsplus.conversion.znpcs.model; + +public class ZNpcsAction { + private String actionType; + private String clickType; + private String action; + private double delay; + + public String getActionType() { + return actionType; + } + + public String getClickType() { + return clickType; + } + + public String getAction() { + return action; + } + + public double getDelay() { + return delay; + } +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/model/ZNpcsLocation.java b/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/model/ZNpcsLocation.java new file mode 100644 index 0000000..815c4c8 --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/model/ZNpcsLocation.java @@ -0,0 +1,34 @@ +package lol.pyr.znpcsplus.conversion.znpcs.model; + +public class ZNpcsLocation { + private String world; + private double x; + private double y; + private double z; + private float yaw; + private float pitch; + + public String getWorld() { + return world; + } + + public double getX() { + return x; + } + + public double getY() { + return y; + } + + public double getZ() { + return z; + } + + public float getYaw() { + return yaw; + } + + public float getPitch() { + return pitch; + } +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/model/ZNpcsModel.java b/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/model/ZNpcsModel.java new file mode 100644 index 0000000..dddb09a --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/model/ZNpcsModel.java @@ -0,0 +1,64 @@ +package lol.pyr.znpcsplus.conversion.znpcs.model; + +import org.bukkit.inventory.ItemStack; + +import java.util.List; +import java.util.Map; + +public class ZNpcsModel { + private int id; + private double hologramHeight; + private String skin; + private String signature; + private String glowName; + private ZNpcsLocation location; + private String npcType; + private List hologramLines; + private List clickActions; + private Map npcEquip; + private Map customizationMap; + + public int getId() { + return id; + } + + public double getHologramHeight() { + return hologramHeight; + } + + public String getSkin() { + return skin; + } + + public String getSignature() { + return signature; + } + + public String getGlowName() { + return glowName; + } + + public ZNpcsLocation getLocation() { + return location; + } + + public String getNpcType() { + return npcType; + } + + public List getHologramLines() { + return hologramLines; + } + + public List getClickActions() { + return clickActions; + } + + public Map getNpcEquip() { + return npcEquip; + } + + public Map getCustomizationMap() { + return customizationMap; + } +} \ No newline at end of file