#java #plugins #minecraft #bukkit
Вопрос:
Я пытаюсь создать менеджер данных, и я довольно новичок в 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); }
}
}
Last class
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]
Комментарии:
1. Что вы подразумеваете под «это не работает»? Чего вы ожидали и что на самом деле произошло?
2. @Sweeper Я добавлю это в вопрос, я ожидаю, что он что-то добавит в файл данных, но он ничего не добавляет
Ответ №1:
Учитывая код, который вы опубликовали, похоже, что вы никогда не получаете доступ к своему DataManager
GPlace
классу. Вы только пытаетесь вызвать data
объект, созданный вами внутри класса, который вы никогда не инициализировали, так что на самом деле вы вызываете null.
Вы определили объект с именем data
a DataManager
, но никогда не присваиваете ему значение.
Похоже, что единственный доступ, который вы сделали для своего DataManager
, находится внутри main
класса, и это #getData()
метод.
Комментарии:
1. извините, я новичок в java, и я следовал учебнику, как я могу это исправить