Пытаюсь получить Dynmap API, но он null

MarinCod

Пользователь
Сообщения
81
Код:
private static DynmapAPI dynmap = (DynmapAPI) Bukkit.getServer().getPluginManager().getPlugin("dynmap");

Такой строчкой пытаюсь получить dynmapAPI, но выдаёт такую ошибку:
Код:
java.lang.NullPointerException: Cannot invoke "org.dynmap.DynmapAPI.getMarkerAPI()" because "dynmap" is null
        at marintileeditor.main.Dynmap.DynmapDrawer.setMarkerDescription(DynmapDrawer.java:120) ~[MarinTileForLovingYouBaby.jar:?]
        at marintileeditor.main.Dynmap.DynmapDrawer.draw(DynmapDrawer.java:85) ~[MarinTileForLovingYouBaby.jar:?]
        at marintileeditor.main.City.City.draw(City.java:89) ~[MarinTileForLovingYouBaby.jar:?]
        at marintileeditor.main.Dynmap.DynmapDrawer.drawAllCities(DynmapDrawer.java:112) ~[MarinTileForLovingYouBaby.jar:?]
        at marintileeditor.main.Dynmap.DynmapDrawer.redrawDynmap(DynmapDrawer.java:156) ~[MarinTileForLovingYouBaby.jar:?]
        at marintileeditor.main.Main.Main.drawDynmap(Main.java:59) ~[MarinTileForLovingYouBaby.jar:?]
        at marintileeditor.main.Main.Main.onEnable(Main.java:47) ~[MarinTileForLovingYouBaby.jar:?]
        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264) ~[paper-api-1.18.1-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:370) ~[paper-api-1.18.1-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:501) ~[paper-api-1.18.1-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.craftbukkit.v1_18_R1.CraftServer.enablePlugin(CraftServer.java:562) ~[paper-1.18.1.jar:git-Paper-216]
        at org.bukkit.craftbukkit.v1_18_R1.CraftServer.enablePlugins(CraftServer.java:476) ~[paper-1.18.1.jar:git-Paper-216]
        at net.minecraft.server.MinecraftServer.loadWorld0(MinecraftServer.java:736) ~[paper-1.18.1.jar:git-Paper-216]
        at net.minecraft.server.MinecraftServer.loadLevel(MinecraftServer.java:503) ~[paper-1.18.1.jar:git-Paper-216]
        at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:313) ~[paper-1.18.1.jar:git-Paper-216]
        at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1211) ~[paper-1.18.1.jar:git-Paper-216]
        at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:317) ~[paper-1.18.1.jar:git-Paper-216]
        at java.lang.Thread.run(Thread.java:833) ~[?:?]

Похоже, что он просто не находит этот плагин. В зависимостях dynmap есть.
 
Инициализируй его в методе onEnable.
Теперь такая ошибка:
Код:
java.lang.NullPointerException: Cannot invoke "org.dynmap.DynmapCore.getMarkerAPI()" because "this.core" is null
        at org.dynmap.bukkit.DynmapPlugin.getMarkerAPI(DynmapPlugin.java:1127) ~[Dynmap-3.4-beta-3-spigot.jar:?]
        at marintileeditor.main.Dynmap.DynmapDrawer.setMarkerDescription(DynmapDrawer.java:120) ~[MarinTileForLovingYouBaby.jar:?]
        at marintileeditor.main.Dynmap.DynmapDrawer.draw(DynmapDrawer.java:85) ~[MarinTileForLovingYouBaby.jar:?]
        at marintileeditor.main.City.City.draw(City.java:89) ~[MarinTileForLovingYouBaby.jar:?]
        at marintileeditor.main.Dynmap.DynmapDrawer.drawAllCities(DynmapDrawer.java:112) ~[MarinTileForLovingYouBaby.jar:?]
        at marintileeditor.main.Dynmap.DynmapDrawer.redrawDynmap(DynmapDrawer.java:156) ~[MarinTileForLovingYouBaby.jar:?]
        at marintileeditor.main.Main.Main.drawDynmap(Main.java:62) ~[MarinTileForLovingYouBaby.jar:?]
        at marintileeditor.main.Main.Main.onEnable(Main.java:50) ~[MarinTileForLovingYouBaby.jar:?]
        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264) ~[paper-api-1.18.1-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:370) ~[paper-api-1.18.1-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:501) ~[paper-api-1.18.1-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.craftbukkit.v1_18_R1.CraftServer.enablePlugin(CraftServer.java:562) ~[paper-1.18.1.jar:git-Paper-216]
        at org.bukkit.craftbukkit.v1_18_R1.CraftServer.enablePlugins(CraftServer.java:476) ~[paper-1.18.1.jar:git-Paper-216]
        at net.minecraft.server.MinecraftServer.loadWorld0(MinecraftServer.java:736) ~[paper-1.18.1.jar:git-Paper-216]
        at net.minecraft.server.MinecraftServer.loadLevel(MinecraftServer.java:503) ~[paper-1.18.1.jar:git-Paper-216]
        at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:313) ~[paper-1.18.1.jar:git-Paper-216]
        at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1211) ~[paper-1.18.1.jar:git-Paper-216]
        at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:317) ~[paper-1.18.1.jar:git-Paper-216]
        at java.lang.Thread.run(Thread.java:833) ~[?:?]
 
