diff --git a/build.gradle b/build.gradle index 3acc204..23c0144 100644 --- a/build.gradle +++ b/build.gradle @@ -41,7 +41,8 @@ repositories { // includeLibs just says to include the library in the final jar dependencies { - implementation "org.bukkit:bukkit:1.15.1-R0.1-SNAPSHOT" + //implementation "org.bukkit:bukkit:1.16.1-R0.1-SNAPSHOT" + implementation "org.spigotmc:spigot-api:1.16.1-R0.1-SNAPSHOT" implementation "net.md-5:bungeecord-api:1.15-SNAPSHOT" implementation "io.netty:netty-all:4.0.4.Final" diff --git a/src/main/java/com/sekwah/advancedportals/bukkit/AdvancedPortalsCommand.java b/src/main/java/com/sekwah/advancedportals/bukkit/AdvancedPortalsCommand.java index 8c6feb6..6557d73 100644 --- a/src/main/java/com/sekwah/advancedportals/bukkit/AdvancedPortalsCommand.java +++ b/src/main/java/com/sekwah/advancedportals/bukkit/AdvancedPortalsCommand.java @@ -6,6 +6,9 @@ import com.sekwah.advancedportals.bukkit.config.ConfigAccessor; import com.sekwah.advancedportals.bukkit.listeners.Listeners; import com.sekwah.advancedportals.bukkit.portals.AdvancedPortal; import com.sekwah.advancedportals.bukkit.portals.Portal; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.*; import org.bukkit.DyeColor; import org.bukkit.Location; import org.bukkit.Material; @@ -23,6 +26,7 @@ import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.material.Wool; import org.bukkit.metadata.FixedMetadataValue; +import javax.xml.soap.Text; import java.util.*; import java.util.stream.Collectors; @@ -462,21 +466,31 @@ public class AdvancedPortalsCommand implements CommandExecutor, TabCompleter { player.sendMessage(PluginMessages.customPrefixFail + " You had no portal selected!"); } case "gui": + // /portal gui remove testarg if (args.length > 1) { if (args[1].toLowerCase().equals("remove") && args.length > 2) { sender.sendMessage(""); sender.sendMessage(PluginMessages.customPrefixFail + " Are you sure you would like to remove the portal \u00A7e" + args[2] + "\u00A7c?"); + + TextComponent removeMessage = new TextComponent(); + TextComponent yes = new TextComponent("[Yes]"); + yes.setColor(ChatColor.YELLOW); + yes.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/portal remove " + args[2])); + yes.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("Confirm removing this portal").create())); + TextComponent no = new TextComponent("[No]"); + no.setColor(ChatColor.YELLOW); + no.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/portal edit " + args[2])); + no.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("Cancel removing this portal").create())); + + removeMessage.addExtra(" "); + removeMessage.addExtra(yes); + removeMessage.addExtra(" "); + removeMessage.addExtra(no); + sender.sendMessage(""); - plugin.compat.sendRawMessage( - "{\"text\":\" \",\"extra\":[{\"text\":\"\u00A7e[Yes]\",\"hoverEvent\":{\"action\":\"show_text\"," - + "\"value\":\"Confirm removing this portal\"},\"clickEvent\":{\"action\":\"run_command\",\"value\":\"/portal remove " - + args[2] + "\"}}, " - + "{\"text\":\" \"},{\"text\":\"\u00A7e[No]\",\"hoverEvent\":{\"action\":\"show_text\",\"value\":\"Cancel removing this portal\"}" - + ",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"/portal edit " - + args[2] + "\"}}]}", - player); + sender.spigot().sendMessage(removeMessage); sender.sendMessage(""); } } @@ -551,11 +565,11 @@ public class AdvancedPortalsCommand implements CommandExecutor, TabCompleter { // TODO add the command autocompletes, add, remove and show if (args[1].toLowerCase().equals("add")) { if (args.length > 2) { - String portalCommand = args[2]; + StringBuilder portalCommand = new StringBuilder(args[2]); for (int i = 3; i < args.length; i++) { - portalCommand += args[i]; + portalCommand.append(args[i]); } - if (Portal.addCommand(portalName, portalCommand)) { + if (Portal.addCommand(portalName, portalCommand.toString())) { sender.sendMessage( PluginMessages.customPrefixFail + " Command added to portal!"); } else { @@ -826,15 +840,65 @@ public class AdvancedPortalsCommand implements CommandExecutor, TabCompleter { sender.sendMessage(""); Player player = (Player) sender; + /*TextComponent editMessage = new TextComponent(); + editMessage.setColor(ChatColor.GREEN);*/ +/* TextComponent yes = new TextComponent("Functions"); + yes.setColor(ChatColor.YELLOW); + yes.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/portal remove " + args[2])); + yes.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("Confirm removing this portal").create())); + TextComponent no = new TextComponent("[No]"); + no.setColor(ChatColor.YELLOW); + no.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/portal edit " + args[2])); + no.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("Cancel removing this portal").create())); - plugin.compat.sendRawMessage("{\"text\":\"\u00A7aFunctions\u00A7e: \"," + removeMessage.addExtra(" "); + removeMessage.addExtra(no); + removeMessage.addExtra(" "); + removeMessage.addExtra(yes);*/ + + TextComponent removeButton = new TextComponent("Remove"); + removeButton.setColor(ChatColor.YELLOW); + removeButton.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, + new ComponentBuilder("Remove the selected portal").create())); + removeButton.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, + "/portal gui remove " + portalName)); + + TextComponent showButton = new TextComponent("Show"); + showButton.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, + new ComponentBuilder("Show the selected portal").create())); + showButton.setColor(ChatColor.YELLOW); + showButton.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/portal show " + portalName)); + + TextComponent renameButton = new TextComponent("Rename"); + renameButton.setColor(ChatColor.YELLOW); + renameButton.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, + new ComponentBuilder("Change the name of the portal").create())); + renameButton.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/portal rename ")); + + TextComponent activateButton = new TextComponent("Activate"); + activateButton.setColor(ChatColor.YELLOW); + activateButton.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, + new ComponentBuilder("Trigger it as if you've just walked into it (Minus failing knockback)").create())); + activateButton.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/portal warp " + portalName)); + + BaseComponent[] editMessage = new ComponentBuilder("Functions").color(ChatColor.GREEN) + .append(": ").color(ChatColor.YELLOW) + .append(removeButton).append(" ") + .append(showButton).append(" ") + .append(renameButton).append(" ") + .append(activateButton).append(" ") + .create(); + + sender.spigot().sendMessage(editMessage); + + /*player.spigot().sendMessage(TextComponent.fromLegacyText("{\"text\":\"\u00A7aFunctions\u00A7e: \"," + "\"extra\":[{\"text\":\"\u00A7eRemove\",\"hoverEvent\":{\"action\":\"show_text\",\"value\":\"Remove the selected portal\"},\"clickEvent\":{\"action\":\"run_command\",\"value\":\"/portal gui remove " + portalName + "\"}}" + ",{\"text\":\" \"},{\"text\":\"\u00A7eShow\",\"hoverEvent\":{\"action\":\"show_text\",\"value\":\"Show the selected portal\"},\"clickEvent\":{\"action\":\"run_command\",\"value\":\"/portal show " + portalName + "\"}}" + ",{\"text\":\" \"},{\"text\":\"\u00A7eRename\",\"hoverEvent\":{\"action\":\"show_text\",\"value\":\"Change the name of the portal\"},\"clickEvent\":{\"action\":\"suggest_command\",\"value\":\"/portal rename \"}}" + ",{\"text\":\" \"},{\"text\":\"\u00A7eTeleport\",\"hoverEvent\":{\"action\":\"show_text\",\"value\":\"Teleport to the set destination\n(If there is one)\"},\"clickEvent\":{\"action\":\"run_command\",\"value\":\"/desti warp " - + destination + "\"}}]}", player); + + destination + "\"}}]}"));*/ sender.sendMessage(""); diff --git a/src/main/java/com/sekwah/advancedportals/bukkit/AdvancedPortalsPlugin.java b/src/main/java/com/sekwah/advancedportals/bukkit/AdvancedPortalsPlugin.java index 285d083..e7685ee 100644 --- a/src/main/java/com/sekwah/advancedportals/bukkit/AdvancedPortalsPlugin.java +++ b/src/main/java/com/sekwah/advancedportals/bukkit/AdvancedPortalsPlugin.java @@ -1,6 +1,5 @@ package com.sekwah.advancedportals.bukkit; -import com.sekwah.advancedportals.bukkit.compat.CraftBukkit; import com.sekwah.advancedportals.bukkit.config.ConfigAccessor; import com.sekwah.advancedportals.bukkit.config.ConfigHelper; import com.sekwah.advancedportals.bukkit.destinations.Destination; @@ -14,7 +13,7 @@ import org.bukkit.plugin.java.JavaPlugin; public class AdvancedPortalsPlugin extends JavaPlugin { - public CraftBukkit compat = null; + //public CraftBukkit compat = null; private Settings settings; public String channelName = "mc:advancedportals"; @@ -29,65 +28,52 @@ public class AdvancedPortalsPlugin extends JavaPlugin { saveDefaultConfig(); - Metrics metrics = new Metrics(this); + /*Metrics metrics = */ + new Metrics(this); - try { - this.compat = new CraftBukkit(this, version); + //this.compat = new CraftBukkit(this, version); - ConfigAccessor config = new ConfigAccessor(this, "config.yml"); + ConfigAccessor config = new ConfigAccessor(this, "config.yml"); - ConfigHelper configHelper = new ConfigHelper(config.getConfig()); + ConfigHelper configHelper = new ConfigHelper(config.getConfig()); - configHelper.update(); + configHelper.update(); - config.saveConfig(); + config.saveConfig(); - // TODO reenable and finish but probably focus on the recode first + // TODO reenable and finish but probably focus on the recode first /*if(config.getConfig().getBoolean("DisableGatewayBeam", true)) { new PacketInjector(this, version); }*/ - ConfigAccessor portalConfig = new ConfigAccessor(this, "portals.yml"); - portalConfig.saveDefaultConfig(); + ConfigAccessor portalConfig = new ConfigAccessor(this, "portals.yml"); + portalConfig.saveDefaultConfig(); - ConfigAccessor destinationConfig = new ConfigAccessor(this, "destinations.yml"); - destinationConfig.saveDefaultConfig(); + ConfigAccessor destinationConfig = new ConfigAccessor(this, "destinations.yml"); + destinationConfig.saveDefaultConfig(); - this.settings = new Settings(this); + this.settings = new Settings(this); - // Loads the portal and destination editors - new Portal(this); - new Destination(this); + // Loads the portal and destination editors + new Portal(this); + new Destination(this); - this.registerCommands(); + this.registerCommands(); - new WarpEffects(this); + new WarpEffects(this); - this.addListeners(); - this.setupDataCollector(); + this.addListeners(); + this.setupDataCollector(); - this.setupBungee(); + this.setupBungee(); - this.getServer().getConsoleSender().sendMessage("\u00A7aAdvanced portals have been successfully enabled!"); - - } catch (ClassNotFoundException e) { - e.printStackTrace(); - this.getLogger().warning("This version of craftbukkit is not yet supported, please notify sekwah and tell him about this version v:" + version); - this.getLogger().warning("Along with the above stacktrace"); - this.setEnabled(false); - } catch (IllegalArgumentException | - NoSuchFieldException | SecurityException | NoSuchMethodException e) { - e.printStackTrace(); - this.getLogger().warning("Something went wrong, please notify sekwah and tell him about this version v:" + version); - this.getLogger().warning("Along with the above stacktrace"); - this.setEnabled(false); - } + this.getServer().getConsoleSender().sendMessage("\u00A7aAdvanced portals have been successfully enabled!"); for (Player player: - this.getServer().getOnlinePlayers()) { + this.getServer().getOnlinePlayers()) { player.removeMetadata("hasWarped", this); player.removeMetadata("lavaWarped", this); } diff --git a/src/main/java/com/sekwah/advancedportals/bukkit/compat/CraftBukkit.java b/src/main/java/com/sekwah/advancedportals/bukkit/compat/CraftBukkit.java deleted file mode 100644 index 2188215..0000000 --- a/src/main/java/com/sekwah/advancedportals/bukkit/compat/CraftBukkit.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.sekwah.advancedportals.bukkit.compat; - -import com.sekwah.advancedportals.bukkit.AdvancedPortalsPlugin; -import com.sekwah.advancedportals.bukkit.reflection.ReflectionHelper; -import org.bukkit.entity.Player; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -public class CraftBukkit { - - private final AdvancedPortalsPlugin plugin; - - // Data for chat bar and json message - private Method chatMessageTypeMethod; - - private Method serializeMessage; - private Constructor chatPacketConstructor; - - private Method playerGetHandle; - private Field playerConnection; - private Method sendPacket; - - - public CraftBukkit(AdvancedPortalsPlugin plugin, String bukkitImpl) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException { - - this.plugin = plugin; - - try { - String craftBukkitPackage = "org.bukkit.craftbukkit." + bukkitImpl + "."; - String minecraftPackage = "net.minecraft.server." + bukkitImpl + "."; - - this.plugin.getLogger().info("Bukkit version detected " + bukkitImpl); - - Class chatBaseComponent = Class.forName(minecraftPackage + "IChatBaseComponent"); // string to packet methods - Class chatSerialClass = ReflectionHelper.findClass(chatBaseComponent, "ChatSerializer"); - - Class chatMessageTypeClass = Class.forName(minecraftPackage + "ChatMessageType"); - - this.chatMessageTypeMethod = chatMessageTypeClass.getMethod("a", byte.class); - - this.chatPacketConstructor = Class.forName(minecraftPackage + "PacketPlayOutChat").getConstructor(chatBaseComponent, chatMessageTypeClass); - - - this.serializeMessage = chatSerialClass.getMethod("a", String.class); - - this.playerGetHandle = Class.forName(craftBukkitPackage + "entity.CraftPlayer").getMethod("getHandle"); - this.playerConnection = Class.forName(minecraftPackage + "EntityPlayer").getField("playerConnection"); // get player connection - Class packet = Class.forName(minecraftPackage + "Packet"); - this.sendPacket = playerConnection.getType().getMethod("sendPacket", packet); - - } catch (Exception e) { - e.printStackTrace(); - plugin.getLogger().warning("Attempting to use backup porekit locations"); - // Fall back on your Porekit - Class textBaseComponent = Class.forName("net.minecraft.util.text.ITextComponent"); // string to packet methods - this.serializeMessage = ReflectionHelper.findClass(textBaseComponent, "Serializer").getMethod("func_150699_a", String.class); // md: jsonToComponent - this.chatPacketConstructor = Class.forName("net.minecraft.network.play.server.SPacketChat").getConstructor(textBaseComponent, byte.class); - - this.playerGetHandle = Class.forName("blue.lapis.pore.impl.entity.PorePlayer").getMethod("getHandle"); - this.playerConnection = Class.forName("net.minecraft.entity.player.EntityPlayerMP").getField("field_71135_a"); // get player connection fd: connection - Class packet = Class.forName("net.minecraft.network.Packet"); - this.sendPacket = playerConnection.getType().getMethod("func_147359_a", packet); //md: sendPacket - } - } - - public void sendRawMessage(String rawMessage, Player player) { - this.sendMessage(rawMessage,player, (byte) 1); - } - - public void sendActionBarMessage(String rawMessage, Player player) { - this.sendMessage("{\"text\":\"" + rawMessage + "\"}",player, (byte) 2); - } - - public void sendMessage(String rawMessage, Player player, byte msgType) { - try { - Object comp = this.serializeMessage.invoke(null, rawMessage); - Object packet = this.chatPacketConstructor.newInstance(comp, this.chatMessageTypeMethod.invoke(null,msgType)); // convert bytes into packet - - Object handle = this.playerGetHandle.invoke(player); - Object playerConnection = this.playerConnection.get(handle); // get players connection - sendPacket.invoke(playerConnection, packet); // send packet - } catch (IllegalAccessException | InvocationTargetException | InstantiationException e) { - this.plugin.getLogger().warning("Error creating raw message, something must be wrong with reflection"); - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/sekwah/advancedportals/bukkit/destinations/Destination.java b/src/main/java/com/sekwah/advancedportals/bukkit/destinations/Destination.java index fa28a01..7fd1404 100644 --- a/src/main/java/com/sekwah/advancedportals/bukkit/destinations/Destination.java +++ b/src/main/java/com/sekwah/advancedportals/bukkit/destinations/Destination.java @@ -4,6 +4,8 @@ import com.sekwah.advancedportals.bukkit.AdvancedPortalsPlugin; import com.sekwah.advancedportals.bukkit.config.ConfigAccessor; import com.sekwah.advancedportals.bukkit.PluginMessages; import com.sekwah.advancedportals.bukkit.effects.WarpEffects; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.Location; @@ -150,7 +152,7 @@ public class Destination { player.sendMessage(PluginMessages.customPrefixFail + "\u00A7a You have been warped to \u00A7e" + name.replaceAll("_", " ") + "\u00A7a."); player.sendMessage(""); } else if (PORTAL_MESSAGE_DISPLAY == 2 && !hideActionbar) { - plugin.compat.sendActionBarMessage("\u00A7aYou have warped to \u00A7e" + name.replaceAll("_", " ") + "\u00A7a.", player); + player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText("\u00A7aYou have warped to \u00A7e" + name.replaceAll("_", " ") + "\u00A7a.")); } return true; diff --git a/src/main/java/com/sekwah/advancedportals/bukkit/portals/Portal.java b/src/main/java/com/sekwah/advancedportals/bukkit/portals/Portal.java index 1c0bbcc..20cb57a 100644 --- a/src/main/java/com/sekwah/advancedportals/bukkit/portals/Portal.java +++ b/src/main/java/com/sekwah/advancedportals/bukkit/portals/Portal.java @@ -9,6 +9,8 @@ import com.sekwah.advancedportals.bukkit.api.portaldata.PortalArg; import com.sekwah.advancedportals.bukkit.destinations.Destination; import com.sekwah.advancedportals.bukkit.effects.WarpEffects; import com.sekwah.advancedportals.bungee.BungeeMessages; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.*; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; @@ -581,8 +583,8 @@ public class Portal { if (warped) { if (hasMessage) { - plugin.compat.sendActionBarMessage(portal.getArg("message").replaceAll("&(?=[0-9a-fk-or])", "\u00A7"), - player); + player.spigot().sendMessage(ChatMessageType.ACTION_BAR, + TextComponent.fromLegacyText(portal.getArg("message").replaceAll("&(?=[0-9a-fk-or])", "\u00A7"))); } } diff --git a/src/main/resources/bungee.yml b/src/main/resources/bungee.yml index 4135b2b..8e77fc8 100644 --- a/src/main/resources/bungee.yml +++ b/src/main/resources/bungee.yml @@ -1,4 +1,4 @@ main: com.sekwah.advancedportals.bungee.AdvancedPortalsPlugin name: AdvancedPortals -version: 0.5.4 +version: 0.5.5 author: sekwah41 diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index a1e85e5..41f17d6 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ main: com.sekwah.advancedportals.bukkit.AdvancedPortalsPlugin name: AdvancedPortals -version: 0.5.4 +version: 0.5.5 author: sekwah41 description: An advanced portals plugin for bukkit. api-version: 1.13