【问题标题】:How can I make this data manager actually work Java Spigot Plugin我怎样才能让这个数据管理器真正工作 Java Spigot Plugin
【发布时间】:2021-08-20 01:22:53
【问题描述】:

我正在尝试制作一个数据管理器,但我对 java 还是很陌生。我让 onblockplace 事件开始工作,但我似乎无法让它真正保存它。没有错误,但它不起作用。这是我的代码:

主要:

import plugin.GManager;
import plugin.GPlace;
import plugin.GCommands;
import plugin.files.DataManager;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.plugin.java.JavaPlugin;

public final class GPlugin extends JavaPlugin {

    public static DataManager data;

    @Override
    public void onEnable() {
        data = new DataManager(this);
        GManager.init();
        getCommand("giveitem").setExecutor(new GCommands());
        getServer().getPluginManager().registerEvents(new GPlace(), this);

    }

    @Override
    public void onDisable() {

    }

    public static FileConfiguration getData() {
        return data.getConfig();
    }

    public static FileConfiguration saveData() {
        return data.saveConfig();
    }
}

二等:

import plugin.GPlugin;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.logging.Level;

public class DataManager {

    private GPlugin plugin;
    private FileConfiguration dataConfig = null;
    private File configFile = null;

    public DataManager(GenPlugin plugin) {
        this.plugin = plugin;
        saveDefaultConfig();
    }

    public void reloadConfig() {
        if (this.configFile == null) { this.configFile = new File(this.plugin.getDataFolder(), "data.yml"); }

        this.dataConfig = YamlConfiguration.loadConfiguration(this.configFile);

        InputStream defaultStream = this.plugin.getResource("data.yml");
        if (defaultStream != null) {
            YamlConfiguration defaultConfig = YamlConfiguration.loadConfiguration(new InputStreamReader(defaultStream));
            this.dataConfig.setDefaults(defaultConfig);
        }
    }

    public FileConfiguration getConfig() {

        if (this.dataConfig == null) { reloadConfig(); }
        return this.dataConfig;
    }

    public void saveConfig() {
        if (this.dataConfig == null || this.configFile == null) { return; }

        try {
            this.getConfig().save(this.configFile);
        } catch (IOException e) {
            plugin.getLogger().log(Level.SEVERE, "Could not save config to " + this.configFile, e);

        }
    }

    public void saveDefaultConfig() {
        if (this.configFile == null) { this.configFile = new File(this.plugin.getDataFolder(), "data.yml"); }
        if (!this.configFile.exists()) { this.plugin.saveResource("data.yml", false); }

    }
}

最后一节课

import plugin.GPlugin;
import plugin.files.DataManager;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent;


public class GPlace implements Listener {

    @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH)
    public void onBlockPlace(BlockPlaceEvent evt) {
        Block block = evt.getBlock();
        Player player = evt.getPlayer();

        if (evt.getItemInHand().getItemMeta().getDisplayName().equals("§7Dirt Gen [Tier I]")) {
            player.sendMessage("Worked!");
            int var = 1;
            if (GenPlugin.getData().contains("data")) {
                var = GPlugin.getData().getConfigurationSection("data").getKeys(false).size() + 1;

                GPlugin.getData().set("data." + player.getUniqueId() + var + ".type", "Dirt Gen");
                GPlugin.getData().set("data." + player.getUniqueId() + var + ".x", (int) block.getLocation().getX());
                GPlugin.getData().set("data." + player.getUniqueId() + var + ".y", (int) block.getLocation().getY());
                GPlugin.getData().set("data." + player.getUniqueId() + var + ".z", (int) block.getLocation().getZ());
                GPlugin.getData().set("data." + player.getUniqueId() + var + ".world", block.getLocation().getWorld().getName());
                GPlugin.saveData();
            }
        }
    }
}

如果可以,请提供帮助。如果您没有看到任何错误,请也告诉我,我很确定存在代码错误,但我仍然可能会弄错。另外,如果您有任何问题,请随时提出。

