本帖最后由 yinseny 于 2013-1-7 11:54 编辑

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
  1. 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
复制代码
把YOUR_ID改为自己的ID
源码(1.3.2)
  1. public static void main(String[] par0ArrayOfStr) {
  2.         ......
  3.         final Frame var12 = new Frame();//需要把frame设置成final
  4.         var12.setTitle("Minecraft");
  5.         var12.setBackground(Color.BLACK);
  6.         JPanel var11 = new JPanel();
  7.         var12.setLayout(new BorderLayout());
  8.         var11.setPreferredSize(new Dimension(854, 480));
  9.         var12.add(var11, "Center");
  10.         var12.pack();
  11.         var12.setLocationRelativeTo((Component) null);
  12.         var12.setVisible(true);
  13.         var12.addWindowListener(new GameWindowListener());
  14.         MinecraftFakeLauncher var9 = new MinecraftFakeLauncher(var1);
  15.         MinecraftApplet var13 = new MinecraftApplet();
  16.         var13.setStub(var9);
  17.         var9.setLayout(new BorderLayout());
  18.         var9.add(var13, "Center");
  19.         var9.validate();
  20.         var12.removeAll();
  21.         var12.setLayout(new BorderLayout());
  22.         var12.add(var9, "Center");
  23.         var12.validate();
  24.         var13.init();
  25.         var13.start();
  26.         Runtime.getRuntime().addShutdownHook(new ThreadShutdown());

  27.         //以下为添加的代码
  28.         final java.awt.TextField chatline = new java.awt.TextField();
  29.         var12.add(chatline, BorderLayout.PAGE_END);
  30.         chatline.setPreferredSize(new Dimension(854, 20));
  31.         chatline.addKeyListener(new java.awt.event.KeyListener() {
  32.                 @Override
  33.                 public void keyPressed(java.awt.event.KeyEvent arg0) {
  34.                         if (arg0.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
  35.                                 String tmp = chatline.getText();
  36.                                 if (tmp != null && !tmp.isEmpty()) {
  37.                                         theMinecraft.getSendQueue().addToSendQueue(
  38.                                                         new Packet3Chat(tmp));
  39.                                         chatline.setText("");
  40.                                 }
  41.                         } else if (arg0.getKeyCode() == java.awt.event.KeyEvent.VK_ESCAPE) {
  42.                                 chatline.setText("");
  43.                         }
  44.                 }
  45.                 @Override
  46.                 public void keyTyped(java.awt.event.KeyEvent e) {}
  47.                 @Override
  48.                 public void keyReleased(java.awt.event.KeyEvent e) {}
  49.         });
  50.         var12.pack();
  51.         var12.validate();
  52.         // 结束
  53. }
复制代码


PS. 吐槽一下国内大部分添加了汉化补丁外挂文本的服务器。。。汉化文件全都使用只在windows上使用的gbk编码,默认使用国际通用的utf-8编码的linux内牛满面啊。。。每次下载下来新的客户端之后都要自己手动转换编码。。。
mcbbslauncher、mclauncher、yolauncher都是Windows的exe可执行文件格式。。。bililauncher倒是jar的,可实际上仍然只是生成cmd指令。。。只能在win下运行。。。