资源文件无法加载

shBLOCK


版本信息
你使用的IDE:IntelliJ IDEA 2020.1
Forge版本: 14.23.5.2847
Minecraft版本: 1.12.2
Mapping 文件版本: stable_39

出错图
nyIYSlioHa.png
wAsh459jLr.png
SMfs8BmNiH.png

错误情况简述
ResourceLocation定义的gui 中的图片资源加载不出来
后来发现assets中的所有资源都读取不到(语言文件等)
我怀疑是不是编译时资源文件没放进去,但是找到了build文件夹发现里面有那些文件,不知道是不是我找错了。

报错日志

[07:54:34] [Client thread/WARN] [minecraft/TextureManager]: Failed to load texture: integratedcontrol:textures/gui/bg2.png
java.io.FileNotFoundException: integratedcontrol:textures/gui/bg2.png
	at net.minecraft.client.resources.SimpleReloadableResourceManager.getResource(SimpleReloadableResourceManager.java:69) ~[SimpleReloadableResourceManager.class:?]
	at net.minecraft.client.renderer.texture.SimpleTexture.loadTexture(SimpleTexture.java:34) ~[SimpleTexture.class:?]
	at net.minecraft.client.renderer.texture.TextureManager.loadTexture(TextureManager.java:69) [TextureManager.class:?]
	at net.minecraft.client.renderer.texture.TextureManager.bindTexture(TextureManager.java:44) [TextureManager.class:?]
	at shBLOCK.integratedcontrol.gui.RemoteControlGui.CustomBackground.drawBackground(CustomBackground.java:46) [CustomBackground.class:?]
	at shBLOCK.integratedcontrol.gui.RemoteControlGui.RemoteControlUseGui.drawScreen(RemoteControlUseGui.java:23) [RemoteControlUseGui.class:?]
	at net.minecraftforge.client.ForgeHooksClient.drawScreen(ForgeHooksClient.java:396) [ForgeHooksClient.class:?]
	at net.minecraft.client.renderer.EntityRenderer.updateCameraAndRender(EntityRenderer.java:1177) [EntityRenderer.class:?]
	at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1209) [Minecraft.class:?]
	at net.minecraft.client.Minecraft.run(Minecraft.java:442) [Minecraft.class:?]
	at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_201]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_201]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_201]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_201]
	at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
	at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_201]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_201]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_201]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_201]
	at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?]
	at GradleStart.main(GradleStart.java:25) [start/:?]

相关代码
<zh_cn.lang>

itemGroup.integratedcontrol=集成控制

item.integratedcontrol.remote_control.name=远程控制终端

key.integratedcontrol.category=集成控制
key.integratedcontrol.edit_remote_hotkey=编辑远程控制终端

<RemoteControlItem.java>

package shBLOCK.integratedcontrol;

import shBLOCK.integratedcontrol.gui.RemoteControlGui.RemoteControlEditGui;
import shBLOCK.integratedcontrol.gui.RemoteControlGui.RemoteControlUseGui;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumHand;
import net.minecraft.world.World;

public class RemoteControlItem extends Item {
    public static final String NAME = "remote_control";
    public static final String REGISTRY_NAME = IntegratedControl.MODID + ":" + NAME;

    public RemoteControlItem() {
        this.setMaxStackSize(1);
        this.setTranslationKey(IntegratedControl.MODID + "." + NAME);
        this.setRegistryName(REGISTRY_NAME);
        this.setCreativeTab(IntegratedControl.INTEGRATED_CONTROL_TAB);
    }

    public void openEditGui() {
        Minecraft.getMinecraft().displayGuiScreen(new RemoteControlEditGui());
    }

    @Override
    public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand hand) {
        System.out.println();
        ItemStack item = player.getHeldItem(hand);
        Minecraft.getMinecraft().displayGuiScreen(new RemoteControlUseGui());
        return new ActionResult<>(EnumActionResult.SUCCESS, item);
    }
}

<RemoteControlUseGui.java>

package shBLOCK.integratedcontrol.gui.RemoteControlGui;

import shBLOCK.integratedcontrol.IntegratedControl;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.util.ResourceLocation;

public class RemoteControlUseGui extends GuiScreen {
    public CustomBackground Background;

    public RemoteControlUseGui() {
        Background = new CustomBackground(new ResourceLocation(IntegratedControl.MODID, "textures/gui/bg2.png"), 5, 10, 16, 16, 16, 16);
    }

    @Override
    public void initGui() {
        this.buttonList.add(new GuiButton(0, 100, 0, "Test Button"));
    }

    @Override
    public void drawScreen(int mouseX, int mouseY, float partialTicks) {
        super.drawScreen(mouseX, mouseY, partialTicks);
        this.Background.drawBackground(this.mc);
    }

    @Override
    public boolean doesGuiPauseGame() {
        return false;
    }

    @Override
    public void actionPerformed(GuiButton button) {
        button.width += 10;
    }
}

shBLOCK


(帖子被作者删除,如无标记将在 24 小时后自动删除)


FledgeXu


