diff --git a/pom.xml b/pom.xml index aa04b5c..2185adc 100644 --- a/pom.xml +++ b/pom.xml @@ -7,30 +7,53 @@ com.github.civclassic civclassic-parent - 1.0.0 + 1.0.1 com.github.maxopoly artemis Artemis - 1.0.1 + 1.1.0 + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.3.0-SNAPSHOT + + + + true + + + org.json + com.github.maxopoly.artemis.json + + + + + + + + - com.destroystokyo.paper + io.papermc.paper paper - 1.16.5-R0.1-SNAPSHOT + 1.17-R0.1-SNAPSHOT provided com.github.maxopoly zeus - 1.1 + 1.2 - vg.civcraft.mc.civmodcore + com.github.civclassic CivModCore - 1.8.2D + 1.9.0 provided @@ -40,6 +63,10 @@ civ-github-repo https://raw.githubusercontent.com/CivClassic/artifacts/master/ + + papermc + https://papermc.io/repo/repository/maven-public/ + diff --git a/src/main/java/com/github/maxopoly/artemis/ArtemisConfigManager.java b/src/main/java/com/github/maxopoly/artemis/ArtemisConfigManager.java index df84813..f1eafd1 100644 --- a/src/main/java/com/github/maxopoly/artemis/ArtemisConfigManager.java +++ b/src/main/java/com/github/maxopoly/artemis/ArtemisConfigManager.java @@ -1,5 +1,8 @@ package com.github.maxopoly.artemis; +import static vg.civcraft.mc.civmodcore.config.ConfigHelper.parseMaterialList; + + import java.util.ArrayList; import java.util.List; @@ -13,9 +16,9 @@ import com.rabbitmq.client.ConnectionFactory; import vg.civcraft.mc.civmodcore.ACivMod; -import vg.civcraft.mc.civmodcore.CoreConfigManager; +import vg.civcraft.mc.civmodcore.config.ConfigParser; -public class ArtemisConfigManager extends CoreConfigManager { +public class ArtemisConfigManager extends ConfigParser { private ConfigurationSection config; private ConnectionFactory connectionFactory; diff --git a/src/main/java/com/github/maxopoly/artemis/ArtemisPlayerDataCache.java b/src/main/java/com/github/maxopoly/artemis/ArtemisPlayerDataCache.java index 87e890f..f91e444 100644 --- a/src/main/java/com/github/maxopoly/artemis/ArtemisPlayerDataCache.java +++ b/src/main/java/com/github/maxopoly/artemis/ArtemisPlayerDataCache.java @@ -4,6 +4,7 @@ import java.util.Map; import java.util.UUID; +import net.kyori.adventure.text.Component; import org.bukkit.event.player.AsyncPlayerPreLoginEvent; import com.github.maxopoly.zeus.model.ZeusLocation; @@ -38,10 +39,10 @@ public synchronized void completeSession(PlayerDataTransferSession session) { } // we abuse the kick message to deliver the result if (session.getData() == null) { - event.setKickMessage("D"); //deny + event.kickMessage(Component.text("D")); //deny } else { sessions.put(uuid, session); - event.setKickMessage("A"); //accept + event.kickMessage(Component.text("A")); //accept } //if player was sent from another server, this will contain where the originating server wanted the player to go ZeusLocation cachedLocation = targetLocations.remove(uuid); diff --git a/src/main/java/com/github/maxopoly/artemis/ArtemisPlayerManager.java b/src/main/java/com/github/maxopoly/artemis/ArtemisPlayerManager.java index ad92519..d08747d 100644 --- a/src/main/java/com/github/maxopoly/artemis/ArtemisPlayerManager.java +++ b/src/main/java/com/github/maxopoly/artemis/ArtemisPlayerManager.java @@ -54,7 +54,7 @@ public UUID getUUID(String name) { * If the player is not found in the cache, Zeus is queried for the players name * (blocking) * - * @param uuid UUID of the player to look up + * @param playerUUID UUID of the player to look up * @return Name of the given player or null if no such player is known */ public String getName(UUID playerUUID) { diff --git a/src/main/java/com/github/maxopoly/artemis/ArtemisPlugin.java b/src/main/java/com/github/maxopoly/artemis/ArtemisPlugin.java index 49a68c4..aff5ec4 100644 --- a/src/main/java/com/github/maxopoly/artemis/ArtemisPlugin.java +++ b/src/main/java/com/github/maxopoly/artemis/ArtemisPlugin.java @@ -1,11 +1,6 @@ package com.github.maxopoly.artemis; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; - +import com.github.maxopoly.artemis.commands.ArtemisCommandManager; import com.github.maxopoly.artemis.listeners.PlayerDataListener; import com.github.maxopoly.artemis.listeners.RespawnListener; import com.github.maxopoly.artemis.listeners.ShardBorderListener; @@ -15,7 +10,11 @@ import com.github.maxopoly.artemis.rabbit.outgoing.ArtemisStartup; import com.github.maxopoly.zeus.model.TransactionIdManager; import com.github.maxopoly.zeus.servers.ZeusServer; - +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; import vg.civcraft.mc.civmodcore.ACivMod; public final class ArtemisPlugin extends ACivMod { @@ -37,6 +36,7 @@ public static ArtemisPlugin getInstance() { private ZeusServer zeus; private CustomWorldNBTStorage customNBTHandler; private RandomSpawnHandler randomSpawnHandler; + private ArtemisCommandManager commandManager; private ScheduledExecutorService transactionIdCleanup; // can't be a bukkit thread, because those are disable before // onDisable and we // still need it there @@ -59,6 +59,7 @@ public void onEnable() { this.globalPlayerTracker = new ArtemisPlayerManager(); this.randomSpawnHandler = new RandomSpawnHandler(this.configManager); this.rabbitInputHandler = new ArtemisRabbitInputHandler(getLogger(), transactionIdManager); + this.commandManager = new ArtemisCommandManager(this); this.rabbitHandler = new RabbitHandler(configManager.getConnectionFactory(), configManager.getIncomingRabbitQueue(), configManager.getOutgoingRabbitQueue(), transactionIdManager, getLogger(), zeus, rabbitInputHandler); @@ -146,4 +147,7 @@ public TransactionIdManager getTransactionIdManager() { return transactionIdManager; } + public ArtemisCommandManager getCommandManager() { + return commandManager; + } } diff --git a/src/main/java/com/github/maxopoly/artemis/RandomSpawnHandler.java b/src/main/java/com/github/maxopoly/artemis/RandomSpawnHandler.java index a27a84f..7e7ef56 100644 --- a/src/main/java/com/github/maxopoly/artemis/RandomSpawnHandler.java +++ b/src/main/java/com/github/maxopoly/artemis/RandomSpawnHandler.java @@ -1,6 +1,6 @@ package com.github.maxopoly.artemis; -import java.util.EnumSet; +import com.github.maxopoly.zeus.model.ConnectedMapState; import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -10,18 +10,14 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.logging.Level; - import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; +import vg.civcraft.mc.civmodcore.inventory.items.MaterialUtils; -import com.destroystokyo.paper.MaterialTags; -import com.github.maxopoly.zeus.model.ConnectedMapState; - -import vg.civcraft.mc.civmodcore.api.MaterialAPI; public class RandomSpawnHandler { @@ -103,7 +99,7 @@ private Location calcSpawnLocation(boolean sync) { int z = pos.getBlockZ() & 0xF; for (int y = maxY; y >= minY; y--) { Block block = chunk.getBlock(x, y, z); - if (MaterialAPI.isAir(block.getType())) { + if (MaterialUtils.isAir(block.getType())) { airCount++; continue; } diff --git a/src/main/java/com/github/maxopoly/artemis/commands/ArtemisCommandManager.java b/src/main/java/com/github/maxopoly/artemis/commands/ArtemisCommandManager.java new file mode 100644 index 0000000..41df9d6 --- /dev/null +++ b/src/main/java/com/github/maxopoly/artemis/commands/ArtemisCommandManager.java @@ -0,0 +1,25 @@ +package com.github.maxopoly.artemis.commands; + +import co.aikar.commands.BukkitCommandCompletionContext; +import co.aikar.commands.CommandCompletions; +import javax.annotation.Nonnull; +import org.bukkit.plugin.Plugin; +import vg.civcraft.mc.civmodcore.commands.CommandManager; + +public class ArtemisCommandManager extends CommandManager { + + public ArtemisCommandManager(Plugin plugin) { + super(plugin); + init(); + } + + @Override + public void registerCommands() { + registerCommand(new ShardTeleportCommand()); + } + + @Override + public void registerCompletions(@Nonnull CommandCompletions completions) { + super.registerCompletions(completions); + } +} diff --git a/src/main/java/com/github/maxopoly/artemis/commands/ShardTeleportCommand.java b/src/main/java/com/github/maxopoly/artemis/commands/ShardTeleportCommand.java index d229b3c..942c5b8 100644 --- a/src/main/java/com/github/maxopoly/artemis/commands/ShardTeleportCommand.java +++ b/src/main/java/com/github/maxopoly/artemis/commands/ShardTeleportCommand.java @@ -1,87 +1,46 @@ package com.github.maxopoly.artemis.commands; -import java.util.List; -import java.util.UUID; -import java.util.function.Consumer; - -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - +import co.aikar.commands.BaseCommand; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Optional; +import co.aikar.commands.annotation.Syntax; import com.github.maxopoly.artemis.ArtemisPlugin; import com.github.maxopoly.artemis.rabbit.outgoing.RequestPlayerLocation; import com.github.maxopoly.artemis.rabbit.session.ALocationRequestSession; import com.github.maxopoly.zeus.model.PlayerData; import com.github.maxopoly.zeus.model.TransactionIdManager; import com.github.maxopoly.zeus.model.ZeusLocation; +import java.util.UUID; +import java.util.function.Consumer; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; -import vg.civcraft.mc.civmodcore.command.CivCommand; -import vg.civcraft.mc.civmodcore.command.StandaloneCommand; - -@CivCommand(id = "stp") -public class ShardTeleportCommand extends StandaloneCommand { +public class ShardTeleportCommand extends BaseCommand { - @Override - public boolean execute(CommandSender sender, String[] args) { - if (args.length <= 4 && args.length != 2) { - if (!(sender instanceof Player)) { - sender.sendMessage("Fuck off"); - return true; - } - } - switch (args.length) { - case 1: { // TP Sender to player - UUID playerToTpTo = getPlayerUUID(sender, args[0]); + @CommandAlias("stp") + @Syntax("[player] [optional_player]") + @Description("Teleport to a player across any shard") + @CommandPermission("artemis.tp") + public void execute(Player sender, @Optional String targetPlayer, @Optional String optionalPlayer) {// TP Sender to player + if (targetPlayer != null && optionalPlayer == null) { + UUID playerToTpTo = getPlayerUUID(sender, targetPlayer); if (playerToTpTo == null) { - return true; + return; } setupLocationRequestForPlayer(playerToTpTo, l -> teleportToLocation(((Player) sender).getUniqueId(), l)); - break; } - case 2: // Tp First player to second one - UUID playerToTp = getPlayerUUID(sender, args[0]); - UUID playerToTpTo = getPlayerUUID(sender, args[1]); + if (targetPlayer != null && optionalPlayer != null) { + // Tp First player to second one + UUID playerToTp = getPlayerUUID(sender, targetPlayer); + UUID playerToTpTo = getPlayerUUID(sender, optionalPlayer); if (playerToTp == null || playerToTpTo == null) { - return true; + return; } setupLocationRequestForPlayer(playerToTpTo, l -> teleportToLocation(playerToTp, l)); - break; - case 3: // Tp sender to coords - case 4: { - String world; - if (args.length == 3) { - world = ArtemisPlugin.getInstance().getConfigManager().getWorldName(); - } else { - world = args[0]; - } - Integer x = parseInt(sender, args[args.length - 3]); - Integer y = parseInt(sender, args[args.length - 2]); - Integer z = parseInt(sender, args[args.length - 1]); - if (x == null || y == null || z == null) { - return true; - } - ZeusLocation location = new ZeusLocation(world, x, y, z); - teleportToLocation(((Player) sender).getUniqueId(), location); - break;} - case 5: - UUID targetPlayer = getPlayerUUID(sender, args[0]); - if (targetPlayer == null) { - return true; - } - String world = args[1]; - Integer x = parseInt(sender, args[2]); - Integer y = parseInt(sender, args[3]); - Integer z = parseInt(sender, args[4]); - if (x == null || y == null || z == null) { - return true; - } - ZeusLocation location = new ZeusLocation(world, x, y, z); - teleportToLocation(targetPlayer, location); - break; - default: - return false; } - return true; } private void setupLocationRequestForPlayer(UUID player, Consumer callback) { @@ -106,12 +65,6 @@ private UUID getPlayerUUID(CommandSender requester, String name) { return data.getUUID(); } - @Override - public List tabComplete(CommandSender sender, String[] args) { - // TODO Auto-generated method stub - return null; - } - private Integer parseInt(CommandSender sender, String toParse) { try { return Integer.parseInt(toParse); diff --git a/src/main/java/com/github/maxopoly/artemis/listeners/PlayerDataListener.java b/src/main/java/com/github/maxopoly/artemis/listeners/PlayerDataListener.java index c9852c7..1e2c3e1 100644 --- a/src/main/java/com/github/maxopoly/artemis/listeners/PlayerDataListener.java +++ b/src/main/java/com/github/maxopoly/artemis/listeners/PlayerDataListener.java @@ -1,5 +1,6 @@ package com.github.maxopoly.artemis.listeners; +import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -13,7 +14,6 @@ import com.github.maxopoly.artemis.rabbit.RabbitHandler; import com.github.maxopoly.artemis.rabbit.outgoing.RequestPlayerData; import com.github.maxopoly.artemis.rabbit.session.ArtemisPlayerDataTransferSession; -import com.github.maxopoly.zeus.rabbit.sessions.PlayerDataTransferSession; public class PlayerDataListener implements Listener { @@ -25,10 +25,10 @@ public void preLoginDataFetch(AsyncPlayerPreLoginEvent event) { ArtemisPlugin.getInstance().getZeus(), ticket, event.getUniqueId()); ArtemisPlugin.getInstance().getTransactionIdManager().putSession(session); rabbit.sendMessage(new RequestPlayerData(ticket, event.getUniqueId())); - event.setKickMessage(""); + event.kickMessage(Component.empty()); ArtemisPlugin.getInstance().getPlayerDataCache().putWaiting(event.getUniqueId(), event); synchronized (event) { - while (event.getKickMessage().equals("")) { + while (event.kickMessage().equals(Component.empty())) { try { event.wait(); } catch (InterruptedException e) { @@ -36,12 +36,12 @@ public void preLoginDataFetch(AsyncPlayerPreLoginEvent event) { } } } - if (event.getKickMessage().equals("D")) { + if (event.kickMessage().equals(Component.text("D"))) { event.disallow(Result.KICK_OTHER, "Internal data error, try waiting a few seconds and then login again. " + "If that does not help, consult an admin"); return; } - if (!event.getKickMessage().equals("A")) { + if (!event.kickMessage().equals(Component.text("A"))) { event.disallow(Result.KICK_OTHER, "Special internal error, tell an admin about this"); return; } diff --git a/src/main/java/com/github/maxopoly/artemis/nbt/CustomWorldNBTStorage.java b/src/main/java/com/github/maxopoly/artemis/nbt/CustomWorldNBTStorage.java index 0055a0a..bc16d41 100644 --- a/src/main/java/com/github/maxopoly/artemis/nbt/CustomWorldNBTStorage.java +++ b/src/main/java/com/github/maxopoly/artemis/nbt/CustomWorldNBTStorage.java @@ -1,5 +1,14 @@ package com.github.maxopoly.artemis.nbt; +import com.github.maxopoly.artemis.ArtemisPlugin; +import com.github.maxopoly.artemis.rabbit.session.ArtemisPlayerDataTransferSession; +import com.github.maxopoly.artemis.util.BukkitConversion; +import com.github.maxopoly.zeus.ZeusMain; +import com.github.maxopoly.zeus.model.ConnectedMapState; +import com.github.maxopoly.zeus.model.ZeusLocation; +import com.github.maxopoly.zeus.rabbit.outgoing.artemis.SendPlayerData; +import com.github.maxopoly.zeus.rabbit.sessions.PlayerDataTransferSession; +import com.mojang.datafixers.DataFixer; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; @@ -7,7 +16,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.Field; -import java.lang.reflect.Modifier; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -17,43 +25,26 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.LinkedBlockingDeque; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; import java.util.logging.Level; - +import net.minecraft.SystemUtils; +import net.minecraft.nbt.GameProfileSerializer; +import net.minecraft.nbt.NBTCompressedStreamTools; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.dedicated.DedicatedPlayerList; +import net.minecraft.server.players.PlayerList; +import net.minecraft.util.datafix.DataFixTypes; +import net.minecraft.world.entity.player.EntityHuman; +import net.minecraft.world.level.storage.Convertable; +import net.minecraft.world.level.storage.SavedFile; +import net.minecraft.world.level.storage.WorldNBTStorage; import org.bukkit.Bukkit; import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_16_R3.CraftServer; - -import com.github.maxopoly.artemis.ArtemisPlugin; -import com.github.maxopoly.artemis.rabbit.session.ArtemisPlayerDataTransferSession; -import com.github.maxopoly.artemis.util.BukkitConversion; -import com.github.maxopoly.zeus.ZeusMain; -import com.github.maxopoly.zeus.model.ConnectedMapState; -import com.github.maxopoly.zeus.model.ZeusLocation; -import com.github.maxopoly.zeus.rabbit.outgoing.artemis.SendPlayerData; -import com.github.maxopoly.zeus.rabbit.sessions.PlayerDataTransferSession; -import com.mojang.datafixers.DataFixer; +import org.bukkit.craftbukkit.v1_17_R1.CraftServer; +import vg.civcraft.mc.civmodcore.nbt.wrappers.NBTCompound; +import vg.civcraft.mc.civmodcore.players.settings.PlayerSetting; +import vg.civcraft.mc.civmodcore.players.settings.PlayerSettingAPI; -import net.minecraft.server.v1_16_R3.Convertable; -import net.minecraft.server.v1_16_R3.Convertable.ConversionSession; -import net.minecraft.server.v1_16_R3.DataFixTypes; -import net.minecraft.server.v1_16_R3.DedicatedPlayerList; -import net.minecraft.server.v1_16_R3.EntityHuman; -import net.minecraft.server.v1_16_R3.GameProfileSerializer; -import net.minecraft.server.v1_16_R3.MinecraftServer; -import net.minecraft.server.v1_16_R3.NBTCompressedStreamTools; -import net.minecraft.server.v1_16_R3.NBTTagCompound; -import net.minecraft.server.v1_16_R3.PlayerList; -import net.minecraft.server.v1_16_R3.SavedFile; -import net.minecraft.server.v1_16_R3.SystemUtils; -import net.minecraft.server.v1_16_R3.WorldNBTStorage; -import vg.civcraft.mc.civmodcore.playersettings.PlayerSetting; -import vg.civcraft.mc.civmodcore.playersettings.PlayerSettingAPI; -import vg.civcraft.mc.civmodcore.serialization.NBTCompound; public class CustomWorldNBTStorage extends WorldNBTStorage { @@ -78,9 +69,9 @@ public static synchronized boolean isActive(UUID uuid) { private final File playerDir; - private CustomWorldNBTStorage(ConversionSession conversionsession, DataFixer datafixer) { + private CustomWorldNBTStorage(Convertable.ConversionSession conversionsession, DataFixer datafixer) { super(conversionsession, datafixer); - this.playerDir = conversionsession.getWorldFolder(SavedFile.PLAYERDATA).toFile(); + this.playerDir = conversionsession.getWorldFolder(SavedFile.c).toFile(); this.playerDir.mkdirs(); this.customDataOriginallyLoaded = new ConcurrentHashMap<>(); } @@ -95,9 +86,8 @@ public void stopExecutor() { public static ZeusLocation readZeusLocation(byte[] playerData) { try { - NBTTagCompound nbttagcompound = NBTCompressedStreamTools.a(new ByteArrayInputStream(playerData)); - NBTCompound comp = new NBTCompound(nbttagcompound); - double[] pos = comp.getDoubleArray("Pos"); + NBTCompound nbtCompound = new NBTCompound(NBTCompressedStreamTools.a(new ByteArrayInputStream(playerData))); + double[] pos = nbtCompound.getDoubleArray("Pos"); ConnectedMapState mapState = ArtemisPlugin.getInstance().getConfigManager().getConnectedMapState(); return new ZeusLocation(mapState.getWorld(), pos[0], pos[1], pos[2]); } catch (IOException e) { @@ -189,7 +179,7 @@ public NBTTagCompound load(EntityHuman entityhuman) { NBTTagCompound comp = loadCompound(entityhuman.getUniqueID()); if (comp != null) { int i = comp.hasKeyOfType("DataVersion", 3) ? comp.getInt("DataVersion") : -1; - entityhuman.load(GameProfileSerializer.a(this.a, DataFixTypes.PLAYER, comp, i)); + entityhuman.load(GameProfileSerializer.a(this.a, DataFixTypes.b, comp, i)); } return comp; } @@ -217,24 +207,24 @@ private NBTTagCompound loadCompound(UUID uuid) { ArtemisPlugin.getInstance().getRandomSpawnHandler().getRandomSpawnLocation(uuid)); } if (loc != null) { - comp.setDoubleArray("Pos", new double[] { loc.getX(), loc.getY(), loc.getZ() }); + comp.setDoubleArray("Pos", new double[] {loc.getX(), loc.getY(), loc.getZ()}); } insertWorldUUID(comp); if (comp.hasKeyOfType(CUSTOM_DATA_ID, 10)) { - NBTCompound customData = comp.getCompound(CUSTOM_DATA_ID); + NBTTagCompound customData = comp.getCompound(CUSTOM_DATA_ID); extractCustomPlayerData(uuid, customData); } if (ArtemisPlugin.getInstance().getConfigManager().isDebugEnabled()) { - ArtemisPlugin.getInstance().getLogger().info("Loaded NBT : " + comp.toString()); + ArtemisPlugin.getInstance().getLogger().info("Loaded NBT : " + comp); } - return comp.getRAW(); + return comp; } catch (IOException e) { ArtemisPlugin.getInstance().getLogger().log(Level.SEVERE, "Failed to load player data", e); return null; } } - private static void insertWorldUUID(NBTCompound compound) { + private static void insertWorldUUID(NBTTagCompound compound) { String worldName = ArtemisPlugin.getInstance().getConfigManager().getConnectedMapState().getWorld(); UUID worldUUID = Bukkit.getWorld(worldName).getUID(); compound.setLong("WorldUUIDLeast", worldUUID.getLeastSignificantBits()); @@ -247,15 +237,15 @@ public static CustomWorldNBTStorage insertCustomNBTHandler() { Field trueServerField = CraftServer.class.getDeclaredField("console"); trueServerField.setAccessible(true); MinecraftServer trueServer = (MinecraftServer) trueServerField.get(server); - Field nbtField = MinecraftServer.class.getDeclaredField("worldNBTStorage"); - Convertable.ConversionSession session = trueServer.convertable; - DataFixer dataFixer = trueServer.dataConverterManager; + Field nbtField = MinecraftServer.class.getDeclaredField("k"); + Convertable.ConversionSession session = trueServer.j; + DataFixer dataFixer = trueServer.O; CustomWorldNBTStorage customNBT = new CustomWorldNBTStorage(session, dataFixer); overwriteFinalField(nbtField, customNBT, trueServer); Field playerListField = CraftServer.class.getDeclaredField("playerList"); playerListField.setAccessible(true); DedicatedPlayerList playerList = (DedicatedPlayerList) playerListField.get(server); - Field nbtPlayerListField = PlayerList.class.getField("playerFileData"); + Field nbtPlayerListField = PlayerList.class.getField("r"); overwriteFinalField(nbtPlayerListField, customNBT, playerList); return customNBT; } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { @@ -264,7 +254,7 @@ public static CustomWorldNBTStorage insertCustomNBTHandler() { } } - private void extractCustomPlayerData(UUID player, NBTCompound specialDataCompound) { + private void extractCustomPlayerData(UUID player, NBTTagCompound specialDataCompound) { // we keep data in this map so settings not loaded on the server currently are // not reset Map extractedData = new HashMap<>(); @@ -295,26 +285,20 @@ private void insertCustomPlayerData(UUID player, NBTTagCompound generalPlayerDat String serial = setting.serialize(setting.getValue(player)); dataToInsert.put(setting.getIdentifier(), serial); } - NBTCompound comp = new NBTCompound(generalPlayerDataCompound); - NBTCompound customDataComp = new NBTCompound(); + NBTTagCompound comp = generalPlayerDataCompound; + NBTTagCompound customDataComp = new NBTTagCompound(); for (Entry entry : dataToInsert.entrySet()) { customDataComp.setString(entry.getKey(), entry.getValue()); } - comp.setCompound(CUSTOM_DATA_ID, customDataComp); + comp.set(CUSTOM_DATA_ID, customDataComp); } private static void overwriteFinalField(Field field, Object newValue, Object obj) { try { field.setAccessible(true); - // remove final modifier from field - Field modifiersField; - modifiersField = Field.class.getDeclaredField("modifiers"); - modifiersField.setAccessible(true); - modifiersField.setInt(field, field.getModifiers() & ~Modifier.PROTECTED); field.set(obj, newValue); - } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { - ArtemisPlugin.getInstance().getLogger().log(Level.SEVERE, "Failed to set final field", e); + } catch (SecurityException | IllegalArgumentException | IllegalAccessException e) { + ArtemisPlugin.getInstance().getLogger().log(Level.SEVERE, "Failed to set final field", e.getStackTrace()); } } - } diff --git a/src/main/java/com/github/maxopoly/artemis/rabbit/incoming/playertransfer/HandleReplyReceivePlayerData.java b/src/main/java/com/github/maxopoly/artemis/rabbit/incoming/playertransfer/HandleReplyReceivePlayerData.java index ba541e9..1e6695a 100644 --- a/src/main/java/com/github/maxopoly/artemis/rabbit/incoming/playertransfer/HandleReplyReceivePlayerData.java +++ b/src/main/java/com/github/maxopoly/artemis/rabbit/incoming/playertransfer/HandleReplyReceivePlayerData.java @@ -1,5 +1,6 @@ package com.github.maxopoly.artemis.rabbit.incoming.playertransfer; +import com.github.maxopoly.zeus.rabbit.PacketSession; import org.json.JSONObject; import com.github.maxopoly.artemis.ArtemisPlugin; @@ -8,7 +9,7 @@ import com.github.maxopoly.zeus.rabbit.outgoing.artemis.SendPlayerData; import com.github.maxopoly.zeus.servers.ConnectedServer; -public class HandleReplyReceivePlayerData extends InteractiveRabbitCommand { +public class HandleReplyReceivePlayerData extends InteractiveRabbitCommand { @Override public String getIdentifier() { @@ -21,11 +22,14 @@ public boolean createSession() { } @Override - public boolean handleRequest(ArtemisPlayerDataTransferSession connState, ConnectedServer sendingServer, JSONObject data) { + public boolean handleRequest(PacketSession connState, ConnectedServer sendingServer, JSONObject data) { + if (!(connState instanceof ArtemisPlayerDataTransferSession session)) { + return false; + } boolean accepted = data.getBoolean("accepted"); if (!accepted) { //fallback for recovery - ArtemisPlugin.getInstance().getCustomNBTStorage().vanillaSave(connState.getEntityHuman()); + ArtemisPlugin.getInstance().getCustomNBTStorage().vanillaSave(session.getEntityHuman()); } return false; } diff --git a/src/main/java/com/github/maxopoly/artemis/rabbit/incoming/playertransfer/HandleZeusRequestPlayerData.java b/src/main/java/com/github/maxopoly/artemis/rabbit/incoming/playertransfer/HandleZeusRequestPlayerData.java index 1a4fabd..97bd56c 100644 --- a/src/main/java/com/github/maxopoly/artemis/rabbit/incoming/playertransfer/HandleZeusRequestPlayerData.java +++ b/src/main/java/com/github/maxopoly/artemis/rabbit/incoming/playertransfer/HandleZeusRequestPlayerData.java @@ -1,12 +1,5 @@ package com.github.maxopoly.artemis.rabbit.incoming.playertransfer; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.UUID; - -import org.bukkit.Bukkit; -import org.json.JSONObject; - import com.github.maxopoly.artemis.ArtemisPlugin; import com.github.maxopoly.artemis.nbt.CustomWorldNBTStorage; import com.github.maxopoly.artemis.rabbit.outgoing.SendRequestedPlayerData; @@ -15,9 +8,14 @@ import com.github.maxopoly.zeus.rabbit.outgoing.artemis.SendPlayerData; import com.github.maxopoly.zeus.rabbit.outgoing.artemis.ZeusRequestPlayerData; import com.github.maxopoly.zeus.servers.ConnectedServer; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.UUID; +import net.minecraft.nbt.NBTCompressedStreamTools; +import net.minecraft.nbt.NBTTagCompound; +import org.bukkit.Bukkit; +import org.json.JSONObject; -import net.minecraft.server.v1_16_R3.NBTCompressedStreamTools; -import net.minecraft.server.v1_16_R3.NBTTagCompound; public class HandleZeusRequestPlayerData extends GenericInteractiveRabbitCommand { diff --git a/src/main/java/com/github/maxopoly/artemis/rabbit/session/ArtemisPlayerDataTransferSession.java b/src/main/java/com/github/maxopoly/artemis/rabbit/session/ArtemisPlayerDataTransferSession.java index ea6d7a3..6394490 100644 --- a/src/main/java/com/github/maxopoly/artemis/rabbit/session/ArtemisPlayerDataTransferSession.java +++ b/src/main/java/com/github/maxopoly/artemis/rabbit/session/ArtemisPlayerDataTransferSession.java @@ -1,11 +1,10 @@ package com.github.maxopoly.artemis.rabbit.session; -import java.util.UUID; - import com.github.maxopoly.zeus.rabbit.sessions.PlayerDataTransferSession; import com.github.maxopoly.zeus.servers.ConnectedServer; +import java.util.UUID; +import net.minecraft.world.entity.player.EntityHuman; -import net.minecraft.server.v1_16_R3.EntityHuman; public class ArtemisPlayerDataTransferSession extends PlayerDataTransferSession { diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index cb16493..fcd1f5e 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,29 +1,13 @@ # READ MORE: https://www.spigotmc.org/wiki/plugin-yml/ name: ${project.name} - version: ${project.version} - main: ${project.groupId}.${project.artifactId}.ArtemisPlugin - -api-version: 1.14 - +api-version: 1.17 depend: [CivModCore] - softdepend: [] - authors: [Maxopoly] -commands: - stp: - aliases: - - shardteleport - usage: /stp - description: Teleports you somewhere - min-args: 1 - max-args: 5 - player-only: false - permission: artemis.tp permissions: artemis.tp: description: Gives access to the teleport command