Что за `core`? Полностью код своего класса кидай.
Код:
package marintileeditor.main.Dynmap;

import com.fasterxml.uuid.Generators;
import library.Hexagon;
import library.HexagonComponents.HexagonSide;
import library.HexagonalGrid;
import library.Point;
import marintileeditor.main.API.SMassiveAPI;
import marintileeditor.main.City.City;
import marintileeditor.main.Main.Main;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.dynmap.DynmapAPI;
import org.dynmap.markers.AreaMarker;
import org.dynmap.markers.Marker;
import org.dynmap.markers.MarkerSet;
import org.dynmap.markers.PolyLineMarker;

import java.util.Locale;
import java.util.logging.Logger;

public class DynmapDrawer {
    public DynmapDrawer() {
    }

    public void drawFigure(Hexagon[] hexagons, String color, DynmapDescription description) {
        if (hexagons.length == 0) {
            return;
        }
        HexagonalGrid grid = hexagons[0].getGrid();
        HexagonSide[] sides = grid.getBounds(hexagons);
        this.draw(hexagons, color, description);
        this.draw(sides, description);
    }

    public void draw(Hexagon[] hexagons, String color, DynmapDescription description) {
        for (Hexagon hexagon : hexagons) {
            this.draw(hexagon, color, description);
        }
    }

    public void draw(HexagonSide side, DynmapDescription description) {
        Point[] points = side.getEnds();
        drawLine(points, description);
    }

    public void draw(HexagonSide[] sides, DynmapDescription description) {
        for (HexagonSide side : sides) {
            this.draw(side, description);
        }
    }

    public void draw(Hexagon hexagon, String color, DynmapDescription description) {
        Point[] points = hexagon.getVertexPositions();
        double[] x = new double[points.length];
        double[] z = new double[points.length];
        for (int i = 0; i < points.length; i++) {
            x[i] = points[i].getX();
            z[i] = points[i].getY();
        }

        String id = Generators.timeBasedGenerator().generate().toString();
        MarkerSet marker = Main.getDynmap().getMarkerAPI().getMarkerSet("marin");
        AreaMarker am = marker.createAreaMarker(id, description.getName(), true, "world", x, z, false);
        // Проверяем первый символ в string
        // Кстати, символы в джае пишутся только в одинарных кавычках, а стринги в двойных
        if (color.charAt(0) == '#') {
            // substring возвращает только часть данной строки, конкретно здесь из формата #FFFF00 строка
            // превращается в FFFF00
            color = color.substring(1);
        }

        // Меняем цвета области
        // radix 16 это обычная система счисления, то есть если напишешь 11, то он и вернет 11, а вот если
        // менять radix, начинается жопа
        am.setFillStyle(0.6D, Integer.parseInt(color.toUpperCase(),16));
        am.setLineStyle(0, 0.5D, Integer.parseInt("03c03c".toUpperCase(), 16));
        am.setBoostFlag(false);
        this.setHexagonDescription(id, description);
    }