请注意,1.12 Forge官方已经放弃支持,不会再有Bug修复,添加特性,请尽早迁移到1.14/1.15

应该是由于IDEA和MDK不互相兼容导致的。
论坛里有类似的问题:


解决办法:


nowandfuture


贴一下你的文件列表:

build/classes
build/classes/java
build/classes/java/main

如果资源文件没缺的话
在build.gradle添加

//已过时,参考后文
sourceSets {
    main {
        output.resourcesDir = output.classesDir
    }
}

重定向到你的classes目录
不过这样做会导致jar打包出错,打包时,去掉classes内所有资源文件并去掉上述重定向代码


上述方法已过时,参考下文:

sourceSets {
    main {
        output.resourcesDir = output.classesDir
    }
}
//当需要reobf jar包时重新设置资源文件夹
gradle.taskGraph.whenReady{
    taskGraph ->
        if(taskGraph.hasTask(":reobfJar")){
            clearSourcesDir
            sourceSets.main.output.resourcesDir(new File("build/resources"))
        }
}

task clearSourcesDir {
    delete(sourceSets.main.output.classesDir)
}

这样不需要再打包时(build时)删除一次classes文件夹和修改重定向内容


FledgeXu


我帮你改了格式化……
可以去学一下Markdown,论坛里支持Markdown的,这样看起来也清楚点。


nowandfuture


(帖子被作者删除,如无标记将在 24 小时后自动删除)


shBLOCK


好的,谢谢您


shBLOCK


但是前置mod还没更新到新版本…


nowandfuture


我只是懒得没打```而已


FledgeXu


:joy:行吧。


shBLOCK



我不确定这个算缺资源文件还是不缺


nowandfuture


build/classes/java/main
请问你运行的时候用gradle的任务runClient还是使用genIntellijRuns配置好的idea的application任务。


shBLOCK


我刚才尝试使用forgegradle中的runClient启动,资源全部加载成功,谢谢大家的帮助!


shBLOCK


我刚才再次用forgegradle运行的时候显示Task execution finished ‘runClient’.但是没有启动MC,我又用genIntellijRuns产生的那个运行了一次,但是又是无法加载资源。把它关掉后再用forgegradle的runClient运行的时候又可以了…

然后我又试了几遍发现每次用forgegradle的runClient运行之后必须genIntellijRuns产生的那个运行一次之后才能再次用forgegradle的runClient运行(感觉我说得好啰嗦…)

请问这是为什么呢?


nowandfuture


不知道,但是你可以分别运行两次(运行前先清空build文件夹)看下两者的output产物区别,我从来没用过runClient,因为每次都要重新构建一遍jar包,太慢了。


shBLOCK


好吧,那就只能先这样用然后等集成动力学更新到1.14或1.15之后升级了


shBLOCK


使用forgegradle中的runClient启动,资源就能正常加载,但是每次用forgegradle的runClient运行之后必须genIntellijRuns产生的那个东西运行一次之后才能再次用forgegradle的runClient运行(感觉我说得好啰嗦…)


nowandfuture


你重定向到classes目录也不行吗?


shBLOCK


emm,刚看到,我试试


shBLOCK


ohhhhhhhhhhhhhhhh竟然可以,谢谢您


补心者


我有一个暴力做法,在加载早期使用ITweaker接口来实现暴力复制资源文件到 build\classes\java\main,
然后如果需要gradle build出来,先执行clean再build就不会出错。
附代码:(程序参数需设置–tweakClass 指向你的ITweaker 实现)

	@Override
	public void injectIntoClassLoader(LaunchClassLoader classLoader)
	{
		//沙雕“特性”
		try
		{
			byte[] a = classLoader.getClassBytes("net.minecraft.world.World");
			if (a != null)
			{
				this.injectResources();
			}
		} catch (Throwable e)
		{
			e.printStackTrace();
		}
	}

	private void injectResources()
	{
		File code = new File(this.getClass().getResource("/").getPath());
		File root = code.getParentFile().getParentFile().getParentFile();
		File resources = new File(root, "resources\\main");
		for (File file : resources.listFiles())
		{
			File res = new File(code, file.getName());
			if (res.exists())
				this.delResources(res);
			this.copyResources(file, res);
		}
	}

	private void copyResources(File from, File to)
	{
		try
		{
			System.err.println("复制:" + from.toString() + "到:" + to.toString());
			Files.copy(from.toPath(), to.toPath());
		} catch (IOException e)
		{
			e.printStackTrace();
		}
		if (from.isDirectory())
		{
			for (File sources : from.listFiles())
				this.copyResources(sources, new File(to, sources.getName()));
		}

	}

	private void delResources(File file)
	{
		if (file.isDirectory() && file.listFiles().length != 0)
		{
			for (File sources : file.listFiles())
				this.delResources(sources);
		}
		try
		{
			System.err.println("删除:" + file.toString());
			Files.delete(file.toPath());
		} catch (IOException e)
		{
			e.printStackTrace();
		}
	}

system


该主题在最后一个回复创建后7天后自动关闭。不再允许新的回复。