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,这样代码量也小,改动的文件也少
步骤:
- 卸载ibus,安装fcitx(使用apt-get、yum等指令即可)
- 下载补丁
- 压缩包内文件拖入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
复制代码 把YOUR_ID改为自己的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下运行。。。
作者: 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
为啥 显示过期 啥意思啊?