    public void draw(Point point, String icon, DynmapDescription description) {
        String id = Generators.timeBasedGenerator().generate().toString();
        Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "dmarker add id:" + id + " " + description.getName() + " set:marin x:" + point.getX() + " y:77 z:" + point.getY() + " icon:" + icon + " world:world");
        this.setMarkerDescription(id, description);
    }

    public void drawLine(Point[] points, DynmapDescription description) {
        double[] x = new double[points.length];
        double[] y = new double[points.length];
        double[] z = new double[points.length];
        for (int i = 0; i < points.length; i++) {
            x[i] = points[i].getX();
            y[i] = 77;
            z[i] = points[i].getY();
        }

        String id = Generators.timeBasedGenerator().generate().toString();
        MarkerSet m = Main.getDynmap().getMarkerAPI().getMarkerSet("marin");
        PolyLineMarker p = m.createPolyLineMarker(id, description.getName(), true, "world", x, y, z, false);
        p.setLineStyle(10, 1.0D, Integer.parseInt("03c03c".toUpperCase(), 16));
        this.setSideDescription(id,description);
    }

    public void drawAllCities() {
        City[] cities = Main.getCityMap().getCities();
        if (cities.length == 0) {
            return;
        }
        for (int i = 0; i < cities.length; i++) {
            Bukkit.broadcastMessage(cities[i].getName());
            cities[i].draw();
            Bukkit.broadcastMessage(cities[i].getName());
        }
    }

    public void setMarkerDescription(String id, DynmapDescription description) {
        String descriptionString = this.generateDescriptionLine(description.getDescriptionsStrings());
        DynmapAPI dynmap = Main.getDynmap();
        MarkerSet m = dynmap.getMarkerAPI().getMarkerSet("marin");
        Marker mm = m.findMarker(id);
        mm.setDescription(descriptionString);
        return;
    }

    public void setHexagonDescription(String id, DynmapDescription description) {
        String descrpString = this.generateDescriptionLine(description.getDescriptionsStrings());
        DynmapAPI dynmap = Main.getDynmap();
        MarkerSet m = dynmap.getMarkerAPI().getMarkerSet("marin");
        AreaMarker am = m.findAreaMarker(id);
        am.setDescription(descrpString);
        return;
    }

    public void setSideDescription(String id, DynmapDescription description) {
        String descriptionString = this.generateDescriptionLine(description.getDescriptionsStrings());
        DynmapAPI dynmap = Main.getDynmap();
        MarkerSet m = dynmap.getMarkerAPI().getMarkerSet("marin");
        PolyLineMarker p = m.findPolyLineMarker(id);
        p.setDescription(descriptionString);
        return;
    }

    // Очищаем динмап, удаляя все точки
    public static void clearDynmap() {
        Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "dmarker deleteset id:marin world:world");
        Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "dmarker addset Государства id:marin world:world");
    }

    // Перезагрузка динмапа
    public static void redrawDynmap() {
        DynmapDrawer.clearDynmap();
        long time0 = System.currentTimeMillis();
        Logger logDyn = Bukkit.getServer().getLogger();
        DynmapDrawer drawer = new DynmapDrawer();
        drawer.drawAllCities();
        long time1 = System.currentTimeMillis();

        long time = time1 - time0;
        logDyn.info(ChatColor.AQUA + "[MarinTileEditor] Dynmap перезагружен. На это потребовалось: " + time);
    }

    private String generateDescriptionLine(String[] strings) {
        return SMassiveAPI.toString(strings, "<br>");
    }
}
 
Код:
[13:22:45 INFO]: [dynmap] Enabling dynmap v3.4-beta-3-774
[13:22:45 INFO]: [dynmap] Added 18 custom biome mappings
[13:22:45 INFO]: [dynmap] Using LuckPerms 5.4.4 for access control
[13:22:45 INFO]: [dynmap] Mod Support processing completed
[13:22:48 INFO]: [dynmap] Loaded 27 shaders.
[13:22:48 INFO]: [dynmap] Loaded 83 perspectives.
[13:22:48 INFO]: [dynmap] Loaded 22 lightings.
[13:22:48 INFO]: [dynmap] Starting enter/exit processing
[13:22:48 INFO]: [dynmap] Finish marker initialization
[13:22:49 INFO]: [dynmap] Web server started on address 0.0.0.0:25870
[13:22:49 INFO]: [dynmap] version 3.4-beta-3-774 is enabled - core version 3.4-beta-3-774
[13:22:49 INFO]: [dynmap] For support, visit our Discord at https://discord.gg/s3rd5qn
[13:22:49 INFO]: [dynmap] For news, visit https://reddit.com/r/Dynmap or follow https://twitter.com/Dynmap
[13:22:49 INFO]: [dynmap] To report or track bugs, visit https://github.com/webbukkit/dynmap/issues
[13:22:49 INFO]: [dynmap] If you'd like to donate, please visit https://www.patreon.com/dynmap or https://ko-fi.com/michaelprimm
[13:22:49 INFO]: [dynmap] Loaded 2 maps of world 'world'.
[13:22:49 INFO]: [dynmap] Loaded 0 maps of world 'world_nether'.
[13:22:49 INFO]: [dynmap] Loaded 0 maps of world 'world_the_end'.
[13:22:49 INFO]: [dynmap] Enabled

Динмап вроде хорошо запускается, ошибок не вижу. Карта работает. Заметил правда такую вещь, что сначала выводит ошибку, что core is null, а только потом пишутся строчки выше. Будто бы мой плагин сначала ищет динмап, а он попросту еще не успел включиться.
 
Назад
Сверху Снизу