Minecraft(我的世界)中文论坛

标题: 【弃坑】【求测试】Minecraft Linux平台中文输入解决办法

作者: yinseny    时间: 2012-9-11 13:29
标题: 【弃坑】【求测试】Minecraft Linux平台中文输入解决办法
本帖最后由 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,这样代码量也小,改动的文件也少

步骤:


副作用:
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下运行。。。




作者: WuProem    时间: 2012-9-11 13:30
ubuntu 表示不会装oracle java。{:10_524:}
作者: indeed    时间: 2012-9-11 13:44
有这么麻烦吗?
直接在游戏进入之前杀掉输入法的deamon进程即可。
作者: yinseny    时间: 2012-9-11 13:50
WuProem 发表于 2012-9-11 13:30
ubuntu 表示不会装oracle java。

ubuntu oracle java 7 安装步骤,http://ubuntudaily.net/2012/06/i ... 7-in-ubuntu-via-ppa

【fedora跪了。。。ppa源什么的最可恶了。。。】
作者: yinseny    时间: 2012-9-11 13:51
indeed 发表于 2012-9-11 13:44
有这么麻烦吗?
直接在游戏进入之前杀掉输入法的deamon进程即可。

杀掉输入法进程的话就没办法输入中文了啊。。。
作者: indeed    时间: 2012-9-11 14:07
yinseny 发表于 2012-9-11 13:51
杀掉输入法进程的话就没办法输入中文了啊。。。

装上输入MOD,从别处复制。
作者: yinseny    时间: 2012-9-11 14:22
indeed 发表于 2012-9-11 14:07
装上输入MOD,从别处复制。

我也试过这样。。。但是由于输入法已经被kill,所以只能使用网页端的云输入法或者虚拟机,即不好用又降低性能,而且复制粘贴好麻烦的。。。
作者: 神ID    时间: 2012-9-11 17:15
看到linux我就进来了0 0
作者: chenchenalex    时间: 2012-9-13 23:07
这个必须顶啊!! 福利啊 太感谢了
作者: qgymib    时间: 2012-9-20 11:02
本帖最后由 qgymib 于 2012-9-20 11:02 编辑

有一种略微简单一点的办法,写一个脚本,在游戏启动前声明此进程禁止使用输入法即可

#!/bin/bash

echo "Launching game"

XMODIFIERS='' java -Xmx1024M -Xms512M -cp ~/Apps/MinecraftSP.jar net.minecraft.LauncherFrame

rm ~/hs_err_pid*.log

最后一行是为了删除错误日志
XMODIFIERS='' 中‘’为两个单引号

这种方法唯一的缺点在于不能在游戏中输入中文,但是在其他程序中可以

作者: yinseny    时间: 2012-9-20 17:56
qgymib 发表于 2012-9-20 11:02
有一种略微简单一点的办法,写一个脚本,在游戏启动前声明此进程禁止使用输入法即可

#!/bin/bash

是的,而我这个半吊子mod的目的就是为了在游戏中输入中文。。。
作者: jjkppo    时间: 2013-1-2 05:45
yinseny 发表于 2012-9-20 17:56
是的,而我这个半吊子mod的目的就是为了在游戏中输入中文。。。

测试过了。。。。fcitx一样进去走不动。。。。蛋疼

作者: jjkppo    时间: 2013-5-30 00:20
WuProem 发表于 2012-9-11 13:30
ubuntu 表示不会装oracle java。

sudo apt-get install openjdk-7-jre openjdk-7-jre-headless openjdk-7-jre-lib default-jre default-jre-headless

复制以上命令,终端粘贴敲回车输入你的用户密码,然后等他完事
作者: jjkppo    时间: 2013-5-30 00:21
indeed 发表于 2012-9-11 13:44
有这么麻烦吗?
直接在游戏进入之前杀掉输入法的deamon进程即可。

你妹闹懂,楼主这玩意可以让你直接在里面打汉字,不是那种外挂式的每次打完字敲一下回车屏幕还会闪一下调整大小.
作者: jjkppo    时间: 2013-5-30 00:33
一直都没说....测试了很不错的东西,现在已经1.5.2了,求更新...我已经开始尝试用你的代码修改了.看结果吧....我是个ubuntu用户..
作者: 笨猫丶爱你    时间: 2019-6-17 15:54
为啥 显示过期 啥意思啊?