编辑: 我希望它将它添加到数据文件中,但它没有:

data:
    <player's uuid>:
        <var>:
            Type: Dirt Gen
            x: <x>
            y: <y>
            z: <z>
            world: <world>

错误:

java.io.IOException: The handle is invalid
    at java.io.FileInputStream.readBytes(Native Method) ~[?:?]
    at java.io.FileInputStream.read(FileInputStream.java:271) ~[?:?]
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:282) ~[?:?]
    at java.io.BufferedInputStream.read(BufferedInputStream.java:343) ~[?:?]
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297) ~[?:?]
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339) ~[?:?]
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188) ~[?:?]
    at java.io.InputStreamReader.read(InputStreamReader.java:178) ~[?:?]
    at java.io.BufferedReader.fill(BufferedReader.java:161) ~[?:?]
    at java.io.BufferedReader.readLine(BufferedReader.java:329) ~[?:?]
    at java.io.BufferedReader.readLine(BufferedReader.java:396) ~[?:?]
    at net.minecrell.terminalconsole.SimpleTerminalConsole.readCommands(SimpleTerminalConsole.java:180) ~[patched_1.17.1.jar:git-Paper-170]
    at net.minecrell.terminalconsole.SimpleTerminalConsole.start(SimpleTerminalConsole.java:143) ~[patched_1.17.1.jar:git-Paper-170]
    at net.minecraft.server.dedicated.DedicatedServer$1.run(DedicatedServer.java:113) ~[patched_1.17.1.jar:git-Paper-170]
    Suppressed: java.io.IOException: The handle is invalid
        at java.io.FileDescriptor.close0(Native Method) ~[?:?]
        at java.io.FileDescriptor.close(FileDescriptor.java:297) ~[?:?]
        at java.io.FileInputStream$1.close(FileInputStream.java:366) ~[?:?]
        at java.io.FileDescriptor.closeAll(FileDescriptor.java:355) ~[?:?]
        at java.io.FileInputStream.close(FileInputStream.java:364) ~[?:?]
        at java.io.BufferedInputStream.close(BufferedInputStream.java:481) ~[?:?]
        at sun.nio.cs.StreamDecoder.implClose(StreamDecoder.java:391) ~[?:?]
        at sun.nio.cs.StreamDecoder.close(StreamDecoder.java:204) ~[?:?]
        at java.io.InputStreamReader.close(InputStreamReader.java:193) ~[?:?]
        at java.io.BufferedReader.close(BufferedReader.java:532) ~[?:?]
        at net.minecrell.terminalconsole.SimpleTerminalConsole.readCommands(SimpleTerminalConsole.java:183) ~[patched_1.17.1.jar:git-Paper-170]
        at net.minecrell.terminalconsole.SimpleTerminalConsole.start(SimpleTerminalConsole.java:143) ~[patched_1.17.1.jar:git-Paper-170]
        at net.minecraft.server.dedicated.DedicatedServer$1.run(DedicatedServer.java:113) ~[patched_1.17.1.jar:git-Paper-170]

【问题讨论】:

  • “它不起作用”是什么意思?您预期会发生什么,实际发生了什么?
  • @Sweeper 我会将这个添加到问题中,我希望它会向数据文件添加一些内容,但它不会添加任何内容

标签: java plugins minecraft bukkit


【解决方案1】:

鉴于您发布的代码,您似乎永远不会在GPlace 类中访问您的DataManager。您只尝试调用您在从未初始化的类中创建的 data 对象,因此您实际上是在调用 null。

您已经定义了一个名为 data 的对象,它是一个 DataManager,但您从未给它一个值。

您对DataManager 所做的唯一访问器似乎是在main 类中,它是#getData() 方法。

【讨论】:

  • 对不起,我是 java 新手,我跟着教程,我该如何解决它
猜你喜欢
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多