1.4.2/1.3.2/1.3.1已有使用相同思路实现的成熟mod了 详见@Zhuogu 的帖子(由于@jjkppo表示@Zhuogu的MOD可能造成游戏无故退出,所以这里不提供链接了)
貌似算不上mod,只能算是个workaround,在自己的机器上成功了,但不知道通不通用,于是来求测试。。。我的环境是Fedora 17 x86_64,KDE桌面环境,oracle java 1.7.0_07,fcitx输入法,LANG=en_US.UTF-8
之前用ibus时一直都需要先kill掉ibus进程才能启动mc,后来换了fcitx输入法之后发现和mc无冲突,键盘可正常使用,但是还是没办法输入中文,大致看了一下mc和lwjgl的源码,mc的文本输入框GuiTextField的按键事件从lwjgl获得,而lwjgl直接从底层获取事件,无视了ime。。。如果正常的修改方式貌似工程量有点大,所以想了个比较取巧的解决办法,在窗口下方加入一个java.awt.TextField,使用java自身的文本框而不是mc自己的GuiTextField,这样代码量也小,改动的文件也少
步骤:
- 卸载ibus,安装fcitx(使用apt-get、yum等指令即可)
- 下载补丁
mc132_ch_input_workaround.zip (23.17 KB, 下载次数: 57)
mc125_ch_input_workaround.zip (23.63 KB, 下载次数: 15)
- 压缩包内文件拖入minecraft.jar中,即net/minecraft/client/Minecraft.class和Minecraft$1.class
副作用:
MinecraftSP无法使用。。。需要自己直接使用指令启动minecraft.jar
- cd ~/.minecraft/bin;java -Xms1024m -Xmx2048m -cp jinput.jar:lwjgl.jar:lwjgl_util.jar:minecraft.jar -Djava.library.path="./natives" net.minecraft.client.Minecraft YOUR_ID
源码(1.3.2)
- public static void main(String[] par0ArrayOfStr) {
- ......
- final Frame var12 = new Frame();//需要把frame设置成final
- var12.setTitle("Minecraft");
- var12.setBackground(Color.BLACK);
- JPanel var11 = new JPanel();
- var12.setLayout(new BorderLayout());
- var11.setPreferredSize(new Dimension(854, 480));
- var12.add(var11, "Center");
- var12.pack();
- var12.setLocationRelativeTo((Component) null);
- var12.setVisible(true);
- var12.addWindowListener(new GameWindowListener());
- MinecraftFakeLauncher var9 = new MinecraftFakeLauncher(var1);
- MinecraftApplet var13 = new MinecraftApplet();
- var13.setStub(var9);
- var9.setLayout(new BorderLayout());
- var9.add(var13, "Center");
- var9.validate();
- var12.removeAll();
- var12.setLayout(new BorderLayout());
- var12.add(var9, "Center");
- var12.validate();
- var13.init();
- var13.start();
- Runtime.getRuntime().addShutdownHook(new ThreadShutdown());
-
- //以下为添加的代码
- final java.awt.TextField chatline = new java.awt.TextField();
- var12.add(chatline, BorderLayout.PAGE_END);
- chatline.setPreferredSize(new Dimension(854, 20));
- chatline.addKeyListener(new java.awt.event.KeyListener() {
- @Override
- public void keyPressed(java.awt.event.KeyEvent arg0) {
- if (arg0.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
- String tmp = chatline.getText();
- if (tmp != null && !tmp.isEmpty()) {
- theMinecraft.getSendQueue().addToSendQueue(
- new Packet3Chat(tmp));
- chatline.setText("");
- }
- } else if (arg0.getKeyCode() == java.awt.event.KeyEvent.VK_ESCAPE) {
- chatline.setText("");
- }
- }
- @Override
- public void keyTyped(java.awt.event.KeyEvent e) {}
- @Override
- public void keyReleased(java.awt.event.KeyEvent e) {}
- });
- var12.pack();
- var12.validate();
- // 结束
- }
PS. 吐槽一下国内大部分添加了汉化补丁外挂文本的服务器。。。汉化文件全都使用只在windows上使用的gbk编码,默认使用国际通用的utf-8编码的linux内牛满面啊。。。每次下载下来新的客户端之后都要自己手动转换编码。。。
mcbbslauncher、mclauncher、yolauncher都是Windows的exe可执行文件格式。。。bililauncher倒是jar的,可实际上仍然只是生成cmd指令。。。只能在win下运行。。。