diff --git a/build.gradle b/build.gradle index 471f833..2a96889 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ plugins { } group = 'me.skymc' -version = '5.15' +version = '5.16' sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/src/main/scala/io/izzel/taboolib/common/listener/ListenerCommand.java b/src/main/scala/io/izzel/taboolib/common/listener/ListenerCommand.java index 385609a..d12419b 100644 --- a/src/main/scala/io/izzel/taboolib/common/listener/ListenerCommand.java +++ b/src/main/scala/io/izzel/taboolib/common/listener/ListenerCommand.java @@ -62,10 +62,10 @@ public class ListenerCommand implements Listener { TabooLibAPI.debug(true); TLogger.getGlobalLogger().info("&aEnabled."); } - } else if ("libupdate".equalsIgnoreCase(e.getCommand())) { + } else if (e.getCommand().equalsIgnoreCase("libUpdate")) { e.setCancelled(true); - e.getSender().sendMessage("§8[§fTabooLib§8] §cWARNING §7| §4Update TabooLib will force to restart your server. Please confirm this action by type §c/libupdateConfirm"); - } else if ("libupdateConfirm".equalsIgnoreCase(e.getCommand()) || "libupdate confirm".equalsIgnoreCase(e.getCommand())) { + e.getSender().sendMessage("§8[§fTabooLib§8] §cWARNING §7| §4Update TabooLib will force to restart your server. Please confirm this action by type §c/libupdateconfirm"); + } else if (e.getCommand().equalsIgnoreCase("libUpdateConfirm") || e.getCommand().equalsIgnoreCase("libUpdate confirm")) { e.getSender().sendMessage("§8[§fTabooLib§8] §7Downloading TabooLib file..."); Files.downloadFile("https://skymc.oss-cn-shanghai.aliyuncs.com/plugins/TabooLib.jar", new File("libs/TabooLib.jar")); e.getSender().sendMessage("§8[§fTabooLib§8] §2Download completed, the server will restart in 3 secs"); diff --git a/src/main/scala/io/izzel/taboolib/util/Hastebin.java b/src/main/scala/io/izzel/taboolib/util/Hastebin.java new file mode 100644 index 0000000..f1f4183 --- /dev/null +++ b/src/main/scala/io/izzel/taboolib/util/Hastebin.java @@ -0,0 +1,57 @@ +package io.izzel.taboolib.util; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; + +/** + * @author Arasple + * @date 2020/1/20 16:40 + */ +public class Hastebin { + + private static final String HASTEBIN_URL = "https://hasteb.in/"; + + public static Result paste(String content) { + try { + HttpURLConnection con = (HttpURLConnection) new URL(HASTEBIN_URL + "documents").openConnection(); + con.setRequestMethod("POST"); + con.setRequestProperty("Charset", "UTF-8"); + con.setDoInput(true); + con.setDoOutput(true); + OutputStream os = con.getOutputStream(); + os.write(content.getBytes(StandardCharsets.UTF_8)); + return new Result(IO.readFully(con.getInputStream(), StandardCharsets.UTF_8)); + } catch (Throwable e) { + return null; + } + } + + public static class Result { + + private String source; + private JsonObject sourceJson; + + public Result(String source) { + this.source = source; + this.sourceJson = new JsonParser().parse(source).getAsJsonObject(); + } + + public String getURL() { + return HASTEBIN_URL + sourceJson.get("key").getAsString(); + } + + public String getSource() { + return source; + } + + public JsonObject getSourceJson() { + return sourceJson; + } + } + +} \ No newline at end of file diff --git a/src/main/scala/io/izzel/taboolib/util/item/MapBuilder.java b/src/main/scala/io/izzel/taboolib/util/item/MapBuilder.java new file mode 100644 index 0000000..2e6d65c --- /dev/null +++ b/src/main/scala/io/izzel/taboolib/util/item/MapBuilder.java @@ -0,0 +1,329 @@ +package io.izzel.taboolib.util.item; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.MapMeta; +import org.bukkit.map.*; +import org.bukkit.map.MapView.Scale; +import org.bukkit.plugin.AuthorNagException; + +import javax.annotation.Nonnull; +import java.awt.image.BufferedImage; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.List; + +/** + * @Author LagBug + */ +public class MapBuilder { + + public static final String VERSION = "1.5"; + private MapView map; + private BufferedImage image; + private List texts; + private MapCursorCollection cursors; + + private boolean rendered; + private boolean renderOnce; + private boolean isNewVersion; + + public MapBuilder() { + cursors = new MapCursorCollection(); + texts = new ArrayList<>(); + rendered = false; + renderOnce = true; + isNewVersion = Bukkit.getVersion().contains("1.15") || Bukkit.getVersion().contains("1.14") || Bukkit.getVersion().contains("1.13"); + } + + /** + * Get the image that's being used + * + * @return the image used + */ + public BufferedImage getImage() { + return image; + } + + /** + * Set an image to be used + * + * @param image the buffered image to use + * @return the instance of this class + */ + public MapBuilder setImage(@Nonnull BufferedImage image) { + this.image = image; + return this; + } + + /** + * Set and image to be used + * + * @param x, y the coordinates to add the text + * @param font the font to be used + * @param text the string that will be displayed + * @return the instance of this class + */ + public MapBuilder addText(@Nonnull int x, @Nonnull int y, @Nonnull MapFont font, @Nonnull String text) { + this.texts.add(new Text(x, y, font, text)); + return this; + } + + /** + * Gets the list of all the texts used + * + * @return a List of all the texts + */ + public List getTexts() { + return texts; + } + + /** + * Adds a cursor to the map + * + * @param x, y the coordinates to add the cursor + * @param direction the direction to display the cursor + * @param type the type of the cursor + * @return the instance of this class + */ + @SuppressWarnings("deprecation") + public MapBuilder addCursor(@Nonnull int x, @Nonnull int y, @Nonnull CursorDirection direction, @Nonnull CursorType type) { + cursors.addCursor(x, y, (byte) direction.getId(), (byte) type.getId()); + return this; + } + + /** + * Gets all the currently used cursors + * + * @return a MapCursorCollection with all current cursors + */ + public MapCursorCollection getCursors() { + return cursors; + } + + /** + * Sets whether the image should only be rendered once. + * Good for static images and reduces lag. + * + * @param renderOnce the value to determine if it's going to be rendered once + * @return the instance of this class + */ + public MapBuilder setRenderOnce(@Nonnull boolean renderOnce) { + this.renderOnce = renderOnce; + return this; + } + + /** + * Builds an ItemStack of the map. + * + * @return the ItemStack of the map containing what's been set from the above methods + */ + @SuppressWarnings("deprecation") + public ItemStack build() { + ItemStack item = null; + + try { + item = new ItemStack(isNewVersion ? Material.MAP : Material.valueOf("MAP")); + } catch (AuthorNagException ex) { + System.out.println("Could not get material for the current spigot version. This won't be shown again until server restats"); + } + + map = Bukkit.createMap(Bukkit.getWorlds().get(0)); + + map.setScale(Scale.NORMAL); + map.getRenderers().forEach(map::removeRenderer); + map.addRenderer(new MapRenderer() { + @Override + public void render(MapView mapView, MapCanvas mapCanvas, Player player) { + if (rendered && renderOnce) { + return; + } + + if (player != null && player.isOnline()) { + if (image != null) { + mapCanvas.drawImage(0, 0, image); + } + + if (!texts.isEmpty()) { + texts.forEach(text -> mapCanvas.drawText(text.getX(), text.getY(), text.getFont(), text.getMessage())); + } + + if (cursors.size() > 0) { + mapCanvas.setCursors(cursors); + } + + rendered = true; + } + } + }); + + if (isNewVersion) { + MapMeta mapMeta = (MapMeta) item.getItemMeta(); + mapMeta.setMapView(map); + item.setItemMeta(mapMeta); + } else { + item.setDurability(getMapId(map)); + } + return item; + } + + /** + * Gets a map id cross-version using reflection + * + * @param mapView the map to get the id + * @return the instance of this class + */ + private short getMapId(@Nonnull MapView mapView) { + try { + return (short) mapView.getId(); + } catch (NoSuchMethodError ex) { + try { + return (short) Class.forName("org.bukkit.map.MapView").getMethod("getId", (Class[]) new Class[0]) + .invoke(mapView, new Object[0]); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException + | NoSuchMethodException | SecurityException | ClassNotFoundException e) { + e.printStackTrace(); + return -1; + } + } + } + + /** + * An enum containing user friendly cursor directions. Instead of using the integers, you can instead use this enum + */ + public enum CursorDirection { + SOUTH(0), SOUTH_WEST_SOUTH(1), SOUTH_WEST(2), SOUTH_WEST_WEST(3), WEST(4), NORTH_WEST_WEST(5), NORTH_WEST(6), + NORTH_WEST_NORTH(7), NORTH(8), NORTH_EAST_NORTH(9), NORTH_EAST(10), NORTH_EAST_EAST(11), EAST(12), + SOUTH_EAST_EAST(13), SOUNT_EAST(14), SOUTH_EAST_SOUTH(15); + + private final int id; + + CursorDirection(@Nonnull int id) { + this.id = id; + } + + /** + * Returns the actual integer to use + * + * @return the integer of the specified enum type + */ + public int getId() { + return this.id; + } + } + + /** + * An enum containing user friendly cursor types. Instead of using the integers, you can instead use this enum + */ + public enum CursorType { + WHITE_POINTER(0), GREEN_POINTER(1), RED_POINTER(2), BLUE_POINTER(3), WHITE_CLOVER(4), RED_BOLD_POINTER(5), + WHITE_DOT(6), LIGHT_BLUE_SQUARE(7); + + private final int id; + + CursorType(@Nonnull int id) { + this.id = id; + } + + /** + * Returns the actual integer to use + * + * @return the integer of the specified enum type + */ + public int getId() { + return this.id; + } + } + + /** + * A storage class to save text information to later be used in order to write in maps + */ + public static class Text { + + private int x; + private int y; + private MapFont font; + private String message; + + public Text(@Nonnull int x, @Nonnull int y, @Nonnull MapFont font, @Nonnull String message) { + setX(x); + setY(y); + setFont(font); + setMessage(message); + } + + /** + * Gets the x position for the text to be displayed + * + * @return the x position + */ + public int getX() { + return x; + } + + /** + * Sets the x position of the text to display it + * + * @param x the x postion + */ + public void setX(@Nonnull int x) { + this.x = x; + } + + /** + * Gets the y position for the text to be displayed + * + * @return the y position + */ + public int getY() { + return y; + } + + /** + * Sets the y position of the text to display it + * + * @param y the y position + */ + public void setY(@Nonnull int y) { + this.y = y; + } + + /** + * Gets the font to be used + * + * @return the MapFont that is used + */ + public MapFont getFont() { + return font; + } + + /** + * Sets what font should be used + * + * @param font the actual font + */ + public void setFont(@Nonnull MapFont font) { + this.font = font; + } + + /** + * Gets what test will be displayed + * + * @return the text + */ + public String getMessage() { + return message; + } + + /** + * Sets what text will be displayed + * + * @param message the actual text + */ + public void setMessage(@Nonnull String message) { + this.message = message; + } + } +} \ No newline at end of file