在不同文件中调用非静态函数

问题描述 投票:0回答:1

我在从一个文件调用非静态函数到另一个文件时遇到问题。这是我的代码:

package me.zoteuh.grillade;

import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.logging.Level;

public final class Grillade extends JavaPlugin {
    private static Grillade instance;

    @Override
    public void onEnable() {
        instance = this;

        AnvilListener anvilListener = new AnvilListener();
        anvilListener.loadHeadTextures();

        checkFiles();
        getServer().getPluginManager().registerEvents(anvilListener, this);
        getLogger().info("Grillade Plugin Operational!");
    }

    public static Grillade getInstance() {
        return instance;
    }

    private void checkFiles() {
        if (!getDataFolder().exists()) {
            if (getDataFolder().mkdir()) {
                getLogger().info("Grillade folder created.");
            } else {
                getLogger().severe("Unable to create the Grillade folder.");
            }
        }

        File headsFile = new File(getDataFolder(), "heads.json");
        if (!headsFile.exists()) {
            try {
                String defaultHeadsJson = "[\n]";
                Files.write(headsFile.toPath(), defaultHeadsJson.getBytes());
                getLogger().info("Created heads.json file.");
            } catch (IOException e) {
                getLogger().log(Level.SEVERE, "Error creating heads.json file.", e);
            }
        }
    }
}
package me.zoteuh.grillade;

import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.inventory.AnvilInventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.SkullMeta;

import java.io.*;
import java.util.*;
import java.lang.reflect.Field;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

public class AnvilListener implements Listener {
    private final Map<String, String> headTextures = new HashMap<>();

    @EventHandler
    public void onAnvilPrepare(PrepareAnvilEvent event) {
        loadHeadTextures();

        AnvilInventory anvilInventory = event.getInventory();
        ItemStack[] contents = anvilInventory.getContents();

        ItemStack firstInput = contents[0];
        ItemStack secondInput = contents[1];
        String renameText = event.getInventory().getRenameText();

        List<Material> classicHeads = new ArrayList<>();
        classicHeads.add(Material.CREEPER_HEAD);
        classicHeads.add(Material.SKELETON_SKULL);
        classicHeads.add(Material.ZOMBIE_HEAD);

        if (firstInput != null && secondInput == null && classicHeads.contains(firstInput.getType()) &&
                renameText != null && headTextures.containsKey(renameText)) {

            String texture = headTextures.get(renameText);
            ItemStack customHead = createCustomHead(texture, renameText);
            event.setResult(customHead);
        }
    }

    private ItemStack createCustomHead(String texture, String name) {
        ItemStack skull = new ItemStack(Material.PLAYER_HEAD);
        SkullMeta skullMeta = (SkullMeta) skull.getItemMeta();

        GameProfile profile = new GameProfile(UUID.randomUUID(), null);
        profile.getProperties().put("textures", new Property("textures", texture));

        try {
            Field profileField = skullMeta.getClass().getDeclaredField("profile");
            profileField.setAccessible(true);
            profileField.set(skullMeta, profile);
            skullMeta.setDisplayName(name);
            skull.setItemMeta(skullMeta);

            return skull;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public void loadHeadTextures() {
        File jsonFile = new File(Grillade.getInstance().getDataFolder(), "heads.json");
        Bukkit.broadcastMessage("Chargement des textures");

        if (!jsonFile.exists()) {
            return;
        }

        try {
            FileReader reader = new FileReader(jsonFile);
            JsonElement jsonElement = JsonParser.parseReader(reader);
            JsonObject jsonObject = jsonElement.getAsJsonObject();
            JsonArray headsArray = jsonObject.getAsJsonArray("heads");


            for (JsonElement headElement : headsArray) {
                JsonObject headObject = headElement.getAsJsonObject();
                String name = headObject.get("name").getAsString();
                String texture = headObject.get("texture").getAsString();

                headTextures.put(name, texture);
            }

            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

问题源自函数“loadHeadTextures”。我想在我的主文件的“onEnable”函数中调用它。

我尝试按照本网站上的说明创建一个实例,但这不起作用 https://www.w3docs.com/snippets/java/calling-non-static-method-in-static-method-in-java.html

我尝试了这里找到的其他几个技巧,但它们都不起作用。 这个问题不是来自我的函数“loadHeadTextures”。我尝试在自己的文件中调用它并且它起作用了;广播在聊天中正确显示。但是,一旦我尝试从主文件中调用它,它就不起作用。我没有任何错误,但什么也没有发生。

java plugins minecraft
1个回答
0
投票

您的问题不是由于在不同文件中调用非静态方法造成的。广播消息不会打印到服务器,因为在

Bukkit.broadcastMessage()
方法中使用
onEnable()
不起作用。这是因为调用该方法时服务器尚未完全启动。 尝试使用
System.out.println()
来显示您的消息(因为它似乎用于调试目的),或者如果您确实想要广播,则使用调度程序将其延迟一些时间。

© www.soinside.com 2019 - 2024. All rights reserved.