我在编一个模版。
下面是代码:
package net.minecraft.client.gui;
import java.io.IOException;
import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.PositionedSoundRecord;
import net.minecraft.client.audio.SoundHandler;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.util.ResourceLocation;
public class GuiButton extends Gui {
public static final ResourceLocation buttonTextures = new ResourceLocation("textures/gui/widgets.png");如您所见,有变量buttonTextures,它的资源位置是“纹理/gui/widgets.png”。我还有第二个,我想要做的是在执行它时用这个第二个buttonTextures文件来修改它。
我只需要将buttonTextures的资源位置更改为我自己的路径,而是通过另一个Java。也许可以通过用第二个脚本重写代码来完成,我真的毫无头绪。
我在做什么:‘a PAYDAY 2 Mod为我的艺术。当然,我从菜单开始。所以我有两个主菜单。要切换到我的菜单,有一个按钮,你必须按。当你这样做的时候,它会改变它的纹理。但问题是,它不能将按钮纹理更改为/gui/PAYDAY2widgets.png,因为变量是final。
如您所见,第一个文件名为GuiButton。我复制了该文件,名为GuiPAYDAY2Button.java,并将路径设置为纹理路径(纹理/gui/PAYDAY2widgets.png)。
现在,如果我将其添加到GuiButton中(我将变量从GuiPAYDAY2Button更改为GuiPAYDAY2Button,但切换到PAYDAY2菜单后游戏就崩溃了),则会使GuiPAYDAY2MainMenu.java文件(GuiMainMenu.java文件的副本)崩溃。我还将GuiButton更改为GuiPAYDAY2Button(在GuiPAYDAY2MainMenu.java文件中),因此它被定向到该文件。我说的是撞车事故,这是坠机报告:
---- Minecraft Crash Report ---- // I feel sad now :(
Time: 8.4.15 21:58 Description: Rendering screen
java.lang.ClassCastException: net.minecraft.client.gui.GuiPAYDAY2Button cannot be cast to net.minecraft.client.gui.GuiButton
at net.minecraft.client.gui.GuiScreen.drawScreen(GuiScreen.java:99)
at net.minecraft.client.gui.GuiPAYDAY2MainMenu.drawScreen(GuiPAYDAY2MainMenu.java:453)
at net.minecraft.client.renderer.EntityRenderer.updateCameraAndRender(EntityRenderer.java:1167)
at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1127)
at net.minecraft.client.Minecraft.run(Minecraft.java:410)
at net.minecraft.client.main.Main.main(Main.java:114)
at Start.main(Start.java:11)错误、其代码路径和所有已知详细信息的详细演练如下:
-- Head --
Stacktrace:
at net.minecraft.client.gui.GuiScreen.drawScreen(GuiScreen.java:99)
at net.minecraft.client.gui.GuiPAYDAY2MainMenu.drawScreen(GuiPAYDAY2MainMenu.java:453)
-- Screen render details --
Details:
Screen name: net.minecraft.client.gui.GuiPAYDAY2MainMenu
Mouse location: Scaled: (202, 11). Absolute: (405, 456)
Screen size: Scaled: (427, 240). Absolute: (854, 480). Scale factor of 2
Stacktrace:
at net.minecraft.client.renderer.EntityRenderer.updateCameraAndRender(EntityRenderer.java:1167)
at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1127)
at net.minecraft.client.Minecraft.run(Minecraft.java:410)
at net.minecraft.client.main.Main.main(Main.java:114)
at Start.main(Start.java:11)
-- System Details --
Details:
Minecraft Version: 1.8
Operating System: Windows 7 (amd64) version 6.1
Java Version: 1.8.0_31, Oracle Corporation
Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
Memory: 707532608 bytes (674 MB) / 1038876672 bytes (990 MB) up to 1038876672 bytes (990 MB)
JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M
IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
Launched Version: mcp
LWJGL: 2.9.1
OpenGL: GeForce GTX 460 v2/PCIe/SSE2 GL version 4.5.0 NVIDIA 347.25, NVIDIA Corporation
GL Caps: Using GL 1.3 multitexturing. Using GL 1.3 texture combiners. Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported. Shaders are available because OpenGL 2.1 is supported. VBOs are available because OpenGL 1.5 is supported.
Using VBOs: No
Is Modded: Very likely; Jar signature invalidated
Type: Client (map_client.txt)
Resource Packs: []
Current Language: English (US)
Profiler Position: N/A (disabled)更新
几个小时前,我拍了一段视频,这是对国防部的展示。也许你会明白我想要什么..:https://www.youtube.com/watch?v=ocHT7LdNBYY
好的,我使扩展脚本看起来如下:
package net.minecraft.client.gui;
import net.minecraft.util.ResourceLocation;
public class GuiButtonTexureChange extends GuiButton {
public static ResourceLocation buttonTextures = new ResourceLocation("textures/gui/PAYDAY2widgets.png");
// Now this part is needed to be here (otherwise it throws errors):
public GuiButtonTexureChange(int buttonId, int x, int y, int widthIn, int heightIn, String buttonText) {
super(buttonId, x, y, widthIn, heightIn, buttonText); // TODO Auto-generated constructor stub
}
}发布于 2015-04-08 21:16:27
如果您不能修改一些Java代码(例如,它是库的一部分),则仍然可以覆盖任何您喜欢的Java类。
创建另一个源文件夹(这里以Eclipse的形式),并在其中将确切的包和文件作为要编辑的类。在您的情况下,它应该是包net.minecraft.client.gui和文件GuiButton.java.
现在,如果您自己的文件在类路径中居第一位,那么您已经成功地覆盖了一个类。库中的所有其他代码仍然像以前一样工作。
在使用Eclipse时,确保您自己的代码在类路径中处于第一位:项目属性、->、Java构建路径、->顺序和导出
最好将现有代码( GuiButton)复制到您自己的文件中,以便具有相同的起点,然后对代码进行修改。
发布于 2015-04-08 21:10:23
根据安全管理器设置的不同,可以通过反射在运行时更改路径字符串。
例子:
static void setFinalStatic(final Field field, final Object instance, final Object newValue) throws Exception {
field.setAccessible(true);
final Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL & ~Modifier.PRIVATE);
field.set(instance, newValue);
}
public final static void main(String[] args) throws Exception {
String path = "initialPath";
final char[] after = "sneakyPath".toCharArray();
setFinalStatic(path.getClass().getDeclaredField("value"), path, after);
setFinalStatic(path.getClass().getDeclaredField("offset"), path, 0);
setFinalStatic(path.getClass().getDeclaredField("count"), path, after.length);
System.out.println(path);
}https://stackoverflow.com/questions/29523975
复制相似问题