只能算个workaround,不是正经的mod或者patch。。。
只是在窗口下方加了个高20px的TextField,没有对MC的内部做修改
问题原因:
- ibus 如果系统装有ibus的话,ibus无论是在输入法开启还是关闭状态都会拦截所有输入,所以ibus运行时mc完全接收不到按键信号,于是网上很多解决linux下mc按键问题都是先kill掉ibus-daemon,运行mc,mc退出后再重启ibus
- lwjgl 解决掉ibus之后,紧接着另一个问题出现了,mc的所有输入信号全都是通过lwjgl库来处理,而lwjgl貌似还不支持中文
解决方法:换掉ibus,使用java自己的文本输入框
步骤:
- 卸载ibus,安装fcitx,fedora系统的话可以直接使用yum安装,个人认为fcitx比ibus好用多了
- 按mc版本下载对应补丁
版本 下载地址 1.2.5 [wpdm_file id=4] 1.3.2 [wpdm_file id=5] - 安装。和正常的mod安装方法相同,把压缩包中文件拖进minecraft.jar中的对应位置即可
副作用。。。。: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
记得把YOUR_ID改成自己的名字
另附添加了jvm调优参数的脚本
[yinseny@localhost bin]$ cat /usr/bin/minecraft #!/bin/bash cd /home/yinseny/.minecraft/bin java -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSIncrementalPacing -XX:+UseFastAccessorMethods -XX:+AggressiveOpts -XX:+DisableExplicitGC -XX:+UseAdaptiveGCBoundary -XX:MaxGCPauseMillis=500 -XX:SurvivorRatio=16 -XX:UseSSE=3 -XX:ParallelGCThreads=2 -Xms1024m -Xmx2048m -cp jinput.jar:lwjgl.jar:lwjgl_util.jar:minecraft.jar -Djava.library.path="./natives" net.minecraft.client.Minecraft yinseny >> /dev/null
效果截图:
源码(1.3.2):
修改后的main函数
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(); // 结束 }