From 8be902c3f5e74a2dcbcdd33c6dbf3ac4283e689a Mon Sep 17 00:00:00 2001 From: mbax Date: Fri, 30 Jun 2023 19:17:12 -0400 Subject: [PATCH] Add EnderVaults converter --- .../playervaults/commands/ConvertCommand.java | 6 +- .../converters/EnderVaultsConverter.java | 127 ++++++++++++++++++ 2 files changed, 129 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/drtshock/playervaults/converters/EnderVaultsConverter.java diff --git a/src/main/java/com/drtshock/playervaults/commands/ConvertCommand.java b/src/main/java/com/drtshock/playervaults/commands/ConvertCommand.java index 10c212a..aac5e05 100644 --- a/src/main/java/com/drtshock/playervaults/commands/ConvertCommand.java +++ b/src/main/java/com/drtshock/playervaults/commands/ConvertCommand.java @@ -19,10 +19,7 @@ package com.drtshock.playervaults.commands; import com.drtshock.playervaults.PlayerVaults; -import com.drtshock.playervaults.converters.BackpackConverter; -import com.drtshock.playervaults.converters.Converter; -import com.drtshock.playervaults.converters.Cosmic2Converter; -import com.drtshock.playervaults.converters.Cosmic3Converter; +import com.drtshock.playervaults.converters.*; import com.drtshock.playervaults.vaultmanagement.VaultOperations; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -40,6 +37,7 @@ public class ConvertCommand implements CommandExecutor { converters.add(new BackpackConverter()); converters.add(new Cosmic2Converter()); converters.add(new Cosmic3Converter()); + converters.add(new EnderVaultsConverter()); this.plugin = plugin; } diff --git a/src/main/java/com/drtshock/playervaults/converters/EnderVaultsConverter.java b/src/main/java/com/drtshock/playervaults/converters/EnderVaultsConverter.java new file mode 100644 index 0000000..6c40ad2 --- /dev/null +++ b/src/main/java/com/drtshock/playervaults/converters/EnderVaultsConverter.java @@ -0,0 +1,127 @@ +/* + * PlayerVaultsX + * Copyright (C) 2013 Trent Hensler, turt2live + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.drtshock.playervaults.converters; + +import com.drtshock.playervaults.PlayerVaults; +import com.drtshock.playervaults.vaultmanagement.VaultManager; +import org.bukkit.command.CommandSender; +import org.bukkit.inventory.Inventory; +import org.bukkit.plugin.Plugin; + +import java.io.IOException; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.stream.Stream; + +public class EnderVaultsConverter implements Converter { + + @SuppressWarnings("unchecked") + @Override + public int run(CommandSender initiator) { + PlayerVaults plugin = PlayerVaults.getInstance(); + VaultManager vaultManager = VaultManager.getInstance(); + + Path path = plugin.getDataFolder().toPath().getParent().resolve("EnderVaults").resolve("data"); + if (!Files.isDirectory(path)) { + plugin.getLogger().warning("Could not find EnderVaults data folder"); + return -1; + } + + MethodHandle load; + MethodHandle getInventory; + MethodHandle getMetadata; + Plugin enderVaultsPlugin = plugin.getServer().getPluginManager().getPlugin("EnderVaults"); + Object dataStorage; + + if (enderVaultsPlugin == null) { + plugin.getLogger().warning("EnderVaults not running. Need it to convert."); + return -1; + } + try { + Class pluginClass = Class.forName("com.github.dig.endervaults.api.EnderVaultsPlugin"); + Class dataStorageClass = Class.forName("com.github.dig.endervaults.api.storage.DataStorage"); + Class bukkitVaultClass = Class.forName("com.github.dig.endervaults.bukkit.vault.BukkitVault"); + + MethodHandles.Lookup lookup = MethodHandles.publicLookup(); + + MethodType typeGetDataStorage = MethodType.methodType(dataStorageClass); + MethodHandle getDataStorage = lookup.findVirtual(pluginClass, "getDataStorage", typeGetDataStorage); + + dataStorage = getDataStorage.invoke(enderVaultsPlugin); + + MethodType typeLoad = MethodType.methodType(List.class, UUID.class); + load = lookup.findVirtual(dataStorageClass, "load", typeLoad); + MethodType typeGetInventory = MethodType.methodType(Inventory.class); + getInventory = lookup.findVirtual(bukkitVaultClass, "getInventory", typeGetInventory); + MethodType typeGetMetadata = MethodType.methodType(Map.class); + getMetadata = lookup.findVirtual(bukkitVaultClass, "getMetadata", typeGetMetadata); + + if (!pluginClass.isAssignableFrom(enderVaultsPlugin.getClass())) { + plugin.getLogger().warning("EnderVaults plugin not of expected type"); + return -1; + } + } catch (Throwable e) { + e.printStackTrace(); + return -1; + } + + AtomicInteger playerCount = new AtomicInteger(0); + try (Stream dir = Files.list(path)) { + dir.forEach(f -> { + if (!Files.isDirectory(f)) { + return; + } + try { + List list = (List) load.invoke(dataStorage, UUID.fromString(f.getFileName().toString())); + for (Object vault : list) { + Inventory inventory = (Inventory) getInventory.invoke(vault); + Map meta = (Map) getMetadata.invoke(vault); + Integer order = (Integer) meta.get("order"); + vaultManager.saveVault(inventory, f.getFileName().toString(), order); + } + } catch (Throwable e) { + e.printStackTrace(); + return; + } + playerCount.incrementAndGet(); + }); + } catch (IOException e) { + plugin.getLogger().log(Level.SEVERE, "Failed. ", e); + } + return playerCount.get(); + } + + @Override + public boolean canConvert() { + return Files.isDirectory(PlayerVaults.getInstance().getDataFolder().toPath().getParent().resolve("EnderVaults").resolve("data")); + } + + @Override + public String getName() { + return "EnderVaults"; + } +}