Minecraft Linux版中文输入解决办法


只能算个workaround,不是正经的mod或者patch。。。
只是在窗口下方加了个高20px的TextField,没有对MC的内部做修改
问题原因:

  1. ibus 如果系统装有ibus的话,ibus无论是在输入法开启还是关闭状态都会拦截所有输入,所以ibus运行时mc完全接收不到按键信号,于是网上很多解决linux下mc按键问题都是先kill掉ibus-daemon,运行mc,mc退出后再重启ibus
  2. lwjgl 解决掉ibus之后,紧接着另一个问题出现了,mc的所有输入信号全都是通过lwjgl库来处理,而lwjgl貌似还不支持中文

解决方法:换掉ibus,使用java自己的文本输入框
步骤:

  1. 卸载ibus,安装fcitx,fedora系统的话可以直接使用yum安装,个人认为fcitx比ibus好用多了
  2. 按mc版本下载对应补丁
    版本 下载地址
    1.2.5 [wpdm_file id=4]
    1.3.2 [wpdm_file id=5]
  3. 安装。和正常的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();
		// 结束
	}

发表评论

电子邮件地址不会被公开。 必填项已用*标注